プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020...

42
プログラミング言語論 A (Concepts on Programming Languages) 趙 建軍 (Jianjun Zhao) 1

Transcript of プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020...

Page 1: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

プログラミング言語論 A

(Concepts on Programming Languages)

趙 建軍 (Jianjun Zhao)

1

Page 2: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

第4回

命令型言語 (1)(Imperative Programming Languages)

2020.05.28

2

Page 3: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

3

講義の内容

抽象機械計算モデル

命令型言語パラダイム 代入文、変数の概念と状態 制御文 構造化プログラミング データ型 副プログラムと手続き

2020/5/28

Page 4: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

プログラミングパラダイム (1)

プログラミングパラダイム (programming

paradigm) は、プログラマにプログラムの見方を与えるものと言える。例えば:

◼ オブジェクト指向プログラミング (object-oritented

programming) において、プログラムとはオブジェクトをつくりそれを管理するものである。

◼ 関数型プログラミング (functional programming) においては、状態を持たない関数の評価の連続である。

4

Page 5: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

プログラミングパラダイム (2)

命令型言語パラダイム

関数型言語パラダイム

論理型言語パラダイム

オブジェクト指向型言語パラダイム

5

Page 6: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

プログラミングパラダイム (3)

6

Page 7: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

計算モデル (computation model) の必要性

世の中の情報システム (コンピュータや生物) は非常に複雑

この情報システムがどのような原理に基づくかを知るには数学的基盤を持つ抽象的な枠組みを導入する必要がある

7

Page 8: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

計算モデルとは

コンピュータによる計算機構を抽象的に捉(とら)えた数学的な枠組みであり, これにより計算に関する様々な議論が可能になる◼ 計算するとはどういうことであるかの説明

◼ 計算モデルが変わるとプログラミング言語の設計も変わる

プログラミング言語パラダイムの最重要かつ主要な構成要素

8

Page 9: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

計算モデル

情報システムの抽象的な枠組み=計算モデル

9

Page 10: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

代表的な計算モデル

(逐次) 計算モデル (sequential computation model)

◼ 抽象機械計算モデル

◼ 関数型計算モデル

◼ 論理型計算モデル

◼ 項書き換え型計算モデル

(並列, 分散) 計算モデル (concurrent, distributed)

◼ プロセス代数 (プロセスカルキュラス)

◼ イベント機械モデル (ペトリネット)

10

Page 11: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

代表的な計算モデル

(逐次) 計算モデル (sequential computation model)

◼ 抽象機械計算モデル

◼ 関数型計算モデル

◼ 論理型計算モデル

◼ 項書き換え型計算モデル

(並列, 分散) 計算モデル (concurrent, distributed)

◼ プロセス代数 (プロセスカルキュラス)

◼ イベント機械モデル (ペトリネット)

11

Page 12: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

抽象機械計算モデル (abstract machine)

主にオートマトン理論での計算システムの理論的モデルを意味する

122020/5/28

Page 13: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

13

文法とオートマトンの関係

Grammar (文法)

Regular Expression

(正規表現)

Context-Free Grammar

(文脈自由文法)

Context-Sensitive Grammar

(文脈依存文法)

Automaton (機械)

Finite-State Automaton

(有限オートマトン)

Push-Down Automaton

(プッシュダウン・オートマトン)

Turing Machine

(チューリング機械)

2020/5/28

Page 14: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

14

文法とオートマトンの関係

Grammar (文法)

Regular Expression

(正規表現)

Context-Free Grammar

(文脈自由文法)

Context-Sensitive Grammar

(文脈依存文法)

Automaton (機械)

Finite-State Automaton

(有限オートマトン)

Push-Down Automaton

(プッシュダウン・オートマトン)

Turing Machine

(チューリング機械)

2020/5/28

Page 15: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

15

チューリング機械 (Turing machine)

チューリング機械は計算模型のひとつで、計算機を数学的に議論するための単純化・理想化された仮想機械である

論文「計算可能数についての決定問題への応用」, 1936

アラン・チューリング(Alan Turing)

2020/5/28

Page 16: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

16

アラン・チューリング

計算機科学分野のノーベル賞

Alan Mathison Turing

1912年6月23日-1954年6

月7日

2020/5/28

Page 17: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

チューリング機械 (Turing machine)

チューリング機械は抽象機械計算モデルにおける計算の典型例

2020/5/28 17

Page 18: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

18

チューリング機械の動作

① 入力テープを1つ読む(入力記号)② 現在の状態と入力記号の組合せに応じて

1. ヘッドを動かす(右、左、動かさない)2. ヘッド位置に記号を書く3. 次の状態を決める

③ 1.に戻って繰り返す

2020/5/28

Page 19: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

計算とは、計算機の内部状態を変えてゆくもの

計算が終わったときの計算機の内部状態が計算の結果

s:35 s:36

実行前の内部状態

実行後の内部状態

for i:=1 to 10 do t:=t+1

s:=s+1

t:35 t:45

192020/5/28

Page 20: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

20

命令型言語パラダイム

状態を次々に変化させることで計算をさせる計算モデルでは、命令型プログラミング言語 (imperative programming languages) が発展する

◼ チューリング機械は状態遷移表を持つが、表が大きくなったとき表形式は得策でない

◼ フローチャートは状態遷移図であり、分かりやすいが書き下すのが困難

そのため命令型言語が適していると考えられる

2020/5/28

Page 21: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

命令型言語

最も一般的なパラダイム

ノイマン型コンピュータが、その計算モデルである

命令(つまり代入文)の繰り返しにより、変数の値(「状態」 という)を動的に変化させ、計算を行う

21

Page 22: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

22

命令型言語の特徴

変数と変数への代入 (代入型言語ともいう)

◼ 変数と変数の構造

◼ データ型

◼ データ型と手続きの結びつき (抽象データ型)

制御構造の発展◼ 構造化プログラミング

手続き(Procedure)

◼ 手続き呼び出しと値引渡し

◼ 再帰呼び出し2020/5/28

Page 23: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

23

変数の概念

変数は記憶装置のある領域に対応する

記憶装置の記憶内容がその機械の「状態」であるため、

2020/5/28

Page 24: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

24

変数の概念

記憶装置◼ シーケンシャルアクセスメモリ(sequential

access memory): 決められた順にのみアクセスできる記憶装置

◼ ランダムアクセスメモリ(random access memory): 番地をつかってどの場所も自由にアクセスできる記憶装置

ノイマン型の計算機はランダムアクセスメモリを主記憶にもつ

2020/5/28

Page 25: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

25

ランダムアクセスマシン(RAM)

チューリング機械よりも現実に近い計算機のモデル

チューリング機械は記憶装置もテープだったのに対し、RAMマシンは番地つきのランダムアクセスメモリをもつ

番地

2020/5/28

Page 26: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

26

代入文

A := A+2;

B[i] := X^2+i;

左辺の式:メモリの場所を示すAやB[i]の値に意味があるのでなく、記憶場所を指し示す変数が左辺にあるとき表す記憶場所を左辺値という

右辺の式:値を示すA、X、iはメモリそのものでなく、その値を指し示す変数が左辺にあるとき表す値を右辺値という

2020/5/28

Page 27: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

27

命令と命令の制御

抽象機械計算モデルでは次の文がある◼ 状態を変化させる形式、命令文

◼ 命令の順序を決める形式、制御構造(制御文)

◼ プログラムの解釈を変える形式、宣言文

◼ コメント文

変数内容の変化が基本であり、他の文はそのための仕掛け

命令文:代入文、入出力文

宣言文:変数の宣言、データ型の定義、手続きの定義

2020/5/28

Page 28: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

28

命令の制御と制御構造

制御構造は、命令の順序を決める文

逐次実行 (合成)◼ S1;S2

分岐◼ if-then、if-then-else、switch-case (多分岐)

繰り返し◼ while 条件 do-end (前判定)

◼ repeat-until 条件 (後判定)

(副プログラムの呼出しと復帰)

2020/5/28

Page 29: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

29

GOTO 文

GOTO 文は無条件分岐 命令にラベルをつけておくとGOTO文は常

に、そのラベルの箇所に制御を移すL1 X:=X+1;

if X>100 GOTO L2;GOTO L1;

L2 ...

機械語にあるため、FORTRAN以来、命令型言語の多くが採用している

制御が自由に変えられるため、多用すると分かりにくいプログラムになる ― スパゲッティプログラム

2020/5/28

Page 30: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

30

命令の制御と制御構造

プログラムは、それぞれの箇所が何をしているのか理解できるように書かなければならない

◼ プログラムのテキストの構造(段落)

◼ プログラムの実行順序の構造

一致するとき、そのプログラムは構造化(structured)されているという

必要な制御構造を容易に記述できる制御文が必要

それを備える言語: 構造的プログラミング言語structured programming languages

一致する必要がある

2020/5/28

Page 31: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

31

構造的プログラミング

プログラムのテキスト上の段落と、命令の制御の段落(実行される時間的な固まり)が一致する

プログラムのテキスト上の段落と、機能的な段落が一致する

読みやすく、保守が容易 (可読性)

GOTO文の排除

2020/5/28

Page 32: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

32

構造化された制御フロー

代表的な制御形式◼ 逐次実行◼ 分岐 if-then、if-then-else◼ ループ while、repeat

その段落への入り口、出口が1つのみ

(single entry/single exit)2020/5/28

Page 33: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

33

ループの不変条件(不変表明)

構造的プログラミングの利点:意味的分かりやすい

特にループ中での性質を明確にすることが重要

while文、repeat文ではループ中に満足している条件、脱出したとき満足する条件が明確

while 条件 do

...

end

ループ内では「条件」は必ず真

ループの不変条件(loop invariant)

条件

true

false

2020/5/28

Page 34: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

34

データ型と変数の型

データ(値)とデータを入れておく変数は表裏一体

これらの種類分けがデータ型(data type)◼ 値のデータ型

◼ 式のデータ型

◼ 変数のデータ型

値や式にデータ型があっても、変数にはデータ型のない言語もある (Lisp, Prolog)

2020/5/28

Page 35: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

35

値の型、式の型、変数の型

PASCAL言語の例:

値のデータ型は表現で決まる

◼ 1 はinteger (整数)、1.0 はreal (実数)

式のデータ型は演算子の性質で決まる

◼ 1+2.0 はreal, 1+2 はinteger

変数のデータ型は、型宣言で決まる

2020/5/28

Page 36: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

36

データ型の働き

処理系に情報を与える◼ 必要なメモリの割当て

◼ アドレス計算

エラーの検出◼ データ型の宣言は、変数の利用法を特定するもの

◼ その利用法に合わない場合にエラーを検出する

◼ これを型検査 (type checking)という

◼ 型検査に合格したプログラムを型安全 (type safe)という

◼ コンパイル時の検査=静的 (static) 検査と、実行時(dynamic) の検査がある

2020/5/28

Page 37: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

37

データ型:基本型と構造型

基本型(basic type):その型のデータを直接扱う演算がある型◼ 整数型、実数(浮動小数点数)型、文字型、論理型

構造型(structured type):基本型を要素にして作られる型◼ 配列型、レコード(構造)型、リスト、など

◼ 構造を作る仕組みを型構成子(type constructor)という

◼ 言語によっては、集合型、列挙型、関数型などがある

◼ ポインターとそれを用いたデータ構造

データ型は値の集合に対応、構造型は集合演算に対応する

2020/5/28

Page 38: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

38

副プログラムと手続き

命令型言語では次の言葉はおおよそ同じ意味◼ サブルーチン (subroutine)◼ サブプログラム (subprogram)◼ 手続き (procedure)◼ 関数 (function)

サブルーチン、サブプログラム:◼ 繰り返し利用するルーチンへ制御を移すものと考え

たとき

手続き、関数:◼ 1つの機能を持つブラックボックスとしてルーチン

を抽出したものと考えるとき2020/5/28

Page 39: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

39

手続き、関数

プログラムの繰り返しを回避するための制御構造ではなく、機能ブロックとしての働きをもたせたルーチンが手続き

手続きが値を返すことを前提とするとき、関数という

手続き、関数の要素:◼ 引数の渡し方、結果の戻し方

◼ 手続き内部の変数の扱い

◼ 手続き内外での変数の通用範囲、生存期間

2020/5/28

Page 40: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

40

命令型言語パラダイム

代入文が基本の命令 これの順序を決める制御文を備える 変数やデータの型を有する 副プログラムが書ける

近代的命令型言語では、◼ 構造的プログラミングの言語構造をもつ◼ 構造的データ型の型構成子をもつ◼ 手続きに関する言語の取り決めがある

2020/5/28

Page 41: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

状態遷移表

41

0 1

S T U

T T U

U T U

states

inputs

2020/5/28

Page 42: プログラミング言語論stap.ait.kyushu-u.ac.jp/~zhao/course/2020/2020-L04... · 28/5/2020  · プログラミング言語パラダイムの最重 要かつ主要な構成要素

状態遷移図

422020/5/28