プログラミング言語論 第4回 文の翻訳 C言語の文 表明 Hoare論理

Slides:



Advertisements
Similar presentations
プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
Advertisements

ループで実行する文が一つならこれでもOK
4章 制御の流れ-3.
プログラミング入門2 第4回 配列 for文 変数宣言 初期化
プログラミング言語としてのR 情報知能学科 白井 英俊.
プログラミング基礎I(再) 山元進.
2009/10/9 良いアルゴリズムとは 第2講: 平成21年10月9日 (金) 4限 E252教室 コンピュータアルゴリズム.
プログラムの正当性(2) 正当性証明の基本原理
コンパイラ 第9回 コード生成 ― スタックマシン ―
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
プログラミング言語論 第1回 導入 情報工学科 篠埜 功.
Semantics with Applications
プログラミング言語論 第4回 手続きの引数機構 変数の有効範囲
条件式 (Conditional Expressions)
言語処理系(9) 金子敬一.
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
第7回 条件による繰り返し.
プログラムの制御構造 選択・繰り返し.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
プログラミング言語論プログラミング言語論 プログラムの意味論 水野嘉明
プログラミング言語論 第3回 BNF記法について(演習付き)
プログラミング言語論 第9回 Hoare論理の練習問題 手続きの引数機構 変数の有効範囲
最適化の方法 中田育男著 コンパイラの構成と最適化 朝倉書店, 1999年 第11章.
電気・機械・情報概論 VBAプログラミング 第2回 2018年7月2日
地域情報学演習 VBAプログラミング 第3回 2017年10月24日
アルゴリズムとデータ構造1 2006年6月16日
アルゴリズムとプログラミング (Algorithms and Programming)
Structured programming
04: 式・条件分岐 (if) C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
第2回 状態モデルと 命令型言語(1) 担当:犬塚
 型推論1(単相型) 2007.
プログラミング言語論 第4回 文の翻訳 C言語の文 表明 Hoare論理
プログラミング言語論 第四回 理工学部 情報システム工学科 新田直也.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
情報処理Ⅱ 第2回:2003年10月14日(火).
プログラムの正当性(2) 正当性証明の基本原理
プログラミング言語論 第5回 手続きの引数機構 変数の有効範囲
プログラミング言語論 第7回 文の翻訳 C言語の文 表明 Hoare論理
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
情報工学科 3年生対象 専門科目 システムプログラミング 第4回 シェルスクリプト 情報工学科 篠埜 功.
制御文の役割と種類 IF文 論理式と関係演算子 GO TO文
プログラミング言語論 第9回 情報工学科 木村昌臣 篠埜 功.
C言語ファミリー C# 高級言語(抽象的) Java オブジェクト指向 C++ C 機械語(原始的)
補講:アルゴリズムと漸近的評価.
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
情報処理Ⅱ 第3回 2007年10月22日(月).
プログラミングⅡ 第2回.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
第14回 前半:ラムダ計算(演習付) 後半:小テスト
プログラミング言語論 第10回 情報工学科 篠埜 功.
C#プログラミング実習 第2回.
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
プログラミング言語論 第4回 文の翻訳 C言語の文 表明 Hoare論理
プログラミング基礎演習 第4回.
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
PROGRAMMING IN HASKELL
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理Ⅱ 小テスト 2005年2月1日(火).
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
情報処理Ⅱ 第3回 2004年10月19日(火).
情報処理Ⅱ 2006年10月20日(金).
分岐(If-Else, Else if, Switch) ループ(While, For, Do-while)
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
ファーストイヤー・セミナーⅡ 第10回 if文による選択処理(2).
Presentation transcript:

プログラミング言語論 第4回 文の翻訳 C言語の文 表明 Hoare論理 情報工学科 篠埜 功

文の翻訳について while文などは効率のよい機械語にほとんどそのままコンパイルされる。 … Eの翻訳結果 Eの値がfalseの場合jump while E do S の翻訳

選択文の翻訳 選択文(Cにおけるswitch文など)は、さまざまな実装方法があり得るので、実装によって使い方に影響がある。 (実装例1)ジャンプテーブルを用いて、連続した定数のみを分岐先指定に用いるように推奨する。 (実装例2)分岐数が少ない場合(例えば7以下の場合)、条件分岐のネストにする。多い場合は、分岐先指定の定数がある程度密ならジャンプテーブル(配列)を用いる(例えば配列の半分以上が埋まる場合)。それ以外の場合ハッシュテーブルを用いる。

C言語の文の構文 C言語の文の構文は拡張BNF記法で以下のように定義される。 <stmt> ::= ; | <exp>; | { <stmt-list> } | if (<exp>) <stmt> | if (<exp>) <stmt> else <stmt> | while ( <exp> ) <stmt> | do <stmt> while (<exp>) ; | for (<opt-exp>; <opt-exp>; <opt-exp>) <stmt> | switch ( <exp> ) <stmt> | case <const-exp> : <stmt> | default : <stmt> | break; | continue; | return; | return <exp>; | goto <label>; | <label> : <stmt> <stmt-list> ::= <stmt> * <opt-exp> ::=  | <exp>

C言語について C言語は、講義で説明のために使っている命令型言語と以下のような違いがある。 基本型にブール型はない。0以外の値をtrue, 0をfalseとして扱う。 代入演算子は=, 比較演算子は==, !=である。 while文の条件部分は括弧で囲まなければならない。 begin, endの代わりに中括弧{, }を用いる。 論理andと論理or演算子は&&と||であり、短絡評価(short circuit evaluation)を行う。

短絡評価(short circuit evaluation) C言語(やModula2, Paslcal等)ではand, or式ついて短絡評価を行う。 短絡評価 --- 第2引数は必要な場合のみ評価。 (例) x = 1; if (x == 1 || y == 2) … のような例の場合、x==1が真であり、if文の条件式はy==2の値に係わらず真であるので、y==2を評価せずif文の本体を実行する。

短絡評価の場合の制御フロー 入口 if (x==1 || y==2) x = x + 1; の制御フロー 偽 真 x==1 真 y==2 偽 短絡評価により制御フローは複雑になるが、実行効率が良くなる。 出口

参考 制御フローを図示したものはグラフ構造を成す。制御フローグラフは、goto文がない場合、複雑さが、ある尺度(木幅 tree-width)に関して一定値以下になることが知られている。 goto文無しのAlgol, goto文無しのPascal --- 3以下 Modula-2 --- 5以下(Modula-2にはgoto文は無い) goto文無しのC --- 6以下 短絡評価がなければ上記の木幅は1ずつ減少。 Algol, Pascalに比べ、Modula-2はループについて複数個所での終了(break)を許し、関数も複数個所での終了(return)を許す。Cではさらにcontinue文がある。 (参考文献) Mikkel Thorup, “All structured programs have small tree-width and good register allocation”, Information and Computation, Vol. 142, pp. 159–181, 1998.

練習問題 (1) 以下のC言語のプログラム断片の制御フローを図示せよ。 if (x==1 || y==2) if (x > 0) x = x + 1; (2) 以下のC言語のプログラム断片の制御フローを図示せよ。 while (x > 0) if (x==1 || x!=3) x = x - 1;

不変表明(invariant) プログラム中のある地点において、そこに制御が到達したときにはある条件式が必ず成り立つ場合、その条件式を不変表明(invariant)という。 x := 10 y := 2 x  y 偽 (例) x := 10; y := 2; while x  y do x := x – y この地点ではx  y という条件式が必ず成り立つ。 真 x := x-y

表明(assertion) 表明(assertion) --- 条件式。 Javaでは表明を記述するための構文がある。 C++では、assert.hをインクルードすることにより、assertというマクロを表明として使うことができる。 (Javaの例) int sum (int n) { assert (n > 0); … } sumというメソッドの呼び出しでは引数には正のint型の値しか渡されないという場合にこのようなassertionを記述しておけば、バグの発見に役立つ。

表明の例 ここでは表明を{ }で囲んで記述する。 (さきほどの例) while x  y do { x  y } x := x – y このwhile文に来る直前の地点で{ x  0 and y > 0 }という 表明が不変表明であるとする。その場合、 { x  0 and y > 0 } while x  y do { y > 0 and x  y } x := x – y の中の { y > 0 and x  y } も不変表明となる。

表明の例(続き) { x  0 and y > 0 } while x  y do { y > 0 and x  y } x := x – y 上記のwhile文の直前の表明が不変表明の場合、3か所の表明はすべて不変表明となる。 特に、表明 { x  0 and y > 0 } は、ループのどの繰り返しの回でも成り立つのでループ不変表明という。

事前条件、事後条件 Single entry/single exitの構成要素からなるプログラムの場合、プログラム中の文の振る舞いはその文の入口と出口における表明によって特徴付けることができる。(命令型言語のプログラム(文)の意味は、文の実行による状態の変化なので。) 文の入口における表明(事前条件、precondition) 文 文の出口における表明(事後条件、postcondition)

Hoare triple 文の前後に表明を記述することにより命令型言語のプログラムの意味を記述できる。この考えを提唱したのがCharles Antony Richard Hoare(略してTony Hoare)である。表明を{ }で囲んで表し、文の前後に書いたものをHoare tripleという。 Hoare triple {P} S {Q} の意味 Pが成り立つ任意の状態において文Sを実行し、状態’で終了したら、 ’ においてQが成り立つ。

Hoare tripleの例 { a + 1 = 1 } a := a + 1 { a = 1 } { a = 1 } a := a – 1; a := a + 1 { a = 1 } a = 1が成り立っている状態で a := a – 1; a := a + 1 を実行すると、 実行後の状態ではa = 1が成り立つ。 { a = 5 } while (a > 0) do a := a - 1 { a = 0 } a = 5が成り立っている状態でこのwhile文を実行すると、 実行後の状態ではa = 0が成り立つ。

部分正当性 Hoare tripleでは、文Sが停止することは言っていない(while文は停止しない場合もあるので)。停止性は別途示す必要がある。Hoare tripleは部分正当性を表している(partial correctness assertion)。 停止しない例: while true do x := 1 {true} while true do x := 1 {false} --- このHoare tripleは成立する。 (参考)完全正当性(total correctness) --- 部分正当性 + 停止性 完全正当性の表明は、[P] S [Q] のように[ ]で表すこともある。 (参考) while ruleを拡張することにより、Hoare tripleがtotal correctnessを示すようにすることができる。

Hoare論理 文に対するHoare Tripleは、文の構造に従って規則的に構築することができる。各構文要素(construct)に対応する規則があり、それを集めたものをHoare論理(Hoare logic)という。Hoare論理は公理(axiom)から推論規則(inference rule)に従って導く形になっており、公理的意味論(axiomatic semantics)である。(公理的意味論には様々な形がある。) (参考) flowchard上でFloydが同様のことを考えている。 (参考文献1) C. A. R. Hoare, "An axiomatic basis for computer programming“, Communications of the ACM, 12(10):576–580,583, 1969. (参考文献2) R. W. Floyd, “Assigning meanings to programs”, Proceedings of the American Mathematical Society Symposium on Applied Mathematics, Vol. 19, pp. 19–32. 1967.

Hoare論理の規則 {P} S1 {Q} {Q} S2 {R} {P} (S1; S2) {R} (composition rule) {P  E} S1 {Q} {P   E} S2 {Q} {P} if E then S1 else S2 {Q} (conditional rule) {P  E} S {P} {P} while E do S {P   E} (while rule) { Q[E/x] } x := E {Q} (assignment axiom) P  P’ {P’} S {Q’} Q’  Q {P} S {Q} (consequence rule)

{ x  0 } while x > 0 do x := x – 1 {x = 0} 例 Hoare triple { x  0 } while x > 0 do x := x – 1 {x = 0} は成り立つが、これを規則を使って導くことができる。 (assignment) x  0  x > 0  x-1  0, { x-1  0 } x := x – 1 { x  0 } (consequence) { x  0  x > 0} x := x – 1 { x  0 } (while) { x  0 } while x > 0 do x := x – 1 { x  0   x > 0}, x  0   x > 0  x = 0 { x  0 } while x > 0 do x := x – 1 {x = 0} (consequence) (補足)一つの文に対して成立するHoare tripleは複数存在する。Consequenceについて、一方だけの適用も可とする。

複雑な例 (( r := x; q := 0); {  y  r while y  r do  (r := r – y; q := 1 + q)) {  y  r  x = r + y * q } {true} 「このプログラムを実行すると、x をyで割ったときの商と余りがqとrに格納された状態になる」ということをこのHoare tripleは表している。 このHoare tripleの導出は省略する。

Assertionについて Assertionに何を書いてよいかを定める必要があるが、この講義では、true, false, 変数、自然数、和(+), 差(-), 積(*)、大小比較(<, >, , )、等しさの判定(=)、論理演算(, , , )を使ってよいものとする。さらに, を加えてもよいが、この講義(や試験)では上記範囲とする。算術演算、大小比較などに関する推論規則も定める必要があるが、本講義では通常の常識で推論を行ってよいものとする。 (参考文献1) Glynn Winskel, “The formal semantics of programming languages”, 1993, MIT Press. の第6章 (参考文献2) C. A. R. Hoare, "An axiomatic basis for computer programming“, Communications of the ACM, 12(10):576–580,583, 1969.

Hoare論理の練習問題 以下のHoare Tripleを推論規則を使って導け。 { a + 2 = 2 } a := a + 2 { a = 2 } { a = 3 } if a = 3 then a := a + 1 else a := a – 1 { a = 4 } { a = 1 } while (a < 5) do a := a + 1 { a = 5 }

(1) 解答 (assignment) { a + 2 = 2 } a := a + 2 { a = 2 }

(2) 解答 { a = 3  a = 3} a := a + 1 { a = 4 } この部分は次ページに掲載 この部分は次の次のページに掲載 { a = 3  a = 3} a := a + 1 { a = 4 } { a = 3   a = 3} a := a - 1 { a = 4 } (if) { a = 3 } if a = 3 then a := a + 1 else a := a – 1 { a = 4 }

(2) 解答の続き(左側) (assignment) (a = 3  a = 3)  a+1 = 4 {a+1 = 4} a := a + 1 {a = 4} a=4  a=4 { a = 3  a = 3} a := a + 1 { a = 4 } (consequence)

(2) 解答の続き(右側) (注) 論理式(a = 3   a = 3)  a-1 = 4 がtrueになることの説明: (assignment) (a = 3   a = 3)  a-1 = 4 {a-1=4} a := a - 1 {a=4} a=4  a=4 { a = 3   a = 3} a := a - 1 { a = 4 } (consequence) (注) 論理式(a = 3   a = 3)  a-1 = 4 がtrueになることの説明: 論理式 a = 3   a = 3 はaの値が何であってもfalseである。の定義より、 の左がfalseなら、右はtrueでもfalseでも全体はtrueになる。

(3) 解答 (a5  a<5)  a+15 {a+15} a := a+1 {a5} a5  a5 (assignment) (a5  a<5)  a+15 {a+15} a := a+1 {a5} a5  a5 (consequence) {a5  a<5} a := a + 1 {a5} (while) a=1  a5 {a5} while (a<5) do a := a + 1 {a5  a<5} (a5  a<5)  a=5 { a = 1 } while (a < 5) do a := a + 1 { a = 5 } (consequence)

参考 基本データ型は範囲は有限であり、それに対応した規則が場合によっては必要になる。 (例)0以上の整数の型の場合のオーバーフローの扱い (1) オーバーフローが起こるとプログラムがエラーで終了する。  x (x = max + 1) (2) オーバーフローの場合は最大値を値とする。 max + 1 = max (3) 最大値での割り算の余りとする。 max + 1 = 0