言語処理系(2) 金子敬一
2 プログラミング言語 2.1 高水準プログラミング言語 2.2 プログラミング言語の定義 2.3 言語の字句構造および構文構造 2 プログラミング言語 2.1 高水準プログラミング言語 2.2 プログラミング言語の定義 2.3 言語の字句構造および構文構造 2.4 データ要素 2.5 データ構造 2.6 演算子 2.7 代入 2.8 文 2.9 プログラム単位 2.10 データ環境 2.11 引数の転送 2.12 記憶域管理
2.1 高水準プログラミング言語 高水準プログラミング言語の利点 理解しやすさ 自然さ 移植性 使用効率 読み易い,書き易い,証明し易い 2.1 高水準プログラミング言語 高水準プログラミング言語の利点 理解しやすさ 自然さ 移植性 使用効率 読み易い,書き易い,証明し易い アルゴリズムを自然に記述できる 色々な計算機上で実行できる プログラムの生産性が高い
2.1 高水準プログラミング言語 信頼性 データ構造 有効範囲規則 制御構造 モジュール構造 生産性の向上に役立つ機能
2.2 プログラミング言語の定義 表記法 言語設計者 正しいプログラムとその意味を単純かつ明快に表現可能 プログラマ コンパイラ設計者 2.2 プログラミング言語の定義 表記法 言語設計者 プログラマ コンパイラ設計者 正しいプログラムとその意味を単純かつ明快に表現可能 記述可能なプログラムとその動作を決定可能 受理すべき原始プログラムと生成すべき目的コードを決定可能
2.2 プログラミング言語の定義 構文 プログラム:アルファベットから選択された文字列 構文:ある文字列が正しいプログラムであるか否かを知 2.2 プログラミング言語の定義 構文 プログラム:アルファベットから選択された文字列 構文:ある文字列が正しいプログラムであるか否かを知 らせる規則 正規表現,文脈自由文法:構文指定のための決まり
2.2 プログラミング言語の定義 意味 意味:プログラムに意味を与える規則 構文の指定より難しい 2.2 プログラミング言語の定義 意味 意味:プログラムに意味を与える規則 構文の指定より難しい for I := 1 step 10 – J until 10 * J do J := J + 1 第1の意味:10 * JとJはループの前に1度だけ評価 第2の意味:10 * JとJをループ毎に評価 第3の意味:増分が負ならば,終了条件をI < 10 * J
2.2 プログラミング言語の定義 意味の指定法 操作的意味:抽象機械+実行規則 翻訳:「文→文(既知)」の規則 2.2 プログラミング言語の定義 意味の指定法 操作的意味:抽象機械+実行規則 翻訳:「文→文(既知)」の規則 公理的定義:「前データー(実行)→後データ」の規則 拡張可能定義:基本操作+その組合せ 表示的意味:「プログラム→数学的対象」の規則
2.2 プログラミング言語の定義 プログラミング言語の階層構造 プログラム サブルーチンおよびブロック 文 式 データ参照 演算子 関数
2.3 言語の字句構造および構文構造 アルファベット 2.3 言語の字句構造および構文構造 アルファベット プログラミング言語で使用される記号の集合:アルファベット,文字集合 Σ={a, b, …, z, A, B, …, Z, [, ], (, ), +, -, *, /, …}
2.3 言語の字句構造および構文構造 字句 もっとも低水準の部分文字列 多くのプログラミング言語では以下を字句とする: 2.3 言語の字句構造および構文構造 字句 もっとも低水準の部分文字列 多くのプログラミング言語では以下を字句とする: 定数.1, 2.3, 4.5E6, など 識別子.A, H2035B, SPEED, など 演算子記号.+, -, **, :=, .EQ., など 手掛かり語.IF, GOTO, SUBROUTINE, など 区切り記号.(, ), {, }, ,, ;, など
2.3 言語の字句構造および構文構造 上位レベルの構成要素 字句の集まり →構文構造 一般に構文構造は式を含む 2.3 言語の字句構造および構文構造 上位レベルの構成要素 字句の集まり →構文構造 一般に構文構造は式を含む 式,代入演算子,区切り記号,手掛かり語 →上位レベルの構成要素を形成する際の要素
2.3 言語の字句構造および構文構造 字句解析上の約束 固定形式:文の要素を入力行の決められた位置に書く 2.3 言語の字句構造および構文構造 字句解析上の約束 固定形式:文の要素を入力行の決められた位置に書く 自由形式:文の要素を入力行のどこに書いても良い →こちらが主流 FortranやAlgol68では文字列中以外の空白は無視される→字句解析作業は複雑化 DO 10 I = 1.3 ... 10 CONTINUE ⇒ DO10I = 1.3
2.4 データ要素 基本的なデータ要素 ALGOL FORTRAN PASCAL PL/I 数値データ V 論理データ 文字データ ― 2.4 データ要素 基本的なデータ要素 ALGOL FORTRAN PASCAL PL/I 数値データ V 論理データ 文字データ ― ポインタ 名札
2.4 データ要素 識別子および名前 対象:計算機が操作したり,使用したりするデータ要素,配列,手続き.記憶に格納される. 2.4 データ要素 識別子および名前 対象:計算機が操作したり,使用したりするデータ要素,配列,手続き.記憶に格納される. 記憶の単位は名前をもつ. 名前は識別子によって表現.値と属性をもつ. 同じ識別子が別の名前を表現しうる.
2.4 データ要素 識別子および名前 void proc1() { int x = 12; ... } void proc2() 2.4 データ要素 識別子および名前 void proc1() { int x = 12; ... } void proc2() double x = 12;
2.4 データ要素 属性 型(とりうる値,適用可能な演算,演算の効果) 有効範囲
2.4 データ要素 宣言 FORTRAN: 暗黙の型宣言 I, …, Nで始まる識別子は,陽に宣言しなければ整数 2.4 データ要素 宣言 FORTRAN: 暗黙の型宣言 I, …, Nで始まる識別子は,陽に宣言しなければ整数 PL/I: 数値は4種類の属性―モード,スケール,進法,精度―をもつ DECLARE A DECIMAL FLOAT(10) ⇒浮動小数点,10進法,10桁精度,モードは実数(省略値)
2.4 データ要素 属性と名前の結合 結合:属性と名前を対応させること 静的結合:コンパイル時に結合を決定⇒強力な型検査 2.4 データ要素 属性と名前の結合 結合:属性と名前を対応させること 静的結合:コンパイル時に結合を決定⇒強力な型検査 動的結合:実行時に結合を検査
ちょっと休憩 (雑談)
中国語編 日中で意味の異なる言葉 日本の意味 中国の意味 湯 お湯 スープ 愛人 伴侶 猪 いのしし ブタ 煤 スス 石炭 走 走る 歩く 手紙 トイレットペーパー 勉強 無理強い 検討 自己批判 質問 詰問
中国語編 外来語を漢字に直す→「意味から」と「音から」 意味編 西北航空(ノースウエスト),汽水(サイダー),電視(機) (テレビ) 音編 西北航空(ノースウエスト),汽水(サイダー),電視(機) (テレビ) 音編 啤酒(ビール),威士忌(ウイスキー),白闌地(ブランデー) 可口可楽(コカコーラ),夏威夷(ハワイ)
休憩おわり
2.5 データ構造 再帰的データ構造 リスト struct cell { int val; 「空リスト」,または「データ 2.5 データ構造 再帰的データ構造 リスト 「空リスト」,または「データ 要素の後にリストの続くもの」 木 1つの節点が根 残りの節点は,根の子で ある部分木に分割可能 struct cell { int val; struct cell *next; }; struct node { struct node *left; struct node *right;
2.5 データ構造 一般的なデータ構造 配列,キュー,スタック,文字列,グラフなど 構成子 破壊子 共通に備わっている関数 選択子
2.5 データ構造 配列 同じ型を持つ要素の集合 k次元の直方体状に並べられたもの A[1,2,0] 2次元 A 添字 0次元 1次元
2.5 データ構造 固定サイズ1次元配列 A[LOW +1] A[LOW +2] 配列A A[LOW] ... A[i] ... BASE 2.5 データ構造 固定サイズ1次元配列 A[LOW +1] A[LOW +2] 配列A A[LOW] ... A[i] ... BASE BASE +k BASE +2*k BASE+ k*(i-LOW) アドレス ... ...
2.5 データ構造 固定サイズ多次元配列 A[1,1] A[1,2] A[1,3] A[2,1] A[2,2] A[2,3] A[1,1] 2.5 データ構造 固定サイズ多次元配列 A[1,1] A[1,2] A[1,3] A[2,1] A[2,2] A[2,3] A[1,1] A[1,2] A[1,3] A[2,1] A[2,2] A[2,3] A[1,1] A[2,1] A[1,2] A[2,2] A[1,3] A[2,3] 行順 列順
A[i,j] ⇒ BASE+k*((i-LOWr)*HIGHc+(j-LOWc) 2.5 データ構造 固定サイズ多次元配列 行順 配列A A[1,1] A[1,2] A[1,3] A[2,1] A[2,2] A[2,3] BASE BASE +k BASE +2*k BASE +3*k BASE +4*k BASE +5*k アドレス A[i,j] ⇒ BASE+k*((i-LOWr)*HIGHc+(j-LOWc)
A[i,j] ⇒ BASE+k*((j-LOWc)*HIGHr+(i-LOWr) 2.5 データ構造 固定サイズ多次元配列 列順 配列A A[1,1] A[2,1] A[1,2] A[2,2] A[1,3] A[2,3] BASE BASE +k BASE +2*k BASE +3*k BASE +4*k BASE +5*k アドレス A[i,j] ⇒ BASE+k*((j-LOWc)*HIGHr+(i-LOWr)
2.5 データ構造 辺ベクトルによる2次元配列 A[1,1] A[1,2] A[1,3] A[2,1] A[2,2] A[2,3]
2.5 データ構造 動的配列 多くの言語で,配列の大きさを動的に指定可能 配列の要素へアクセスするためのアドレス計算は, 固定の場合と同じ. 2.5 データ構造 動的配列 多くの言語で,配列の大きさを動的に指定可能 配列の要素へアクセスするためのアドレス計算は, 固定の場合と同じ. 添字の上下限は,データ記述子から調べる.
2.5 データ構造 レコード構造 レコード欄を子,部分欄を孫としてもつ木構造 郵送先名簿を以下のように格納したい: 2.5 データ構造 レコード構造 レコード欄を子,部分欄を孫としてもつ木構造 郵送先名簿を以下のように格納したい: MR. ALAN TURING 172 THE GRADUATE COLLEGE PRINCETON, N. J. 08540
2.5 データ構造 レコード構造 1 FRIENDS(1000), 2 NAME, 3 TITLE CHARACTER(6), 2.5 データ構造 レコード構造 1 FRIENDS(1000), 2 NAME, 3 TITLE CHARACTER(6), 3 FIRST CHARACTER(15), 3 LAST CHARACTER(15), 2 ADDRESS, 3 STREET CHARACTER(30), 3 TOWN CHARACTER(15), 3 STATE CHARACTER(15), 3 ZIP FIXED DECIMAL(5); MR. ALAN TURING 172 THE GRADUATE COLLEGE PRINCETON N. J. 08540
2.5 データ構造 ... レコード構造 M R . A L N T U I G 1 7 2 H E D P C O J 8 5 4 2.5 データ構造 レコード構造 M R . A L N T U I G 1 7 2 H E D ... P C O J 8 5 4 FRIENDS NAME TITLE FIRST LAST ADDRESS STREET TOWN STATE ZIP X = FRIENDS(123).ADDRESS.STATE ⇒BASE + 100 * (123 - 1) + 36 + 45 = BASE + 12281
2.5 データ構造 文字列 文字列の長さを指定する必要なし: SNOBOL⇒動的な記憶域の割当て 文字列の長さの上限が規定: 2.5 データ構造 文字列 文字列の長さを指定する必要なし: SNOBOL⇒動的な記憶域の割当て 文字列の長さの上限が規定: PL/I⇒文字列の長さを表すデータ記述子
2.5 データ構造 リスト構造 carとcdrという2つの欄からなるレコード構造 各欄は,アトム,空ポインタ,他のレコード番地の いずれか 2.5 データ構造 リスト構造 carとcdrという2つの欄からなるレコード構造 各欄は,アトム,空ポインタ,他のレコード番地の いずれか さらにアトムとポインタの判別に2つの欄,ゴミか 否か判別するのに1つの欄が必要 整数や文字などの基本的なデータ型
2.5 データ構造 CAR CDR ’B’ 1 ’A’ 2 リスト構造 [’A’, 2, ’B’, 1]
2.5 データ構造 -2.14 ’B’ スタック 1024 ’A’ スタックポインタ スタックサイズの上限が決まって 2.5 データ構造 -2.14 ’B’ 1024 ’A’ スタック スタックポインタ スタックサイズの上限が決まって いれば,その大きさの配列を使い 実現可能
2.6 演算子 算術演算子 演算子+, -, *, /, **(または^)が有名 演算子-は,単項にも2項にも用いられる. 2.6 演算子 算術演算子 演算子+, -, *, /, **(または^)が有名 演算子-は,単項にも2項にも用いられる. 単項演算子→前置または後置 言語Cでは,++は前置,後置いずれにも使用可 X=++Y; → Y=Y+1; X=Y; X=Y++; → X=Y; Y=Y+1; 2項演算子→前置,中置,または後置
2.6 演算子 算術式 データ参照は式 +を2項中置演算子,E1, E2を式 ⇒ E1 + E2は式 +を単項前置演算子,Eを式 2.6 演算子 算術式 データ参照は式 +を2項中置演算子,E1, E2を式 ⇒ E1 + E2は式 +を単項前置演算子,Eを式 ⇒ + Eは式 +を単項後置演算子,Eを式 ⇒ E +は式 Eを式 ⇒ (E)は式
2.6 演算子 関係演算子 2項演算子 論理値(たとえばtrueやfalse)を返す 2.6 演算子 関係演算子 2項演算子 論理値(たとえばtrueやfalse)を返す 代表的なものに<=, <, =, <>, >=, >がある
2.6 演算子 論理演算子 論理値をもつ引数,論理値を返す. 論理積and 論理和or 論理否定not 排他的論理和xor(またはeor)
2.6 演算子 文字列演算子 文字列を対象とする. 連接 ”abcd” + ”efg” ⇒ ”abcdefg” 部分列の取り出し パタン照合
2.6 演算子 結合性と順位 左結合的 右結合的 a+b+c → (a+b)+cか, a+(b+c)か? 2.6 演算子 左結合的 右結合的 結合性と順位 a+b+c → (a+b)+cか, a+(b+c)か? a+b**c で,+は左結合的で **は右結合的 a+b**c → (a+b)**cか, a+(b**c)か? +の順位>**の順位 +の順位<**の順位
2.6 演算子 演算子の優先順位 単項演算子 ALGOL FORTRAN PI/I ^ ** ** + - + - * / 2.6 演算子 単項演算子 演算子の優先順位 ALGOL FORTRAN PI/I ^ ** ** + - + - * / < = > < = > .LT. .EQ. .GT. || .LE. .NE. .GE. < = > <= >= .NOT. < = > .AND. & .OR. |
2.6 演算子 演算子の代数的性質 可換則 x + y = y + x a + b * c = b * c + a 2.6 演算子 演算子の代数的性質 可換則 x + y = y + x a + b * c = b * c + a 結合則 (x + y) + z = x + (y + z) (a * 3) * 2 = a * (3 * 2) = a * 6 分配則 (x + y) * z = x * z + y * z a * 2 + b * 2 = (a + b) * 2
2.6 演算子 その他の演算子(代入以外) 条件式:ALGOLのif A then B else CやCの 2.6 演算子 その他の演算子(代入以外) 条件式:ALGOLのif A then B else CやCの A ? B : Cなど.これは3項演算子 選択子:配列の添字付け,レコード構造の欄名の 指定 A[1,2,i] 変項演算子あるいは多項演算子
2.6 演算子 型強制 異なる型の引数をとりうる演算子:Aが整数型で, Bが実数型のとき,A+Bの結果の型は? 2.6 演算子 型強制 異なる型の引数をとりうる演算子:Aが整数型で, Bが実数型のとき,A+Bの結果の型は? 暗黙の型変換:Aを実数型に変換してから加算を 実行するようなコードを生成
2.6 演算子 演算子の実現 多くの演算子→機械命令 算術演算子や論理演算子などの多くの演算子 関係演算子→比較命令&条件分岐命令 2.6 演算子 演算子の実現 多くの演算子→機械命令 算術演算子や論理演算子などの多くの演算子 関係演算子→比較命令&条件分岐命令 その他→機械命令列やサブルーチン
よい連休を