<< 豆知識 >>コンパイルをすると、PC上では何が起きる?Fortranでは、コンパイルというのはもはや当たり前のことで、Fortranを学習している皆さんにとってはお手の物,ですよね。ところで、コンパイルというのは、一体どういうものなのでしょうか。 コンパイルを日本語にすると、「翻訳」ですね。そう、まさにコンパイルは翻訳作業のことなのです。何を翻訳しているのかというと、ソースファイル(ソースコードとも)ですね。ソース、つまりプログラムの「源」ですね。それでは、何に翻訳しているのでしょうか。何を翻訳しているのかは分かっていても、何が出来上がっているのかを知っている人は結構いるのではないでしょうか。出来上がっているのは実行ファイル? それも正解ではあるのですが、性格には違うんです。出来上がっているのは、オブジェクトファイル(オブジェクトコード)なのです。 ソースコードをコンパイルしてみたら、ぜひそのソースコードが入っているフォルダをあけてみてください。きっとその中には、「.obj」というファイルがしまわれているはずです。これが、オブジェクトコードです。「object」の略で、「.obj」ですね。機械語が「固有語」と呼ばれるので、オブジェクトコードは「ネイティブコード」とも呼ばれます。このファイルが何なのかという言うと、これも内容はソースファイルと同じです。ただ、書き方が違うみたいです。ソースファイルは僕らがよく知っている英語で書かれた文章ですが、このオブジェクトファイルは、機械語で書かれているんだそうです。開いてみたことがないからわかりませんけどね。 機械語とは何でしょう。それは、0と1の世界です。2進数はご存知ですか? 全ての事柄を、0と1の二種類の数字で表してしまうという、おっそろしい世界です。10進数との違いは、一桁に表せる最高が1なのが2進数、9なのが10進数です。10進数は9に1を与えると次の桁が1繰り上がり、元の桁は0になりますね。2進数だと1の次は0に成り、次の桁が1つ繰り上がります。10進数の「25」とは、「11001」のことです。 コンピュータは2進数を基に作られていますので、2進数でならプログラマからの命令を聞くことができます。「画面に足し算の結果を表示しろ」という命令も、1と0による命令なら可能なのです。しかし、万能なコンピュータでも、僕ら人間の言葉は全然理解できません。「Print the answer!」といっても、コンピュータは全然無視です。ですから、コンピュータに命令するには、2進数で命令をしなければなりません。 でも、ぶっちゃけ2進数で命令文を書くなんて、大変ですよね。単に訓練してないからだけじゃなくて、数字の羅列だけの命令なんて、バリエーションがありすぎで、1日でもうギブアップです。昔のプログラマは、これにめちゃくちゃ悩まされていたみたいです。途中、「二ーモック」と呼ばれる、2進数の命令を英語表記に直せる便利なリファレンスが登場したみたいなんですが、これでもやっぱり変換作業が大変だったそうです。 ということで、高級言語と呼ばれる、僕らが日常使う言葉(といっても英語)でソースコードを書き、しかもその変換作業をしなくていい言語が登場しました(ちなみにそれ以前の言語は低級言語)。もちろんFortranもその一つです。当初はその言語にはコンパイラというものが装備され、変換作業は機械に任せとけ!ということになりました。当時としては、このことはこの上ない感動をプログラマにもたらしたでしょうね。 コンピュータや言語は進化を続けていますが、いまだにコンピュータは機械語でないと命令を理解することができません。でも、僕らだって0と1の世界の命令文なんて書きたくありません。というわけで、コンパイラが人間の言葉(ソースコード)を、機械の言葉(オブジェクトコード)に変換する必要があるのです。 オブジェクトコードは、プログラミングを行なう環境によって異なります。windowsで作ったオブジェクトコードはマックではダメ、C言語で作ったオブジェクトコードはFortranではダメ,という具合です。オペレーションシステム・CPU・プログラミング言語によって、それぞれ違ったオブジェクトコードが出来上がるそうです。FortranやC言語等の欠点の一つはこれで、生成したプログラムが限定した環境でしか使用できないということです。この欠点を改善したのが、Javaですね。 コンパイルによって作られるファイルは、オブジェクトファイルです。実行ファイルのexeファイルではありません。最近のコンパイラはそれもまとめて作っちゃうみたいですけどね。コンパイルによって作られたオブジェクトファイルは、機械語に直されたソースコードに書かれたプログラムの設計図です。これを基に、今度は実行ファイルが作られます。 実行ファイルは、「リンク」という作業を行なって作られます。リンクといっても、ホームページにあるような、別のページに飛ぶリンクではありませんよ。リンクというのは、オブジェクトコードとライブラリコードとを結び付けて、実行ファイルを生成する作業のことです。リンクを行なうのはリンカと呼ばれる存在です。リンカもコンパイラと一緒のフォルダに用意されています。リンクをする際、オブジェクトコードは複数合っても大丈夫だそうです。 皆さんはリンカを使ったことはないと思います(Salford社さんのFortran90版のコンパイラを使用している方は別ですが)。最近のコンパイラは非常に便利にできていて、コンパイルをしたら、ついでにリンクもしてくれちゃうようにできています。普通はコンパイルしたらそのままリンクしちゃいますからね。一緒にしてくれたほうが手間がかからなくていいです。 普通はついでにリンクもしてくれて構わないんですが、複数オブジェクトコードを結びつけたり、自分でライブラリファイルを選びたいときもあります(僕レベルの人間ではまだそんなことはありませんが)。そういう時は、自分でリンカを使ってリンク作業をこなすことになりますね。例えば、オブジェクトファイルだけ作っておいて、別のソースコードとリンクさせて、単にソースコードをコンパイル・リンクさせただけの実行ファイルとは別の実行ファイルを作ることができるみたいです。 僕が使っているFortranコンパイラは富士通の「Fortran & C Package」なんですが、このコンパイラでコンパイルすると、拡張子が「fwd」とか、「ydg」とかいうファイルまで生成されます。これが何なのかはまだ調査中です。なんだか不気味ですね。 参考: ウィキペディア ASCIIデジタル用語辞典 コマンドプロンプトを使ってみよう! コマンドプロンプトで作業効率UP FORTRANの歴史 Fortranを使おう |