プログラミング言語論 第6回 型 情報工学科 篠埜 功 型付き言語 • 静的型付き言語(statically typed language) – コンパイル時に型の整合性を検査する – (例)C, Java, Pascalなど • 動的型付き言語(dynamically typed language) – 実行時に型の整合性を検査する – (例)Lisp, Emacs Lisp, Schemeなど 型とは (例) int f ( ) { int x, y; x = 4; y = 3 + x; return y; } 静的型付き言語のプログラム は、コンパイル時に型につい て整合性がとれている必要 がある。 型検査 コンパイル時に、型について(その言語で定められた基準 で)整合性がとれているかどうかを検査する。 プログラムの正当性を部分的に示すことになる。(実行時 のエラーを減少させる。) 型情報は静的意味(実行しなくても分かる情報)であり、型 検査は静的意味の解析の一種。 型検査はコンパイラの中で、構文解析より後のフェーズで 行う。 C言語の変数宣言について (例) int (*a) [13]; この宣言では、変数aはint型の配列(要素数13)へ のポインタ型であることを示す。 式 (*a) [ j ] (0 j < 13) の型はint型になる。 例えば、式(* a) [0] はint型である。 C言語の変数宣言について (例) int (*a) [13]; int b [2] [13]; と宣言されているとき、 a=b は型について整合性のある代入式である。bはコンパイ ル時に&b[0]に置き換えられる。この代入式の実行後に 等式 (*a) [ j ] = b[0][ j ] (0 j < 13) が成立する。これは、*a = *b = *(&b[0]) = b[0] に[ j ] を つければ得られる。プログラムが型について整合性がと れているかどうかをチェックする仕組みの基礎を学習す る。 C言語の変数宣言について char ( * ( * x ( ) ) [3] ) ( ) ; の変数宣言の意味は? 内側から順番に優先順位(次ページ記載)にしたがって 読んでいき、最後にcharを読む。すると ( ) * [3] * ( ) char となる。これを逆順にすると char ( ) * [3] * ( ) となる。これを型の後置記法と呼ぶことにする(一般に 通用する用語ではない)。これをx : の後に書いた x : char ( ) * [3] * ( ) を型の後置記法による宣言と呼ぶことにする。 優先順位 優先順位は、高い順に( ), [ ], * である。宣言されて いる変数xからこの優先順位に従って読んでいけば よいが、優先順位の括弧がついている場合は順番 は変わる。前ページの変数宣言の例 char ( * ( * x ( ) ) [3] ) ( ) ; で優先順位の括弧は char ( * ( * x ( ) ) [3] ) ( ) ; の太字の部分である。内側(宣言されている変数x) から順番に優先順位に従って読むと、 ( ) * [3] * ( ) char となる。 練習問題1 C言語の変数宣言 char ( * ( * y [3] ) ( ) ) [5] ; を型の後置記法による宣言に直せ。 練習問題2 C言語の変数宣言 (1) int * z; (2) int c [13]; を型の後置記法による宣言に直せ。 練習問題3 C言語の変数宣言 (1) int (*a) [13]; (2) int b[2][13]; を型の後置記法による宣言に直せ。 例 char ( * ( * y [3] ) ( ) ) [5] ; の宣言のもとで、 式 y [2] はどういう型を持つか。 y : char [5] * ( ) * [3] となり、一番外側の[3]を取り除いて、 y [2] : char [5] * ( ) * となる。 練習問題4 C言語の変数宣言 int (*a) [13]; のもとで、式 *a の型は何か。 推論規則 e:[n] e[i]: e:() e(): e:* *e: 0 i < n, n は正の整数。 eは式、 は型を表すメタ変数(説明のた めの変数)。 例 C言語の変数宣言 int (*a) [13] ; のもとで、式 *a の型は、int [13]であった(練習問 題4参照)。これを、型の後置記法による宣言から 推論規則で以下のようにして導くことができる。 a : int [13] * *a : int [13] 例 C言語の変数宣言 int (*a) [13] ; のもとで、式 (*a) [3] はint型である。これを、型の 後置記法による宣言から推論規則で以下のように 導くことができる。 a : int [13] * *a : int [13] (*a) [3] : int 練習問題5 C言語の変数宣言 int b [2] [13] ; のもとで、式 b [1] の型を、変数bの型の後置記法 による宣言から推論規則で導け。 練習問題6 C言語の変数宣言 int b [2] [13] ; のもとで、式 b [1] [4] の型を、変数bの型の後置 記法による宣言から推論規則で導け。 配列型について 配列型について、以下の推論規則を追加。 e:[n] e:& ここで、 e : &は、 e : *かつeは左辺値(アドレ ス)を持たないことを表すものとする。 この推論規則は、一番外側が配列型であれば、それ をポインタ型に変更してもよいということを表している。 代入演算子 = について 代入演算子 = について、以下の推論規則を追加する。 e : e’ : e = e’ : ただし、eは左辺値を持つ式であり、かつ定数ではな い。 演算子&について 演算子&について以下の推論規則を追加する。 e: &e : & e:& *e : e : * e’ : & e = e’ : & ただし、 の一番右側(一番外側)は&ではない。 最初の例 C言語の変数宣言 a : int [13] * b : int [13] [2] のもとで、代入式 a = b が型について整合性がある ことを以下のようにして確認できる。 a : int [13] * b : int [13] [2] b : int [13] & a = b : int [13] & 注意事項 実際のC言語では、関数に引数がある。その他、構 造体、共用体など、今回扱っていない構文がある。 C言語では共用体の型はチェックしない。中にどの 型のデータが入っているかはプログラマが認識して いなければならない。 練習問題7 C言語の変数宣言 p : int * a : int [10] のもとで、代入式 p = &a[1] が型に関して整合性があることを示せ。
© Copyright 2024 ExpyDoc