13-04.関数、変数、文、式

関数と変数

 C言語のバイブルである、プログラミング言語Cには、8ページに、以下の様な記述があります。
一つのCプログラムは、その大きさはどうであれ、関数と変数からなる。
関数には、行うべき計算の過程を指示する文、
および計算で使われる値を格納する変数が含まれる。
 シンプルですが、C言語の構造をこれほど簡潔に述べた文章もそうはないと思います。
 ここでは、2つの重要なことの説明があります。
1、C言語は関数と変数で構成される
2、関数には、計算の過程を記す文と、変数がある。
 1、は、いわゆるグローバル領域のことを説明しています(#で始まるプリプロフェッサ命令はC言語の一部ではないので、ここでは説明しません)。
 グローバル領域は、あらかじめ定義される(つまり実行前に保持される)グローバル変数と、関数がある、といっています。代表的な関数はmain関数です。
 2で説明されているのは、関数の中身です。関数の中は変数と文があるといっています。
 具体的には関数
戻り値の型 関数名 { 変数宣言定義 文リスト }
 という構造になります。
 関数の定義領域をまとめる { } は必須です。
 ここで出てくる変数は多くの場合ローカル変数です。ローカル変数はその関数内で閉じています。
 そして、計算過程が記されるがあることを説明しています。
 文(Statement)は複数記述することができそれは文リスト(StatementList)という形でまとめられます。
 C言語のソースは、以上のような構造で記述され、実際の実行は、一般的にはmain関数から実行されます。
 main関数の実行は変数の宣言があれば、それらを定義し、文リストの先頭のが実行されます。

文(Statement)

 は、例えば
printf("hello world");
 のように ; (セミコロン)で区切られています。改行は無視されます。すなわち
文の始まりからセミコロンまで
 がであり、セミコロンで区切られた後は、次のが始まります。

式(Expression)

 は、計算そのものを記すで構成されます。
 ここでというと
3 + 5
 のような算術計算を思いうかべるかもしれません。算術計算ももちろんなのですが、プロラミング言語におけるはもっと広い意味を持ちます。
 例えば、C言語では
50
 と書けば10進数の整数50をあらわす定数ですが、これは、ソースコード上はアスキーコード50が並んだものにすぎません。これを50という数値に変換しなければなりません。この変換処理も計算ですからとみなされます。
 50のような定数の記述を
10進数整数リテラル式
 といいます。同じように0x2Bのような記述は
16進数整数リテラル式
 となり、両社ともなのです。

式と計算結果

 計算ですので結果を戻します。これを返すと表現する場合もあります。計算結果はという形で返されます。
 そしてそのは、別の式のオペランドとして再利用されます。
 以下のを考えてみましょう。
int i;
i = (3 + 5) * (7 - 9);
 2つの文が並んだものです。
 まず、
int i;
 ですが、これは変数iの定義でありこれもとして実行します。
1、iという識別子が登録される
2、その識別子対応する変数定義式が実行され、メモリが確保される
 という処理を行い、 i を確保します。
 続いて整数リテラルが並んだ計算文です。
 この処理は以下の様な順番で行われます。
1、3という整数リテラル式が処理されて、3という値になる
2、5という整数リテラル式が処理されて、5という値になる
3、1と2の値に加算式が実行されて、8という値を得る
4、7という整数リテラル式が処理されて、7という値になる
5、9という整数リテラル式が処理されて、9という値になる
6、4と5の値に減算式が実行されて、-2という値になる
7、3の値と6の値に対して乗算式が実行されて、-16という値を得る
8、7の値が、変数iに代入され、代入した値-16という値を得る
 8で行った代入式の実行は、C言語では代入された値そのものが返りますが、上記の例ではをれは利用してません。
 変数iに代入のみ処理しています。
 このような処理の後は
i
 と書けば、変数式iを実行することになり、それは現在保持している-16という値を得ることができるようになり、例えば
printf("%d",i);
 などで、利用できるようになります。
 つまり変数式を実行すると、その変数の内容が戻り値になるということです。

 別にC言語でなくても
int i;
i = (3 + 5) * (7 - 9);
 がどういう計算なのか、すぐに理解する人も多いと思いますが、それを、インタプリタなりコンパイルなり、その言語を作成するということは、上記したような細かいところまで考える必要が出てきます。
 というより、そういう細かいところを実装していくことが言語を作成するということにほかなりません。

 次項では、13-03.ファイル構成の設定と、関数定義で実装した内容について細かく分析します。
 まずは、この項で説明した変数はまだ出てきませんが、いずれ登場する変数の概念も加味しながら、実装を進めていくことになります。