annotate paper/chapter/02-cbc.tex @ 150:4c0d2a58f6e5

update
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Tue, 16 Feb 2021 14:23:37 +0900
parents 911bf1a2c6fa
children c9fb8f47a921
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 \chapter{Continuation Based C}
41
e25a073180de add file
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
2 Continuation Based C(CbC)とはC言語の下位言語であり、 関数呼び出しではなく継続を導入したプログラミング言語である。
e25a073180de add file
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
3 CbCでは通常の関数呼び出しの他に、 関数呼び出し時のスタックの操作を行わず、次のコードブロックに\texttt{jmp}命令で移動する継続が導入されている。
e25a073180de add file
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
4 この継続はSchemeのcall/ccなどの環境を持つ継続とは異なり、 スタックを持たず環境を保存しない継続である為に軽量である事から軽量継続と呼べる。
e25a073180de add file
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
5 またCbCではこの軽量継続を用いて\texttt{for}文などのループの代わりに再起呼び出しを行う。
e25a073180de add file
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
6 これは関数型プログラミングでのTail callスタイルでプログラミングすることに相当する。
e25a073180de add file
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
7 Agda よる関数型のCbCの記述も用意されている。
80
a15db66cab3c add other paper
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
8 実際のOSやアプリケーションを記述する場合には、GCC10\cite{cbcgcc}及びLLVM10/clang上\cite{cbcllvm}のCbC実装を用いる。
41
e25a073180de add file
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
9
55
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
10
42
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
11 \section{CodeGear}
41
e25a073180de add file
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
12 CbCでは関数の代わりにCodeGearという単位でプログラミングを行う。
e25a073180de add file
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
13 CodeGearは通常のCの関数宣言の返り値の型の代わりに\texttt{\_\_code}で宣言を行う。
e25a073180de add file
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
14 各CodeGearはDataGearと呼ばれるデータの単位で入力を受け取り、 その結果を別のDataGearに書き込む。
e25a073180de add file
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
15 入力のDataGearをInputDataGearと呼び、 出力のDataGearをOutputDataGearと呼ぶ。
e25a073180de add file
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
16 CodeGearがアクセスできるDataGearは、 InputDataGearとOutputDataGearに限定される。
17
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17
58
b1e2bcdd5191 fix order
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
18 CodeGearは関数呼び出し時のスタックを持たない為、一度あるCodeGearに遷移すると元の処理に戻ってこれない。
41
e25a073180de add file
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
19 しかしCodeGearを呼び出す直前のスタックは保存される。
e25a073180de add file
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
20 部分的にCbCを適用する場合はCodeGearを呼び出す\texttt{void}型などの関数を経由することで呼び出しが可能となる。
e25a073180de add file
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
21
58
b1e2bcdd5191 fix order
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
22 この他にCbCからCへ復帰する為のAPIとして、 環境付きgotoがある。
41
e25a073180de add file
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
23 これは呼び出し元の関数を次のCodeGearの継続対象として設定するものである。
e25a073180de add file
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
24 これはGCCでは内部コードを生成を行う。
e25a073180de add file
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
25 LLVM/clangでは\texttt{setjmp}と\texttt{longjmp}を使い実装している。
60
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
26 環境付きgotoを使うと、通常のCの関数呼び出しの返り値をCodeGearから取得する事が可能となる。
41
e25a073180de add file
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
27
60
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
28 \section{DataGear}
55
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
29 DataGearはCbCでのデータの単位である。
60
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
30 CbC上では構造体の形で表現される。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
31 各CodeGearの入力として受けるDataGearをInputDataGearと呼ぶ。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
32 逆に次の継続に渡すDataGearをOutputDataGearと呼ぶ。
42
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
33
65
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
34 メタレベルではDataGearはポインタを扱っているが、 ノーマルレベルのDataGearはポインタを扱っていないと仮定している。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
35 例えばリストのDataGearを考えると、 Cの実装の場合はポインタを使った単方向リストが考えられる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
36 リストのそれぞれの要素には、メタレベルでは次の要素を指し示すポインタが含まれている。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
37 ノーマルレベルのDataGearとして見る場合は、 リストそのものや、 リストの中の値そのものとして判断するために、より抽象化された単位として見える。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
38 これは関数型プログラミングにおける末尾再起呼び出し時の値のやりとりに似た概念である。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
39
62
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
40 \section{CbCを使った例題}
64
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
41 ソースコード\ref{src:cbcexample_test}にCbCを使った例題を、 ソースコード\ref{src:cbcexample_test_c}に通常のCで実装した例題を示す。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
42 この例では構造体\texttt{struct test}をcodegear1に渡し、その次にcodegear2に継続している。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
43 codegear2からはcodegear3にgotoし、 最後にexitする。
62
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
44 \lstinputlisting[label=src:cbcexample_test, caption=CbCの例題]{src/cbc_example_test.cbc}
64
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
45 \lstinputlisting[label=src:cbcexample_test_c, caption=ソースコード\ref{src:cbcexample_test}のCでの実装]{src/cbc_example_test.c}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
46 CbCの場合は継続で進んでいくが、 C言語での実装はvoid型の返り値を持つ関数呼び出しで表現される。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
47 \texttt{codegear3}に遷移したタイミングで、 CbCはmain関数のスタックしか持たないが、 C言語ではcodegear1、codegear2のスタックをそれぞれ持つ違いがある。(図\ref{fig:cbc_vs_c})
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
48
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
49 \begin{figure}[tb]
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
50 \begin{center}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
51 \includegraphics[width=150mm]{./drawio/cbc_vs_c.pdf}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
52 \end{center}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
53 \caption{CbCとCの処理の差}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
54 \label{fig:cbc_vs_c}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
55 \end{figure}
62
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
56
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
57
64
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
58 実際に軽量継続になっているかを、この例題をアセンブラに変換した結果を見比べて確認する。
93
b1febd693942 add fig
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
59 \lstinputlisting[label=src:cbcexample_test_asm, caption=CbCの例題をコンパイルしたアセンブラの一部]{src/cbc_example_test.s}
b1febd693942 add fig
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
60 \lstinputlisting[label=src:cbcexample_test_asm_void, caption=C言語の例題をコンパイルしたアセンブラの一部]{src/cbc_example_test_void.s}
64
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
61 codegear1からcodegear2への移動の際に、CbCとCで発行されるアセンブラの命令を比較する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
62 CbCの例題の場合のアセンブラのソースコード\ref{src:cbcexample_test_asm}はcodegear2へ25行目でjmp命令を使って遷移している。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
63 対してC言語での実装の場合(ソースコード\ref{src:cbcexample_test_asm_void})は21行目でcallqを使っている。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
64 jmp命令はプログラムカウンタを切り替えるのみの命令であり、 callは関数呼び出しの命令であるためにスタックの操作が行われる。
65
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
65 CbCでのgoto文はすべてこのjmp命令に変換されるため、 関数呼び出しより軽量に実行することが可能である。
62
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
66
42
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
67
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
68 \section{CbCを使ったシステムコールディスパッチの例題}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
69 CbCを用いてMITが開発した教育用のOSであるxv6\cite{xv6}の書き換えを行った。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
70 CbCを利用したシステムコールのディスパッチ部分をソースコード\ref{src:cbc_syscall_example}に示す。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
71 この例題では特定のシステムコールの場合、 CbCで実装された処理に\texttt{goto}文をつかって継続する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
72 例題ではCodeGearへのアドレスが配列\texttt{cbccodes}に格納されている。
150
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 142
diff changeset
73 引数として渡している\texttt{cbc\_ret}は、 システムコールの返り値の数値をレジスタに代入するCodeGearのアドレスである。
42
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
74 実際に\texttt{cbc\_ret}に継続が行われるのは、 \texttt{read}などのシステムコールの一連の処理の継続が終わったタイミングである。
150
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 142
diff changeset
75 この例題はGearsOSにあるStubCodeGearの仕組みを導入していない為、 直接CodeGearのアドレスを利用し継続している。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 142
diff changeset
76 GearsOSでは直接CodeGearのアドレスを利用するのはメタ計算のみであり、 ノーマルレベルではアドレスを扱うことはない。
42
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
77
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
78 \lstinputlisting[label=src:cbc_syscall_example, caption=CbCを利用したシステムコールのディスパッチ]{src/xv6_syscall.cbc}
47
24f6f068ddbb from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
79
24f6f068ddbb from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
80 軽量継続を持つCbCを利用して、 証明可能なOSを実装したい。
24f6f068ddbb from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
81 その為には証明に使用される定理証明支援系や、 モデル検査機での表現に適した状態遷移単位での記述が求められる。
24f6f068ddbb from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
82 CbCで使用するCodeGearは、 状態遷移モデルにおける状態そのものとして捉えることが可能である。
24f6f068ddbb from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
83 CodeGearを元にプログラミングをするにつれて、 CodeGearの入出力のDataも重要であることが解ってきた。
24f6f068ddbb from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
84
50
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
85 \section{メタ計算}
62
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
86 メタ計算のメタとは、高次元などの意味を持つ言葉であり、特定の物の上位に位置するものである。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
87 メタ計算の場合は計算に必要な計算や、 計算を行うのに必要な計算を指す。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
88 GearsOSでのメタ計算は、 通常の計算を管理しているOSレベルの計算などを指す。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
89 OSから見たメタ計算は、自分自身を検証する計算などになる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
90
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
91 ノーマルレベルの計算からすると、メタ計算は通常隠蔽される。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
92 これはUNIXのプログラムを実行する際に、 OSのスケジューラーのことを意識せずに実行可能であることなどから分かる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
93 新しいプロセスを作製する場合は\texttt{fork}システムコールを実行する必要がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
94 システムコールの先はOSが処理を行う。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
95 forkシステムコールの処理をOSが計算するが、 この計算はユーザープログラムから見るとメタ計算である。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
96 システムコールの中で何が起こっているかはユーザーレベルでは判断できず、 返り値などのAPIを経由して情報を取得する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
97 現状のUNIXではメタ計算はこの様なシステムコールの形としても表現される。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
98
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
99
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
100 メタデータなどはデータのデータであり、 データを扱う上で必要なデータ情報を意味する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
101 プログラムの中でプログラムを生成するものをメタプログラミングなどと呼ぶ。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
102 メタ計算やメタプログラムは、プログラム自身の検証などにとって重要な機能である。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
103 しかしメタレベルの計算をノーマルレベルで自在に記述してしまうと、 ノーマルレベルでの信頼性に問題が発生する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
104 メタレベルではポインタ操作や資源管理を行うため、メモリオーバーフローなどの問題を簡単に引き起こしてしまう。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
105 メタレベルの計算とノーマルレベルの計算を適切に分離しつつ、 ノーマルレベルから安全にメタレベルの計算を呼び出す手法が必要となる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
106
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
107
55
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
108 プログラミング言語からメタ計算を取り扱う場合、 言語の特性に応じて様々な手法が使われてきた。
142
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 93
diff changeset
109 関数型プログラミングの見方では、 メタ計算はモナドの形で表現されていた\cite{moggi-monad}。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 93
diff changeset
110 OSの研究ではメタ計算の記述に型付きアセンブラを用いることもある\cite{Yang:2010:SLI:1806596.1806610}。
50
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
111
62
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
112 通常ユーザーがメタレベルのコードを扱う場合は特定のAPIを経由することになる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
113 プログラム実行中のスタックの中には、 プログラムが現在実行している関数までのフレームや、各関数でアロケートされた変数などの情報が入る。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
114 これらを環境と呼ぶ。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
115 現状のプログラミング言語やOSでは、 この環境を常に持ち歩かなければならない。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
116 ノーマルレベルとメタレベルを分離しようとすると、 環境の保存について考慮しなければならず、 結果的にシステムコールなどのAPIを使わなければならない。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
117 システムコールを利用しても、 保存されている環境が常に存在する。
65
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
118 また関数単位での分離を行っても、 呼び出す関数の数が細かくなってしまい、スタックの容量を容易に消費してしまう。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
119 既存言語ではメタ計算の分離が困難である。
62
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
120
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
121
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
122 CbCではgoto文による軽量継続によって、 スタックをgotoの度に捨てていく。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
123 そもそもスタックが存在しないため、 暗黙の環境も存在せずに自由にプログラミングが可能となる。
65
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
124 またCodeGearをどれだけ呼び出しても、関数呼び出し時に伴うスタックの消費も存在しない。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
125 メタ計算の単位で細かくCodeGearを切り分けても、実行の問題が生じない。
62
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
126 その為従来のプログラミング言語ではできなかった、ノーマルレベルとメタレベルのコードの分離が容易に行える。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
127
55
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
128 CbCでのメタ計算はCodeGear、 DataGearの単位がそのまま使用できる。
62
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
129 メタ計算を行うCodeGearや、 メタな情報を持つDataGearが存在する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
130 これらの単位はそれぞれ、 MetaCodeGear、 MetaDataGearと呼ばれる。
47
24f6f068ddbb from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
131 \section{MetaCodeGear}
62
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
132 遷移する各CodeGearの実行に必要なデータの整合性の確認などはメタ計算である。
65
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
133 この計算はMetaCodeGearと呼ばれる各CodeGearごと実装されたメタなCodeGearで計算を行う。
62
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
134
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
135 特に対象のCodeGearの直前で実行されるMetaCodeGearをStubCodeGearと呼ぶ。
65
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
136 ユーザーからするとノーマルレベルのCodeGear間の移動に見えるが、実際にはStubCodeGearが挿入される。
62
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
137 MetaCodeGearやMetaDataGearは、プログラマが直接実装せず、 PerlスクリプトによってGearsOSのビルド時に生成される。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
138 ただしPerlスクリプトはすでに書かれていたStubCodeGearは上書きしない。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
139 スクリプトに問題がある場合や、 細かな調整をしたい場合はプログラマが直接実装可能である。
47
24f6f068ddbb from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
140 CodeGearから別のCodeGearに遷移する際のDataGearなどの関係性を、図\ref{meta-cg-dg}に示す。
24f6f068ddbb from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
141
24f6f068ddbb from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
142 \begin{figure}[tb]
24f6f068ddbb from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
143 \begin{center}
24f6f068ddbb from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
144 \includegraphics[width=150mm]{./fig/meta-cg-dg.pdf}
24f6f068ddbb from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
145 \end{center}
24f6f068ddbb from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
146 \caption{CodeGearとMetaCodeGear}
24f6f068ddbb from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
147 \label{meta-cg-dg}
24f6f068ddbb from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
148 \end{figure}
24f6f068ddbb from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
149
24f6f068ddbb from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
150 通常のコード中では入力のDataGearを受け取りCodeGearを実行、 結果をDataGearに書き込んだ上で別のCodeGearに継続する様に見える。
24f6f068ddbb from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
151 この流れを図\ref{meta-cg-dg}の上段に示す。
24f6f068ddbb from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
152 しかし実際はCodeGearの実行の前後に実行されるMetaCodeGearや入出力のDataGearをMetaDataGearから取り出すなどのメタ計算が加わる。
24f6f068ddbb from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
153 これは図\ref{meta-cg-dg}の下段に対応する。
24f6f068ddbb from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
154
24f6f068ddbb from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
155 \section{MetaDataGear}
60
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
156 基本はC言語の構造体そのものであるが、 DataGearの場合はデータに付随するメタ情報も取り扱う。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
157 これはデータ自身がどういう型を持っているかなどの情報である。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
158 ほかに計算を実行するCPU、 GPUの情報や、 計算に必要なすべてのDataGearの管理などの実行環境のメタデータもDataGearの形で表現される。
62
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
159 このメタデータを扱うDataGearをMetaDataGearと呼ぶ。
65
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
160
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
161
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
162 またCbCはスタックを持たないため、 データを保存したい場合はスタック以外の場所に値を書き込む必要がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
163 このスタック以外の場所はDataGearであり、 メタなデータを扱っているためにMetaDataGearと言える。
80
a15db66cab3c add other paper
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
164 具体的にMetaDataGearがどのように構成されているかは、CbCを扱うプロジェクトによって異なる。