changeset 42:fc3f4de57bb1

update chapter2
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Thu, 14 Feb 2019 18:13:42 +0900
parents 5169e3bc40f9
children 49e6b3116f12
files paper/chapter2.tex paper/main.pdf
diffstat 2 files changed, 9 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/paper/chapter2.tex	Thu Feb 14 17:49:14 2019 +0900
+++ b/paper/chapter2.tex	Thu Feb 14 18:13:42 2019 +0900
@@ -60,8 +60,17 @@
 
 CbCでは関数呼び出しの他に、 for文やwhile文などのループ制御を廃している。
 CbCでループ相当の物を記述する際は、 再帰呼び出しを利用する。
+C言語で、ループを再帰呼び出しで表現する場合、 再帰呼び出しの度にスタックに値が積まれていく為に、 スタック領域を埋め尽くしてしまいスタックオーバーフローが発生する。
+これを回避するには、 末尾再帰と呼ばれる形でのプログラミングが要求される。
+CbCの場合、 CodeGear同士の軽量継続は、 強制的に末尾再帰の形になる。
+また、 CodeGearからCodeGearへの遷移は、 スタックを利用しない。
+その為、 CodeGearの再帰呼び出しを利用しても、 スタックオーバーフローを発生させることがない。
+この処理を末尾呼び出し除去(tail call elimination)と呼び、 CbCコンパイラは、 各CodeGearの遷移を末尾再帰に変換する。
+
 実際にある数の階乗を計算するCプログラムと、 このプログラムをCbCで書き直した場合のソースコードを示す。
 
+
+
 \section{Cとの互換性}
 
 CbCコンパイラはコンパイル対象のソースコードが、 CbCであるかC言語であるかを判断する。
Binary file paper/main.pdf has changed