言語処理系(2) 金子敬一 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.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.3 言語の字句構造および構文構造 • アルファベット プログラミング言語で使用される記号の集合:アルファベット, 文字集合 Σ={a, b, …, z, A, B, …, Z, [, ], (, ), +, -, *, /, …} 2.3 言語の字句構造および構文構造 • 字句 もっとも低水準の部分文字列 多くのプログラミング言語では以下を字句とする: 定数.1, 2.3, 4.5E6, など 識別子.A, H2035B, SPEED, など 演算子記号.+, -, **, :=, .EQ., など 手掛かり語.IF, GOTO, SUBROUTINE, など 区切り記号.(, ), {, }, ,, ;, など 2.3 言語の字句構造および構文構造 • 上位レベルの構成要素 字句の集まり →構文構造 一般に構文構造は式を含む 式,代入演算子,区切り記号,手掛かり語 →上位レベルの構成要素を形成する際の要素 2.3 言語の字句構造および構文構造 • 字句解析上の約束 固定形式:文の要素を入力行の決められた位置に書く 自由形式:文の要素を入力行のどこに書いても良い →こちらが主流 FortranやAlgol68では文字列中以外の空白は無視さ れる→字句解析作業は複雑化 DO 10 I = 1.3 ⇒ DO10I = 1.3 ... 10 CONTINUE 2.4 データ要素 • 基本的なデータ要素 ALGOL FORTRAN PASCAL PL/I 数値データ V V V V 論理データ V V V V 文字データ ― ― V V ポインタ ― ― V V 名札 ― ― ― V 2.4 データ要素 • 識別子および名前 対象:計算機が操作したり,使用したりするデータ 要素,配列,手続き.記憶に格納される. 記憶の単位は名前をもつ. 名前は識別子によって表現.値と属性をもつ. 同じ識別子が別の名前を表現しうる. 2.4 データ要素 • 識別子および名前 void proc1() { int x = 12; ... } void proc2() { double x = 12; ... } 2.4 データ要素 • 属性 型(とりうる値,適用可能な演算,演算の効果) 有効範囲 2.4 データ要素 • 宣言 FORTRAN: 暗黙の型宣言 I, …, Nで始まる識別子は,陽に宣言しなければ整数 PL/I: 数値は4種類の属性―モード,スケール,進法,精 度―をもつ DECLARE A DECIMAL FLOAT(10) ⇒浮動小数点,10進法,10桁精度,モードは実数(省略 値) 2.4 データ要素 • 属性と名前の結合 結合:属性と名前を対応させること 静的結合:コンパイル時に結合を決定⇒強力な型検査 動的結合:実行時に結合を検査 ちょっと休憩 (雑談) 中国語編 • 日中で意味の異なる言葉 日本の意味 中国の意味 湯 お湯 スープ 愛人 愛人 伴侶 猪 いのしし ブタ 煤 スス 石炭 走 走る 歩く 手紙 手紙 トイレットペーパー 勉強 勉強 無理強い 検討 検討 自己批判 質問 質問 詰問 中国語編 • 外来語を漢字に直す→「意味から」と「音から」 —意味編 西北航空(ノースウエスト),汽水(サイダー),電視(機) (テレビ) —音編 啤酒(ビール),威士忌(ウイスキー),白闌地(ブランデー) 可口可楽(コカコーラ),夏威夷(ハワイ) 休憩おわり 2.5 データ構造 • 再帰的データ構造 struct cell { int val; 「空リスト」,または「データ struct cell *next; 要素の後にリストの続くもの」 }; リスト 木 1つの節点が根 残りの節点は,根の子で ある部分木に分割可能 struct node { int val; struct node *left; struct node *right; }; 2.5 データ構造 • 一般的なデータ構造 配列,キュー,スタック,文字列,グラフなど 構成子 破壊子 選択子 共通に備わっている関数 2.5 データ構造 • 配列 同じ型を持つ要素の集合 k次元の直方体状に並べられたもの 2次元 0次元 1次元 A A[1,2,0] 添字 2.5 データ構造 • 固定サイズ1次元配列 配列A アドレス A[LOW] BASE A[LOW A[LOW +1] +2] ... BASE +k ... BASE+ ... k*(i-LOW) BASE +2*k A[i] ... 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] 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) 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 データ構造 • レコード構造 —レコード欄を子,部分欄を孫としてもつ木構造 —郵送先名簿を以下のように格納したい: MR. ALAN TURING 172 THE GRADUATE COLLEGE PRINCETON, N. J. 08540 2.5 データ構造 • レコード構造 1 FRIENDS(1000), 2 NAME, 3 TITLE CHARACTER(6), MR. 3 FIRST CHARACTER(15), ALAN 3 LAST CHARACTER(15), TURING 2 ADDRESS, 3 STREET CHARACTER(30), 172 THE GRADUATE COLL 3 TOWN CHARACTER(15), PRINCETON 3 STATE CHARACTER(15), N. J. 3 ZIP FIXED DECIMAL(5); 08540 2.5 データ構造 • レコード構造 FRIENDS NAME TITLE MR. FIRST ALAN LAST TURING ADDRESS STREET 1 7 2 THE GRAD TOWN PRINCETON STATE N. ZIP 08540 ... J. X = FRIENDS(123).ADDRESS.STATE ⇒BASE + 100 * (123 - 1) + 36 + 45 = BASE + 12281 2.5 データ構造 • 文字列 —文字列の長さを指定する必要なし: SNOBOL⇒動的な記憶域の割当て —文字列の長さの上限が規定: PL/I⇒文字列の長さを表すデータ記述子 2.5 データ構造 • リスト構造 —carとcdrという2つの欄からなるレコード構造 —各欄は,アトム,空ポインタ,他のレコード番地の いずれか 整数や文字などの基 本的なデータ型 —さらにアトムとポインタの判別に2つの欄,ゴミか 否か判別するのに1つの欄が必要 2.5 データ構造 • リスト構造 CAR CDR ’B’ 1 [’A’, 2, ’B’, 1] ’A’ 2 2.5 データ構造 • スタック -2.14 ’B’ スタックポインタ 1024 スタックサイズの上限が決まって いれば,その大きさの配列を使い 実現可能 ’A’ 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を式 ⇒ + Eは式 —+を単項後置演算子,Eを式 ⇒ E +は式 —Eを式 ⇒ (E)は式 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)か? —a+b**c で,+は左結合的で **は右結合的 a+b**c → (a+b)**cか, a+(b**c)か? +の順位>**の順位 +の順位<**の順位 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 —結合則 (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の A ? B : Cなど.これは3項演算子 —選択子:配列の添字付け,レコード構造の欄名の 指定 A[1,2,i] 変項演算子あるいは多項演算子 2.6 演算子 • 型強制 —異なる型の引数をとりうる演算子:Aが整数型で, Bが実数型のとき,A+Bの結果の型は? —暗黙の型変換:Aを実数型に変換してから加算を 実行するようなコードを生成 2.6 演算子 • 演算子の実現 —多くの演算子→機械命令 算術演算子や論理演算子などの多くの演算子 —関係演算子→比較命令&条件分岐命令 —その他→機械命令列やサブルーチン よい連休を
© Copyright 2024 ExpyDoc