seegongsik
プログラミング

わかりやすく コンパイラ インタプリタ ちがい

私たちは「add」「if」「名前」のような人の言葉でコードを書きます。でも機械が内側でわかるのは、オンとオフのレベルのとても小さな命令だけです。人の言葉と機械の言葉のあいだには大きなすき間があり、そのすき間に橋をかけるのがコンパイラとインタプリタです。

01

人の言葉と機械の言葉は違う

私たちが書く「add」「if」は、人が読みやすい言葉です。
でも機械が本当に知っているのは、オンとオフを並べたとても小さな命令だけです。
私たちの書いた文と機械のする仕事のあいだには大きなすき間があるので、私たちの文はこのままでは動かせません。

私たちの文
二つの数を足す
?
1011 0010 1100 0101
機械の仕事

上は私たちが書いた一行、下は機械がわかる小さな命令。「すき間を見る」を押すと、二つのあいだの隔たりが見えます。

上と下があまりにも違います。
人の言葉はひと目で読めるのに、機械の言葉は見分けがつきません。
だれかがこのすき間を代わりに渡ってくれなければならず、そのやり方が二つあります。

02

橋をかける二つのやり方

すき間を渡るには、翻訳してくれるだれかが必要です。
一つは文全体を前もって全部翻訳しておくやり方、もう一つは一行ずつその場で読んですぐに実行するやり方です。
前者がコンパイラ、後者がインタプリタです。

私たちの文 → コンパイル → 完成品 → 実行

コンパイラとインタプリタを順に押すと、「全体を先に翻訳」と「一行ずつその場で」の形が違って描かれます。

同じすき間を渡るのに、やり方がずいぶん違います。
一方は前もって、もう一方はその場で行います。
まずは、前もってまるごと翻訳するほう、つまりコンパイラの働き方からくわしく見ていきましょう。

03

コンパイル:まるごと前もって翻訳する

コンパイラは私たちの文を最初から最後まで全部読み、機械がすぐに使える完成品に一度で変えます。
翻訳は前もって一回だけで、その成果物を何度でも速く動かせます。
ずれているところがあれば、動かす前に知らせてくれることもあります。
本を一冊まるごと翻訳しておいてから、読者に手渡すようなものです。

値を決める
二つの数を足す
結果を見せる

「コンパイル」を押すと文全体が完成品に変わり、「実行」を押すとその完成品を一度に速く動かします。

全体を前もって翻訳しておくので、実行はむだがなく速いのです。
そのかわり、最初に翻訳が終わるまで待たなければなりません。
では、待たずにすぐ始める方法はないのでしょうか。それがインタプリタです。

04

インタプリト:一行ずつその場で

インタプリタは、完成品を別に作りません。
私たちの文を上から一行読んですぐにその仕事をし、次の行を読んでまたする、というようにその場で進めます。
だから待たずにすぐ始められ、気軽に試すのも簡単です。
話す人の横で、一文ずつ訳していく通訳のようなものです。

値を決める
二つの数を足す
結果を見せる

「実行」を押すと、一行読んですぐに行い、次の行へ移ります。その場で順々に進みます。

すぐに始めて一行ずつ進むので、手になじみます。
そのかわり、動かすたびに最初から一行ずつ読み直します。
コンパイルは前もって速く、インタプリトはその場で手軽に。
では、どちらのほうがよいのでしょうか。

05

どちらが上というより、やりとり

どちらかがいつもよいわけではありません。互いにやりとりする関係です。
コンパイルは始まりが遅いけれど実行が速く、エラーを前もって知らせてくれます。
インタプリトはすぐに始まって試すのも簡単ですが、毎回一行ずつ読み直します。
だから実際には二つを上手に混ぜて使うことが多く、何をより大事にするかで選ぶのです。

コンパイラ
インタプリタ
始まり
先に翻訳 (遅い)
すぐ
実行の速さ
速い
普通
エラーが出るとき
動かす前
その行に着いたとき
成果物
完成品あり
特になし

項目を押すと、始まり、実行の速さ、エラーが出るとき、成果物が、二つのあいだでどう分かれるかが出てきます。

これで、私たちの文がどうやって機械の仕事になるのかを見ました。
では、そうして動いているあいだ、私たちが作った値やオブジェクトは、いったいどこに入っているのでしょうか。
「これがあれを指す」とは、どういう意味なのでしょうか。
この分野の最後のレッスンで、その場所をのぞいてみます。

一言でいうと人の言葉で書いたコードは、そのままでは機械が動かせません。コンパイラは全体を前もってまるごと翻訳して完成品を作り、インタプリタは一行ずつその場で読んで実行します。二つは優劣ではなくやりとりで、始まりの速さ、実行の速さ、エラーが見つかるときが違うのです。
← プログラミング
このページがお役に立ったなら支援する