一度書いて、何百万台で動く
スマホのゲームは、人が読める言葉で書かれています。でもスマホのプロセッサは、その言葉を読めません。読めるのは、数でできた自分の命令だけです。
だから、先にだれかが翻訳しなければなりません。翻訳には大きく2つのやり方があり、どちらもラボのマシンで見ることができます。
このレッスンのゴール
メモ
コンパイラとインタプリタのちがいを説明できる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| ソースコード | 人が書いた形のプログラム | hello.c |
| 機械語 | プロセッサが実行する、数で書かれた命令 | |
| 翻訳プログラム | ソースコードを、コンピュータが実行できる形にするプログラム | |
| コンパイラ | 実行の前に、プログラム全体を機械語にする翻訳プログラム | |
| インタプリタ | プログラムを1文ずつ読んで実行する翻訳プログラム | |
| トークン | 名前、数、記号など、プログラムの1つの単語 |
学生が入力するセルは、このプレビューでは空白です。
3種類の翻訳プログラム
アセンブラは、アセンブリ言語を機械語にします。1行が1つの命令になります。
コンパイラは、まずプログラム全体を読みます。どこかにまちがいがあれば、それを知らせて止まり、何も実行されません。まちがいがなければ、何度でも実行できる機械語を書き出します。
インタプリタは、1文を読んで実行し、それから次の文を読みます。
コンパイラとインタプリタを比べる
| 問い | コンパイラ | インタプリタ |
|---|---|---|
| いつ翻訳するか | 実行の前に全部 | 実行しながら1文ずつ |
| プログラムのファイルができるか | できる。コンパイラなしで何度も実行できる | できない。毎回インタプリタが必要 |
| まちがいはいつ見つかるか | 何かを実行する前 | その行に来たとき |
| どちらが速いか | ふつうはコンパイルしたプログラム | ふつうは遅い |
| ラボでは | gcc | python3 |
学生が入力するセルは、このプレビューでは空白です。
始める前に
メモ
上のバーの Start the lab を押し、マシンが動き出すまで待ってください。Run ボタンは、順番にコマンドをマシンのターミナルに入力します。
compiler フォルダへ移る
cd ~/compilerここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
hello.c をプログラムにする
gcc hello.c -o helloここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
gcc が作ったプログラムを動かす
./helloここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
まちがいのあるプログラムをコンパイルする
gcc -Wall -c scope.cここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
インタプリタはまちがいに遅く気づく
gcc は scope.c を全部読んで、受け付けませんでした。プログラムは1つも作られていません。
次は、2行の Python のファイルを書きます。1行目は数を表示します。2行目は、値を一度も入れていない total という名前を使います。Python がどう動くか見てください。
2行の Python ファイルを書く
printf 'print(100)\nprint(total)\n' > late.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
インタプリタで実行する
python3 late.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
コンパイラは段階ごとに進む
字句解析は、文字の並びをトークンに分け、空白やコメントを捨てます。
構文解析は、トークンが言語の文法に合っているか調べ、プログラムの木を作ります。コード生成はその木を機械語にし、最適化はそれを小さく、または速くします。
1行の Python を書く
echo 'print(6 * 8)' > times.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
トークンに分ける
python3 -m tokenize times.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
インタプリタは何も翻訳しない、と考える人がよくいます。Python はまずファイルをバイトコードという、自分用の簡単な命令に直します。次の Run でそれが見えます。48 を探してください。Python は実行の前に 6 × 8 を計算していました。
バイトコードを表示する
python3 -m dis times.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
さらに挑戦: 電卓の字句解析
ラボの calc は電卓で、字句解析は flex、構文解析は bison が作ったものです。Open terminal を押して make と打ち、次に echo "7 @ 2" | ./calc と打ちます。
2行が表示されます。どちらの行が字句解析から、どちらが構文解析から出たものでしょうか。なぜそう言えるかも考えてください。