言語処理系(2) 金子敬一.

Slides:



Advertisements
Similar presentations
2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
Advertisements

和田俊和 資料保存場所 /2/26 文法と言語 ー正規表現とオートマトンー 和田俊和 資料保存場所
プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
配列の宣言 配列要素の初期値 配列の上限 メモリ領域 多次元配列 配列の応用
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
C言語によるプログラミングスタイル 制御システム工学科 山北 昌毅.
言語処理系(1) 金子敬一.
コンパイラ 2011年10月17日
プログラミング言語としてのR 情報知能学科 白井 英俊.
言語処理系(4) 金子敬一.
言語処理系(6) 金子敬一.
言語処理系(3) 金子敬一.
地理情報システム論 第3回 コンピュータシステムおける データ表現(1)
コンパイラ 第9回 コード生成 ― スタックマシン ―
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
プログラミング言語論 第4回 式の構文、式の評価
アルゴリズムとデータ構造 2011年6月13日
条件式 (Conditional Expressions)
言語処理系(5) 金子敬一.
言語処理系(8) 金子敬一.
言語処理系(9) 金子敬一.
  【事例演習6】  数式インタプリタ      解 説     “インタプリタの基本的な仕組み”.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
コンパイラ 2012年10月15日
コンパイラ 2012年10月22日
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
情報処理Ⅱ 第4回 2007年10月29日(月).
プログラミング言語論 第12回 関数型プログラミング 情報工学科 篠埜 功.
コンパイラ 2011年10月24日
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
二分探索木によるサーチ.
プログラミング言語入門 手続き型言語としてのJava
言語プロセッサ 第7回目 平成27年11月16日.
プログラミング言語論 第3回 BNF記法について(演習付き)
関数の定義.
プログラミング 4 記憶の割り付け.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング演習I 2003年5月7日(第4回) 木村巌.
プログラミング入門2 第11回 情報工学科 篠埜 功.
国立情報学研究所 ソフトウェア研究系 助教授/
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
プログラミング言語論 第9回 情報工学科 木村昌臣 篠埜 功.
コンパイラ 2011年10月20日
C言語 はじめに 2016年 吉田研究室.
15.cons と種々のデータ構造.
統計ソフトウエアRの基礎.
文法と言語 ー文脈自由文法とLR構文解析ー
地理情報システム論(総)/ 国民経済計算論(商)
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
アルゴリズムとデータ構造 2012年6月11日
PROGRAMMING IN HASKELL
情報処理Ⅱ 第2回 2005年10月14日(金).
情報処理Ⅱ 第2回 2006年10月13日(金).
アルゴリズムとデータ構造1 2009年6月15日
情報処理Ⅱ 2005年10月28日(金).
PROGRAMMING IN HASKELL
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
コンパイラ 2012年10月11日
アルゴリズムとデータ構造 2010年6月17日
PROGRAMMING IN HASKELL
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
情報処理Ⅱ 第2回 2004年10月12日(火).
情報処理Ⅱ 2005年11月25日(金).
プログラミング基礎a 第5回 C言語によるプログラミング入門 配列と文字列
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理Ⅱ 小テスト 2005年2月1日(火).
復習 いろいろな変数型(2) char 1バイト → 英数字1文字を入れるのにぴったり アスキーコード → 付録 int
情報処理Ⅱ 2006年10月27日(金).
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

言語処理系(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 演算子 演算子の実現 多くの演算子→機械命令  算術演算子や論理演算子などの多くの演算子 関係演算子→比較命令&条件分岐命令 その他→機械命令列やサブルーチン

よい連休を