「コンパイラ型」言語と「インタプリタ型」言語に関するまとめ

まとめ主がツイートした、「コンパイラ型」言語という分類は誤り、というところから派生した一連の話題をまとめたものです。抜けているのがあれば好きに追加してください。
20
uint256_t @uint256_t

コンパイル型とインタプリタ型の謝った理解ってなんですか

2019-09-15 16:08:54
yoh2 @yoh2_sdj

ここにインタプリタ型に分類されるけどJITコンパイルで部分的に機械語を生成する言語がぶち込まれて場が混乱する。

2019-09-15 16:28:33
kmizu @kmizu

ところで、コンパイラ型言語とかインタープリタ型言語とかおかしいといっておきながら、長くなるからJVM言語とかいう用語を使ってしまってるのはちと罪悪感が(結構前から)あったりします。正確には、JVMで処理系が動作するのを前提にして仕様が作られた言語、ってところなんですが、めっちゃ長い。

2019-09-15 16:37:57
名賀月晃嗣 (あっきー) @acy

昔懷かしのBASICの頃ならいざ知らず、いまどきのインタプリタ式とされる諸言語、實行始める前に構文エラーを吐いてくれるからね。一行づつとか、うん、それ何の話、みたいなw まあ、構文解析において行が意味を持つから、C++er的にやりにくいなあと思ふことはあるのだが。

2019-09-15 16:38:33
齊藤 健司(ゆめかけ@こんぶ) @yume_piece1010

Javaもコンパイルせずに実行出来るからなぁ(内部的には動的にコンパイルしてるかも知れんが) コンパイル型言語とインタープリター型言語って分類は不適切になってきてる。 実行形態に過ぎないよな。 Rustでさえサードパーティ製のREPLでインタープリター実行出来るわけだし

2019-09-15 16:50:14
S (ツイートはスレッド全体をご確認ください) @esumii

自分が子供の頃(1980年代)のマイコン(死語)ブームのときも、BASICインタプリタとコンパイラの両方があったし、「インタプリタは1行ずつ翻訳(≠解釈)して実行」という説明がよくあって嘘じゃん!と思った記憶。

2019-09-15 17:33:53
kmizu @kmizu

なんか、処理系と言語が一対一対応してるから便宜上云々ってあったのだけど、100歩譲ってそうだったとしても、昨今普通になってきた、JITコンパイルされる「言語」(ここは皮肉)は「インタプリタ型言語」なのか「コンパイル型言語」なのか区別つかなくなるから、やっぱり色々な意味でこの区別は筋悪。

2019-09-16 01:53:54
kmizu @kmizu

もし、言語の性質に「コンパイラ型」と「インタプリタ型」をくっつけるのなら、初期のJavaは(バイトコード)インタプリタ型言語だったけど、JITコンパイラが入って、コンパイラ型言語っぽくもなって、さらに、AOTコンパイラが出て、コンパイル型言語にもなって…と収集つかなくなるわけだ。

2019-09-16 01:55:11
極端流形式仕様 初代𝕍𝕚𝕖𝕟𝕟𝕒𝕋𝕒𝕝𝕜𝕖𝕣 @tomooda

あらゆる言語を「コンパイラ型言語」「インタプリタ型言語」に分類するのは間違い。一方で、言語によってはコンパイルされることが前提(例えばJavaはbytecodeにコンパイルされる)だったり、言語仕様でインタプリタ動作を規定しているものもあるので、そういう文脈では間違いと断言するのはいきすぎ。

2019-09-16 11:50:00
はる💉💉💉💉💉 @I_HaL

@kmizu ツイート拝見いたしました。 「インタプリタ型言語は一行ずつ翻訳して実行している」は誤り。 「インタプリタ型言語は一行ずつ翻訳して(から)実行している」が正しい。 という認識でよいでしょうか?

2019-09-16 12:05:55
極端流形式仕様 初代𝕍𝕚𝕖𝕟𝕟𝕒𝕋𝕒𝕝𝕜𝕖𝕣 @tomooda

言語デザインとしてコンパイラ実装された時に最大の効果を発揮できるよう言語機能を組み合わせた言語については、オレは恥も臆面もなく「コンパイラ型言語」と呼ぶよ。例えばFORTRANはコンパイラ型言語だ。もちろんインタプリタ実装も可能だし存在するが、立派なコンパイラ型言語だと思う。

2019-09-16 12:15:46
はる💉💉💉💉💉 @I_HaL

テストの〇と×で、 BASIC→インタープリタ型言語 LISP→インタープリタ型言語 C言語→コンパイラ型言語 FORTRAN→コンパイラ型言語 とか、だった気がした。

2019-09-16 12:21:43
極端流形式仕様 初代𝕍𝕚𝕖𝕟𝕟𝕒𝕋𝕒𝕝𝕜𝕖𝕣 @tomooda

@miura1729 もちろんインタプリタも便利なシーンがあるから実装されるわけですが、最終的に何を狙って言語仕様が定義されているかといったら、コンパイルされたネイティブコードの処理速度ですよね。ならコンパイラ型と呼んでいいでしょ、と思うわけです。(コンパイラ指向でもいいですが、これはこれでまたげふん

2019-09-16 12:22:55
DR.KSK @DR_KSK

@pao5656 PHPとかのインタプリタ型も、PHP環境が一旦コンパイルして実行している、ということを言いたいんじゃないんでしょうか? Go言語とか、go runとgo buildの2つでインタプリタ風とコンパイル風に実行できるようになってますし。 もしくは、1行ずつ、というところがNGなのか。

2019-09-16 12:30:31
はる💉💉💉💉💉 @I_HaL

@felis_silv STOPボタンで止まる→インタープリタ型言語 電源を切ると止まる→コンパイラ型言語 というイニシエの認識。(老害

2019-09-16 12:44:33
れでぃ☆ばぐ @pcbcat

これなー。時代とともに変わるんだよな。 とはいえ、翻訳という言葉の使い方が間違ってるわな。 「コンパイル型言語とインタプリタ型言語」と言ってたのは、どちらか一方しか存在できない程度のメモリ環境しかなかった、って前提だと思うのよね。 twitter.com/kmizu/status/1…

2019-09-16 14:03:23
kmizu @kmizu

最近、一部のプログラミング入門書は継続的に「コンパイル型言語とインタプリタ型言語」とか、「インタプリタ型言語は一行ずつ翻訳して実行している」とか、後で修正されない誤りの元を広めていることが多いという気がしてきた(というか、実際、それが派生したと思われる間違いを多く目にする)。

2019-09-15 08:50:00
れでぃ☆ばぐ @pcbcat

あの時代の「インタプリタ型言語」ってのは、たとえばLISTコマンドで表示させたときに中間コードからテキストに変換して表示される。そのまま編集できる。 Enterキーをおして次の行に行くときに中間コードに変換してメモリに保存される。RUNコマンドで中間コードを解釈しながら実行する。

2019-09-16 14:03:23
れでぃ☆ばぐ @pcbcat

「コンパイル型言語」は、ある程度OSやファイルシステムがある前提で、プログラムを書いたテキストファイルをコンパイラに渡して「翻訳」して「実行ファイル」を生成した上でユーザーが任意に実行できる。これは今も昔も変わらない。

2019-09-16 14:03:24
まりす@maris annの中の人 @maris_HY

インタプリタ/コンパイラの話。 インタプリタ言語/コンパイラ言語じゃなくて、インタプリタ実装/コンパイラ実装なんですよね?本質は。 どちらの実装かは言語仕様にそれ程影響を与えないはず。 どちらかしか持たない言語が有ったとしたら、それはまだそうで無い方が作られていないだけじゃ無いのかな?

2019-09-16 14:21:33
あおいさや @La_zlo

@maris_HY ですね。 自分は最近インタプリタ言語じゃなくてスクリプト言語というようにしてます。 TAT短くて手軽という側面は実装に意味があるので。

2019-09-16 15:19:45
kmizu @kmizu

@I_HaL そういう意図ではなかったです。まず、第一に「インタプリタ型言語」という区分がまずおかしい(コンパイラとインタプリタは言語の性質ではなく、処理系の性質に過ぎない)というのがあります。第二に「インタプリタはそもそも(機械語であれ他の言語であれ)翻訳していない」というのがあります。

2019-09-16 18:15:44
kmizu @kmizu

@I_HaL 凄い単純化した数式インタプリタを考えてみます(C言語風です)。 int eval(ast tree) { switch(ast.type) { case ADD: return eval(ast.lhs) + eval(ast.rhs); case SUB: return eval(ast.lhs)+ eval(ast.rhs); ... } } ここでは(木を)「解釈」しているだけです。

2019-09-16 18:18:33
kmizu @kmizu

@I_HaL 俗流のしばしば誤ったインタプリタ解説では、(一行ごとに)機械語に翻訳している、といったものがありますが、上のようなコードを想像してもらえば、そういうものは(普通はない)と納得してもらえるのではないかと。

2019-09-16 18:20:26
kmizu @kmizu

@DR_KSK @pao5656 twitter.com/felis_silv/sta… とかで言及されていることでもありますが、ある言語のプログラムはコンパイラで翻訳できるし、インタプリタで解釈することもできるのであって、という意味です。なお、Goのインタプリタはありえますが、今のgo runもgo buildもどっちもコンパイルしています。

2019-09-16 18:39:45
やまねこ⚙楢ノ木技研 @felis_silv

@pao5656 言語と、ランタイムの実装(コンパイル/インタープリタ)は本来的に無関係な概念であるという点で。。Cインタープリタなんてのもありますしね。

2019-09-16 12:33:06
kmizu @kmizu

「コンパイラ型言語」と「インタプリタ型」言語に関する言及、なんか予想以上に凄い反響があって驚いているのですが、反応をみても、わかっている方の一部の「まあ、便宜的用法でしょ」ってのはやっぱり的外れで、本気で区別がついていなかったり、イメージが誤っている人は多数いるようです。

2019-09-16 18:42:57