# HG changeset patch # User Nobuyasu Oshiro # Date 1321702518 -32400 # Node ID 9314b8c2dfd921d1e7d4c554f2f03d64498c28d7 # Parent 3d1f778dc3588f36a927d778c43d464c2179ea67 modify bib diff -r 3d1f778dc358 -r 9314b8c2dfd9 Paper/Makefile --- a/Paper/Makefile Sat Nov 19 19:18:22 2011 +0900 +++ b/Paper/Makefile Sat Nov 19 20:35:18 2011 +0900 @@ -1,11 +1,26 @@ -all: nobu-prosym.pdf +TARGET=nobu-prosym + +LATEX=platex +BIBTEX=pbibtex +DVIPDF=dvipdfmx + +.SUFFIXES: .tex .div .pdf -nobu-prosym.pdf: nobu-prosym.dvi - dvipdfmx nobu-prosym.dvi - open nobu-prosym.pdf +.tex.dvi: + $(LATEX) $< + $(BIBTEX) $(TARGET) + $(LATEX) $< + $(LATEX) $< -nobu-prosym.dvi: nobu-prosym.tex - platex nobu-prosym.tex +.dvi.pdf: + $(DVIPDF) $(DVIPDF_OPT) $< + +all: $(TARGET).pdf + open $(TARGET).pdf + +dvi: $(TARGET).div + +pdf: $(TARGET).pdf clean: - rm *.{log,aux,dvi,pdf} \ No newline at end of file + rm *.{log,aux,dvi,pdf,bbl,blg} \ No newline at end of file diff -r 3d1f778dc358 -r 9314b8c2dfd9 Paper/Makefile~ --- a/Paper/Makefile~ Sat Nov 19 19:18:22 2011 +0900 +++ b/Paper/Makefile~ Sat Nov 19 20:35:18 2011 +0900 @@ -1,11 +1,11 @@ -all: nobu-graduation.pdf +all: nobu-prosym.pdf -nobu-graduation.pdf: nobu-graduation.dvi - dvipdfmx nobu-graduation.dvi - open nobu-graduation.pdf +nobu-prosym.pdf: nobu-prosym.dvi + dvipdfmx nobu-prosym.dvi + open nobu-prosym.pdf -nobu-graduation.dvi: nobu-graduation.tex - platex nobu-graduation.tex +nobu-prosym.dvi: nobu-prosym.tex + platex nobu-prosym.tex clean: rm *.{log,aux,dvi,pdf} \ No newline at end of file diff -r 3d1f778dc358 -r 9314b8c2dfd9 Paper/nobu-prosym.aux --- a/Paper/nobu-prosym.aux Sat Nov 19 19:18:22 2011 +0900 +++ b/Paper/nobu-prosym.aux Sat Nov 19 20:35:18 2011 +0900 @@ -1,8 +1,24 @@ \relax \newlabel{fig:cs}{{1}{1}} \@writefile{lol}{\contentsline {lstlisting}{source/factorial.cbc}{2}} +\newlabel{fig:factorial}{{2}{2}} \newlabel{fig:ir}{{3}{2}} \newlabel{fig:continue}{{4}{3}} \newlabel{fig:cs_stack}{{5}{3}} \newlabel{code:_ret_val}{{1}{3}} \@writefile{lol}{\contentsline {lstlisting}{\numberline {1}環境付き継続を行うコード}{3}} +\citation{kono:2002a} +\citation{kono:2008a} +\citation{yogi:2008a} +\citation{gcc_internals} +\bibstyle{junsrt} +\bibdata{cbc.bib} +\bibcite{kono:2002a}{1} +\bibcite{kono:2008a}{2} +\bibcite{yogi:2008a}{3} +\bibcite{gcc_internals}{4} +\newlabel{fig:fastcall}{{6}{4}} +\newlabel{code:typedefrec}{{2}{4}} +\@writefile{lol}{\contentsline {lstlisting}{\numberline {2}typedefrecの例}{4}} +\newlabel{tab:speed-mc-vs-gcc-nonopt}{{1}{4}} +\newlabel{tab:speed-mc-vs-gcc-opt}{{2}{4}} diff -r 3d1f778dc358 -r 9314b8c2dfd9 Paper/nobu-prosym.log --- a/Paper/nobu-prosym.log Sat Nov 19 19:18:22 2011 +0900 +++ b/Paper/nobu-prosym.log Sat Nov 19 20:35:18 2011 +0900 @@ -1,4 +1,4 @@ -This is e-pTeX, Version 3.1415926-p3.2-110415-2.3 (utf8.euc) (TeX Live 2011) (format=platex 2011.11.10) 19 NOV 2011 19:15 +This is e-pTeX, Version 3.1415926-p3.2-110415-2.3 (utf8.euc) (TeX Live 2011) (format=platex 2011.11.10) 19 NOV 2011 20:15 entering extended mode restricted \write18 enabled. %&-line parsing enabled. @@ -150,78 +150,49 @@ )) Package: listings 2007/02/22 1.4 (Carsten Heinz) -No file nobu-prosym.aux. +(./jtygm.sty +Package: jtygm 1998/06/12 based on v1.3 KANJI font defines +) (./nobu-prosym.aux) \openout1 = `nobu-prosym.aux'. -LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 42. -LaTeX Font Info: ... okay on input line 42. -LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 42. -LaTeX Font Info: ... okay on input line 42. -LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 42. -LaTeX Font Info: ... okay on input line 42. -LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 42. -LaTeX Font Info: ... okay on input line 42. -LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 42. -LaTeX Font Info: ... okay on input line 42. -LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 42. -LaTeX Font Info: ... okay on input line 42. -LaTeX Font Info: Checking defaults for JY1/mc/m/n on input line 42. -LaTeX Font Info: ... okay on input line 42. -LaTeX Font Info: Checking defaults for JT1/mc/m/n on input line 42. -LaTeX Font Info: ... okay on input line 42. +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 43. +LaTeX Font Info: ... okay on input line 43. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 43. +LaTeX Font Info: ... okay on input line 43. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 43. +LaTeX Font Info: ... okay on input line 43. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 43. +LaTeX Font Info: ... okay on input line 43. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 43. +LaTeX Font Info: ... okay on input line 43. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 43. +LaTeX Font Info: ... okay on input line 43. +LaTeX Font Info: Checking defaults for JY1/mc/m/n on input line 43. +LaTeX Font Info: ... okay on input line 43. +LaTeX Font Info: Checking defaults for JT1/mc/m/n on input line 43. +LaTeX Font Info: ... okay on input line 43. \c@lstlisting=\count112 -LaTeX Font Info: Font shape `JT1/mc/bx/n' in size <14.4> not available -(Font) Font shape `JT1/gt/m/n' tried instead on input line 97. -LaTeX Font Info: Font shape `JY1/mc/bx/n' in size <14.4> not available -(Font) Font shape `JY1/gt/m/n' tried instead on input line 97. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <10.95> on input line 98. LaTeX Font Info: External font `cmex10' loaded for size -(Font) <10.95> on input line 97. -LaTeX Font Info: External font `cmex10' loaded for size -(Font) <8> on input line 97. -LaTeX Font Info: Font shape `JT1/mc/bx/n' in size <12> not available -(Font) Font shape `JT1/gt/m/n' tried instead on input line 97. -LaTeX Font Info: Font shape `JY1/mc/bx/n' in size <12> not available -(Font) Font shape `JY1/gt/m/n' tried instead on input line 97. +(Font) <8> on input line 98. + Class ipsjpapers Warning: \etitle is too wide. Break line(s) by \\ on input lin -e 97. - - -LaTeX Font Warning: Font shape `JT1/mc/m/sc' undefined -(Font) using `JT1/mc/m/n' instead on input line 97. - - -LaTeX Font Warning: Font shape `JY1/mc/m/sc' undefined -(Font) using `JY1/mc/m/n' instead on input line 97. +e 98. LaTeX Font Info: External font `cmex10' loaded for size -(Font) <7> on input line 97. -LaTeX Font Info: Font shape `JT1/mc/bx/n' in size <9> not available -(Font) Font shape `JT1/gt/m/n' tried instead on input line 133. -LaTeX Font Info: Font shape `JY1/mc/bx/n' in size <9> not available -(Font) Font shape `JY1/gt/m/n' tried instead on input line 133. - -LaTeX Warning: Reference `fig:cs' on page 1 undefined on input line 136. - +(Font) <7> on input line 98. File: figure/codesegment.eps Graphic file (type eps)
-Overfull \hbox (2.42252pt too wide) in paragraph at lines 145--146 +Overfull \hbox (2.42252pt too wide) in paragraph at lines 146--147 [] [] -LaTeX Font Info: Font shape `JT1/mc/bx/n' in size <7> not available -(Font) Font shape `JT1/gt/m/n' tried instead on input line 147. -LaTeX Font Info: Font shape `JY1/mc/bx/n' in size <7> not available -(Font) Font shape `JY1/gt/m/n' tried instead on input line 147. [1 -] - -LaTeX Warning: Reference `fig:factorial' on page 2 undefined on input line 158. - - -(/usr/local/texlive/2011/texmf-dist/tex/latex/listings/lstlang1.sty +] (/usr/local/texlive/2011/texmf-dist/tex/latex/listings/lstlang1.sty File: lstlang1.sty 2004/09/05 1.3 listings language file ) (/usr/local/texlive/2011/texmf-dist/tex/latex/listings/lstmisc.sty @@ -243,146 +214,58 @@ LaTeX Font Info: Font shape `OML/cmr/m/n' in size <9> not available (Font) Font shape `OML/cmm/m/it' tried instead on input line 8. ) - -LaTeX Warning: Reference `fig:ir' on page 2 undefined on input line 181. - File: figure/ir.eps Graphic file (type eps) -
-Overfull \hbox (19.2858pt too wide) in paragraph at lines 185--186 +
+Overfull \hbox (19.2858pt too wide) in paragraph at lines 187--188 [] [] - -LaTeX Warning: Reference `fig:continue' on page 2 undefined on input line 227. - File: figure/continuation.eps Graphic file (type eps)
[2] - -LaTeX Warning: Reference `fig:cs_stack' on page 3 undefined on input line 261. - File: figure/cs_stack.eps Graphic file (type eps) -
-Overfull \hbox (7.76706pt too wide) in paragraph at lines 295--295 +
+Overfull \hbox (7.76706pt too wide) in paragraph at lines 296--296 []\OT1/cmtt/m/n/9 __code c1(__code ret(int,void *),void *env) {[] [] -LaTeX Warning: Reference `code:_ret_val' on page 3 undefined on input line 298. - - - -Overfull \hbox (50.22961pt too wide) in paragraph at lines 304--305 +Overfull \hbox (50.22961pt too wide) in paragraph at lines 305--306 [][][][][][][][][][][][][][][][][][] [] -Overfull \hbox (94.62976pt too wide) in paragraph at lines 305--306 +Overfull \hbox (94.62976pt too wide) in paragraph at lines 306--307 [][][][][][][][][][][][][][][][] [] [3] - -LaTeX Warning: Reference `fig:fastcall' on page 4 undefined on input line 341. - File: figure/fastcall.eps Graphic file (type eps) -
-Overfull \hbox (12.43753pt too wide) in paragraph at lines 347--348 +
+Overfull \hbox (12.43753pt too wide) in paragraph at lines 348--349 [] [] -Overfull \hbox (3.0592pt too wide) in paragraph at lines 398--399 -[][][][][][][][][][][][][][][][]\JY1/mc/m/n/9 が最適 - [] - - -Overfull \hbox (61.32965pt too wide) in paragraph at lines 406--407 -[][][][][][][][][][][][][][][][][][][][][][] - [] - - -Overfull \hbox (89.07974pt too wide) in paragraph at lines 407--408 -[][][][][][][][][][][][][][][][][][][][][][][][][] - [] - - -Overfull \hbox (94.62976pt too wide) in paragraph at lines 408--409 -[][][][][][][][][][][][][][][][][][][][][][][][][][][][] - [] +LaTeX Warning: `h' float specifier changed to `ht'. -Overfull \hbox (50.22961pt too wide) in paragraph at lines 409--410 -[][][][][][][][][][][][][][][][][][][][][][][][] - [] - - -Overfull \hbox (5.82947pt too wide) in paragraph at lines 412--413 -[][][][][][][][][][][][][][][][][][] - [] - - -Overfull \hbox (61.32965pt too wide) in paragraph at lines 420--421 -[][][][][][][][][][][][][][][][][][][][][][] - [] - - -Overfull \hbox (89.07974pt too wide) in paragraph at lines 421--422 -[][][][][][][][][][][][][][][][][][][][][][][][][] - [] - - -Overfull \hbox (94.62976pt too wide) in paragraph at lines 422--423 -[][][][][][][][][][][][][][][][][][][][][][][][][][][][] +Overfull \hbox (13.24168pt too wide) in paragraph at lines 403--409 + [][] [] -Overfull \hbox (50.22961pt too wide) in paragraph at lines 423--424 -[][][][][][][][][][][][][][][][][][][][][][][][] - [] - - -Overfull \hbox (100.17978pt too wide) in paragraph at lines 451--452 -[][][][][][][][][][][][][][][][][] - [] - - -Overfull \hbox (10.36559pt too wide) in paragraph at lines 452--455 -[][][][][][][][][][][][][] \JY1/mc/m/n/9 ” +Overfull \hbox (13.24168pt too wide) in paragraph at lines 417--423 + [][] [] -) -* -(Please type a command or say `\end') -* -! Interruption. -<*> - -? -(Please type a command or say `\end') -*x - -*x - -* -! Interruption. -<*> - -? -(Please type a command or say `\end') -* -(Please type a command or say `\end') -* -! Interruption. -<*> - -? x - +(./nobu-prosym.bbl) [4] (./nobu-prosym.aux) ) Here is how much of TeX's memory you used: - 2728 strings out of 494163 - 36381 string characters out of 3160585 - 146564 words of memory out of 3000000 - 6117 multiletter control sequences out of 15000+200000 - 17620 words of font info for 68 fonts, out of 3000000 for 9000 + 2652 strings out of 494163 + 35721 string characters out of 3160585 + 118638 words of memory out of 3000000 + 6030 multiletter control sequences out of 15000+200000 + 17965 words of font info for 69 fonts, out of 3000000 for 9000 745 hyphenation exceptions out of 8191 30i,10n,52p,207b,1326s stack positions out of 5000i,500n,10000p,200000b,50000s -Output written on nobu-prosym.dvi (3 pages, 19184 bytes). + +Output written on nobu-prosym.dvi (4 pages, 25952 bytes). diff -r 3d1f778dc358 -r 9314b8c2dfd9 Paper/nobu-prosym.pdf Binary file Paper/nobu-prosym.pdf has changed diff -r 3d1f778dc358 -r 9314b8c2dfd9 Paper/nobu-prosym.tex --- a/Paper/nobu-prosym.tex Sat Nov 19 19:18:22 2011 +0900 +++ b/Paper/nobu-prosym.tex Sat Nov 19 20:35:18 2011 +0900 @@ -1,1 +1,1 @@ -\documentclass[private]{ipsjpapers} %\documentstyle{ipsjpapers} \Usepackage[dvipdfmx]{graphicx} \usepackage{url} \usepackage{multirow} %% tabularの上下の結合 \usepackage{slashbox} %% tabularでの斜め線 \usepackage{listings} % 巻数,号数などの設定 %\setcounter{巻数}{41} %\setcounter{号数}{6} %\setcounter{volpageoffset}{1234} %\受付{12}{2}{4} %\採録{12}{5}{11} \pagestyle{empty} % ユーザが定義したマクロなど. \makeatletter \let\@ARRAY\@array \def\@array{\def\<{\inhibitglue}\@ARRAY} \def\<{\(\langle\)} \def\>{\(\rangle\)} %\def\|{\verb|} \def\Underline{\setbox0\hbox\bgroup\let\\\endUnderline} \def\endUnderline{\vphantom{y}\egroup\smash{\underline{\box0}}\\} \def\LATEX{\iLATEX\Large} \def\LATEx{\iLATEX\normalsize} \def\LATex{\iLATEX\small} \def\iLATEX#1{L\kern-.36em\raise.3ex\hbox{#1\bf A}\kern-.15em T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX} \def\LATEXe{\ifx\LaTeXe\undefined \LaTeX 2e\else\LaTeXe\fi} \def\LATExe{\ifx\LaTeXe\undefined \iLATEX\scriptsize 2e\else\LaTeXe\fi} \def\Quote{\list{}{}\item[]} \let\endQuote\endlist \def\TT{\if@LaTeX@e\tt\fi} \def\CS#1{\if@LaTeX@e\tt\expandafter\string\csname#1\endcsname\else $\backslash$#1\fi} %\checklines % 行送りを確認する時に使用 \begin{document}%{ % 和文表題 \title[Continuation based C の GCC 4.6 上の実装について]% {Continuation based C の GCC 4.6 上の実装について} % 英文表題 \etitle{The implementation of Continuation based C Compiler on GCC 4.6} % 所属ラベルの定義 \affilabel{URYUKYU}{琉球大学\\University of the Ryukyu} % 和文著者名 \author{大城 信康\affiref{URYUKYU}\nomember\and 河野 真治\affiref{URYUKYU}\member{19841765}} % 英文著者名 \eauthor{Nobuyasu Oshiro\affiref{URYUKYU}\and Shinji Kono\affiref{URYUKYU}} % 連絡先(投稿時に必要.製版用では無視される.) \contact{大城 信康\\ 〒903-0213 沖縄県中頭郡西原町字千原1番地\\ 琉球大学 情報工学科\\ TEL: (098)895-8723\qquad FAX: (098)895-8727\\ email: dimolto@cr.ie.u-ryukyu.ac.jp} % 和文概要 \begin{abstract} GCC-4.6 をベースとした CbC コンパイラの実装を行った. CbC のコンパイラは GCC-4.2 ベースのコンパイラが2008年に開発されており, 以来 GCC のアップデートにあわせて CbC のコンパイラもアップデートが行われてきた. 今回は GCC-4.6 への実装を行った. 本論文では GCC-4.6 への CbC の具体的な実装について述べる。 %当研究室では継続を基本としたプログラミング言語 Continuation basede C (以下CbC) を開発している. %また,CbC 自体の開発と共に CbC のコンパイラの開発も行っている. %お陰で GCC の最適化やデバッグの機能を CbC のプログラミングで扱うことができるようになった. \end{abstract} % 英文概要 \begin{eabstract} We implemented Continuation based C Compiler on GCC-4.6. CbC Compiler on GCC-4.2 was developed on 2008. Since then we kept to update it. In this paper, we introduce implemented Continuation based C Compiler on GCC-4.6. %Continuation based C is programming language. It is developing our laboratory. \end{eabstract} % 表題などの出力 \maketitle \thispagestyle{empty} % }{ % 本文はここから始まる \section{歴史的経緯} %当研究室では, 継続により処理を行うプログラミング言語 Continuation based C (以下CbC) を開発している. %CbC の構文は C と同じであるが,継続によりループ制御や関数コールが取り除かれる. 当研究室ではコードセグメント (Code Segment) 単位で記述するプログラミング言語 Continuation based C (以下CbC) を開発している. コードセグメントは並列実行の単位として使うことができ, プログラムの正しさを示す単位としても使用することができる.これにより, Many Core での並列実行を高い性能と高い信頼性で実現することができると考えている. CbC のコンパイルには元々 Micoro-C 版の独自のコンパイラを用いていたが, 2008年の研究において GCC-4.2 ベースの CbC コンパイラが開発され, 2010年には GCC-4.4 へとアップデートが行われた. GCC への実装により,GCC の最適化やデバッガの機能を使うことができより実用的な CbC プログラミングが行えるようになった. %以来,GCC のアップデートに合わせて GCC ベースの CbC コンパイラのアップデートを行って来ている. %今回,CbC コンパイラを GCC-4.6 へとアップデートを行った. %本論文では, CbC,GCC の簡単な説明と,GCC-4.6 への実装を述べる. だが, GCC をベースとした CbC のコンパイラ (以下 CbC-GCC)は, GCC のアップデートに合わせて変更する必要がある. 本研究では, GCC-4.5 をベースとしていた CbC-GCC を GCC-4.6 へのアップデートを行い, Intel64 に対応するとともに, CbC の拡張を行う. % }{ \section{Continuation based C (CbC)} CbC のプログラムはコードセグメント毎に記述され, コード間をgoto(軽量継続)により処理を移る. 構文は C と同じであるが, ループ制御や関数コールが取り除かれる. %Continuation based C (以下CbC) は当研究室で開発しているプログラミング言語である. %構文は C と同じであるが,ループ制御や関数コールを取り除き継続(goto)を用いている. %また,コードセグメント単位で処理を記述するという特徴がある. %図\ref{fig:cs}は CbC におけるプログラムの処理の流れを表している. \subsection{継続(goto)} コードセグメントの記述は C の関数の構文と同じで, 型に“\verb+__code+” を使うことで宣言できる. コードセグメントへの移動は“goto” の後にコードセグメント名と引数を並べて記述することで行える. 図\ref{fig:cs}はコードセグメント間の処理の流れを表している. %コードセグメントへと移った処理は C の関数と違って呼び出し元の関数に戻ることはない. %コードセグメントは自身の処理が終えると goto により次のコードセグメントへと処理に移る. %この goto によるコードセグメント間の移動を継続と言う. %継続の実態は jmp による関数の移動となる. \begin{figure}[htpb] \begin{center} \scalebox{0.35}{\includegraphics{figure/codesegment.eps}} \end{center} \caption{コードセグメント間の継続(goto)} \label{fig:cs} \end{figure} \subsection{コードセグメント(code segment)} コードセグメントは C の関数と違って返り値を持たず, 処理が終われば次のコードセグメントへと処理を移る. C において関数呼び出しを繰り返し行う場合, 呼び出された関数の引数の数だけスタックに値が積まれていく. だが, 返り値を持たないコードセグメントではスタックに値を積んでいく必要な無く, スタックは変更されない. 軽量継続により並列化, ループ制御, 関数コールとスタックの操作を意識した最適化がソースコードレベルで行えるようになる. 図\ref{fig:factorial}は CbC で書いたプログラムの例である. 与えられた数 x の階上を計算して出力するプログラムとなっている. \begin{figure} \lstinputlisting[language=c]{source/factorial.cbc} \caption{階上を計算する CbC プログラムの例} \label{fig:factorial} \end{figure} %CbC におけるプログラムの基本単位としてコードセグメントという概念がある. %コードセグメントの記述の仕方は C の関数と同じだが, 型に“\_\_code”を使って宣言を行うところだけが違う. %関数と同じように引数を持たせて継続させることもできる. %しかし,関数とは違ってリターンを行わない為返り値を取得することはできない. %コードセグメントは関数よりも小さな単位で記述される為,最適化がされやすくなる. %コードセグメントの記述の仕方は C の関数と同じで,引数を持たせて継続を行うことができる. \section{GCCの3つの内部表現} GCC-4.6 への実装の前に,GCC で扱われる3つの内部表現について触れておく. \subsection{3つの内部表現} GCC は内部で Generic Tree, GIMPLE, RTL という3つの内部表現を扱う. それぞれが 読み込んだソースコードは Generic Tree, GIMPLE, RTL の順に変換されていき, 最後にアセンブラ言語へと出力される. 図\ref{fig:ir}は GCC がソースコードを読み込みアセンブラ言語出力までの流れを表した図である. \begin{figure}[htpb] \begin{center} \scalebox{0.35}{\includegraphics{figure/ir.eps}} \end{center} \caption{GCC によるコンパイルの一連の流れ} \label{fig:ir} \end{figure} \subsubsection{Generic Tree} ソースコードより読み込んだ関数の情報を木構造で表したものが Generic Tree となる. 関数の返り値,引数,変数の型,条件式とプログラムの処理全てが木構造で表される. CbC の実装では parse の部分からこの Generic Tree 生成の部分に手が加わっている. \subsubsection{GIMPLE} Generic Tree で表現されたデータは GIMPLE というデータ構造に変換される. GIMPLE も Generic Tree と同じ構文木だが、より制約がかかった状態で作成された構文木となる. 制約は「1つの枝に4つ以上の子を持たせない」等といったもので, GIMPLE へと変換されたデータは Generic Tree より簡単な命令で表されることになり最適化がかけやすくなる. CbC の実装では特に修正は加えていない. \subsubsection{Register Transfer Language (RTL)} 構文木 GIMPLE は解析が行われた後 RTL へと変換される. RTL はレジスタの割り当てといった低レベルの表現で,アセンブラとほぼ同じ表現を行うことができる. プログラム内部では RTL も木構造で表される. CbC における継続は,この RTL への変換で行われる最適化の1つ Tail Call Elimination が重要となってくる. \section{GCC-4.6 への実装} 前節までで CbC の基本仕様と GCC でのアセンブラ出力までの流れを確認した. ここからは GCC-4.6 への実装について述べていく. %\subsection{“\_\_code” のパース} \subsection{Tail Call Elimination} CbC の継続の実装には GCC の最適化の1つ, Tail Call Elimination (末尾除去) を強制することで実装する. これにより, コードセグメント間の移動を, call ではなく jmp 命令で実現する. %Tail Call Elimination とは関数の最後の処理で別の関数呼び出しを行った際に, %call ではなく jmp を用いることができるという最適化である. 図\ref{fig:continue}は Tail Call Elimination が行われた際のプログラムの処理を表している. \begin{figure}[htpb] \begin{center} \scalebox{0.35}{\includegraphics{figure/continuation.eps}} \end{center} \caption{Tail Call Elimination} \label{fig:continue} \end{figure} funcB は jmp 命令で funcC を呼び出す. funcC は,返り値を funcB ではなく funcA へと返すことになる. \subsubsection{expand\_call} ある関数が Tail Call Elimination を行えるかどうかは \verb+expand_call+ 関数で判断される. \verb+expand_call+ 関数内でチェックされる Tail Call Elimination が行える条件は以下になる. \begin{itemize} \item caller 側と callee 側の戻値の型が一致している. \item 関数呼び出しがリターンの直前に行われている. \item 呼出先関数の引数に用いられるスタックサイズが呼出元関数のそれより少ない. \item 引数の並びのコピーに上書きがない. \end{itemize} CbC の実装では上記の条件を,以下の様にして解決させている. \begin{itemize} \item コードセグメントは void 型で統一する. Cの関数からコードセグメントに goto する場合は返す値の型チェックを行わない. \item goto の直後に retrun を置く. \item スタックサイズは関数宣言時に決まったサイズにする. \item 引数は一旦, 一時変数にコピーして重なりがないようにする. \end{itemize} スタックサイズを決め打ちで行うことで,ベースポインタを変えずにスタックを扱うことができる. これも CbC の1つの特徴である. 図\ref{fig:cs_stack}はコードセグメントの継続の際にスタックに積まれる引数を表している. \begin{figure}[htpb] \begin{center} \scalebox{0.33}{\includegraphics{figure/cs_stack.eps}} \end{center} \caption{継続による引数のスタック格納の様子} \label{fig:cs_stack} \end{figure} GCCでは, この他にもTCEを禁止しするルールがあり, GCC-4.5, 4.6 でも Tail Call Elimination にかからないコードセグメントがある. この点を改善する必要がある. \subsection{環境付き継続} CbC には通常の C の関数からコードセグメントに継続する際, その関数から値を戻す処理への継続を得ることができる. これを環境付き継続という. これらは, 以下の二種類の CbC で定義した特殊変数である. \verb+__environment+ は, 環境を表す情報である. \verb__return+ は, これを環境付き継続の行き先であり, 関数の戻値と \verb+__environment+ の二つの引数を持つ コードセグメントである. 例えば, 以下のように使うと, \verb+main()+ は 1 を返す. \begin{verbatim} __code c1(__code ret(int,void *),void *env) { goto ret(1,env); } int main() { goto c1(__return, __environment); } \end{verbatim} GCC内部では, \verb+__return+ は, 関数内で定義された \verb+_cbc_internal_return+関数へのポインタを返す. 戻値は, \verb+cbc_internal_return+ 関数内で定義された変数\verb+retval+を通して返される(Listing\ref{code:_ret_val}). \begin{figure}[h] \begin{minipage}[b]{.45\textwidth} \begin{lstlisting}[caption=環境付き継続を行うコード,label=code:_ret_val] __label__ _cbc_exit0; static int retval; // should be thread local void _cbc_internal_return(int retval_, void *_envp){ retval = retval_; goto _cbc_exit0; } if (0) { _cbc_exit0: return retval; } _cbc_internal_return; \end{lstlisting} \end{minipage} \hfill \end{figure} \subsubsection{環境付き継続の問題} 現在環境付き継続は このコードを GCC 内部で生成することで実現している. これは正しく動作しているが, \verb+retval+に static を指定してしまうと, スレッドセーフな実装でなくなる. これを通常の変数にすると, 関数内の関数は closure として実装される. しかし, GCC 4.6 と Lion の 組合せでは closure は正しく動作してないことがわかった. Thread local 変数を用いると, やはり closure が出力されてしまう. 本来は, 戻値用のレジスタが使用されれば問題ないが, 戻値の型は整数やポインタとは限らず, 浮動小数点や構造体自体である可能性があり複雑である. 一つの解決策はレジスタ渡しと考えているが, 他の方法もありえる. 少し重いが setjmp を用いた実装方法もある. \subsection{引数渡し} 通常コードセグメントの継続において, 引数は C の関数と同じスタックを用いて渡される. GCC には引数渡しをスタックではなくレジスタを用いて行う機能として fastcall がある. fastcall を用いてコードセグメントを宣言することで, レジスタを用いた速度の向上を図る. \subsubsection{fastcall} C において fastcall を用いる場合は関数にキーワード “\_\_attribute\_\_ ((fastcall))” をつけて行う. だが, コードセグメントを全てこのキーワードをつけて宣言することは実用できではない. そこで, コードセグメントで宣言された場合, fastcall が自動で付くように実装を行う. 図\ref{fig:fastcall}はコードセグメントに fastcall 属性を付与しているソースである. %\lstinputlisting[language=c]{source/fastcall.c} \begin{figure}[htpb] \begin{center} \scalebox{0.33}{\includegraphics{figure/fastcall.eps}} \end{center} \caption{コードセグメントへのfastcall属性付与} \label{fig:fastcall} \end{figure} if 文で条件を決めているのは, 64 bit の場合 fastcall が標準で行われ, fastcall 属性を付けると warning を出すからである. \subsection{typedefrecの実装の構想} C を基本とした CbC には型推論がない. \begin{figure}[h] \begin{minipage}[b]{.45\textwidth} \begin{lstlisting}[caption=typedefrecの例,label=code:typedefrec] typedefrec void *funcA(int, funcA); typedefrec struct { node left; node right; } *NODE; \end{minipage} \hfill \end{figure} \section{評価} 今回実装を行った GCC-4.6 ベースのコンパイラを GCC-4.4 ベース, Micro-C コンパイラとそれぞれ比較を行った. 比較を行うのはクイックソートのプログラムである. クイックソートは再帰的にプログラムされる為 CbC に向いている プログラムだと言える. 比較を行うのは以下のアーキテクチャと OS になる. %\begin{description} \begin{itemize} \item x86/Linux \item x86/OS X \end{itemize} %\end{description} また,比較を行うプログラムは最適化(-O0 オプション)を行わないものと, 速度最適化(-O2 -fomit-frame-pointer)を行うものの2つ, それと -m32 オプションと -m64 オプションをつけたものそれぞれで行う. 表\ref{tab:speed-mc-vs-gcc-nonopt}が最適化無し, 表\ref{tab:speed-mc-vs-gcc-opt}が速度最適化有りとなる. \begin{table}[htpb] \centering \small \begin{tabular}{|c|c|c|c|} \hline CPU/OS &GCC-4.4& GCC-4.6 &Micro-C \\ \hline x86/Linux & 7.378 & 0.829 & 2.890 \\ \hline x86\_64/OS X(-m32)& 3.890 & 0.382 & 2.288 \\ \hline x86\_64/OS X & 4.078 & 0.450 & \\ \hline \end{tabular} \caption{アーキテクチャ毎のGCCとmicro-cの速度比較(単位: 秒)(最適化無し)} \label{tab:speed-mc-vs-gcc-nonopt} \end{table} \begin{table}[htpb] \centering \small \begin{tabular}{|c|c|c|c|} \hline CPU/OS &GCC-4.4& GCC-4.6 &Micro-C \\ \hline x86/Linux & 3.252 & 2.906 & 2.890 \\ \hline x86\_64/OS X(-m32)& 1.827 & 0.934 & 2.288 \\ \hline x86\_64/OS X & 1.101 & 2.896 & \\ \hline \end{tabular} \caption{アーキテクチャ毎のGCCとmicro-cの速度比較(単位: 秒)(速度最適化)} \label{tab:speed-mc-vs-gcc-opt} \end{table} \begin{thebibliography}{7} \bibitem{1}{河野真治}: “継続を基本とした言語 CbC の gcc 上の実装”. 日本ソフトウェア科学会第 19 回大会論文集, Sep, 2002 \bibitem{2}{河野真治}: “継続を持つ C の回言語によるシステム記述”. 日本ソフトウェア科学会第 17 回大会論文集, Sep, 2000 \bibitem{3}{与儀健人,河野真治}: “Continuation based CコンパイラのGCC-4.2による実装”. 琉球大学 情報工学科 学位論文, 2008 \bibitem{4}{与儀健人,河野真治}: “組み込み向け言語Continuation based C のGCC上の実装”. 琉球大学大学院 理工学研究科 学位論文(修士), 2010 \bibitem{5}{下地篤樹,河野真治}: “線形時相論理を用いたContinuation based C プログラムの検証”. 琉球大学大学院 理工学研究科 情報工学専攻 学位論文(修士), 2008 \bibitem{6}{楊挺,河野真治}: “Continuation based C の実装”. 琉球大学大学院 理工学研究科 情報工学専攻 学位論文(修士), 2002 \bibitem{7}{GNU Compiler Collection (GCC) Internals}: “http://gcc.gnu.org/onlinedocs/gccint/” \end{thebibliography} \end{document} \ No newline at end of file +\documentclass[private]{ipsjpapers} %\documentstyle{ipsjpapers} \usepackage[dvipdfmx]{graphicx} \usepackage{url} \usepackage{multirow} %% tabularの上下の結合 \usepackage{slashbox} %% tabularでの斜め線 \usepackage{listings} \usepackage{jtygm} % 巻数,号数などの設定 %\setcounter{巻数}{41} %\setcounter{号数}{6} %\setcounter{volpageoffset}{1234} %\受付{12}{2}{4} %\採録{12}{5}{11} \pagestyle{empty} % ユーザが定義したマクロなど. \makeatletter \let\@ARRAY\@array \def\@array{\def\<{\inhibitglue}\@ARRAY} \def\<{\(\langle\)} \def\>{\(\rangle\)} %\def\|{\verb|} \def\Underline{\setbox0\hbox\bgroup\let\\\endUnderline} \def\endUnderline{\vphantom{y}\egroup\smash{\underline{\box0}}\\} \def\LATEX{\iLATEX\Large} \def\LATEx{\iLATEX\normalsize} \def\LATex{\iLATEX\small} \def\iLATEX#1{L\kern-.36em\raise.3ex\hbox{#1\bf A}\kern-.15em T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX} \def\LATEXe{\ifx\LaTeXe\undefined \LaTeX 2e\else\LaTeXe\fi} \def\LATExe{\ifx\LaTeXe\undefined \iLATEX\scriptsize 2e\else\LaTeXe\fi} \def\Quote{\list{}{}\item[]} \let\endQuote\endlist \def\TT{\if@LaTeX@e\tt\fi} \def\CS#1{\if@LaTeX@e\tt\expandafter\string\csname#1\endcsname\else $\backslash$#1\fi} %\checklines % 行送りを確認する時に使用 \begin{document}%{ % 和文表題 \title[Continuation based C の GCC 4.6 上の実装について]% {Continuation based C の GCC 4.6 上の実装について} % 英文表題 \etitle{The implementation of Continuation based C Compiler on GCC 4.6} % 所属ラベルの定義 \affilabel{URYUKYU}{琉球大学\\University of the Ryukyu} % 和文著者名 \author{大城 信康\affiref{URYUKYU}\nomember\and 河野 真治\affiref{URYUKYU}\member{19841765}} % 英文著者名 \eauthor{Nobuyasu Oshiro\affiref{URYUKYU}\and Shinji Kono\affiref{URYUKYU}} % 連絡先(投稿時に必要.製版用では無視される.) \contact{大城 信康\\ 〒903-0213 沖縄県中頭郡西原町字千原1番地\\ 琉球大学 情報工学科\\ TEL: (098)895-8723\qquad FAX: (098)895-8727\\ email: dimolto@cr.ie.u-ryukyu.ac.jp} % 和文概要 \begin{abstract} GCC-4.6 をベースとした CbC コンパイラの実装を行った. CbC のコンパイラは GCC-4.2 ベースのコンパイラが2008年に開発されており, 以来 GCC のアップデートにあわせて CbC のコンパイラもアップデートが行われてきた. 今回は GCC-4.6 への実装を行った. 本論文では GCC-4.6 への CbC の具体的な実装について述べる。 %当研究室では継続を基本としたプログラミング言語 Continuation basede C (以下CbC) を開発している. %また,CbC 自体の開発と共に CbC のコンパイラの開発も行っている. %お陰で GCC の最適化やデバッグの機能を CbC のプログラミングで扱うことができるようになった. \end{abstract} % 英文概要 \begin{eabstract} We implemented Continuation based C Compiler on GCC-4.6. CbC Compiler on GCC-4.2 was developed on 2008. Since then we kept to update it. In this paper, we introduce implemented Continuation based C Compiler on GCC-4.6. %Continuation based C is programming language. It is developing our laboratory. \end{eabstract} % 表題などの出力 \maketitle \thispagestyle{empty} % }{ % 本文はここから始まる \section{歴史的経緯} %当研究室では, 継続により処理を行うプログラミング言語 Continuation based C (以下CbC) を開発している. %CbC の構文は C と同じであるが,継続によりループ制御や関数コールが取り除かれる. 当研究室ではコードセグメント (Code Segment) 単位で記述するプログラミング言語 Continuation based C (以下CbC) を開発している. コードセグメントは並列実行の単位として使うことができ, プログラムの正しさを示す単位としても使用することができる.これにより, Many Core での並列実行を高い性能と高い信頼性で実現することができると考えている. CbC のコンパイルには元々 Micoro-C 版の独自のコンパイラを用いていたが, 2008年の研究において GCC-4.2 ベースの CbC コンパイラが開発され, 2010年には GCC-4.4 へとアップデートが行われた. GCC への実装により,GCC の最適化やデバッガの機能を使うことができより実用的な CbC プログラミングが行えるようになった. %以来,GCC のアップデートに合わせて GCC ベースの CbC コンパイラのアップデートを行って来ている. %今回,CbC コンパイラを GCC-4.6 へとアップデートを行った. %本論文では, CbC,GCC の簡単な説明と,GCC-4.6 への実装を述べる. だが, GCC をベースとした CbC のコンパイラ (以下 CbC-GCC)は, GCC のアップデートに合わせて変更する必要がある. 本研究では, GCC-4.5 をベースとしていた CbC-GCC を GCC-4.6 へのアップデートを行い, Intel64 に対応するとともに, CbC の拡張を行う. % }{ \section{Continuation based C (CbC)} CbC のプログラムはコードセグメント毎に記述され, コード間をgoto(軽量継続)により処理を移る. 構文は C と同じであるが, ループ制御や関数コールが取り除かれる. %Continuation based C (以下CbC) は当研究室で開発しているプログラミング言語である. %構文は C と同じであるが,ループ制御や関数コールを取り除き継続(goto)を用いている. %また,コードセグメント単位で処理を記述するという特徴がある. %図\ref{fig:cs}は CbC におけるプログラムの処理の流れを表している. \subsection{継続(goto)} コードセグメントの記述は C の関数の構文と同じで, 型に“\verb+__code+” を使うことで宣言できる. コードセグメントへの移動は“goto” の後にコードセグメント名と引数を並べて記述することで行える. 図\ref{fig:cs}はコードセグメント間の処理の流れを表している. %コードセグメントへと移った処理は C の関数と違って呼び出し元の関数に戻ることはない. %コードセグメントは自身の処理が終えると goto により次のコードセグメントへと処理に移る. %この goto によるコードセグメント間の移動を継続と言う. %継続の実態は jmp による関数の移動となる. \begin{figure}[htpb] \begin{center} \scalebox{0.35}{\includegraphics{figure/codesegment.eps}} \end{center} \caption{コードセグメント間の継続(goto)} \label{fig:cs} \end{figure} \subsection{コードセグメント(code segment)} コードセグメントは C の関数と違って返り値を持たず, 処理が終われば次のコードセグメントへと処理を移る. C において関数呼び出しを繰り返し行う場合, 呼び出された関数の引数の数だけスタックに値が積まれていく. だが, 返り値を持たないコードセグメントではスタックに値を積んでいく必要な無く, スタックは変更されない. 軽量継続により並列化, ループ制御, 関数コールとスタックの操作を意識した最適化がソースコードレベルで行えるようになる. 図\ref{fig:factorial}は CbC で書いたプログラムの例である. 与えられた数 x の階上を計算して出力するプログラムとなっている. \begin{figure} \lstinputlisting[language=c]{source/factorial.cbc} \caption{階上を計算する CbC プログラムの例} \label{fig:factorial} \end{figure} %CbC におけるプログラムの基本単位としてコードセグメントという概念がある. %コードセグメントの記述の仕方は C の関数と同じだが, 型に“\_\_code”を使って宣言を行うところだけが違う. %関数と同じように引数を持たせて継続させることもできる. %しかし,関数とは違ってリターンを行わない為返り値を取得することはできない. %コードセグメントは関数よりも小さな単位で記述される為,最適化がされやすくなる. %コードセグメントの記述の仕方は C の関数と同じで,引数を持たせて継続を行うことができる. \section{GCCの3つの内部表現} GCC-4.6 への実装の前に,GCC で扱われる3つの内部表現について触れておく. \subsection{3つの内部表現} GCC は内部で Generic Tree, GIMPLE, RTL という3つの内部表現を扱う. それぞれが 読み込んだソースコードは Generic Tree, GIMPLE, RTL の順に変換されていき, 最後にアセンブラ言語へと出力される. 図\ref{fig:ir}は GCC がソースコードを読み込みアセンブラ言語出力までの流れを表した図である. \begin{figure}[htpb] \begin{center} \scalebox{0.35}{\includegraphics{figure/ir.eps}} \end{center} \caption{GCC によるコンパイルの一連の流れ} \label{fig:ir} \end{figure} \subsubsection{Generic Tree} ソースコードより読み込んだ関数の情報を木構造で表したものが Generic Tree となる. 関数の返り値,引数,変数の型,条件式とプログラムの処理全てが木構造で表される. CbC の実装では parse の部分からこの Generic Tree 生成の部分に手が加わっている. \subsubsection{GIMPLE} Generic Tree で表現されたデータは GIMPLE というデータ構造に変換される. GIMPLE も Generic Tree と同じ構文木だが、より制約がかかった状態で作成された構文木となる. 制約は「1つの枝に4つ以上の子を持たせない」等といったもので, GIMPLE へと変換されたデータは Generic Tree より簡単な命令で表されることになり最適化がかけやすくなる. CbC の実装では特に修正は加えていない. \subsubsection{Register Transfer Language (RTL)} 構文木 GIMPLE は解析が行われた後 RTL へと変換される. RTL はレジスタの割り当てといった低レベルの表現で,アセンブラとほぼ同じ表現を行うことができる. プログラム内部では RTL も木構造で表される. CbC における継続は,この RTL への変換で行われる最適化の1つ Tail Call Elimination が重要となってくる. \section{GCC-4.6 への実装} 前節までで CbC の基本仕様と GCC でのアセンブラ出力までの流れを確認した. ここからは GCC-4.6 への実装について述べていく. %\subsection{“\_\_code” のパース} \subsection{Tail Call Elimination} CbC の継続の実装には GCC の最適化の1つ, Tail Call Elimination (末尾除去) を強制することで実装する. これにより, コードセグメント間の移動を, call ではなく jmp 命令で実現する. %Tail Call Elimination とは関数の最後の処理で別の関数呼び出しを行った際に, %call ではなく jmp を用いることができるという最適化である. 図\ref{fig:continue}は Tail Call Elimination が行われた際のプログラムの処理を表している. \begin{figure}[htpb] \begin{center} \scalebox{0.35}{\includegraphics{figure/continuation.eps}} \end{center} \caption{Tail Call Elimination} \label{fig:continue} \end{figure} funcB は jmp 命令で funcC を呼び出す. funcC は,返り値を funcB ではなく funcA へと返すことになる. \subsubsection{expand\_call} ある関数が Tail Call Elimination を行えるかどうかは \verb+expand_call+ 関数で判断される. \verb+expand_call+ 関数内でチェックされる Tail Call Elimination が行える条件は以下になる. \begin{itemize} \item caller 側と callee 側の戻値の型が一致している. \item 関数呼び出しがリターンの直前に行われている. \item 呼出先関数の引数に用いられるスタックサイズが呼出元関数のそれより少ない. \item 引数の並びのコピーに上書きがない. \end{itemize} CbC の実装では上記の条件を,以下の様にして解決させている. \begin{itemize} \item コードセグメントは void 型で統一する. Cの関数からコードセグメントに goto する場合は返す値の型チェックを行わない. \item goto の直後に retrun を置く. \item スタックサイズは関数宣言時に決まったサイズにする. \item 引数は一旦, 一時変数にコピーして重なりがないようにする. \end{itemize} スタックサイズを決め打ちで行うことで,ベースポインタを変えずにスタックを扱うことができる. これも CbC の1つの特徴である. 図\ref{fig:cs_stack}はコードセグメントの継続の際にスタックに積まれる引数を表している. \begin{figure}[htpb] \begin{center} \scalebox{0.33}{\includegraphics{figure/cs_stack.eps}} \end{center} \caption{継続による引数のスタック格納の様子} \label{fig:cs_stack} \end{figure} GCCでは, この他にもTCEを禁止しするルールがあり, GCC-4.5, 4.6 でも Tail Call Elimination にかからないコードセグメントがある. この点を改善する必要がある. \subsection{環境付き継続} CbC には通常の C の関数からコードセグメントに継続する際, その関数から値を戻す処理への継続を得ることができる. これを環境付き継続という. これらは, 以下の二種類の CbC で定義した特殊変数である. \verb+__environment+ は, 環境を表す情報である. \verb__return+ は, これを環境付き継続の行き先であり, 関数の戻値と \verb+__environment+ の二つの引数を持つ コードセグメントである. 例えば, 以下のように使うと, \verb+main()+ は 1 を返す. \begin{verbatim} __code c1(__code ret(int,void *),void *env) { goto ret(1,env); } int main() { goto c1(__return, __environment); } \end{verbatim} GCC内部では, \verb+__return+ は, 関数内で定義された \verb+_cbc_internal_return+関数へのポインタを返す. 戻値は, \verb+cbc_internal_return+ 関数内で定義された変数\verb+retval+を通して返される(Listing\ref{code:_ret_val}). \begin{figure}[h] \begin{minipage}[b]{.45\textwidth} \begin{lstlisting}[caption=環境付き継続を行うコード,label=code:_ret_val] __label__ _cbc_exit0; static int retval; // should be thread local void _cbc_internal_return(int retval_, void *_envp){ retval = retval_; goto _cbc_exit0; } if (0) { _cbc_exit0: return retval; } _cbc_internal_return; \end{lstlisting} \end{minipage} \hfill \end{figure} \subsubsection{環境付き継続の問題} 現在環境付き継続は このコードを GCC 内部で生成することで実現している. これは正しく動作しているが, \verb+retval+に static を指定してしまうと, スレッドセーフな実装でなくなる. これを通常の変数にすると, 関数内の関数は closure として実装される. しかし, GCC 4.6 と Lion の 組合せでは closure は正しく動作してないことがわかった. Thread local 変数を用いると, やはり closure が出力されてしまう. 本来は, 戻値用のレジスタが使用されれば問題ないが, 戻値の型は整数やポインタとは限らず, 浮動小数点や構造体自体である可能性があり複雑である. 一つの解決策はレジスタ渡しと考えているが, 他の方法もありえる. 少し重いが setjmp を用いた実装方法もある. \subsection{引数渡し} 通常コードセグメントの継続において, 引数は C の関数と同じスタックを用いて渡される. GCC には引数渡しをスタックではなくレジスタを用いて行う機能として fastcall がある. fastcall を用いてコードセグメントへ継続することで, 速度の向上を図る. \subsubsection{fastcall} C において fastcall を用いる場合は関数にキーワード “\_\_attribute\_\_ ((fastcall))” をつけて行う. だが, コードセグメントを全てこのキーワードをつけて宣言することは実用できではない. そこで, コードセグメントで宣言された場合, fastcall が自動で付くように実装を行う. 図\ref{fig:fastcall}はコードセグメントに fastcall 属性を付与しているソースである. %\lstinputlisting[language=c]{source/fastcall.c} \begin{figure}[htpb] \begin{center} \scalebox{0.33}{\includegraphics{figure/fastcall.eps}} \end{center} \caption{コードセグメントへのfastcall属性付与} \label{fig:fastcall} \end{figure} if 文で条件を決めているのは, 64 bit の場合 fastcall が標準で行われ, fastcall 属性を付けると warning を出すからである. \subsection{typedefrecの実装の構想} C を基本とした CbC には型推論がない. \begin{figure}[h] \begin{minipage}[b]{.45\textwidth} \begin{lstlisting}[caption=typedefrecの例,label=code:typedefrec] typedefrec void *funcA(int, funcA); typedefrec struct { node left; node right; } *NODE; \end{lstlisting} \end{minipage} \hfill \end{figure} \section{評価} 今回実装を行った GCC-4.6 ベースのコンパイラを GCC-4.4 ベース, Micro-C コンパイラとそれぞれ比較を行った. 比較を行うのはクイックソートのプログラムである. クイックソートは再帰的にプログラムされる為 CbC に向いている プログラムだと言える. 比較を行うのは以下のアーキテクチャと OS になる. %\begin{description} \begin{itemize} \item x86/Linux \item x86/OS X \end{itemize} %\end{description} また,比較を行うプログラムは最適化(-O0 オプション)を行わないものと, 速度最適化(-O2 -fomit-frame-pointer)を行うものの2つ, それと -m32 オプションと -m64 オプションをつけたものそれぞれで行う. 表\ref{tab:speed-mc-vs-gcc-nonopt}が最適化無し, 表\ref{tab:speed-mc-vs-gcc-opt}が速度最適化有りとなる. \begin{table}[htpb] \centering \small \begin{tabular}{|c|c|c|c|} \hline CPU/OS &GCC-4.4& GCC-4.6 &Micro-C \\ \hline x86/Linux & 7.378 & 0.829 & 2.890 \\ \hline x86\_64/OS X(-m32)& 3.890 & 0.382 & 2.288 \\ \hline x86\_64/OS X & 4.078 & 0.450 & \\ \hline \end{tabular} \caption{アーキテクチャ毎のGCCとmicro-cの速度比較(単位: 秒)(最適化無し)} \label{tab:speed-mc-vs-gcc-nonopt} \end{table} \begin{table}[htpb] \centering \small \begin{tabular}{|c|c|c|c|} \hline CPU/OS &GCC-4.4& GCC-4.6 &Micro-C \\ \hline x86/Linux & 3.252 & 2.906 & 2.890 \\ \hline x86\_64/OS X(-m32)& 1.827 & 0.934 & 2.288 \\ \hline x86\_64/OS X & 1.101 & 2.896 & \\ \hline \end{tabular} \caption{アーキテクチャ毎のGCCとmicro-cの速度比較(単位: 秒)(速度最適化)} \label{tab:speed-mc-vs-gcc-opt} \end{table} \nocite{kono:2002a, kono:2008a, yogi:2008a, gcc_internals} \bibliographystyle{junsrt} \bibliography{cbc.bib} \end{document} \ No newline at end of file