本日の課題; 以下の課題の答えを「本日中に」メイルで、 report@logic.cs.tsukuba.ac.jp あてに提出せよ。氏名、学籍番号を「メイル本文中に」必ず明記せよ。 また、Subjectは report という文字列を含むこと。形式は、テキストでも pdf でも WORD でもよい。 1. MiniC 処理系を使って、動的束縛と、静的束縛の違いを理解せよ. 具体的には、処理モードの 0,1,2,3 によって、同じプログラムの 実行結果が異なる場合があることを確かめ、その理由を説明せよ。 2. MiniC 処理系の処理モードの 0,1,2,3 は、動的/静的束縛の 違い以外に、「関数の引数を左から評価するか、右から評価するか」 の違いがある。(2種類の違いが2組あるので、合計4つのモードがある) 0,1,2,3 が、それぞれ、どのような評価順序であるか、調べよ。 3. 動的束縛は、現在のコンパイラ型言語ではほとんど使われていない。 これが有用な場面はどんな局面か想像して書きなさい。(想像できない 場合は、想像できない、と書いたのでよい。) 本日の課題としては以上であるが、もし時間があまってしょうがない とか、もっと考えたい、という人は、以下の課題を考えるとよい。 4. (余力のある人のみ) C言語の実行は、ときに、まったく予想もつか ない結果をもたらすことがある。以下のプログラムで、関数fooには 3つの実引数がわたされるが、その値が何であるか想像つくだろうか? 。。。 int x = 10; foo(++x, ++x, ++x); 。。。 おそらく、11,12,13 か 13,12,11 が渡されると考えるだろう。では、 本当にそうなるか、皆さんの手近な計算機で試してみて、どうして そうなったか、考えてほしい。 (関数fooに何という引数がわたされ たか調べる簡単な方法は、fooの中で、3つの引数を印刷することで ある。) 5. (もっと余力のある人のみ) MiniC 言語は、C言語に似せているとはいって もだいぶ違うところがある。その最大のものは、コンパイラでないこと、 あるいは、コンパイラがやるような静的チェックをしないことである。 具体的には、if true then 1 else 2+true のように、型があわない計算 を含むプログラムであっても、その部分が実行されない限り、エラーに ならない。これを「何とかする」ためにはどうしたらよいか考えよ。 以上。