Mercurial > hg > Papers > 2019 > anatofuz-thesis
diff paper/chapter2.tex @ 82:7e50d0abefba
remove ,...
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 18 Feb 2019 21:10:04 +0900 |
parents | 29bb4dca94ea |
children | dbc35db820b4 |
line wrap: on
line diff
--- a/paper/chapter2.tex Mon Feb 18 20:51:30 2019 +0900 +++ b/paper/chapter2.tex Mon Feb 18 21:10:04 2019 +0900 @@ -19,7 +19,7 @@ CbCではC言語の関数の代わりに CodeGear を導入する。 CodeGearはC言語の関数宣言の型名の代わりに \_\_codeと書く事で宣言出来る。 -\_\_codeはCbCコンパイラでの扱いはvoidと同じ型として扱うが、 CbCプログラミングではCodeGearである事を示す、 識別子として利用する。 +\_\_codeはCbCコンパイラでの扱いはvoidと同じ型として扱うが、 CbCプログラミングではCodeGearである事を示す識別子として利用する。 CodeGearは通常のC言語の関数とは異なり、 返り値を持たない。 そのためreturn文や返り値の型などの情報が存在しない。 @@ -31,7 +31,7 @@ CbCの場合、 スタックフレームを操作せずに次のCodeGearに遷移する。 この際Cの関数呼び出しとは異なり、 プロラムカウンタを操作するのみのjmp命令として処理される。 通常Schemeのcall/ccなどの継続と呼ばれる処理は、 現在のプログラムまでの位置や情報を、 環境として所持した状態で遷移する。 -CbCの場合これら環境を持たず遷移する為、 通常の継続と比較して軽量であるから、 軽量継続であると言える。 +CbCの場合これら環境を持たず遷移する為、 通常の継続と比較して軽量であるから軽量継続であると言える。 軽量継続を利用する為、 ループ文を軽量継続の再帰呼び出しなどで実現する事が可能となる。 CodeGear間の入出力の受け渡しは引数を利用して行う。 @@ -61,11 +61,11 @@ CbCでは関数呼び出しの他に、 for文やwhile文などのループ制御を廃している。 CbCでループ相当の物を記述する際は、 再帰呼び出しを利用する。 C言語で、ループを再帰呼び出しで表現する場合、 再帰呼び出しの度にスタックに値が積まれていく為に、 スタック領域を埋め尽くしてしまいスタックオーバーフローが発生する。 -これを回避するには、 末尾再帰と呼ばれる形でのプログラミングが要求される。 -CbCの場合、 CodeGear同士の軽量継続は、 強制的に末尾再帰の形になる。 -また、 CodeGearからCodeGearへの遷移は、 スタックを利用しない。 +これを回避するには末尾再帰と呼ばれる形でのプログラミングが要求される。 +CbCの場合、 CodeGear同士の軽量継続は強制的に末尾再帰の形になる。 +また、 CodeGearからCodeGearへの遷移はスタックを利用しない。 その為、 CodeGearの再帰呼び出しを利用しても、 スタックオーバーフローを発生させることがない。 -この処理を末尾呼び出し除去(tail call elimination)と呼び、 CbCコンパイラは、 各CodeGearの遷移を末尾再帰に変換する。 +この処理を末尾呼び出し除去(tail call elimination)と呼び、 CbCコンパイラは各CodeGearの遷移を末尾再帰に変換する。 実際にある数の階乗を計算するプログラムをCbC書いた場合のコードをソースコード\ref{cbc_fact}に示す。 @@ -85,11 +85,11 @@ この際は環境付きgotoと呼ばれる手法を取る。 これは\_CbC\_return及び、 \_CbC\_environmentという変数を使用する。 この変数は \_CbC\_return が元の環境に戻る際に利用する CodeGear を指し、 \_CbC\_environment は復帰時に戻す元の環境である。 -復帰する場合、 呼び出した位置には帰らず、 呼び出した関数の終了する位置に帰る。 +復帰する場合、 呼び出した位置には帰らず呼び出した関数の終了する位置に帰る。 実際に環境付き継続を利用した場合のサンプルコードをソースコード\ref{cbc_return_src}に示す。 \lstinputlisting[frame=lrbt, label=cbc_return_src, caption=環境付き継続の例]{./codes/src/return.cbc} この例では、 通常 c\_funcの返り値が-1である為、 変数testには-1が設定されるかの様に見える。 -しかし関数 c\_func内でCodeGearである cgに軽量継続しており、 cgでは環境付きgotoを利用して、 1を返り値としてCの関数に戻る。 -この場合、 呼び出し元 c\_funcの返り値である -1 の代わりに、 環境付きgotoで渡される1が優先され、 変数testには1が代入される。 +しかし関数 c\_func内でCodeGearである cgに軽量継続しており、 cgでは環境付きgotoを利用して1を返り値としてCの関数に戻る。 +この場合、 呼び出し元 c\_funcの返り値である -1 の代わりに、 環境付きgotoで渡される1が優先され変数testには1が代入される。