プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020...
Transcript of プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020...
プログラミング言語論 A
(Concepts on Programming Languages)
趙 建軍 (Jianjun Zhao)
1
第4回
命令型言語 (1)(Imperative Programming Languages)
2020.05.28
2
3
講義の内容
抽象機械計算モデル
命令型言語パラダイム 代入文、変数の概念と状態 制御文 構造化プログラミング データ型 副プログラムと手続き
2020/5/28
プログラミングパラダイム (1)
プログラミングパラダイム (programming
paradigm) は、プログラマにプログラムの見方を与えるものと言える。例えば:
◼ オブジェクト指向プログラミング (object-oritented
programming) において、プログラムとはオブジェクトをつくりそれを管理するものである。
◼ 関数型プログラミング (functional programming) においては、状態を持たない関数の評価の連続である。
4
プログラミングパラダイム (2)
命令型言語パラダイム
関数型言語パラダイム
論理型言語パラダイム
オブジェクト指向型言語パラダイム
5
プログラミングパラダイム (3)
6
計算モデル (computation model) の必要性
世の中の情報システム (コンピュータや生物) は非常に複雑
この情報システムがどのような原理に基づくかを知るには数学的基盤を持つ抽象的な枠組みを導入する必要がある
7
計算モデルとは
コンピュータによる計算機構を抽象的に捉(とら)えた数学的な枠組みであり, これにより計算に関する様々な議論が可能になる◼ 計算するとはどういうことであるかの説明
◼ 計算モデルが変わるとプログラミング言語の設計も変わる
プログラミング言語パラダイムの最重要かつ主要な構成要素
8
計算モデル
情報システムの抽象的な枠組み=計算モデル
9
代表的な計算モデル
(逐次) 計算モデル (sequential computation model)
◼ 抽象機械計算モデル
◼ 関数型計算モデル
◼ 論理型計算モデル
◼ 項書き換え型計算モデル
(並列, 分散) 計算モデル (concurrent, distributed)
◼ プロセス代数 (プロセスカルキュラス)
◼ イベント機械モデル (ペトリネット)
10
代表的な計算モデル
(逐次) 計算モデル (sequential computation model)
◼ 抽象機械計算モデル
◼ 関数型計算モデル
◼ 論理型計算モデル
◼ 項書き換え型計算モデル
(並列, 分散) 計算モデル (concurrent, distributed)
◼ プロセス代数 (プロセスカルキュラス)
◼ イベント機械モデル (ペトリネット)
11
抽象機械計算モデル (abstract machine)
主にオートマトン理論での計算システムの理論的モデルを意味する
122020/5/28
13
文法とオートマトンの関係
Grammar (文法)
Regular Expression
(正規表現)
Context-Free Grammar
(文脈自由文法)
Context-Sensitive Grammar
(文脈依存文法)
Automaton (機械)
Finite-State Automaton
(有限オートマトン)
Push-Down Automaton
(プッシュダウン・オートマトン)
Turing Machine
(チューリング機械)
2020/5/28
14
文法とオートマトンの関係
Grammar (文法)
Regular Expression
(正規表現)
Context-Free Grammar
(文脈自由文法)
Context-Sensitive Grammar
(文脈依存文法)
Automaton (機械)
Finite-State Automaton
(有限オートマトン)
Push-Down Automaton
(プッシュダウン・オートマトン)
Turing Machine
(チューリング機械)
2020/5/28
15
チューリング機械 (Turing machine)
チューリング機械は計算模型のひとつで、計算機を数学的に議論するための単純化・理想化された仮想機械である
論文「計算可能数についての決定問題への応用」, 1936
アラン・チューリング(Alan Turing)
2020/5/28
16
アラン・チューリング
計算機科学分野のノーベル賞
Alan Mathison Turing
1912年6月23日-1954年6
月7日
2020/5/28
チューリング機械 (Turing machine)
チューリング機械は抽象機械計算モデルにおける計算の典型例
2020/5/28 17
18
チューリング機械の動作
① 入力テープを1つ読む(入力記号)② 現在の状態と入力記号の組合せに応じて
1. ヘッドを動かす(右、左、動かさない)2. ヘッド位置に記号を書く3. 次の状態を決める
③ 1.に戻って繰り返す
2020/5/28
例
計算とは、計算機の内部状態を変えてゆくもの
計算が終わったときの計算機の内部状態が計算の結果
s:35 s:36
実行前の内部状態
実行後の内部状態
for i:=1 to 10 do t:=t+1
s:=s+1
t:35 t:45
192020/5/28
20
命令型言語パラダイム
状態を次々に変化させることで計算をさせる計算モデルでは、命令型プログラミング言語 (imperative programming languages) が発展する
◼ チューリング機械は状態遷移表を持つが、表が大きくなったとき表形式は得策でない
◼ フローチャートは状態遷移図であり、分かりやすいが書き下すのが困難
そのため命令型言語が適していると考えられる
2020/5/28
命令型言語
最も一般的なパラダイム
ノイマン型コンピュータが、その計算モデルである
命令(つまり代入文)の繰り返しにより、変数の値(「状態」 という)を動的に変化させ、計算を行う
21
22
命令型言語の特徴
変数と変数への代入 (代入型言語ともいう)
◼ 変数と変数の構造
◼ データ型
◼ データ型と手続きの結びつき (抽象データ型)
制御構造の発展◼ 構造化プログラミング
手続き(Procedure)
◼ 手続き呼び出しと値引渡し
◼ 再帰呼び出し2020/5/28
23
変数の概念
変数は記憶装置のある領域に対応する
記憶装置の記憶内容がその機械の「状態」であるため、
2020/5/28
24
変数の概念
記憶装置◼ シーケンシャルアクセスメモリ(sequential
access memory): 決められた順にのみアクセスできる記憶装置
◼ ランダムアクセスメモリ(random access memory): 番地をつかってどの場所も自由にアクセスできる記憶装置
ノイマン型の計算機はランダムアクセスメモリを主記憶にもつ
2020/5/28
25
ランダムアクセスマシン(RAM)
チューリング機械よりも現実に近い計算機のモデル
チューリング機械は記憶装置もテープだったのに対し、RAMマシンは番地つきのランダムアクセスメモリをもつ
番地
2020/5/28
26
代入文
A := A+2;
B[i] := X^2+i;
左辺の式:メモリの場所を示すAやB[i]の値に意味があるのでなく、記憶場所を指し示す変数が左辺にあるとき表す記憶場所を左辺値という
右辺の式:値を示すA、X、iはメモリそのものでなく、その値を指し示す変数が左辺にあるとき表す値を右辺値という
2020/5/28
27
命令と命令の制御
抽象機械計算モデルでは次の文がある◼ 状態を変化させる形式、命令文
◼ 命令の順序を決める形式、制御構造(制御文)
◼ プログラムの解釈を変える形式、宣言文
◼ コメント文
変数内容の変化が基本であり、他の文はそのための仕掛け
命令文:代入文、入出力文
宣言文:変数の宣言、データ型の定義、手続きの定義
2020/5/28
28
命令の制御と制御構造
制御構造は、命令の順序を決める文
逐次実行 (合成)◼ S1;S2
分岐◼ if-then、if-then-else、switch-case (多分岐)
繰り返し◼ while 条件 do-end (前判定)
◼ repeat-until 条件 (後判定)
(副プログラムの呼出しと復帰)
2020/5/28
29
GOTO 文
GOTO 文は無条件分岐 命令にラベルをつけておくとGOTO文は常
に、そのラベルの箇所に制御を移すL1 X:=X+1;
if X>100 GOTO L2;GOTO L1;
L2 ...
機械語にあるため、FORTRAN以来、命令型言語の多くが採用している
制御が自由に変えられるため、多用すると分かりにくいプログラムになる ― スパゲッティプログラム
2020/5/28
30
命令の制御と制御構造
プログラムは、それぞれの箇所が何をしているのか理解できるように書かなければならない
◼ プログラムのテキストの構造(段落)
◼ プログラムの実行順序の構造
一致するとき、そのプログラムは構造化(structured)されているという
必要な制御構造を容易に記述できる制御文が必要
それを備える言語: 構造的プログラミング言語structured programming languages
一致する必要がある
2020/5/28
31
構造的プログラミング
プログラムのテキスト上の段落と、命令の制御の段落(実行される時間的な固まり)が一致する
プログラムのテキスト上の段落と、機能的な段落が一致する
読みやすく、保守が容易 (可読性)
GOTO文の排除
2020/5/28
32
構造化された制御フロー
代表的な制御形式◼ 逐次実行◼ 分岐 if-then、if-then-else◼ ループ while、repeat
その段落への入り口、出口が1つのみ
(single entry/single exit)2020/5/28
33
ループの不変条件(不変表明)
構造的プログラミングの利点:意味的分かりやすい
特にループ中での性質を明確にすることが重要
while文、repeat文ではループ中に満足している条件、脱出したとき満足する条件が明確
while 条件 do
...
end
ループ内では「条件」は必ず真
ループの不変条件(loop invariant)
条件
true
false
2020/5/28
34
データ型と変数の型
データ(値)とデータを入れておく変数は表裏一体
これらの種類分けがデータ型(data type)◼ 値のデータ型
◼ 式のデータ型
◼ 変数のデータ型
値や式にデータ型があっても、変数にはデータ型のない言語もある (Lisp, Prolog)
2020/5/28
35
値の型、式の型、変数の型
PASCAL言語の例:
値のデータ型は表現で決まる
◼ 1 はinteger (整数)、1.0 はreal (実数)
式のデータ型は演算子の性質で決まる
◼ 1+2.0 はreal, 1+2 はinteger
変数のデータ型は、型宣言で決まる
2020/5/28
36
データ型の働き
処理系に情報を与える◼ 必要なメモリの割当て
◼ アドレス計算
エラーの検出◼ データ型の宣言は、変数の利用法を特定するもの
◼ その利用法に合わない場合にエラーを検出する
◼ これを型検査 (type checking)という
◼ 型検査に合格したプログラムを型安全 (type safe)という
◼ コンパイル時の検査=静的 (static) 検査と、実行時(dynamic) の検査がある
2020/5/28
37
データ型:基本型と構造型
基本型(basic type):その型のデータを直接扱う演算がある型◼ 整数型、実数(浮動小数点数)型、文字型、論理型
構造型(structured type):基本型を要素にして作られる型◼ 配列型、レコード(構造)型、リスト、など
◼ 構造を作る仕組みを型構成子(type constructor)という
◼ 言語によっては、集合型、列挙型、関数型などがある
◼ ポインターとそれを用いたデータ構造
データ型は値の集合に対応、構造型は集合演算に対応する
2020/5/28
38
副プログラムと手続き
命令型言語では次の言葉はおおよそ同じ意味◼ サブルーチン (subroutine)◼ サブプログラム (subprogram)◼ 手続き (procedure)◼ 関数 (function)
サブルーチン、サブプログラム:◼ 繰り返し利用するルーチンへ制御を移すものと考え
たとき
手続き、関数:◼ 1つの機能を持つブラックボックスとしてルーチン
を抽出したものと考えるとき2020/5/28
39
手続き、関数
プログラムの繰り返しを回避するための制御構造ではなく、機能ブロックとしての働きをもたせたルーチンが手続き
手続きが値を返すことを前提とするとき、関数という
手続き、関数の要素:◼ 引数の渡し方、結果の戻し方
◼ 手続き内部の変数の扱い
◼ 手続き内外での変数の通用範囲、生存期間
2020/5/28
40
命令型言語パラダイム
代入文が基本の命令 これの順序を決める制御文を備える 変数やデータの型を有する 副プログラムが書ける
近代的命令型言語では、◼ 構造的プログラミングの言語構造をもつ◼ 構造的データ型の型構成子をもつ◼ 手続きに関する言語の取り決めがある
2020/5/28
状態遷移表
41
0 1
S T U
T T U
U T U
states
inputs
2020/5/28
状態遷移図
422020/5/28