クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

2つの翻訳のしかた(コンパイラ、インタプリタ)

このレッスンのあとで: コンパイラとインタプリタのちがいを説明できる。

50分のレッスンコマンド9件コンパイラとアーキテクチャのラボ:gcc、flex、bison、RISC-V を1台の VM で

一度書いて、何百万台で動く

スマホのゲームは、人が読める言葉で書かれています。でもスマホのプロセッサは、その言葉を読めません。読めるのは、数でできた自分の命令だけです。

だから、先にだれかが翻訳しなければなりません。翻訳には大きく2つのやり方があり、どちらもラボのマシンで見ることができます。

このレッスンのゴール

メモ

コンパイラとインタプリタのちがいを説明できる。

キーワード

ことばいみれい
ソースコード人が書いた形のプログラムhello.c
機械語プロセッサが実行する、数で書かれた命令
翻訳プログラムソースコードを、コンピュータが実行できる形にするプログラム
コンパイラ実行の前に、プログラム全体を機械語にする翻訳プログラム
インタプリタプログラムを1文ずつ読んで実行する翻訳プログラム
トークン名前、数、記号など、プログラムの1つの単語

学生が入力するセルは、このプレビューでは空白です。

3種類の翻訳プログラム

アセンブラは、アセンブリ言語を機械語にします。1行が1つの命令になります。

コンパイラは、まずプログラム全体を読みます。どこかにまちがいがあれば、それを知らせて止まり、何も実行されません。まちがいがなければ、何度でも実行できる機械語を書き出します。

インタプリタは、1文を読んで実行し、それから次の文を読みます。

コンパイラとインタプリタを比べる

問いコンパイラインタプリタ
いつ翻訳するか実行の前に全部実行しながら1文ずつ
プログラムのファイルができるかできる。コンパイラなしで何度も実行できるできない。毎回インタプリタが必要
まちがいはいつ見つかるか何かを実行する前その行に来たとき
どちらが速いかふつうはコンパイルしたプログラムふつうは遅い
ラボではgccpython3

学生が入力するセルは、このプレビューでは空白です。

始める前に

メモ

上のバーの 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行が表示されます。どちらの行が字句解析から、どちらが構文解析から出たものでしょうか。なぜそう言えるかも考えてください。

このラボとソースについて: コンパイラとアーキテクチャのラボ:gcc、flex、bison、RISC-V を1台の VM で

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。