Mercurial > hg > Papers > 2008 > kent-graduation
view resume2.tex @ 9:6e7e571d96e2 default tip
*** empty log message ***
author | kent |
---|---|
date | Mon, 17 Mar 2008 12:55:42 +0900 |
parents | 01f8838d91fd |
children |
line wrap: on
line source
\documentclass[twocolumn,twoside,9.5pt]{jarticle} \usepackage[dvips]{graphicx} \usepackage{picins} \usepackage{float} \usepackage{fancyhdr} \pagestyle{fancy} \lhead{\parpic{\includegraphics[height=1zw,clip,keepaspectratio]{figures/emblem-bitmap.eps}}琉球大学主催 工学部情報工学科 卒業研究発表会} \rhead{} \cfoot{} \setlength{\topmargin}{-1in \addtolength{\topmargin}{15mm}} \setlength{\headheight}{0mm} \setlength{\headsep}{5mm} \setlength{\oddsidemargin}{-1in \addtolength{\oddsidemargin}{11mm}} \setlength{\evensidemargin}{-1in \addtolength{\evensidemargin}{21mm}} \setlength{\textwidth}{181mm} \setlength{\textheight}{261mm} \setlength{\footskip}{0mm} \pagestyle{empty} \begin{document} \title{Continuation based CコンパイラのGCC-4.2による実装} \author{045760E 与儀健人 \hspace{2cm} 指導教員 : 河野真治} \date{} \maketitle \thispagestyle{fancy} \section{はじめに} 当研究室ではContinuation based C(以下CbC)という言語を提案している。 これまでCbCのコンパイルにはMicro-Cをベースとした当研究室独自のコンパイラを 使用していた。 また、河野氏による以前の論文\cite{kono1}にて、Tail call optimizationを用いることで GCC上でも実装可能である事が示されている。 この様な背景から、CbCをGCCでコンパイルしたいという要望がでてきた。 本研究ではこの言語をGCCへ移植することを目的とする。 それによりGCCの最適化機構によるCbCのコード性能の向上、 また複数のアーキテクチャへの対応を目指す。 \section{Continuation based Cについて} Continuation based C (以下CbC) は当研究室が提案するアセンブラよりも上 位でC よりも下位な記述言語である\cite{kono2}。 Cの仕様からループ制御や関数コールを取り除き、 継続(goto) や code segmentを導入している。 これによりスタックの操作やループ、関数呼び出しなどのより低レベルでの最適化を、 ソースコードレベルで行うことができる。 図\ref{fig:continuation}にこの様子を表す。 \begin{figure}[H] \begin{center} \includegraphics[width=.45\textwidth]{figures/continuation.eps} \end{center} \caption{code segment間の``継続''} \label{fig:continuation} \end{figure}% \section{The GNU Compiler Collection} \subsection{GCCの基本構成} GCCは主に次のような手順でソースコードをコンパイルする。 \begin{description} \item[parsing] 一般的なコンパイラと同じく、GCCもまずはパーサによって ソースコードを解析し、解析した結果はGeneric Treeと呼ばれる tree構造の構造体に格納される \item[gimplification] この段階ではGeneric Treeをもとにこれを GIMPLEに変換していく。 \item[GIMPLE optimization] 前段階で変換したGIMPLEに対して最適化を行う。 \item[RTL generation] ここで、GIMPLEをもとにRTLを生成する。 この段階でほぼ言語依存性がなくなる。 \item[RTL optimization] 前段階で生成されたRTLに対して最適化を行う。 \item[Output assembly] 最後にRTLをもとにターゲットマシンのアセンブリに変換する。 \end{description} これらの様子を図\ref{fig:GCC-pass}に示す。 \begin{figure}[H] \begin{center} \includegraphics[width=.45\textwidth]{figures/GCC-pass.eps} \end{center} \caption{GCCのpass} \label{fig:GCC-pass} \end{figure} \subsection{Tail call elimination} GCCの最適化には``Tail call elimination''と呼ばれる、関数呼び出しを 最適化するものがある。 ``Tail call elimination''は通常call命令を使用すべき 関数呼び出しで、jump命令に変更するというものである。 この最適化の概要を図\ref{fig:Tail call}にしめす。 \begin{figure}[H] \begin{center} \includegraphics[width=.4\textwidth]{figures/GCC-TailCall.eps} \end{center} \caption{Tail call eliminationの例} \label{fig:Tail call} \end{figure} \section{GCCへの実装} 河野氏の論文``継続を基本とした言語CbCのgcc上の実装''\cite{kono1} にて、Tail call optimizationをもちいてCbCのgotoが実装できる事が 示されている。 実装の流れとしては次のようになる。 \begin{enumerate} \item \_\_code トークンの追加(Tokenizerで読み込めるようにする) \item code segmentのパース及びtree生成 \item CbCのgoto ステートメントのパース及びtree生成 \item gotoステートメントtreeのRTLへの変換 \item その他エラーメッセージ処理やコード改良 \end{enumerate} 最も重要なところがRTL生成である。 ここではtail call可能なフラグのついた関数コールをRTLに変換することになる。 これは通常は\verb|expand_call|という巨大な関数にて生成されている。 \verb|expand_call|ではtail callが可能かを詳しくチェックして、可能であれば tialcall用のCALL\_INSN RTL. 不可と判定されれば通常のCALL\_INSN RTLを生成している。 しかし、goto先がcode segmentであれば 強制的にtailcall用のCALL\_INSNを生成する必要がある。 そこで実装の際には\verb|expand_cbc_goto|という新たな関数を作り、 CbCのgoto処理はそこで全て行うようにした。 \section{評価} 本研究によって、GCCによるCbCのコンパイルが可能になった。 その評価としては両コンパイラによってコンパイルされたコードの 実行速度を測れば良いだろう。 評価にはこれまでもMicro-Cの評価に用いてきたconv1という簡単な プログラムを用いた。 測定結果は表\ref{tab:mc,gcc,compare}に示される。 \begin{table}[H] \centering \begin{tabular}{|l|r|r|r|r|} \hline & conv1 0 & conv1 1 & conv1 2 & conv1 3 \\ \hline Micro-C & 5.25 & 8.97 & 2.19 & 2.73 \\ \hline \hline GCC & 3.69 & 4.87 & 3.08 & 3.65 \\ \hline GCC (+omit) & 2.74 & 4.20 & 2.25 & 2.76 \\ \hline GCC (+fastcall) & 2.70 & 3.44 & 1.76 & 2.34 \\ \hline \hline TCC & 4.15 &122.28& 84.91&102.59\\ \hline \end{tabular} \caption{Micro-C, GCCの実行速度比較 (単位 秒)} \label{tab:mc,gcc,compare} \end{table} この評価から本研究における目的の一つ、``CbCコードの高速化''を 達成できたことが分かった。 \section{今後の課題} 本研究において、CbCを使う分にはほぼ問題はなくなったが、 まだ対応していない構文や、バグが以下の通り見つかっている。 \begin{description} \item[environment] CbCにはもう一つ、environment付きの継続という構文が存在する。 これは関数からcode segmentにgotoした場合に関数の呼び出し元に戻る ことを可能にするものだが、今回この実装は間に合わなかった。 \item[code segmentポインタの計算] 今の実装では\verb|goto cs->next(a, b);| のように呼び出し先code segmentを計算することができない。 \item[-O2オプションの強制] CbCは-O2オプションをつけないとコンパイルできない。 なのでファイル名が.cbcの場合はこれを強制させる必要がある。 \item[fastcall] code segmentではfastcallを強制させることで高速化が期待できる。 \end{description} この中から特に重要なのがenvironmentとcode segmentポインタの計算 への対応だと考えている。 この二つができればとりあえずCbCの現在の仕様を満たす。 これらに加えて、GCCにはすでにC++やObjective-Cのコンパイルが可能である。 これを活かし、CbC++, もしくはObjective-CbCといった既存の言語と CbCを組み合わせた言語に付いても考えてみる価値があるだろう。 \begin{thebibliography}{9} \bibitem{kono1} 河野真治. ``継続を基本とした言語CbCのgcc上の実装''. 日本ソフトウェア科学会第19回大会論文集, Sep, 2002. \bibitem{kono2} 河野真治. ``継続を持つCの下位言語によるシステム記述''. 日本ソフトウェア科学会第17回大会論文集, Sep, 2000. \bibitem{gcc1} GNU Project - Free Software Foundation, GCC internal manual. ``http://gcc.gnu.org/onlinedocs/gccint/''. \end{thebibliography} \end{document}