annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 \chapter{Continuation based C (CbC)}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 \label{chp:cbc}
3
d2999e94b97d add gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
3
d2999e94b97d add gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
4 Continuation based C(以下CbC)は当研究室の提案する、アセンブラよりも
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
5 上位でCよりも下位な記述言語である。我々は様々な視点からこのCbCを用いた
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
6 研究を行っている。本章ではそのCbCの仕様と現在の状況について説明し、ま
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
7 たCbCを用いた研究例についても紹介する。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 \section{CbCの要求仕様}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 90 年代以降、ハードウェアの進歩がプログラミング言語よりも早く進みつつ
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 あり、70 年代、80 年代に設計された言語は矛盾を抱えて来ている。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 オブジェクト指向技術とそれに基づいたJava などの言語が注目されているが
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 、これらの言語は動的な適合性を中心に設計されたものである。C などの低レ
1
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
15 ベルな言語による記述に比べて、余分な条件判断(Method search, Meta level
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
16 での実行) を増やしてしまい、コンパクトで高速な応答を期待される
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
17 Real-time 処理や組み込み用途には適さない。この用途にはハードウェアに近
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
18 い記述が要求される。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
20 %ハードウェアに一番近い言語はアセンブラであるがマクロアセンブラなどの記
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
21 %述はあまりにも低レベルであり、長年進歩していない。しかし使用可能なゲー
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
22 %ト数が増えるにつれ、RISC 的な対称性の高い小数の命令よりも、複雑なマル
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
23 %チメディア関係の命令などを持つCISC 的なCPU が増えてきている。そのため
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
24 %に既存の言語に対するコンパイラをその都度設計し直すことが必要になってき
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
25 %ている。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 ハードウェアに一番近い言語はアセンブラであるがマクロアセンブラなどの記
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
27 述はあまりにも低レベルであり、依存性が強く汎用的ではない。さらに使用可
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
28 能なゲート数が増えるにつれ、RISC 的な対称性の高い少数の命令よりも、複
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
29 雑なSIMD命令やソフトウェアパイプライン命令を持つCPU が増えてきている。
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
30 そのために既存の言語に対するコンパイラをその都度設計し直すことが必要に
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
31 なってきている。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 VHDL, Verilog などのハードウェア記述言語は有限状態遷移の中に閉じており
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 、オブジェクト指向などの抽象化とはまったく別なものとなってしまっている。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
36 このようにハードウェア記述言語、アセンブラ、プログラミング言語の3つは
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
37 全く異なる方向を向いている。コンパイラの自動生成などが重要な研究テーマ
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
38 となると考えられるが、この3つが全く独立したものであれば困難なものにな
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
39 ると考えられる。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 そこでCbC はこの3 つを埋めるべく以下のような要求仕様に従って設計された。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 \begin{itemize}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 \item ハードウェアとスタックマシンの中間言語
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
45 インタプリタ記述やコンパイラターゲットとして優れる。アーキテクチャ
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
46 依存性が少ない。また、アーキテクチャ依存性をモデル化できる。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 \item C 言語よりも下位の言語
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
50 アセンブラよりも汎用性と記述性に優れC と互換である。C をCbC にコン
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
51 パイルでき、ハンドコンパイルの結果を同値なコードに変換できる。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 \item 明確な実行モデル
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 C++やProlog のような複雑な実行モデルは好ましくなく、ハードウェアに
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 実行順序の変更を許す範囲を広くする。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 \item 状態遷移を直接記述できる
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 Yacc のような表駆動やC のような巨大なswitch 文ではなく直接に状態遷
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 移ができ実行できる。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 \item Thread を実行モデルに内蔵できる
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
65 %並列処理記述法ではなく状態遷移として表現できる。
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
66 状態遷移記述とCbC上のスケジューラ実装によりスレッドを実現可能にす
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
67 る。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 \item クリティカルパスの最適化
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
71 全体を散漫に最適化するのではなく、実行ルーチンから重要な箇所を抜き
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
72 出し、アセンブラに近い最適化をソースコードレベルで実現する。
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
73
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
74 %全体を散漫に最適化するコンパイルではなくクリティカルパスを見つけ出
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
75 %して最適化できる。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 \end{itemize}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
77
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 これらの仕様はハードウェア記述とソフトウェア記述の両方を同時に行いつつ
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 、C よりも精密な実行記述を可能にするためのものである。また、CbC はプロ
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
80 グラム変換やコンパイラターゲットとしての使用を意識している。状態遷移記
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
81 述のみでは制御機構は静的なものになってしまう。CbC では状態遷移記述に適
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
82 した言語を作ることを考え、スタックマシンを避けてContinuation(継続)が
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
83 導入されている。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
84
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
85
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 \section{コードセグメントと継続}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
87
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 \subsection{call-returnから継続制御へ}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 Cなどの一般的な手続き型言語では、呼び出した手続きの処理のあと、呼出し
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 元の環境に復帰する。そのためプログラム全体においてスタックが用意され、
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 呼出し元はスタックに復帰先アドレス及び環境を保持しておく事で呼出し先か
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 らの復帰を可能とする。これはcall-return制御と呼ばれるものである(図
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 \ref{fig:call-return})。
1
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
94 しかし復帰先が決まっていて環境を受け継ぐことができれば、この
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
95 call-return制御は図 \ref{fig:continuation}の様に手続き呼び出しの前後で
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
96 分割する事ができ、スタック操作を伴わないシーケンシャルな呼び出しに変換
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
97 する事ができる。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 これは継続制御構造と呼ばれている。schemeのcall-with-continuationの実装
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 や、 Java,C++の例外処理、Cのsetjmp()/longjmp()による大域脱出もこの継続
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 制御の一種である。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 \begin{figure}[hptb]
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 \begin{center}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 %\includegraphics[width=\textwidth,bb=0 0 595 842]{figures/call-return.pdf}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 \includegraphics[width=.6\textwidth]{figures/call-return.eps}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 \end{center}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 \caption{call-return制御}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 \label{fig:call-return}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 \end{figure}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 \begin{figure}[hptb]
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 \begin{center}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 \includegraphics[width=.6\textwidth]{figures/continuation.eps}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 \end{center}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 \caption{継続制御}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 \label{fig:continuation}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 \end{figure}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
117 \subsection{Schemeにおける継続制御}
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
118 継続とは一般的には「現在の処理を続行するための情報」と解釈されている。
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
119 継続制御はその情報をプログラム記述で操作するための構文である。
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
120 例としてSchemeでの継続の使用をコード\ref{code:scheme-cont}に挙げる。
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
121
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
122 %\lstset{morecomment=[is]{/*}{*/}} % /*コメント内を非表示にする*/
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
123 \lstinputlisting
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
124 [caption=Schemeでの継続制御の例,
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
125 label=code:scheme-cont,
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
126 language=Lisp,
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
127 morekeywords={cont,cont-test},
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
128 emph={gosh},
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
129 emphstyle=\bfseries\underbar]
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
130 {sources/scheme-cont-out.scmout}
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
131
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
132 この例では関数\verb|cont-test|内にて\verb|call/cc|を呼ぶことで、現在の
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
133 計算処理の``継続''を関数として変数\verb|cont|に保持している。
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
134
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
135 その後、\verb|(cont)|という命令でその関数を実行すると、contが代入され
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
136 た位置に処理が復帰する。そのため、直前の``before''は出力されずに
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
137 ``after''が出力されていることが分かる。\verb|cont|では関数の継続処理だ
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
138 けでなく、引数などの環境も一緒に保持しているので、この\verb|cont|は呼
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
139 ばれる度に \verb|i|カウントアップし、その値を返すことになる。
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
140
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
141
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 CbCはこの継続制御を基本として設計されており、その実現のためにコードセ
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 グメントと軽量継続という概念を用いている。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 以下ではその二つについて説明する。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
145
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 \subsection{コードセグメント}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 CbCは図\ref{fig:continuation}の様に分割された手続きのそれぞれを一つの
4
30c102343b37 modify gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
148 処理単位として用い、これを``コードセグメント(code-segment)''と呼ぶ。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 コードセグメントはキーワード``code''を用いてCの関数の様に定義される。
2
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
151 引数部分はインタフェイスと呼ばれ、継続前のコードセグメントからの出力に
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
152 あたる。例として、引数で与えられた数xの階乗を求めるプログラムをコード
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 \ref{code:factorial}に示した。
2
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
154
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
155 \lstinputlisting[caption=CbCプログラムの例(階乗計算),label=code:factorial]{sources/factorial.cbc}
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
156
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 %コードセグメントは手続きを細かく分割したものなので、Cの関数と比べより
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 %小さい処理単位となる。しかしコードセグメント内部ではCのステートメント
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 %と同様の記述が可能であり、処理単位としてはステートメントより大きいもの
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 %となる。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
161
1
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
162 \subsection{軽量継続(light-weight continuation)}
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 コードセグメントはCにおける関数とは違い、呼出し元への復帰は存在しない。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 そのためコードセグメントの処理の末尾で別のコードセグメントへ継続するこ
4
30c102343b37 modify gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
165 とになる。CbCではこの継続制御を``軽量継続(light-weight continuation)''
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 と呼ぶ。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 軽量継続はキーワード``goto''のあとにコードセグメント名とそのコードセグ
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 メントのインタフェイスに渡す引数列を並べて記述する。(同じく軽量継続の
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 例がコード \ref{code:factorial}にみられる。)
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 %この引数列は継続前のコードセグメントの状態、つまりインタフェイスの値に
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 %よって一意に決まる
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
174
2
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
175 この例の様に、プログラムはforやwhileなどのループ制御構造を含んでいない
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
176 。代わりに、コードセグメント\verb|factorial0|の様に自分自身への軽量継
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
177 続を用いることで繰り返し処理を実現している。Cでは再帰関数を使うことで
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
178 同じことを行えるが、そこにはスタックの拡張という処理が入る。しかしCbC
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
179 ではスタックの拡張は行われず、元の環境に戻ることはない。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
180
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
181
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 \section{状態遷移に適した言語}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 Continuation based Cは値を返すプログラムよりも、状態遷移記述に適している。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
184
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 従来の言語での状態遷移記述は
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 \begin{itemize}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 \item 表を使った状態遷移インタプリタ
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 \item 巨大なswitch文
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 \end{itemize}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 などが用いられてきた。しかしこれらは記述性が悪く、効率も良くない。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
191
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 表を使った状態遷移インタプリタはコンパイラ言語とは考えられない。また、
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 それをハードウェア記述に落とすことは難しい。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
194
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 巨大なswitch文は、コンパイルが複雑になり、適切な最適化を行うことが難し
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 い。また、人間が読む場合にも読みやすいとは言えない。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 CbCは元々状態遷移を直接記述することを目的として設計されており、
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 手続きの様に環境の保持を伴わないため、その時々に実行中のコードセグメン
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 トとその引数を直接プログラムの状態とみなす事ができる。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
201
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 特にゲームやGUIを用いたプログラムなどでは状態遷移記述が多用されており
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 、そのようなプログラムでは CbCを状態記述言語として使うことにより、直接
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 実行による実行の高速化と既存の言語と状態遷移記述の整合性の向上をはかる
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 ことができる。
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
206
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
207
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 \section{C with Continuation}
2
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
209 数学的検証や組み込み用途を目的として提案されたCbCであるが、既存のソフ
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
210 トウェアやシステムは膨大な数にのぼり、これらをCbCに置き換えるのは無理
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
211 がある。そのため、少なくともソースコードのレベルでCとの互換性を持つこ
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
212 とが望ましい。
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
213 Continuation based Cの名のとおり、CbCからCの関数の呼び出しは問題なく行
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
214 える。しかしCbCをCと相互に利用するためには、Cの関数から継続を行った場
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
215 合に元の環境に戻るための、特殊な継続を導入する必要がある。これを環境付
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
216 き継続と呼ぶ。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
217
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 この環境付き継続を導入した言語はC with Continuation(CwC)と呼ばれ、Cと
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 CbCの両方の機能をもつ言語となる。また、 C、CbCはCwCのサブセットと考え
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 られるので(図 \ref{fig:cwc})、CwCのコンパイラをCbCに使用する事ができ
3
d2999e94b97d add gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
221 る。
d2999e94b97d add gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
222 これまでに実装されてきたCbCのコンパイラは実際にはCwCのコンパイラとして
d2999e94b97d add gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
223 実装されている。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
224
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 \begin{figure}[htpb]
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 \begin{center}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 \includegraphics[width=.6\textwidth]{figures/CwC.eps}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 \end{center}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 \caption{C with Continuationとそのサブセット}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 \label{fig:cwc}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 \end{figure}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
232
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
233
2
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
234 \subsection{環境付き継続}\label{ssec:gotowithenv}
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 環境付き継続を用いる場合、Cの関数からコードセグメントへ継続する際に
4
30c102343b37 modify gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
236 \verb|__return|という変数で表される特殊なコードセグメントポインタを渡
30c102343b37 modify gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
237 す。コード\ref{code:cbcreturn}では関数\verb|funcB|からコードセグメント
3
d2999e94b97d add gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
238 \verb|cs|に継続する際に\verb|__return|を渡している。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 継続先のコードセグメントでは渡されたコードセグメントポインタへ継続する
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
240 事で元のCの環境に復帰することが可能となる。
4
30c102343b37 modify gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
241 ただし復帰先は\verb|__return|を参照した関数が終了する位置である。この
30c102343b37 modify gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
242 プログラムの例では、関数\verb|funcA|からは\verb|funcB|が正常に終了した
30c102343b37 modify gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
243 ように見える。図\ref{fig:cbcreturn}にこの様子を表した。
2
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
244 \lstinputlisting
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
245 [caption=\_\_returnの例,
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
246 label=code:cbcreturn,
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
247 emph=\_\_return]
1
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
248 {sources/cbcreturn.cbc}
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
249 この様な形にすることでcode segment側では関数から呼ばれたか、コードセグ
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
250 メントからの継続かを考慮する必要がない。また、\verb|funcA|からもその内
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
251 部でコードセグメントが使われていることを隠蔽できる。
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
252 \begin{figure}[htpb]
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
253 \begin{center}
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
254 \includegraphics[width=.6\textwidth]{figures/cbcreturn.eps}
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
255 \end{center}
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
256 \caption{\_\_returnの例}
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
257 \label{fig:cbcreturn}
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
258 \end{figure}%
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
259
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
260 環境付きは実際にはCにおける\verb|setjmp()/longjmp()|とほぼ同じ処理であ
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
261 る。この二つの関数はCで継続を実現するために用いられる。例としてコード
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
262 \ref{code:setjmp}を挙げる。このコードでは\verb|setfunc|内で
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
263 \verb|setjmp|を使用している。\verb|setjmp|は通常は0を返すため、if文の
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
264 内部は実行されないが、その後\verb|longjmp|が実行されると、関連する
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
265 \verb|setjmp|が呼び出された環境に``継続''し、非零を返すためif文の中が
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
266 実行されることになる。この時、\verb|longjmp|の呼出側(この例では
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
267 \verb|jmpfunc|)の環境は失われる。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
268
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
269 環境付き継続もこの動作によく似ており、if文内でreturnのみを記述すること
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
270 に相当する。
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
271
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
272 \lstset{morecomment=[is]{/*}{*/}} % /*コメント内を非表示にする*/
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
273 \lstinputlisting
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
274 [caption=setjmp/longjmpの例,
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
275 basicstyle=\footnotesize\ttfamily,%
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
276 commentstyle=\footnotesize\itshape\rmfamily,%
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
277 label=code:setjmp,
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
278 emph={setjmp,longjmp}]
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
279 {sources/setjmp.c}
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
280 \lstset{morecomment=[s]{/*}{*/}} % /*元に戻す*/
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
281
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
282
2
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
283
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
284 \section{CbCの用途・先行研究}
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
285 CbCによるプログラム記述の例として本研究室における研究例を紹介する。
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
286
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
287 \subsection{プログラムの検証}
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
288 計算機科学の進歩により、ソフトウェアは大規模かつ複雑なものになっている
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
289 。しかしそれに応じて、設計段階において誤りが生じる可能性も高くなってき
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
290 ており、設計されたシステムに誤りがないことを保証するための論理設計や検
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
291 証手法及びデバッグ手法の確立が重要な課題となっている。
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
292
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
293 どんなプログラムでも状態と状態遷移が存在し、その全てを網羅的に探索する
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
294 ことでデッドロックなどの望ましくない状態を検出することができる。探索に
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
295 はさまざまな手法が考えられるが、プログラムを直接状態遷移として記述でき
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
296 ればこの探索に有利となる。
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
297
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
298 本研究室の下地らはこの特徴を持つCbCを用いて線形時相論理による検証を提
4
30c102343b37 modify gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
299 案し、その有用性を示した。\cite{bib:shimoji-2006},
30c102343b37 modify gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
300 \cite{bib:shimoji-2007}
2
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
301
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
302
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
303 \subsection{ゲームプログラミングにおけるデモンストレーション}
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
304 我々は家庭用ゲーム機で動作するゲームプログラムのオープンな開発フレーム
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
305 ワークに関する研究も行ってきた。家庭用ゲーム機の多くは特殊なアーキテク
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
306 チャをもち、そのためゲームプログラムには汎用性や冗長性が極めて小さく、
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
307 移植が困難という問題がある。
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
308
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
309 その問題の解決に、ゲームプログラム全体を小規模なプログラムの集合である
6
b59d31966d7d change fonts.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
310 ``デモンストレーション''に分割することで移植性を向上する手法を本研究室
b59d31966d7d change fonts.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
311 の金城らが提案した。\cite{bib:kinjo-master-2005},\cite{bib:akira-2008}
2
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
312
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
313 このデモンストレーション手法はプログラムを細かく分割するため、ゲーム機
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
314 や組み込みなどの資源が制約された環境ではサブルーチンによるスタック操作
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
315 がネックとなる。そのためこの手法ではプログラム分割の実現にCbCを用いて
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
316 おり、CからCbCへの機械的な変換方法について述べている。
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
317
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
318
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
319 %\subsection{CbCによる分散プログラミング}
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
320 %現在の分散プログラミングには様々な手法がある。ネットワークAPIを直接使
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
321 %う方法、SOAPやMPIなどのライブラリ、Telescripに見られる言語仕様への埋め
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
322 %込みなどがあった。これらは通信に関する複雑なセマンティクスを実現する手
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
323 %段といえる。
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
324 % TODO 分散プログラミング
2
50e23a4b2f40 add many files.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
325
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
326
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
327 \section{CbCコンパイラの現状と本研究における目標}
1
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
328 \label{sec:cbc-problem}
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
329
3
d2999e94b97d add gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
330 \subsection{micro-cとGCC}
d2999e94b97d add gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
331
4
30c102343b37 modify gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
332 CbCのコンパイラには二つの実装が用意されている。一つは2000年に当研究室
30c102343b37 modify gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
333 の河野らにより開発された、micro-cというCのコンパイラをベースとしたもの
30c102343b37 modify gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
334 である。こちらは現在安定して動作しており、アーキテクチャは PowerPC,
30c102343b37 modify gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
335 x86, MIPS, ARMなどに対応している。もう一つは2008年に開発された、GCCを
30c102343b37 modify gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
336 ベースとしたコンパイラである。 \cite{bib:kent-2008}
3
d2999e94b97d add gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
337
4
30c102343b37 modify gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
338 GCCは元より多数のアーキテクチャに対応しており、高機能な最適化も備えて
30c102343b37 modify gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
339 いる。これらをCbCでも活用したいという要望からコンパイラ環境の移植が行
30c102343b37 modify gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
340 われた。
30c102343b37 modify gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
341
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
342 \subsection{本研究における目標}\label{sec:gcc-problems}
3
d2999e94b97d add gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
343
d2999e94b97d add gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
344 この時の実装でコードセグメント、継続制御構造などは実装され、一通りの
d2999e94b97d add gcc.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
345 CbCプログラムのコンパイルが可能となった。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
346
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
347 本研究ではこのGCCベースのコンパイラをより実用的なCbCコンパイラとすべく
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
348 以下の項目を目標とする。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
349
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
350 \begin{itemize}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
351 \item 環境付き継続
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
352
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
353 Cとの互換性のための制御構造である環境付き継続を実装する。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
354
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
355 \item 並列代入
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
356
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
357 これまでGCCベースのコンパイラでは、実装方法の影響から継続制御に一
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
358 部制限が存在した。これは実行中のコードセグメントの引数と継続制御に
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
359 渡す引数の順序が入れ替わる場合等に継続が行えないという制限である。
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
360
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
361 並列代入を行うことで引数順序の影響はなくなり、この制限を排除できる。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
362
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
363 \item PowerPCにおける間接継続(indirect goto)
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
364
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
365 Cでの関数ポインタを用いた間接呼び出し(indirect call)の様に、CbCで
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
366 用いる継続制御においても、コードセグメントポインタを用いたメモリ参
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
367 照による間接的な継続が可能である。これを間接継続と呼んでいる。
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
368 コード\ref{code:indirect-example}のcodepointerへの継続が間接継続に
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
369 当たる。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
370 \lstinputlisting[
1
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
371 caption=間接継続の例(2つめのgoto文),
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
372 label=code:indirect-example]
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
373 {sources/indirect-example.cbc}
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
374 しかしPowerPCアーキテクチャでは最適化の問題からこの間接継続がこれ
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
375 まで制限されていた。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
376
1
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
377 間接継続はCbCでのプログラミングには必須であり、また本研究室の主要
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
378 プロジェクトであるCeriumはPS3(PowerPCをもつ)をメインターゲットと
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
379 しているため、この対応は必須のものである。
1
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
380
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
381 \item プロトタイプ宣言の自動化
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
382
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
383 Cのプロトタイプ宣言はコンパイル時のエラー検出に役立っているが、
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
384 CbCでは返り値が存在しないなど、あまり重要な意味をなさない。
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
385 また、micro-cではこれを極力排除するよう設計されているため、ソース
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
386 コードの互換性が薄れてしまう。
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
387
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
388 プロトタイプを自動生成することにより、この互換性を向上させる。
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
389
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
390 \item x86での継続制御の最適化
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
391
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
392 x86では、Cの関数呼び出し全ての引数をメモリに格納する。コードセグメ
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
393 ントは関数をベースに作られているため、このABIに引きずられ実効速度
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
394 に影響をもたらしている。引数の一部をレジスタに格納することで、x86
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
395 における継続処理の高速化を行う。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
396
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
397 \item メンテナンス性の向上
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
398
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
399 GCCのソースコードは200万行にものぼる。CbCコンパイラで修正するソー
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
400 スコードはそのごく一部であるが、GCCのアップデートによる修正はCbC用
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
401 のソースコードにも大きな影響をもたらす。
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
402 GCCの最新リリースに追従するためには、アップデートも考慮し、洗練さ
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
403 れたメンテナンス方法が必要になる。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
404
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
405 \end{itemize}
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
406
1
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
407 %特にPowerPCで間接継続ができないことで、当研究室が開発するPS3を主な対象としたシステムであるCeriumが実装不能であった。
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
408 \ref{chp:impl}章ではこれらの項目の実装を行う。
0
e9ecd5b5f29a first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
409
1
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
410
aa09c34b90d3 add quicksort_for_pcc
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
411