すでに プログラムはどうやって動くのかについ ては説明しました。どのプログラムも究極的には、そのコンピュータの マシン語命令のバイト・ストリームとして実行し なければなりません。しかし人間はマシン語をうまく処理することができ ません。たとえハッカーの間でさえも、これをやるのは滅多に見られない 黒魔術になってしまいました。
カーネル自身の中でハードウェアへの直接のインターフェース をサポートする少量のコードを除けば、現在ではほとんどすべての Unix のコードは高水準言語で書かれています(こ こで言う高水準とは、歴史的ななごりで、これら高水準言語を「低水準」 のアセンブラ言語と区別するためのものです。後 者は基本的にはマシンコードを包む薄い包み紙(ラッパー)です)。
いくつかの異なった種類の高水準言語があります。これらを説明するた めに、ちょっと難しい話につきあっていただけたらと思います。プログ ラムのソースコードはある種の翻訳系を通して、 マシンが実際に実行することのできるマシンコードに落とされます。
従来のほとんどの言語はコンパイル言語です。コンパイル言語 はコンパイラと呼ばれる(そのまんまな名前ですね)特別な プログラムによりバイナリのマシンコードとしての実行ファイルに変換されます。 いったんバイナリが生成されると、再びそのソースコードを参照することなく、 直接そのバイナリを実行できます(ほとんどのソフトウェアはコンパイルされた バイナリとして提供されており、そのコードをユーザが見ることはありません)。
コンパイル言語は高いパフォーマンスを示し、かつほとんど完璧な OS へのアクセスを提供しますが、それだけプログラムを書くのは難しくな ります。
C 言語は、Unix 自体を書いている言語であり、これらコンパイル言語の中でも(そ の変種である C++ と共に)この上なく重要です。FORTRAN もコンパイル言語で、技 術者や科学者の中でいまだ根強く使われていますが、古く、かつより原始的です。 Unix の世界で主に使われているのはこれくらいです。Unix 以外の世界では、金融 やビジネス用のソフトウェアとして COBOL が非常に広範囲で使われています。
その他多くのコンパイル言語が使われてきましたが、それらのほとんど はその生命を終えたか、または厳密には研究ツールになっています。も し新しい Unix 開発者になってコンパイル言語を使うのであれば、これ はもう徹底的に C や C++ にするべきです。
インタプリタ言語はインタプリタ・プログラムに 依存しています。これはソースコードを読んで、それをその場で逐次翻 訳し、計算をしたりシステムコールを呼んだりするものです。そのコード を実行するたびに、そのソースは毎回解釈され(かつ、そのインタープ リタが存在し)なければなりません。
インタプリタ言語は一般的にコンパイル言語より低速で、またオペレー ティング・システムやハードウェアへのアクセスを制限されることも多々 あります。一方、インタプリタ言語はプログラムを書くのが容易で、コ ンパイル言語に比べてコーディングのエラーにも寛容です。
シェルや bc(1) や sed(1) や awk(1) といった多くの Unix ユーティ リティは、事実上はインタプリタ言語です。BASIC も普通インタプリタ です。Tcl もそうです。歴史的に、最も重要なインタプリタ言語は LISP でした(成功したものの中でもっとも発展してきました)。今日では Perl が非常に広範囲で使われており、着実に評判を上げてきています。
1990 年以来、コンパイルと逐次翻訳の両方を使う混成言語がだんだん と重要になってきています。P コード言語は、ソースが実際に実行する コンパクトなバイナリにコンパイルされるところはコンパイル言語に似 ていますが、その形式はマシンコードではありません。その疑似コード(またはP コード)は普 通非常に単純ですが、本来のマシンコードよりパワフルです。そのプロ グラムを動かすと、P コードが解釈されます。
P コードはコンパイル言語に近い速度で動作できます(P コード・イン タプリタは非常にシンプルに作成でき、しかも小さくて高速です)。それにも関わら ず、P コード言語は良いインタプリタの柔軟性とパワーも持っています。
重要な P コード言語としては Python や Java があります。