300 likes | 361 Views
プログラミング言語論. 第 12 回 型について(先週の続き) および C 言語の subset の意味の定義 (演習付). 情報工学科 木村昌臣 篠埜 功. 先週の補足1. 型の後置記法について 今は関数の引数がない等、制限された C を考えているので、型宣言の構造が一列になっている。 (例) char ( * (* x ( ) ) [ ] ) ( ) ; が x : char ( ) * [ ] * ( ) のように一列に書けたのは、
E N D
プログラミング言語論 第12回 型について(先週の続き) および C言語のsubsetの意味の定義 (演習付) 情報工学科 木村昌臣 篠埜 功
先週の補足1 型の後置記法について 今は関数の引数がない等、制限されたCを考えているので、型宣言の構造が一列になっている。 (例) char ( * (* x ( ) ) [ ] ) ( ) ; が x : char ( ) * [ ] * ( ) のように一列に書けたのは、 xの型が Sfn (Pnt (Arr (Pnt (Sfn (Char))))) のように一列の構造を持っていたから。 (Sfnは、引数を持たない、単純な関数型のつもり) Simple
先週の補足1 関数に引数がある場合は、関数型の部分で返り値の型と引数の型の2つの情報が必要になり、そこで枝分かれが起こり、構造が一列ではなくなる。 char ( * (* x ( int ) ) [ ] ) ( double ) ; の場合、xの型は、 Fn (Int, Pnt (Arr (Pnt (Fn (Double, Char))))) のように枝分かれがある。 一般には、C言語の型は木構造をなす。
先週の補足2 配列の左辺値について (例) int main () { int a [10]; printf (“%p\n”, a);/* aの値は、a[0]のアドレス &(a[0]) */ printf (“%p\n”, &a); /* &aの値は、aのアドレス */ printf (“%p\n”, a+1); /* 4が足される */ printf (“%p\n”, (&a)+1); /* 40が足される */ return 0; } a と &aの値(右辺値)は同じだが、型が異なる。 a は 要素数10の配列型、&aは要素数10の配列へのポインタ型。 intが4byteの場合
練習問題 int B [2] [13] の宣言のもとで、 式 B [1] [4] の型は、何になるか。 これを、型宣言から推論規則で導け。
配列型について 配列型について、以下の推論規則を追加。 e : [ n ] e : & ここで、 e : &は、 e : *かつeは左辺値を持たないことを表すものとする。 この推論規則は、一番外側が配列型であれば、それをポインタ型に変更してもよいということを表している。
代入演算子 = について 代入演算子 = について、以下の推論規則を追加。 e : e’ : e = e’ : ただし、eは左辺値を持つ式であり、かつ定数ではない。
演算子&について 演算子&について以下の推論規則を追加。 e : &e : & e : & * e : e : * e’ : & e = e’ : & ただし、 の一番右側(一番外側)は&ではない。
最初の例 daytab : int [13] * B : int [13] [2] の型宣言があるとき、 daytab = B が型について整合性があることを確認。 B : int [13] [2] B : int [13] & daytab : int [13] * daytab = B : int [13] &
練習問題 p : int * A : int [10] の型宣言があるとき、代入式 p = & A[1] が型に関して整合性があることを示せ。
今日のトピック • C言語の非常に小さいsubsetの意味を操作的意味論(自然意味論)で定義する。
算術演算式の意味 以下のBNF記法で定義される式を対象とし、その意味を操作的意味論で定義する。 <式> ::= <数> | <変数> | ( <式> + <式> ) | ( <式> - <式> ) | ( <式> * <式> ) <変数> ::= X | Y | Z <数字> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 <数> ::= <数字> | <数> <数字> (例) (12 + 34), 3 * (45 – X) など。
状態 C言語における変数は、アドレスに付けられた名前。 算術式中の変数の意味は、そのアドレスに格納されている値。 状態とは、アドレス({X, Y, Z})から整数Zへの関数。 すべての値が0の状態を初期状態とする。 例えば、 int X = 3; int Y = 4; という状況では、状態は、 { (X, 3), (Y, 4), (Z,0) } である。
算術演算式の操作的意味 前ページで定義した式の構文解析結果を対象として 意味を定義する。 構文解析結果は以下の式で表す。 a ::= n | x | (a + a) | (a – a) | (a * a) aは、式(の構文解析結果)を表す。 nは、整数を表す。 xは、変数を表す。 数(数字の列)は、構文解析の段階で整数に変換することにする。
式の評価 「算術式 aを状態 において評価すると 整数nが得られる」 という関係を、 < a, > n と表す。 (例) 0= { (X, 3), (Y, 20), (Z, 13) } のとき、 < ((10 + 20) * 4), 0 > 120 < (5 * (X + 1)), 0 > 20 が成り立つ。
式の評価規則 ((2 + 3) * 4) という式は、まず(2 + 3) を評価し、5を得てから、 (5 * 4) を評価して20を得る。 すべての式の評価は一定の規則にしたがって行われる。
式の評価規則 式が整数の場合 < n, > n 式が変数の場合 < x, > (x) 式が足し算の場合 < a0, > n0 < a1, > n1 < (a0 + a1 ), > n (ここで、nはn0とn1の和)
式の評価規則(続き) 式が引き算の場合 < a0, > n0 < a1, > n1 < (a0 - a1 ), > n (ここで、nはn0とn1の差) 式が掛け算の場合 < a0, > n0 < a1, > n1 < (a0 * a1 ), > n (ここで、nはn0とn1の積)
式の評価の例1 状態 0= { (X, 3), (Y, 20), (Z, 13) } のもとで、 ((10 + 20) * 4) という算術式を評価規則に従って評価してみる。 < 10, 0 > 10 < 20, 0 > 20 < (10 + 20), 0 > 30 < 4, 0 > 4 < ((10 + 20) * 4), 0 > 120
式の評価の例2 状態 0= { (X, 3), (Y, 20), (Z, 13) } のもとで、 (5 * (X + 1)) という算術式を評価規則にしたがって評価してみる。 < X, 0 > 3 < 1, 0 > 1 < 5, 0 > 5 < (X + 1), 0 > 4 < 5 * (X + 1), 0 > 20
練習問題 状態 0= { (X, 3), (Y, 20), (Z, 13) } のもとで、 ((4 + Y) * (5 + Z)) という算術式を評価規則に従って評価せよ。
文 • これまで式の意味を定義した。 • 式の実行(評価)では、値が得られる。(フルセットのCでは式の評価で状態が変化する場合がある。) • 文の実行の効果は、状態の変化。 (例)X= 2; このような代入文を実行すると、Xの値が書き変わる。 この代入文の実行前の状態を とすると、実行後は、状態の中のXの値が2に変わる。(もちろん、もともとXの値が2の場合は変わらない。)
状態に関する記法 • 状態において変数xに値mが代入された時の状態を [ m / x ] と書く。 ( [ m / x ]) (y) = m if y = x, (y) if y x (例1) X= 2; この文を実行すると、状態のXの値が書き変わる。 この代入文の実行前の状態を実行前の状態を とすると、実行後の状態は、[ 2 / X ] となる。 (例1) X= X + 2; この代入文の実行前の状態を実行前の状態を とすると、実行後の状態は、[ (X) + 2 / X ] となる。
練習問題 状態 = { (X, 10), (Y, 20), (Z, 30) } のとき、 [ 40 / X ] はどういう状態か。
文の定義 文を、代入文の並びで定義する。 <文> :: = <変数>= <式> ; | <文> <文> 文の構文解析結果を以下で表す。 c ::= x = a; | c c c は文を表す。 x は変数を表す。 a は算術式を表す。
文の実行 状態のもとで文cを実行したら状態が’になる ということを、 <c, > ’ と表す。 (例) 状態 { (X, 10), (Y, 20), (Z, 30) }のもとで 文 Y = 40; を実行すると、状態は { (X, 10), (Y, 40), (Z, 30) } になる。これを、 < Y = 40;, { (X, 10), (Y, 20), (Z, 30) } > < { (X, 10), (Y, 40), (Z, 30) } > と書き表す。
文の実行に関する規則 代入文の場合 <a, > n < x = a;, > [ n / x ] 文の並びの場合 <c1, > 1 <c2, 1> 2 < c1c2, > 2
例1 状態 = { (X, 10), (Y, 20), (Z, 30) } において文Y=40; を実行すると状態はどうなるか。 < 40, > 40 < Y = 40;, > [ 40 / Y ] < { (X, 10), (Y, 40), (Z, 30) } >
例2 状態 = { (X, 10), (Y, 20), (Z, 30) } において 文X = 3; Y=40; を実行すると状態はどうなるか。 < 3, > 3 < X = 3;, > [ 3 / X ] < 40, > 40 < Y = 40;, [ 3 / X ] >( [3 / X]) [ 40 / Y ] < X = 3; Y = 40; > ( [3 / X]) [ 40 / Y ] < { (X, 3), (Y, 40), (Z, 30) } >
練習問題 状態 = { (X, 10), (Y, 20), (Z, 30) } において、文 X = Y + 2; Y = Y + 3 を実行したら 状態はどうなるか。規則を使って導出せよ。