ソースコードのコンパイル#

ビルドプロセスの最初のステップは、ソースコードをコンパイルすることです。このステップからの出力は、一般的にオブジェクトコードとして知られています。これは、人間が読めるソースコードから生成された、コンピュータへの一連の命令です。コンパイラが異なると、同じソースコードから異なるオブジェクトコードが生成され、命名規則も異なります。

結果

  • あるソースファイルに特定のコンパイラを使用する場合は、他のすべての部分にも同じコンパイラ(または互換性のあるコンパイラ)を使用する必要があります。結局のところ、プログラムは多くの異なるソースファイルから構築される可能性があり、コンパイルされた部分は協力する必要があります。

  • 各ソースファイルはコンパイルされ、その結果は「.o」または「.obj」のような拡張子を持つファイルに保存されます。これらのオブジェクトファイルは、次のステップであるリンクプロセスの入力となります。

コンパイラは複雑なソフトウェアです。平均的なプログラマーよりもはるかに詳細かつ深く言語を理解する必要があります。また、コンピュータの内部構造も理解する必要があります。そして、長年にわたり、コンパイルプロセスと構築される最終的なプログラムをカスタマイズするための多数のオプションが追加されてきました。

しかし、基本は十分にシンプルです。GNUコンパイラコレクションの一部であるgfortranコンパイラを例にとってみましょう。上記の例のような、1つのソースファイルで構成される簡単なプログラムをコンパイルするには、ソースコードがファイル「hello.f90」に保存されていると仮定して、次のコマンドを実行します。

$ gfortran -c hello.f90

これにより、ファイル「hello.o」が生成されます(gfortranコンパイラはオブジェクトファイルの拡張子として「.o」を使用するため)。

オプション「-c」は、ソースファイルのみをコンパイルすることを意味します。省略すると、コンパイラのデフォルトのアクションは、ソースファイルをコンパイルし、リンカーを起動して実際の実行可能プログラムを構築することです。コマンド

$ gfortran hello.f90

は、Linuxでは「a.out」、Windowsでは「a.exe」という実行可能ファイルを生成します。

いくつかの注意点

  • コンパイラは、タイプミスや不明なキーワードなど、ソースファイルの内容に誤りがある場合、それを指摘することがあります。その場合、コンパイルプロセスは中断され、オブジェクトファイルや実行可能プログラムは生成されません。たとえば、単語「program」が誤って「prgoram」と入力された場合

$ gfortran hello3.f90
hello.f90:1:0:

    1 | prgoram hello
      |
Error: Unclassifiable statement at (1)
hello3.f90:3:17:

    3 | end program hello
      |                 1
Error: Syntax error in END PROGRAM statement at (1)
f951: Error: Unexpected end of file in 'hello.f90'

このコンパイルレポートを使用して、ソースコードを修正して再試行できます。

  • 「-c」なしのステップは、ソースファイルにメインプログラム(Fortranのprogramステートメントによって特徴付けられます)が含まれている場合にのみ成功します。それ以外の場合、リンクステップは、次のような「シンボル」の欠落について文句を言うでしょう。

$ gfortran hello2.f90
/usr/lib/../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status

ファイル「hello2.f90」は、キーワードprogramがキーワードsubroutineに置き換えられている点を除いて、ファイル「hello.f90」とほぼ同じです。

上記のコンパイラからの出力例は、コンパイラとそれが実行されるプラットフォームによって異なります。これらの例は、Windows上のCygwin環境で実行されているgfortranコンパイラからのものです。

コンパイラはサポートするオプションも異なりますが、一般的には

  • コードを最適化するためのオプション — より高速なプログラムまたはより小さなメモリフットプリントになります。

  • ソースコードをチェックするためのオプション — たとえば、変数に値が与えられる前に使用されていないかをチェックしたり、言語への拡張機能が使用されているかどうかをチェックしたりします。

  • インクルードファイルまたはモジュールファイルの場所に関するオプション。以下を参照してください。

  • デバッグ用のオプション。