11. コンピュータ言語はどのような仕組みで動いているのか

プログラムを実行する仕組み については、すでに説明しました。あらゆるプログラムは、最終的に、 一連のバイト列、すなわちコンピュータの マシン言語 (machine language) で表現された命令として実行されなければなりません。 しかし、人間は、こうしたマシン言語は上手く扱えません。 そうしたことはもう極めて稀になり、ハッカーの間でも 黒魔術化しています。

カーネル自体の内部にあるハードウェアインターフェイスを直接サポートする少量の 部分を除くと、ほぼ全ての Unix コードは、今日では、 高水準言語 (high-level language) で書かれています。(この用語の「高水準」という部分は、古くさい言葉で、 「低水準」の アセンブラ言語 (assembler languages と区別する意味で 使用されるものです。アセンブラ言語とは、基本的にマシン語を若干分かり易く したような言語のことです)。

高水準言語には、いろいろな種類があります。こうしたプログラム言語について 話す際は、プログラムのソースコード (source code) (すなわち、人間が作成したもので、変更が可能なコード) は、何らかの変換処理を 経ることで、マシンが実際に実行できるマシンコードに変換される必要がある のだということを是非頭の片隅で覚えておいてください。

11.1. コンパイル型の言語

コンピュータ言語の中で最も伝統的なのが、コンパイル型言語 (compiled language) です。コンパイル型言語は、その名の通りコンパイラ (compiler) と呼ばれる特別なプログラムによって、実行ファイルである バイナリ形式のマシンコードへと変換されます。一旦バイナリが生成されると、 再度ソースファイルを参照せずとも、直接そのバイナリを実行することが できます。(大部分のソフトウェアは、コンパイルされたバイナリ形式で配布され、 その元になっているコードを見ることはできないのが一般です。)

コンパイル型言語は、パフォーマンスに優れ、OS リソースへのアクセスも最も効率 よく行うことができますが、プログラムするのが難しいという傾向があります。

C 言語は、Unix を記述している言語であり、(その派生言語である C++ とともに) コンパイル言語のなかで圧倒的な重要性を持っています。FORTRAN もまたコンパイル 型の言語であり、いまでもエンジニアや科学者の間では利用されていますが、 C よりも古く、旧式なものです。Unix の世界では、それ以外のコンパイル言語は、 メインストリームとしては利用されていません。それ以外では、COBOL が、 金融やビジネス用ソフトウェアとして広く利用されています。

以前は、いろいろなコンパイル型言語がありましたが、ほとんどはすたれたか、 研究用のツールとしてしか使われなくなっています。読者がコンパイル言語を 使う新人の Unix 開発者なら、使用言語は C か C++ であることがほとんどです。

11.2. インタプリタ型言語

インタプリト型言語 (interpreted language) とは、ソースを解釈する プログラム (interpreter program) を必要とする言語です。そのプログラムが、 実行の際そのソースコードを読み込んで、演算やシステムコールが可能な形式に 変換する仕組みになっています。この場合、コードが実行されるたびに、( ソースを解釈するプログラムが起動されて、) ソースコードの変換が行われ なければなりません。

インタプリタ型言語は、コンパイル型言語よりも実行速度が遅く、下部階層にある オペレーティングシステムやハードウェアへのアクセスも制限されることが多いの 傾向があります。その反面、コンパイル型言語に比べてプログラムが容易で、 コードにエラーがあっても深刻な事態になりにくかったりします。

シェルや bc(1), sed(1), awk(1) を含む多くの Unix ユーティリティは、かなり 小型のインタプリタ型言語です。BASIC も通常はインタプリタ型であり、 Tcl もそうです。歴史的に見て、最も重要なインタプリタ型言語は、LISP です(何世代もの開発者たちにより、大幅な改善がほどこされてきました)。 現在では、Emacs エディタ内で使用できるシェルと LISP が、おそらく 最も重要な純粋インタプリタ型言語であると思われます。

11.3. P-code 言語

1990 年以来、コンパイルとインタプリタの両方を使う一種のハイブリッド言語 の存在が重要になってきています。P-code 言語というのは、ソースコードが コンパクトなバイナリコードに変換されて、それが実際に実行されるという点では コンパイル型言語と似ていますが、変換されたコードの形態がマシンコードでは ないという点で異なります。それは、疑似コード (pseudocode) (もしくは p-code) であり、これは実際のマシンコードよりもシンプルかつパワフルなものです。 プログラムの実行時には、この p-code が (インタプリタにより) 変換されます。

p-code は、コンパイル型言語のバイナリとほぼ同じくらいの実行速度を持ちます (単純かつ小型で、スピーディな p-code インタープリタを作成することが できるからです)。つまり、p-code は、柔軟かつパワフルなインタプリタ型言語 の長所も保持しているわけです。

重要な p-code 言語としては、Python, Perl, および Java があります。