Mercurial > hg > Papers > 2019 > anatofuz-thesis
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言語であるかを判断する。