翻訳の手順
プログラミング言語の文法に従って記述されたソースプログラムは,コンパイルされて目的プログラムになり,連係編集されてロードモジュールになります。
- コンパイル
- プログラミング言語の文法に従って記述されたプログラムをソースプログラムあるいは原始プログラムといいます。通常の高水準言語では,ソースプログラムをいったんアセンブラ言語に翻訳する必要があります。それをコンパイルといい,コンパイルするソフトウェアをコンパイラといいます。それで,高水準言語のことをコンパイラということもあります。
コンパイルされた結果を目的プログラムあるいはオブジェクトモジュールといいます。これは通常はアセンブラ言語になっています。ですから,アセンブラ言語で記述されたソースプログラムは,それ自体が目的プログラムになります。
- 連係編集(リンカー)
- 高水準言語では,全体の処理を一つのプログラムとして記述するのではなく,ロジックをいくつかのサブプログラムに分解し,それらをつなぎ合わせてプログラムにする方法が取られます。それらのサブプログラムは部品として他のプログラムにも利用されることがあります。また,言語プロセッサは多様な共通利用サブプログラムを多く持っています。それらはライブラリとして保管されています。
連係編集(リンカー)とは,作成した目的プログラムとライブラリにある既存の目的プログラム群を組み合わせて,一つの機械語プログラムに翻訳します。この機械語プログラムのことを実行可能プログラムあるいはロードモジュールといいます。すなわち,機械語で作成したソースプログラムは,それ自体がロードモジュールになっています。
この翻訳プログラムを連係編集プログラムあるいはリンケージ・エディタといいます。言語プロセッサとしてのアセンブラはこの機能を持っています。なお,目的プログラムでは高水準言語の特性は失われますので,COBOLで作成した目的プログラムとFORTRANで作成したライブラリを連係することもできます。
Javaでの用語
Javaコンパイラでは、コンパイルした目的プログラムに相当するものをバイトコードといいます。バイトコードは機種やOSに限定しない言語になっており、移植性を高めています。
バイトコードは、それをインタプリタとして実行するには、Java VM(仮想マシン)というソフトウェアを用います。このソフトウェアは通常ブラウザに標準機能として搭載されています。また、コンパイルするにはJITコンパイラが用意されており、機種やOSに固有の機械語プログラムに翻訳されます。
実行による言語プロセッサの区分
翻訳の方法にはコンパイラ以外にインタプリタやジェネレータなどもあります。
- コンパイラ
- 多くの高水準言語はコンパイラ方式です。この特徴は,ソースプログラムの全体を一つのかたまりとして翻訳しロードモジュールとして実行します。
- プログラム全体を作成しないと実行させてチェックすることができないし,プログラムの一部を修正したときも,全体を翻訳する必要があります。そのために,1回しか使わないようなプログラムを作成するのには非効率です。
- 逆に,1回ロードモジュールを作成しておけば,実行時に毎回コンパイルする必要がありませんので,何度も利用するプログラムに適しています。
- インタプリタ
- インタプリタは,ソースプログラムを1行づつ翻訳して実行する方式です。代表的なインタプリタ言語にBASICがあります(コンパイラのBASICもあります)。
プログラムを一部作成して実行し逐次追加修正するのが容易ですから,プログラムを作成する段階では便利な方式です。
しかし,実行のたびに翻訳をする必要があるので,何度も利用するプログラムでは非効率です。また,大量のデータを用いるプログラムでは,一つのデータを処理するたびに翻訳することが起こりますので,処理が非効率になります。
- ジェネレータ
- プログラムの一部をパラメタとして与えることにより,完成したプログラムを出力する方式です。これにはソースプログラムを出力してコンパイルするものと,既に実行可能プログラムがあり最初にパラメタを読み込み,それを用いてデータを読み込み帳票作成などをするようなものがあります。
コンパイラに関する補足
- プレコンパイラ
- ソースプログラムで、よく用いられる記述、あるいは、コンパイラに指示する事項を特定の方法で記述しておき、それをプレコンパイラを通すことにより、正規の文法によるソースプログラムを生成します。これを極端に発展させたのがジェネレータだということもできます。
- コンパイラによる最適化
- コンパイラがソースプログラムを翻訳するのに際して、効率の良いアルゴリズムや機械語に変換する機能を最適化機能といいます。
- ソースプログラム段階での最適化
左のようなプログラムを右に変換することにより、負荷の大きな計算の回数を減らすことができます。
元のソースプログラム 改良したプログラム
sqx = sqrt(x);
for (i==1; i<=10; i++) { for (i==1; i<=10; i++) {
a[i] = a[i] + sqrt(x); a[i] = a[i] + sqx;
} }
- 機械語命令に翻訳するときの最適化
VLIW(Very Long Instruction Word)とは、パイプライン方式などの並行処理をしやすくするために、複数の機械語命令を語長の長い固定長の命令に生成する技術です。VLIWを発展させたものにEPIC(Explicitly Parallel Instruction Computing)があります。