Mercurial > hg > Papers > 2023 > soto-master
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 の機能を通して処理することが多く,信頼性の高い記述が求められる. |