編集可能

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

まとめ主がツイートした、「コンパイラ型」言語という分類は誤り、というところから派生した一連の話題をまとめたものです。抜けているのがあれば好きに追加してください。
議論 テクノロジー
20
Takeshi ITOH @it00h
インタプリタ型で実行時ならないとエラーを検出しないケース。c0(c1?)カバレッジを前提とした場合にコンパイラ型言語と比較して出荷後の不良の比率で優劣あるのだろうか。
Python3エンジニア認定ナビ @hpeo_pye
Pythonのプログラミング言語としての分類として、正しいものを選べ。 A.低水準型 B.インタープリタ型 C.トランザクション型 D.コンパイラ型 #Python3エンジニア認定 ite.hpeo.jp/entry/python/e…
うめうさぎ @UmeRabbit
@koiwai_g コンパイル言語はいいな!型定義するもんな! まさか配列期待のメソッドからカンマ区切りの数値文字列が出るパターンがあるなんて考えねえよ!
Panda@プログラミング演習 @Pract1328
プログラミング言語の実行形式の違い コンパイル型 - コードを機械語または中間コードに変換して実行 - 利点 : 利用者がすぐ実行できる - 欠点 : コンパイルに時間がかかる スクリプト型 - コードをそのまま実行できる - 利点 : 開発のオーバーヘッドが少なくなる - 欠点 : 比較的遅い
やなか @wayaqu
観測圏でいくらtypescriptとかコンパイル言語とかJSのフレームワークが流行っても俺はインタプリタ型言語でフレームワーク使わずに書く(というのを宗旨変えする可能性もあるけど😂)
Python3エンジニア認定ナビ @hpeo_pye
Pythonのプログラミング言語としての分類として、正しいものを選べ。 A.低水準型 B.インタープリタ型 C.トランザクション型 D.コンパイラ型 #Python3エンジニア認定 ite.hpeo.jp/entry/python/e…
客先常駐のさくらさん @ScrTy_CCS
プログラミング教育やるなら、CとかJavaじゃなくて、PHPやRubyから始めるべきなんですよ まぁ、インタプリタに慣れると、コンパイラ型言語はまずやらないだろうけど
K_a2sh4i @a2sh4i_engineer
僕はまだインタプリタ型言語というのしか勉強していないんだな。 コンパイラ型言語もある程度今の勉強が進んだら始めるか。 #programming #engineer #プログラミング学習
Kota Mizushima (on a diet) @kmizu
最近、一部のプログラミング入門書は継続的に「コンパイル型言語とインタプリタ型言語」とか、「インタプリタ型言語は一行ずつ翻訳して実行している」とか、後で修正されない誤りの元を広めていることが多いという気がしてきた(というか、実際、それが派生したと思われる間違いを多く目にする)。
S (ツイートはスレッド全体をご確認ください) @esumii
「インタプリタは命令を読みながら実行する」「コンパイラは命令を別の言葉に翻訳してから実行する(翻訳した命令は、また別のインタプリタなりコンパイラなりで実行する。それがハードウェアの場合もある)」で良いので、「1行ずつ翻訳」という嘘解説は「わかりやすさ」のメリットもない。
Kota Mizushima (on a diet) @kmizu
「コンパイラ型言語」と「インタプリタ型言語」とかの説明で納得したままでいられると何が嫌かというか、たとえば処理系の速度とかに関する議論をしようとおもうと、議論相手が言語仕様と処理系をごっちゃにして、話が伝わらないことが多いことなどがあると思います。
Kota Mizushima (on a diet) @kmizu
ちなみに、私がみたところ、「コンパイラ型(コンパイル型)言語」と「インタプリタ型言語」という説明をしている人のいくらかは、そもそも(典型的な)インタプリタが何やってるかを理解されていないのでは、と思っています。その辺は、「インタプリタ型言語」でぐぐっていただけるとわかるのですが。
Kota Mizushima (on a diet) @kmizu
あと、「インタプリタ」ってそもそも、むしろ正しい説明の方が(少なくともググった範囲では)少ないのでは、と思った。いや、機械語に「翻訳」しているわけじゃないんだってば。
Kota Mizushima (on a diet) @kmizu
インタプリタがなにかってのは、たとえば数式をevalする関数でも書いてみればすぐわかると思うのですけど。 def eval(e: Exp): Int = e match { case Add(l, r) => eval(l) + eval(r) ... case Value(v) => v } このevalが「機械語に翻訳している」とは思えませんよね、と。
S (ツイートはスレッド全体をご確認ください) @esumii
そりゃまあちょっとでも中身を知ってれば「インタプリタは1行ずつ翻訳」とか思わないですよね…
Kota Mizushima (on a diet) @kmizu
@book_western 読んでみましたが、一行ずつ「翻訳」の部分を否定していることが伝わっていなかったように思います。一行ずつ「解釈」しているインタプリタは昔はあったと思います。
book_western @book_western
振り返ってみると黎明期はむしろコンパイル型の言語の方が多いと思う。インタプリタはむしろ次の世代かもしれない(調査していないので不正確)。
極端流形式仕様 初代𝕍𝕚𝕖𝕟𝕟𝕒𝕋𝕒𝕝𝕜𝕖𝕣 @tomooda
インタプリタ型言語とかコンパイラ型言語とかは間違い、ってのはまあ実際問題そういう記述がある文章は間違っていることが圧倒的に多いわけだけど、言語仕様で処理系の方式を定めている言語もありうるわけで、その言葉自体を間違いと断定するのもどうかなと思う。なんとなく。
Kota Mizushima (on a diet) @kmizu
@zacky1972 あ、あと、インタプリタが「一行ずつ」「翻訳」している、という誤りについてもですね(インタプリタの「解釈」という挙動があまり理解されていないようだ、という問題意識です)。
po @podhmo
インタプリタが一行ずつ解釈するとか誤解してる人存在するの?
そすうぽよ @_primenumber
言語に備わった性質として「インタプリタ型・コンパイラ型」みたいなのが決まるわけではないしなあ C++でさえインタプリタと対話型インターフェイスが存在するし( github.com/root-project/c… ) もっともリフレクション要素があるとコンパイラを作るのは大変そうだけど。
Kota Mizushima (on a diet) @kmizu
「コンパイラ型」言語と「インタプリタ型」言語は、普通にお仕事関連で見たことから来る問題意識で、この区別がたとえ誤っていようとプログラムはもちろん書けると思うんですが、言語の実行モデルに関することに話が及んだときに話が通じなくなる恐れが高いので、この誤った区別はリアルに嫌です。
はたの☆☆☆クラブ名に崎がつくのは長崎と川崎だけなんです @hatano
言語にコンパイラ型とインタープリタ型があるのではなく言語処理系にコンパイラとインタープリタ(とそのハイブリッドな様々)があるんだけどね。
残りを読む(35)

コメント

mikumiku_aloha @mikumiku_aloha 2019年9月18日
LISPの頃からインタープリター型言語の特徴は便利な機能を徐々に増やせることと聞きました。まとめ中にあるようなeval関数(って言わないのかな?)を定義すると、その後はインタープリターの機能としてevalが使えるようになるわけで。
mikumiku_aloha @mikumiku_aloha 2019年9月18日
初期のBASICはFORTRANをベースにそれを使いやすくという発想の設計で、LISPやLogoなどといったインタープリターの上記の特徴(徐々に機能拡張)を発揮出来ないためインタープリターとコンパイラーでどっちが実行効率が良いという本質的でない部分が注目されちゃうと30年ぐらい前に大学で習いました
ゆーき @yuki073 2019年9月18日
mikumiku_aloha 徐々に機能拡張が何を指すのかわかりませんが、どの言語も仕様の拡張、機能追加は行われているはずですが?
mikumiku_aloha @mikumiku_aloha 2019年9月18日
yuki073 LISPは言語仕様としては基本的なリスト処理なのが、そこにどんんどんと関数の定義を増やしいいくことでユーザーの環境が便利になっていく。コンパイル時にライブラリーに組み込むのではなく、ユーザーとコンピューターの対話機能が増えていく。
いとけい @itokei_ 2019年9月18日
なつかしいなあdB-BASIC
アルビレオ@炙りカルビ @albireo_B 2019年9月18日
コンピュータは機械語命令しか実行できないよ。突き詰めればコンパイル系とインタプリタ系の違いは「いつ機械語に翻訳するか」でしかないし、コンパイル系でもevalや正規表現のように実行時に動的に機械語を生成するものがあるし、インタプリタでもJITはコンパイラに近いことをやっている。昔に比べるとかなり違いは少なくなってるよ
mikumiku_aloha @mikumiku_aloha 2019年9月18日
albireo_B まとめ主は、インタープリターは処理系が解釈して機械語で動くもので、コンパイラのように翻訳する(機械語の実行ファイルにする)わけではないということで、解釈と翻訳は分けようと言っているように見えます。
kartis56 @kartis56 2019年9月18日
BASICコンパイラとかあるので、言語と処理方法は必ずしも一致しない。perl とかだってコンパイラ作ってもいい
ハント中尉 @wildlicca 2019年9月18日
昔はコンピュータの性能が低かったので機械語にコンパイルしないと実用的じゃなかったって視点が抜けてる気がします。まとめ内のコンパイラ型インタプリタ型の分類って言語の構文とか構造がコンパイルしやすさか可読性かのどっちかに振られているかを語ってるように感じた
mikumiku_aloha @mikumiku_aloha 2019年9月18日
インタープリターは一般的には通訳の意味なので、通訳と翻訳の違いと考えれば良いのかもしれない。 でもって、通訳に自分好みのあれこれを教え込むことで通訳が成長する。
ゆーき @yuki073 2019年9月18日
cでも作ろうと思えばEvalは作れると思いますけど。それを実装したらインタープリター言語なんですかね?要はコンパイラを内蔵するだけですけど。
いとけい @itokei_ 2019年9月18日
……インタプリタ型というか対話型?
Hacchi @2mocccck 2019年9月18日
ピクニック(あらかじめ作っておく)とバーベキュー(食う時に調理する)ぐらいの違いしかないもんだと思ってた
KPCG10 @KPCG10 2019年9月18日
コンピュータ黎明期(~80年代)は主記憶が小さいので速度を犠牲にしてもインタプリタBASICが流行りました。後に主記憶の制限が取れてきてコンパイラ型言語が流行り(簡単な命令語が多数の機械語に置き換わる=コンパイル。~90年代)、そのうちリアルタイムコンパイルが登場(命令語を読みつつ機械語へ変換してキャッシュする。~00年代)現在ではインタプリタでも十分速度が出るので好き好きですね。
T.Nakagawa @nora1962 2019年9月19日
LispもSBCLをどう位置づけるのかかとかありそう
Kota Mizushima (on a diet) @kmizu 2019年9月19日
yuki073 CINTというCインタプリタは実在して、こいつは(機械語へは)翻訳してません。
Kota Mizushima (on a diet) @kmizu 2019年9月19日
mikumiku_aloha 元々のinterpreterは通訳ですが、そのアナロジーを実際のインタプリタに適用できないと思います。通訳は相手のことばをその場で翻訳して伝えているので(インタプリタは翻訳しない)
nekosencho @Neko_Sencho 2019年9月19日
初期のパソコンだと、メモリが致命的に少なかった&外部記憶装置に信頼性がなかったので、メモリ内でソース(コンピュータにはわからない)と翻訳済みの実行ファイル両方置いとくことが難しかったから必然的に少しずつ実行できるインタプリタになった。数キロなんて手書き機械語でもすぐ埋まる
S (ツイートはスレッド全体をご確認ください) @esumii 2019年9月19日
・FORTRANやLISPは1950年代からあって、前者はコンパイラ、後者はインタプリタが(比較的)多かった(もちろん、LISPのコンパイラも昔からある) ・コンパイル後は実行にソースコードが不要な言語も多い もご参考になれば。
S (ツイートはスレッド全体をご確認ください) @esumii 2019年9月19日
すみません、(わりと)初期のLISPでもインタプリタとコンパイラのどっちが「多かった」か微妙なので、「インタプリタが多かった」は訂正します。何度も失礼しました。
nekosencho @Neko_Sencho 2019年9月19日
Neko_Sencho ソースと実行ファイル両方を置かなきゃいけないってこともないんだけど、自分でプログラムを作る時代だったからまずソースができる、それを実行ファイルに変換(コンパイル)する、外部記憶装置があてにならないとなると、メモリ上にソース、実行ファイルに変換するプログラム(コンパイラ)、実行ファイルの3つを置けないとつらい。となるとメモリが絶望的に足りない。
mikumiku_aloha @mikumiku_aloha 2019年9月19日
リソースの限界に関してはFORTRANが登場した頃のコンピューターもかなり貧しいので、リソースが少ないからインタープリターというよりは、パンチカードなどによるバッチ処理から、TSS端末を使えるようになってからという影響かもしれません
mikumiku_aloha @mikumiku_aloha 2019年9月19日
kmizu 人間の言葉を理解する便利な存在という感じの方が近いんですかね
Kota Mizushima (on a diet) @kmizu 2019年9月19日
mikumiku_aloha そうですね。その方が、実態に近いと思います。
Ayuha_m @aymhtnk 2019年9月22日
いや、これものの見事に誤解していたので、教えて頂きたいです。 言語仕様そのものに「コンパイラ」と「インタプリタ」という違いはない、とのことですが、「コンパイラ実装しやすい言語仕様」「インタプリタ実装しやすい言語仕様」というのはあるんでしょうか? 素人考えだと、学習難易度が低い、いわゆる「インタプリタ言語」(Ruby, Pythonとか)をコンパイルしてC言語並みに速くなるのならそれが最強じゃないか、と思ってしまったり・・・(コンパイラ実装も無くはないですが、一般的ではないように感じるので)。
ログインして広告を非表示にする
ログインして広告を非表示にする