comparison Paper/tex/cbc.tex @ 15:f0d512637e52

Add ref
author soto <soto@cr.ie.u-ryukyu.ac.jp>
date Wed, 01 Feb 2023 22:16:45 +0900
parents c28e8156a37b
children 40a9af45b375
comparison
equal deleted inserted replaced
14:f52e5fd41f58 15:f0d512637e52
11 そのため次に遷移する Code Gear を指定する. 11 そのため次に遷移する Code Gear を指定する.
12 これは,関数型プログラミングでの末尾関数呼び出しに相当する. 12 これは,関数型プログラミングでの末尾関数呼び出しに相当する.
13 したがって,Code Gear に Deta Gear を与え,それをもとに処理を行い, 13 したがって,Code Gear に Deta Gear を与え,それをもとに処理を行い,
14 出力として Data Gear を返し,また次の Code Gearに遷移していく流れとなる. 14 出力として Data Gear を返し,また次の Code Gearに遷移していく流れとなる.
15 15
16 本章ではCbCの概要について説明する。 16 本章ではCbCの概要について説明する.
17 17
18 \section{Code Gear / Data Gear} 18 \section{Code Gear / Data Gear}
19 CbCでは、検証しやすいプログラムの単位として DataGear と CodeGear という単位を用いる。 19 CbCでは,検証しやすいプログラムの単位として DataGear と CodeGear という単位を用いる.
20 20
21 CodeGear はプログラムの処理そのものであり、一般的なプログラム言語における関数と同じ役割である。 21 CodeGear はプログラムの処理そのものであり,一般的なプログラム言語における関数と同じ役割である.
22 DataGear は CodeGear で扱うデータの単位であり、処理に必要なデータである。 22 DataGear は CodeGear で扱うデータの単位であり,処理に必要なデータである.
23 CodeGear の入力となる DataGear を Input DataGear と呼び、出力は Output DataGear と呼ぶ。 23 CodeGear の入力となる DataGear を Input DataGear と呼び,出力は Output DataGear と呼ぶ.
24 24
25 CodeGear 間の移動は継続を用いて行われる。 25 CodeGear 間の移動は継続を用いて行われる.
26 継続は関数呼び出しとは異なり、呼び出した後に元のコードに戻れず、次の CodeGear へ継続を行う。 26 継続は関数呼び出しとは異なり,呼び出した後に元のコードに戻れず,次の CodeGear へ継続を行う.
27 これは、関数型プログラミングでは末尾再帰をしていることと同義である。 27 これは,関数型プログラミングでは末尾再帰をしていることと同義である.
28 28
29 29
30 \section{CbC と C言語の違い} 30 \section{CbC と C言語の違い}
31 同じ仕様でCbCとC言語で実装した際の違いを、実際のコードを元に比較する。 31 同じ仕様でCbCとC言語で実装した際の違いを,実際のコードを元に比較する.
32 比較するにあたり、再起処理が含まれるコードの例として、 32 比較するにあたり,再起処理が含まれるコードの例として,
33 フィボナッチ数列の n 番目を求めるコードを挙げる。 33 フィボナッチ数列の n 番目を求めるコードを挙げる.
34 C言語で記述したものが\coderef{fib_c}。CbCで記述したものが\coderef{fib_cbc}になる。 34 C言語で記述したものが\coderef{fib_c}.CbCで記述したものが\coderef{fib_cbc}になる.
35 CbCは実行を継続するため、 return を行えない。そのためC言語での実装も return を書 35 CbCは実行を継続するため, return を行えない.そのためC言語での実装も return を書
36 かず関数呼び出しを行い、最後にexitをして実行終了するように記述している。 36 かず関数呼び出しを行い,最後にexitをして実行終了するように記述している.
37 37
38 \lstinputlisting[label=code:fib_c, caption=C言語で記述した フィボナッチ数列の n 番目 38 \lstinputlisting[label=code:fib_c, caption=C言語で記述した フィボナッチ数列の n 番目
39 を求めるコード, firstline=5] {src/cbc/fib.c} 39 を求めるコード, firstline=5] {src/cbc/fib.c}
40 \lstinputlisting[label=code:fib_cbc, caption=CbCで記述した フィボナッチ数列の n 番目 40 \lstinputlisting[label=code:fib_cbc, caption=CbCで記述した フィボナッチ数列の n 番目
41 を求めるコード, firstline=5] {src/cbc/fib.cbc} 41 を求めるコード, firstline=5] {src/cbc/fib.cbc}
42 42
43 軽量実装になっているのか、上記のコードをアセンブラ変換した結果を見て確認する。 43 軽量実装になっているのか,上記のコードをアセンブラ変換した結果を見て確認する.
44 全てを記載すると長くなるので、アセンブラ変換した際のfib関数のみを記載する。 44 全てを記載すると長くなるので,アセンブラ変換した際のfib関数のみを記載する.
45 C言語で記述した\coderef{fib_c}をアセンブラ変換した結果が\coderef{c-ass}。 45 C言語で記述した\coderef{fib_c}をアセンブラ変換した結果が\coderef{c-ass}.
46 CbCで記述した\coderef{fib_cbc}をアセンブラ変換した結果が\coderef{cbc-ass}になる。 46 CbCで記述した\coderef{fib_cbc}をアセンブラ変換した結果が\coderef{cbc-ass}になる.
47 47
48 比較すると、fib 関数の内部で再度 fib 関数を呼び出す際、 48 比較すると,fib 関数の内部で再度 fib 関数を呼び出す際,
49 C言語で実装した\coderef{c-ass}の30行目では callq で fib 関数を呼び出している。 49 C言語で実装した\coderef{c-ass}の30行目では callq で fib 関数を呼び出している.
50 対して CbC で実装した\coderef{cbc-ass}の32行目では、 jmp により fib 関数に移動 50 対して CbC で実装した\coderef{cbc-ass}の32行目では, jmp により fib 関数に移動
51 している。 51 している.
52 52
53 \lstinputlisting[label=code:c-ass, caption=cで記述した際の fib 関数のアセンブラ] {src/cbc/c.txt} 53 \lstinputlisting[label=code:c-ass, caption=cで記述した際の fib 関数のアセンブラ] {src/cbc/c.txt}
54 \lstinputlisting[label=code:cbc-ass, caption=cbcで記述した際の fib 関数のアセンブラ] {src/cbc/cbc.txt} 54 \lstinputlisting[label=code:cbc-ass, caption=cbcで記述した際の fib 関数のアセンブラ] {src/cbc/cbc.txt}
55 55
56 以上のことから CbCが軽量継続を行っていると言える。 56 以上のことから CbCが軽量継続を行っていると言える.
57 57
58 58
59 \section{Meta Code Gear / Meta Data Gear} 59 \section{Meta Code Gear / Meta Data Gear}
60 Meta DataGear は CbC 上のメタ計算で扱われる DataGear である。例えば stub 60 Meta DataGear は CbC 上のメタ計算で扱われる DataGear である.例えば stub
61 CodeGear では Context と呼ばれる接続可能な CodeGear、DataGear のリストや、DataGear 61 CodeGear では Context と呼ばれる接続可能な CodeGear,DataGear のリストや,DataGear
62 のメモリ空間等を持った Meta DataGear を扱っている。 62 のメモリ空間等を持った Meta DataGear を扱っている.
63 63
64 また,プログラムを記述する際は,ノーマルレベルの計算の他に,メモリ管理,スレッド管理,資源管理等を記述しなければならない処理が存在する. 64 また,プログラムを記述する際は,ノーマルレベルの計算の他に,メモリ管理,スレッド管理,資源管理等を記述しなければならない処理が存在する.
65 これらの計算はノーマルレベルの計算と区別してメタ計算と呼ぶ. 65 これらの計算はノーマルレベルの計算と区別してメタ計算と呼ぶ.
66 66
67 メタ計算は OS の機能を通して処理することが多く,信頼性の高い記述が求められる. 67 メタ計算は OS の機能を通して処理することが多く,信頼性の高い記述が求められる.