インタープリタは「翻訳」しない

http://qiita.com/kantomi/items/747aef968d37b5ebeced

中間言語方式 Java・.Net
(バイトコードなど)中間言語に変換してから、JavaVMなどがネイティブコードで実行する。

インタープリタ言語 PHP/Ruby/JavaScriptなど
1行ずつ、コンパイルしながら実行する。
コンパイラ(コンパイル作業)すら必要ないようにした。

■ 最終的にマシン語(機械語)に翻訳されます

……うへえ。今時こんな文章を読むことになろうとは。

当たり前ですが、JVMを含め、インタプリタはネイティブコードへの変換は行いません*1

今から文章書くにはもう眠いので、昔、拙著「センス・オブ・プログラミング」に書いた文章を貼っておきます。

センス・オブ・プログラミング p.83の補足『インタープリタは「翻訳」しない』より

インタープリタは「翻訳」しない』
どうも、入門書によっては、コンパイラインタープリタについて、以下のような説明をしているものがあるようです。

コンパイラは、ソースプログラム全体を一気に機械語に翻訳して、オブジェクトプログラムを作成する。
それに対し、インタープリタは、事前に一括翻訳するのではなく、実行と同時に、1行づつ部分的に機械語に翻訳する。

はっきりさせましょう。この説明は、完璧に間違っています
インタープリタでは、ソース(または中間形式)を、インタープリタというプログラム自身が解釈しながら実行します。インタープリタが、ソースから機械語への変換を行なうことはありません。
最近のJava仮想マシンは、バイトコード機械語に変換する機能を持っています。しかしこれは「JIT(Just In Time)コンパイラ・・・・・」と呼ばれる技術であり、この部分を指してインタープリタとは呼びません。
この間違いは、私が8ビットパソコンのBASICで遊んでいた頃(もう20年近くも前になりますか---遠い目)にはあちこちで見掛けたものですが、さすがに最近は絶滅したものだと思っていました。
しかし、本書の執筆のため、本屋で各種入門書を見てみると、最近の入門書にも、上のような嘘が書かれているものがちょくちょくあるようです。これが驚異のべすとせらあ?

――困ったものです。

ここで、「これが驚異のべすとせらあ?」と書いている本は、「プログラムはなぜ動くのか 知っておきたいプログラミングの基礎知識」(矢沢久雄著)です*2。当時、「これが驚異のベストセラー!」というアオリが帯に書かれていたのです……
上記の補足を書いた「センス・オブ・プログラミング」が出版されたのが、2004年ですよもう12年も前ですよ。

だいたいプログラマーなら、インタプリタのひとつやふたつみんな作るものだろうに一度でも作ったらこんな勘違いすぐに解消されるだろうに。
はい宣伝。プログラミング言語の作り方に興味が出てきた方はこちら。

関係ないけど今一番売れてほしいのはこの本なので、これも宣伝しておきます。

Webアプリケーション開発を学ぶのに、「Webサーバを作る」という低レベルなところから攻めていこうという本です。低レベルなところから攻めるという点で、プログラミング言語の動く仕組みとかを考えるのと、関係なくはないですね。

ところで、Qittaにはトラックバックとかは飛ばせないようですが、元記事書いた方には、いったいどの本を読んで、インタプリタが「1行ずつ、コンパイルしながら実行する」という(誤った)知識を得たのか、ぜひ教えていただきたいところです。

*1:もちろんJITのような技術はありますが、これはJust In Time コンパイラであって、この部分を指してインタプリタとは呼びません。

*2:私が確認したのは1版7刷 (1刷ともに2001年