見出し画像

Retro-gaming and so on

もういい加減、「コンパイラ型言語」とか言うのは止めないか。

以前から気になってた事を言う。

もういい加減、「コンパイラ型言語」とか「インタプリタ型言語」とか言うのは止めないか。

この2つの区分けは実は全く意味を成さない。
確かに、30年〜40年くらい前、初心者向けのプログラミング言語のテキストに、プログラミング言語には「コンパイラ型」と「インタプリタ型」がある、なんつー事が書かれてた気がする。今も書かれてんの?

んな区分けは意味がない。全くの無駄。言わばクソだ。

確かこんなカンジで前書きとか書かれてたんじゃねぇ?

「従来のBASICはインタプリタで速度が遅いのが問題になってきました。一方、新しく登場したC言語はコンパイラで、律速なコードを吐き出します。」

ここに書かれてる事には既に嘘がある。
BASICはインタプリタたぁ限らない。たまたま貴方が使ってたPCに載ってたBASICがインタプリタなだけであるか、ポピュラーな(例えばMicrosoftの)BASICがインタプリタなだけで、BASICが全部インタプリタである、と言うのは間違いである。実際当時のメインフレームではBASICのコンパイラが動いていた。
そして、C言語の言語仕様ではCはコンパイラとは決めていない。C言語もインタプリタがあって構わないのだ。「たまたま」実用性の問題で、多くのC言語実装者がCをコンパイラとして実装しているだけ、だ。しかし、いずれにせよ、全てのC言語処理系をコンパイラにしろ、とは規定されていない。

要するにこういう事だ。

☆ 仕様の話と実装の話をごちゃまぜにすんな。

そして殆どの言語仕様では、大体、言語Xをインタプリタである、ともコンパイラである、とも規定してない。従ってもうこの時点で「コンパイラ型言語」とか「インタプリタ型言語」なんつーのは成り立たないのだ。
つまり、80年代辺りの初心者向け教科書からずーっと嘘が最初に書かれていて、しかもヘタすれば今も嘘が書かれてるのだ。一体どーなってんだ。

そして実装の話で考えてもややこしい。そもそも現代の言語処理系って「コンパイラ型」とか「インタプリタ型」とか技術的に分けられるのかしら?
ちょっと次の質問を考えてみよう。

Q: Javaはコンパイラ型言語なのかインタプリタ型言語なのか?

「そんなのコンパイラ型に決まってるでしょ。昔見たJavaの入門書に書いてあったよ。」

とか言う貴方。貴方はピュアである。
実際はこうだ。「JavaはC言語で言うコンパイラ程コンパイラでもない」。ちとややこしい言い回しだけど。
C言語のコンパイラは殆どのケースでネイティヴコード、つまり、直接CPUが解読出来るマシン語を最終的には吐き出す。
一方、Javaはそうではない。JVM(Java Virtual Machine)と呼ばれる仮想マシン上で実行されるコードをJavaのコンパイラ(javac)は吐き出す。こう言う、仮想マシン上で動くマシン語をバイトコードと呼んだりするわけだが(そしてこのテのコンパイルをバイトコンパイル、と言ったりする)。
このバイトコードはCPUは直接読めない。何故なら、例えばこの場合、JVMの設計者が決めたJVM上で解釈されるマシン語であって、CPUとは直接関係ないのだ。
そして次が極めて重要である。仮想マシンとは原理的には単なるインタプリタなのだ。
つまり、Javaのコンパイラ(javac)はJavaのソースコードをJVMと言うインタプリタで解釈する為のマシンコードであるバイトコードを吐き出す・・・繋げて一気に読むとワケが分からん状態だが、実際こうなんだから仕方ない。いずれにせよ、仮想マシンは原理的にはインタプリタなのだ。ここ重要。
さぁ、じゃあJavaはコンパイラ型言語なのかインタプリタ型言語なのか・・・要するにこの問は無意味だ、って事が分かるだろう。

こういう言語はJavaだけじゃない。Pythonなんかも一見インタプリタだと思われてるが、実はコンパイラも付いている。CやJavaと違うのが、明示的にコンパイル指令が必要ないトコだ。でも我々が気が付かないトコで、こっそりと書いたソースコードをバイトコンパイルして高速化してくれたりする。最近は意外とこういう言語が多い。
他にもLisp、特にANSI Common Lispなんかはインタプリタでもありコンパイラでもある。通常はインタプリタとして使ってるが、速度が必要な場合は任意にコンパイル出来る。こうなると、完全に「インタプリタ型言語」とか「コンパイラ型言語」なんつーのは何の区別にもならんし、意味が無い区分けだと言うのがお分かりいただけるだろう。

もうホント、事実にも適合しないし、いい加減「コンパイラ型言語」とか「インタプリタ型言語」とか、初心者に向けて嘘教えるの止めようぜ。
もう一回原点に戻るけど、大体のプログラミング言語仕様には「インタプリタとして」あるいは「コンパイラとして」実装せよ、なんて書いてないんだから、仕様と実装をごちゃまぜにしておかしな事を教えるのはいい加減止めるべきだと思う。
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「プログラミング」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事