comparison cbc.tex @ 7:8ef81ff8cb52

emended.
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Fri, 12 Feb 2010 13:10:57 +0900
parents b59d31966d7d
children 4b2af58b0302
comparison
equal deleted inserted replaced
6:b59d31966d7d 7:8ef81ff8cb52
1 \chapter{Continuation based C (CbC)} 1 \chapter{Continuation based C (CbC)}
2 \label{chp:cbc} 2 \label{chp:cbc}
3 3
4 Continuation based C(以下CbC)は当研究室の提案する、アセンブラよりも 4 Continuation based C(以下CbC)は当研究室の提案する、アセンブラよりも
5 上位でCよりも下位な記述言語である。我々は様々な視点からこのCbCを使った 5 上位でCよりも下位な記述言語である。我々は様々な視点からこのCbCを用いた
6 研究を行っている。本章ではそのCbCの 6 研究を行っている。本章ではそのCbCの仕様と現在の状況について説明し、ま
7 仕様と現在の状況について説明し、またCbCを用いた研究例も紹介する。 7 たCbCを用いた研究例についても紹介する。
8 8
9 \section{CbCの要求仕様} 9 \section{CbCの要求仕様}
10 90 年代以降、ハードウェアの進歩がプログラミング言語よりも早く進みつつ 10 90 年代以降、ハードウェアの進歩がプログラミング言語よりも早く進みつつ
11 あり、70 年代、80 年代に設計された言語は矛盾を抱えて来ている。 11 あり、70 年代、80 年代に設計された言語は矛盾を抱えて来ている。
12 12
13 オブジェクト指向技術とそれに基づいたJava などの言語が注目されているが 13 オブジェクト指向技術とそれに基づいたJava などの言語が注目されているが
14 、これらの言語は動的な適合性を中心に設計されたものである。C などの低レ 14 、これらの言語は動的な適合性を中心に設計されたものである。C などの低レ
15 ベルな言語による記述に比べて、余分な条件判断(Method search, Meta level 15 ベルな言語による記述に比べて、余分な条件判断(Method search, Meta level
16 での実行) を増やしてしまい、コンパクトで高速な応答を期待される 16 での実行) を増やしてしまい、コンパクトで高速な応答を期待される
17 Real-time 処理や組み込み用途には適さない。 17 Real-time 処理や組み込み用途には適さない。この用途にはハードウェアに近
18 18 い記述が要求される。
19
20 %ハードウェアに一番近い言語はアセンブラであるがマクロアセンブラなどの記
21 %述はあまりにも低レベルであり、長年進歩していない。しかし使用可能なゲー
22 %ト数が増えるにつれ、RISC 的な対称性の高い小数の命令よりも、複雑なマル
23 %チメディア関係の命令などを持つCISC 的なCPU が増えてきている。そのため
24 %に既存の言語に対するコンパイラをその都度設計し直すことが必要になってき
25 %ている。
19 ハードウェアに一番近い言語はアセンブラであるがマクロアセンブラなどの記 26 ハードウェアに一番近い言語はアセンブラであるがマクロアセンブラなどの記
20 述はあまりにも低レベルであり、長年進歩していない。しかし使用可能なゲー 27 述はあまりにも低レベルであり、依存性が強く汎用的ではない。さらに使用可
21 ト数が増えるにつれ、RISC 的な対称性の高い小数の命令よりも、複雑なマル 28 能なゲート数が増えるにつれ、RISC 的な対称性の高い少数の命令よりも、複
22 チメディア関係の命令などを持つCISC 的なCPU が増えてきている。そのため 29 雑なSIMD命令やソフトウェアパイプライン命令を持つCPU が増えてきている。
23 に既存の言語に対するコンパイラを一々設計し直すことが必要になってきてい 30 そのために既存の言語に対するコンパイラをその都度設計し直すことが必要に
24 る。 31 なってきている。
25 32
26 VHDL, Verilog などのハードウェア記述言語は有限状態遷移の中に閉じており 33 VHDL, Verilog などのハードウェア記述言語は有限状態遷移の中に閉じており
27 、オブジェクト指向などの抽象化とはまったく別なものとなってしまっている。 34 、オブジェクト指向などの抽象化とはまったく別なものとなってしまっている。
28 35
29 このように3 つは全く異なる方向を向いている。コンパイラの自動生成などが 36 このようにハードウェア記述言語、アセンブラ、プログラミング言語の3つは
30 重要な研究テーマとなると考えられるが、ハードウェア記述言語、アセンブラ 37 全く異なる方向を向いている。コンパイラの自動生成などが重要な研究テーマ
31 、プログラミング言語の3 つが全く独立したものであれば困難なものになると 38 となると考えられるが、この3つが全く独立したものであれば困難なものにな
32 考えられる。 39 ると考えられる。
33 40
34 そこでCbC はこの3 つを埋めるべく以下のような要求仕様に従って設計された。 41 そこでCbC はこの3 つを埋めるべく以下のような要求仕様に従って設計された。
35 \begin{itemize} 42 \begin{itemize}
36 \item ハードウェアとスタックマシンの中間言語 43 \item ハードウェアとスタックマシンの中間言語
37 44
38 インタプリタ記述やコンパイラターゲットとして優れること。アーキテク 45 インタプリタ記述やコンパイラターゲットとして優れる。アーキテクチャ
39 チャ依存性が少ないこと、また、アーキテクチャ依存性をモデル化できる。 46 依存性が少ない。また、アーキテクチャ依存性をモデル化できる。
40 47
41 \item C 言語よりも下位の言語 48 \item C 言語よりも下位の言語
42 49
43 アセンブラよりも汎用性と記述性に優れC と互換であること。C をCbC に 50 アセンブラよりも汎用性と記述性に優れC と互換である。C をCbC にコン
44 コンパイルでき、ハンドコンパイルの結果を同値なコードに変換できる。 51 パイルでき、ハンドコンパイルの結果を同値なコードに変換できる。
45 52
46 \item 明確な実行モデル 53 \item 明確な実行モデル
47 54
48 C++やProlog のような複雑な実行モデルは好ましくなく、ハードウェアに 55 C++やProlog のような複雑な実行モデルは好ましくなく、ハードウェアに
49 実行順序の変更を許す範囲を広くする。 56 実行順序の変更を許す範囲を広くする。
53 Yacc のような表駆動やC のような巨大なswitch 文ではなく直接に状態遷 60 Yacc のような表駆動やC のような巨大なswitch 文ではなく直接に状態遷
54 移ができ実行できる。 61 移ができ実行できる。
55 62
56 \item Thread を実行モデルに内蔵できる 63 \item Thread を実行モデルに内蔵できる
57 64
58 並列処理記述法ではなく状態遷移として表現できる。 65 %並列処理記述法ではなく状態遷移として表現できる。
66 状態遷移記述とCbC上のスケジューラ実装によりスレッドを実現可能にす
67 る。
59 68
60 \item クリティカルパスの最適化 69 \item クリティカルパスの最適化
61 70
62 全体を散漫に最適化するコンパイルではなくクリティカルパスを見つけ出 71 全体を散漫に最適化するのではなく、実行ルーチンから重要な箇所を抜き
63 して最適化できる。 72 出し、アセンブラに近い最適化をソースコードレベルで実現する。
73
74 %全体を散漫に最適化するコンパイルではなくクリティカルパスを見つけ出
75 %して最適化できる。
64 \end{itemize} 76 \end{itemize}
65 77
66 これらの仕様はハードウェア記述とソフトウェア記述の両方を同時に行いつつ 78 これらの仕様はハードウェア記述とソフトウェア記述の両方を同時に行いつつ
67 、C よりも精密な実行記述を可能にするためのものである。また、CbC はプロ 79 、C よりも精密な実行記述を可能にするためのものである。また、CbC はプロ
68 グラム変換やコンパイラターゲットとして使うことを意識している。状態遷移 80 グラム変換やコンパイラターゲットとしての使用を意識している。状態遷移記
69 記述のみでは制御機構は静的なものになってしまう。CbC では状態遷移記述に 81 述のみでは制御機構は静的なものになってしまう。CbC では状態遷移記述に適
70 適した言語を作ることを考え、スタックマシンを避けてContinuation(継続) 82 した言語を作ることを考え、スタックマシンを避けてContinuation(継続)が
71 が導入されている。 83 導入されている。
72 84
73 85
74 \section{コードセグメントと継続} 86 \section{コードセグメントと継続}
75 87
76 \subsection{call-returnから継続制御へ} 88 \subsection{call-returnから継続制御へ}
100 \end{center} 112 \end{center}
101 \caption{継続制御} 113 \caption{継続制御}
102 \label{fig:continuation} 114 \label{fig:continuation}
103 \end{figure} 115 \end{figure}
104 116
117 \subsection{Schemeにおける継続制御}
118 継続とは一般的には「現在の処理を続行するための情報」と解釈されている。
119 継続制御はその情報をプログラム記述で操作するための構文である。
120 例としてSchemeでの継続の使用をコード\ref{code:scheme-cont}に挙げる。
121
122 %\lstset{morecomment=[is]{/*}{*/}} % /*コメント内を非表示にする*/
123 \lstinputlisting
124 [caption=Schemeでの継続制御の例,
125 label=code:scheme-cont,
126 language=Lisp,
127 morekeywords={cont,cont-test},
128 emph={gosh},
129 emphstyle=\bfseries\underbar]
130 {sources/scheme-cont-out.scmout}
131
132 この例では関数\verb|cont-test|内にて\verb|call/cc|を呼ぶことで、現在の
133 計算処理の``継続''を関数として変数\verb|cont|に保持している。
134
135 その後、\verb|(cont)|という命令でその関数を実行すると、contが代入され
136 た位置に処理が復帰する。そのため、直前の``before''は出力されずに
137 ``after''が出力されていることが分かる。\verb|cont|では関数の継続処理だ
138 けでなく、引数などの環境も一緒に保持しているので、この\verb|cont|は呼
139 ばれる度に \verb|i|カウントアップし、その値を返すことになる。
140
141
105 CbCはこの継続制御を基本として設計されており、その実現のためにコードセ 142 CbCはこの継続制御を基本として設計されており、その実現のためにコードセ
106 グメントと軽量継続という概念を用いている。 143 グメントと軽量継続という概念を用いている。
107 以下ではその二つについて説明する。 144 以下ではその二つについて説明する。
108 145
109 \subsection{コードセグメント} 146 \subsection{コードセグメント}
218 \end{center} 255 \end{center}
219 \caption{\_\_returnの例} 256 \caption{\_\_returnの例}
220 \label{fig:cbcreturn} 257 \label{fig:cbcreturn}
221 \end{figure}% 258 \end{figure}%
222 259
223 260 環境付きは実際にはCにおける\verb|setjmp()/longjmp()|とほぼ同じ処理であ
261 る。この二つの関数はCで継続を実現するために用いられる。例としてコード
262 \ref{code:setjmp}を挙げる。このコードでは\verb|setfunc|内で
263 \verb|setjmp|を使用している。\verb|setjmp|は通常は0を返すため、if文の
264 内部は実行されないが、その後\verb|longjmp|が実行されると、関連する
265 \verb|setjmp|が呼び出された環境に``継続''し、非零を返すためif文の中が
266 実行されることになる。この時、\verb|longjmp|の呼出側(この例では
267 \verb|jmpfunc|)の環境は失われる。
268
269 環境付き継続もこの動作によく似ており、if文内でreturnのみを記述すること
270 に相当する。
271
272 \lstset{morecomment=[is]{/*}{*/}} % /*コメント内を非表示にする*/
273 \lstinputlisting
274 [caption=setjmp/longjmpの例,
275 basicstyle=\footnotesize\ttfamily,%
276 commentstyle=\footnotesize\itshape\rmfamily,%
277 label=code:setjmp,
278 emph={setjmp,longjmp}]
279 {sources/setjmp.c}
280 \lstset{morecomment=[s]{/*}{*/}} % /*元に戻す*/
224 281
225 282
226 283
227 \section{CbCの用途・先行研究} 284 \section{CbCの用途・先行研究}
228 CbCによるプログラム記述の例として本研究室における研究例を紹介する。 285 CbCによるプログラム記述の例として本研究室における研究例を紹介する。
262 %\subsection{CbCによる分散プログラミング} 319 %\subsection{CbCによる分散プログラミング}
263 %現在の分散プログラミングには様々な手法がある。ネットワークAPIを直接使 320 %現在の分散プログラミングには様々な手法がある。ネットワークAPIを直接使
264 %う方法、SOAPやMPIなどのライブラリ、Telescripに見られる言語仕様への埋め 321 %う方法、SOAPやMPIなどのライブラリ、Telescripに見られる言語仕様への埋め
265 %込みなどがあった。これらは通信に関する複雑なセマンティクスを実現する手 322 %込みなどがあった。これらは通信に関する複雑なセマンティクスを実現する手
266 %段といえる。 323 %段といえる。
267 % TODO 324 % TODO 分散プログラミング
268 325
269 326
270 \section{CbCコンパイラの現状と問題点} 327 \section{CbCコンパイラの現状と本研究における目標}
271 \label{sec:cbc-problem} 328 \label{sec:cbc-problem}
272 329
273 \subsection{micro-cとGCC} 330 \subsection{micro-cとGCC}
274 331
275 CbCのコンパイラには二つの実装が用意されている。一つは2000年に当研究室 332 CbCのコンパイラには二つの実装が用意されている。一つは2000年に当研究室
280 337
281 GCCは元より多数のアーキテクチャに対応しており、高機能な最適化も備えて 338 GCCは元より多数のアーキテクチャに対応しており、高機能な最適化も備えて
282 いる。これらをCbCでも活用したいという要望からコンパイラ環境の移植が行 339 いる。これらをCbCでも活用したいという要望からコンパイラ環境の移植が行
283 われた。 340 われた。
284 341
285 \subsection{GCCベースコンパイラの問題点}\label{sec:gcc-problems} 342 \subsection{本研究における目標}\label{sec:gcc-problems}
286 343
287 この時の実装でコードセグメント、継続制御構造などは実装され、一通りの 344 この時の実装でコードセグメント、継続制御構造などは実装され、一通りの
288 CbCプログラムのコンパイルが可能となった。 345 CbCプログラムのコンパイルが可能となった。
289 346
290 しかし、前節に説明した環境付き継続はまだ実装に至っておらず、また継続制 347 本研究ではこのGCCベースのコンパイラをより実用的なCbCコンパイラとすべく
291 御構造の実装方法の影響により、いくつかの問題が発生している。 348 以下の項目を目標とする。
292 以下にその問題点を列記する。
293 %この問題に対せる解決を \ref{chp:impl}章にて説明する。
294 349
295 \begin{itemize} 350 \begin{itemize}
296 \item 環境付き継続 351 \item 環境付き継続
297 352
298 これは未実装の機能である。 353 Cとの互換性のための制御構造である環境付き継続を実装する。
299 仕様に若干変更があったので新しい仕様に対応したい。
300 354
301 \item 並列代入 355 \item 並列代入
302 356
303 CbCでは現在のコードセグメントのインタフェイスと次に継続するコード 357 これまでGCCベースのコンパイラでは、実装方法の影響から継続制御に一
304 セグメントの引数は同じメモリスペース(もしくはレジスタ)に格納して 358 部制限が存在した。これは実行中のコードセグメントの引数と継続制御に
305 いる。そのためコード\ref{code:parallel-example}のように変数の値を 359 渡す引数の順序が入れ替わる場合等に継続が行えないという制限である。
306 入れ替えるような処理では並列代入が行われることになる。 360
307 前実装では単純な並列代入に対しては問題がなかったが、構造体の混じる 361 並列代入を行うことで引数順序の影響はなくなり、この制限を排除できる。
308 複雑な並列代入ではバグが見つかっている。
309 \lstinputlisting
310 [caption=並列代入の例,
311 label=code:parallel-example]
312 {sources/parallel-example.cbc}
313 362
314 \item PowerPCにおける間接継続(indirect goto) 363 \item PowerPCにおける間接継続(indirect goto)
315 364
316 CbCで用いる継続制御は、Cでの関数ポインタを用いた間接呼び出し 365 Cでの関数ポインタを用いた間接呼び出し(indirect call)の様に、CbCで
317 (indirect call)の様にコードセグメントポインタを用いた間接継続が可 366 用いる継続制御においても、コードセグメントポインタを用いたメモリ参
318 能である。 367 照による間接的な継続が可能である。これを間接継続と呼んでいる。
368 コード\ref{code:indirect-example}のcodepointerへの継続が間接継続に
369 当たる。
319 \lstinputlisting[ 370 \lstinputlisting[
320 caption=間接継続の例(2つめのgoto文), 371 caption=間接継続の例(2つめのgoto文),
321 label=code:indirect-example] 372 label=code:indirect-example]
322 {sources/indirect-example.cbc} 373 {sources/indirect-example.cbc}
323 しかしPowerPCアーキテクチャでは最適化の問題でこの機能が働かないこ 374 しかしPowerPCアーキテクチャでは最適化の問題からこの間接継続がこれ
324 とが分かっている。 375 まで制限されていた。
325 376
326 間接継続はCbCでのプログラミングには必須であり、また本研究室の主要 377 間接継続はCbCでのプログラミングには必須であり、また本研究室の主要
327 プロジェクトであるCeriumはPS3をメインターゲットとしているため、こ 378 プロジェクトであるCeriumはPS3(PowerPCをもつ)をメインターゲットと
328 の対応は必須のものである。 379 しているため、この対応は必須のものである。
329 380
330 \item プロトタイプ宣言 381 \item プロトタイプ宣言の自動化
331 382
332 Cのプロトタイプ宣言はコンパイル時のエラー検出に役立っている。 383 Cのプロトタイプ宣言はコンパイル時のエラー検出に役立っているが、
333 しかしCbCのコードセグメントには返り値は存在しない。また状態遷移記 384 CbCでは返り値が存在しないなど、あまり重要な意味をなさない。
334 述という性質上、プログラムを記述する際は上から下に実行順にコードセ 385 また、micro-cではこれを極力排除するよう設計されているため、ソース
335 グメントを並べることが多いため、プロトタイプ宣言をするとそれが膨大 386 コードの互換性が薄れてしまう。
336 な数になる。 387
337 これはプログラミングにおける障害とも言える。 388 プロトタイプを自動生成することにより、この互換性を向上させる。
338 389
339 \item x86での継続制御のオーバヘッド 390 \item x86での継続制御の最適化
340 391
341 micro-c実装ではx86アーキテクチャでのコードセグメント継続の際には引 392 x86では、Cの関数呼び出し全ての引数をメモリに格納する。コードセグメ
342 数をレジスタに格納していた。しかしx86では、Cの関数呼び出しはデフォ 393 ントは関数をベースに作られているため、このABIに引きずられ実効速度
343 ルトでは全ての引数をメモリに格納する。コードセグメントは関数をベー 394 に影響をもたらしている。引数の一部をレジスタに格納することで、x86
344 スに作られているため、このABIに引きずられ実効速度に影響をもたらす。 395 における継続処理の高速化を行う。
345 396
397 \item メンテナンス性の向上
398
399 GCCのソースコードは200万行にものぼる。CbCコンパイラで修正するソー
400 スコードはそのごく一部であるが、GCCのアップデートによる修正はCbC用
401 のソースコードにも大きな影響をもたらす。
402 GCCの最新リリースに追従するためには、アップデートも考慮し、洗練さ
403 れたメンテナンス方法が必要になる。
346 404
347 \end{itemize} 405 \end{itemize}
348 406
349 これらの問題は、CbCを実用的なプログラムを開発する際の大きな障害となっ
350 ていた。
351 %特にPowerPCで間接継続ができないことで、当研究室が開発するPS3を主な対象としたシステムであるCeriumが実装不能であった。 407 %特にPowerPCで間接継続ができないことで、当研究室が開発するPS3を主な対象としたシステムであるCeriumが実装不能であった。
352 \ref{chp:impl}章ではこれらの問題の解決手法を説明する。 408 \ref{chp:impl}章ではこれらの項目の実装を行う。
353 409
354 410
355 411