Cプログラムのコンパイルから実行までの流れ


1. サンプルプログラムの作成

以下の内容のファイルを作り、test1.cとして保存して下さい。これをC言語のソースファイルと言います。

/* Program "test1.c" */

#include <stdio.h>

int main(void) {
  printf("Practice C Programming!! \n");
  return 0;
}

2. コンパイル

計算機はC言語で書かれたプログラムを直接実行することができませんから、直接実行可能な「機械語命令」によるプログラムに変換する必要があります。

C言語等の高級言語で書かれたプログラム(ソースプログラム)を実行形式のプログラムに変換することを、「コンパイル」といいます。

では、先ほどのソースプログラムtest1.cをコンパイルします。ターミナルで次のようにコマンドを入力してください。

cc -o test1 test1.c

何もメッセージがでなければ(エラーがなければ)、test1というファイルができているはずです。lsコマンドでファイルの有無を確認して下さい。もしエラーメッセージ("error"を含むメッセージ)がでたら、ソースファイルをチェックして再びコンパイルして下さい。

ccはコンパイルをするためのプログラムで、「コンパイラ」と呼びます。ccにオプションを付けることで、コンパイルの設定をすることができます。以下にコンパイラの代表的なオプションを示します。

代表的なコンパイルオプション
1. -o 名前      出力する実行ファイルの名前を指定する(デフォルトはa.out)
2. -c         オブジェクトファイル(〜.o)のみ生成し、
              実行ファイルを出力しない
3. -Iパス       インクルードファイルのパスを指定する
4. -l名前       組み込むライブラリファイルを指定する
5. -Lパス       ライブラリファイルのパスを指定する

詳しく知りたい人は、ccのオンラインマニュアルを読んで下さい。オンラインマニュアルを見るには、man ccとコマンドを入力します。英語で書かれていますが、分かり易いシンプルな英語で書かれていますので、頑張って読んでみましょう。

3. 実行

では、コンパイルによってできた実行ファイルを実行してみましょう。ターミナルから、いまコンパイルした実行ファイル名を入力してください。

./test1

Practice C Programming!!」と表示されたでしょうか。test1の前に付けた「./」はカレントディレクトリの意味です。すなわち「カレントディレクトリにある test1 というファイル」と細かく指定して実行しています。もしカレントディレクトリを指定しないと、他の場所にあるtest1というファイルを実行してしまうことがあります。

この1から3までがプログラム作業をする上での基本動作です。必ず覚えてください。では、ソースプログラムをもう一度見てください。

/* Program "test1.c" */

/* と */の間にコメント(コンパイルには関係ない)を書くことができます。

各所にコメントをいれて、プログラムの名前だとか、何をしようとしているのかなどを書きます。

#include <stdio.h>

プログラムとは関数の定義と実行の世界です。また、関数とは「コンピュータに対して命令をおこない、その結果をもらう動作」を定義するものと考えてください。「命令 Order」と「関数 Function」の違いですが、言語によって概念が違います。厳密にいうとCでは予約語して使われているものだったような・・・。ここでは、四則演算・代入・比較・変数を定義するなどの単機能なものを「命令」としています。

そして「関数」はこの命令を組み合わせていって、特定の動作をするようにしたものと考えるとわかりやすいでしょう。もちろん、命令の他に関数を使うこともできます。

さらに、C言語では通常使われるような、たとえば「指定した文字を表示しろ(コンピュータに対する命令)→画面に文字が表示される(コンピュータからの結果)」という関数をあらかじめ用意してくれています(標準関数)。

いまの例は出力と呼ばれる動作ですが、この他にも「キーボードから入力された文字を指定した変数に入れろ」という入力動作などがあります。

コンピュータはある入力にたいして結果を出力する動作が基本になりますので、様々な入出力動作を「標準入出力関数 standard I/O」としてあらかじめ用意してくれています。

ただし、使うためにはプログラムの中で「使う」といってあげる必要があります。この部分では standard I/O の関数が定義された「stdio.h」という、あらかじめ用意されたファイルをコンパイル時に読み込むという指示をしています。これによって後に出てくる「printf」という関数が使えるようになります。

int main(void) {
  printf("Practice C Programming!! \n");

  return 0;
};

これが関数です。これをもう少し詳しく見ていくと

int main(void)

これが関数名の定義です。定義することを宣言ともいいます。さらにこの部分をもう少し詳しく見ると

int 関数の戻り値を持つ場合の型宣言 main() 関数の名前 ()の中 この関数の中で使用する変数(引数)の指定。ここでは何も指定しないのでそれを示す「VOID」を指定しています。

「変数」「型」「戻り値」というのはあとから説明します。 次に{で始まり、return 0; }で終わっている部分、これが関数の動作の定義を記述する場所です。 ここの部分で、

printf("Practice C Programming!! \n");

という関数が呼び出されて(定義された関数を実行することを「呼び出す」といいます)います。呼び出された関数もmain関数の関数名の定義に似た構造ですね。printfは引数で与えられた文字を表示するという関数です。後ろの()の中に表示させるべき引数(文字)が""に囲まれて定義されています。この定義が「stdio.h」の中にあらかじめかかれている訳です。

Cのプログラムは動作を定義した関数の集合体です。でも、「定義」しただけでダメで、「呼び出す」必要があります。でも、プログラム中に関数がたくさんあって、どれを一番最初に実行すればいいのかは関数自体に定義されていません。そこで、一番最初に実行する関数はこれですよというのが決まっています。これをmain関数と呼びます。このmain関数の中に呼出す関数や動作を記述していきます。

4. 練習課題

ソースファイルに誤りがあると、コンパイラはどのようなエラーメッセージを出力するでしょうか。test1.cの内容を変更してわざとエラーを起こし、コンパイラのエラーメッセージがどうなるかを確かめてみましょう。こんな風にしてエラーを起こそう(1度に1つずつ)


戻る