気の向くままに辿るIT/ICT/IoT
UNIX/Linux

UNIX/Linux コンパイラとコンパイル

ホーム前へ次へ
コンパイラとコンパイルとは?

UNIX/Linux コンパイラでコンパイル

UNIX/Linux コンパイラ・コンパイル

 UNIX/Linux及びシェル環境においてはコンパイルを行うことは日常的で至極当然な作業の1つです。

コンパイル

 コンパイル(compile)とは多くのプログラミング言語において

 実行ファイル(を含むファイル)生成 

または、そうしたファイルを生成することを指します。

UNIX/Linuxの実行ファイル

 実行ファイルとはWindowsで言えば拡張子がexeのファイルですが、あらゆるものがファイルとして表現され、ハードディスクやCD/DVDディスク、USB、メモリさえもファイルとして扱われ、プログラム等々さえも基本的にテキストファイルであるUNIX/Linuxにおいては(時にその有無も含めた)拡張子に関わらずファイルモードビットにおけるファイルパーミッションビットの内、

 実行ビットが立っているファイル 

のことを指します。

 ビット(bit)とはbinary digitが時を経て略されたものと云われており、binaryは二進数、digitは0?9のアラビア数字を意味し、二進数とは0か1から成る組み合わせであり、これを表す単位の1つです。

 つまり、ここでは、ある/なし、ON/OFF、Yes/No、True/False(、今日と明日は明後日も一昨日もあるし、青と赤から成る歩行者用信号機も点灯、消灯以外に点滅もあるけど、それは別として)二者択一を表し、当該ビットを「立てるか/立てないか」を決めることになります。

 ファイルモードビットの設定・変更にはumaskコマンド、chmodコマンドを利用しますが、UNIX/Linuxやそのシェルの1つBourne Shell(sh)やその拡張であるbashにおいては、ディレクトリやファイルの使用許可状態(許可=Permission=パーミッション)は、shシェル組み込みコマンドであるumaskコマンドによって主にbash管理・設定ファイル上であらかじめ設定されているのが普通です。

 但し、そのumask設定では、ディレクトリの実行ビットを立てることはできますが、ディレクトリとファイルにおけるファイルモードビットの意味の違い及びセキュリティ上の理由などから、ここで言う「ファイルの実行ビットを立てる」ことができないようになっている為、必然的に実行ファイルを実行したい場合には、意図して実行ビットを立てる必要があることになり、そういった場合にファイルモードビット/ファイルパーミッションビットの設定変更を行うシステムコマンドがchmodコマンドです。

 このようにUNIX/Linuxにおいては実行ビットは明示的に立てたり外したりするのは別に不思議なことのない極普通のことであって、しばしば実行権限(実行ビット)を与える、付与する、付ける、(英語のpermission及びファイルモード使用上も本来の意味である)許可する、実行パーミッションを有効にするなど様々な表現、言い回しがあります。

コンパイラ

 コンパイラ(compiler)の意味としては、日本人にもなじみ深い!?英単語にerを付けたら、たいてい「~する人(モノ)」でしょという大方の予想通り「コンパイルする(してくれる)モノ」を指します。

 C言語においてはUNIXがアセンブリ言語で書かれて1~2年後、C言語ベースで書かれたものが発表されて以来、C言語のコンパイラとしてはcc(c compiler)があり、その後、bashを開発したFSFのGNUプロジェクトによりgccが開発されました。

ccとgcc

$ cc -v 

$ gcc -v 

 ccとgccは共にコマンドであり、昨今gccはデファクトスタンダード(事実上の標準)とも言えるほどあらゆるUNIX/Linuxにインストールされており、その多くでccコマンドも実行できますが、ccがgccへのシムリンク(シンボリックリンク)になっているなど実質gccが使われていることも珍しくありません。

gcc

 gccはGNU C Compilerとして開発されましたが、その後C/C++/Objective-C/FORTRAN/Java等々多言語対応を表すGNU Compiler Collectionと呼ばれるようになりました。

 実際にgccには、C言語用のgcc、C++用のg++、Java用のgcjなどのラインナップがあり、それぞれのコマンドで実行することによりその言語用の入力ファイルを想定するようになっていてそれぞれに異なる既定のライブラリパスなども各々検索されるようになっています。

 ただccもgccも単独のコマンドというよりは、各種コマンドの集まりなのでオプションと引数さえ切り分けるように作られればインタフェースとしては(各ライブラリパスなどは自動認識してくれない場合もあるけど)gccコマンドを多言語対応のコンパイラとして利用することさえ可能であるとも言えるのでGNU C CompilerではなくGNU Compiler Collectionと呼ばれる(呼ぶ)ようになったわけですね。

gccでコンパイル

#include <stdio.h>

int main(void){

  printf ("Hello!!\n");

  return 0;

}

 そんなgccで例えば、かろうじてC言語の体をなしている!?こんなプログラムの最もシンプルなコンパイルは

$ gcc foo.c 

のようにgccに半角スペースとボディファイル名を続けて入力して[Enter]キーを押せばよく、運よくエラーもなくコンパイルを終えればプロンプトに戻り、

$ ls -lF 

 lF(小文字のエルと大文字のエフ)というオプション付きでlsというリストコマンドで確認してみると

$ ./a.out 

Hello!! 

そこに(C言語では-oオプションで実行ファイル名を指定しない場合に自動的に生成される)a.out* というファイルができていて、一番左の10ビットの内最初の1ビットを除く9ビットの中に3か所[x]という実行ビットが立っていることがわかり、これを実行するとプログラムに記述した通りに表示されプロンプトに戻ります。

 あっという間にさらりとgccがコンパイルしたように見えますが、実はgccは実行後、相応のコマンドを呼んでプリプロセス、コード生成、アセンブル、リンクなどあらゆる工程の処理を経てa.outを生成しています。

LINK

ホーム前へ次へ