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

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) 金子敬一.
2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
言語処理系(1) 金子敬一.
プログラミング入門2 第4回 配列 for文 変数宣言 初期化
プログラミング言語論プログラミング言語論 命令型プログラミング言語 水野嘉明
プログラミング言語としてのR 情報知能学科 白井 英俊.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
言語処理系(4) 金子敬一.
ファーストイヤー・セミナーⅡ 第8回 データの入力.
プログラミングパラダイム さまざまな計算のモデルにもとづく、 プログラミングの方法論 手続き型 関数型 オブジェクト指向 代数 幾何.
データ構造とアルゴリズム 第10回 mallocとfree
VBA H106077 寺沢友宏.
地理情報システム論 第3回 コンピュータシステムおける データ表現(1)
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
プログラミング言語論 第4回 手続きの引数機構 変数の有効範囲
言語処理系(5) 金子敬一.
言語処理系(8) 金子敬一.
言語処理系(9) 金子敬一.
第4回放送授業.
  【事例演習6】  数式インタプリタ      解 説     “インタプリタの基本的な仕組み”.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
関数 関数とスタック.
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
プログラミング言語入門 手続き型言語としてのJava
プログラミング言語論 第9回 Hoare論理の練習問題 手続きの引数機構 変数の有効範囲
関数の定義.
Cプログラミング演習 第7回 メモリ内でのデータの配置.
プログラミング言語入門.
プログラミング入門2 第11回 情報工学科 篠埜 功.
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
第2回 状態モデルと 命令型言語(1) 担当:犬塚
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
プログラミング言語論 第四回 理工学部 情報システム工学科 新田直也.
プログラミング言語論 第5回 手続きの引数機構 変数の有効範囲
オブジェクト指向プログラミングと開発環境
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
コンパイラ 2011年10月20日
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
構造体と共用体.
情報とコンピュータ 静岡大学工学部 安藤和敏
プログラミング入門2 第9回 ポインタ 情報工学科 篠埜 功.
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
ポインタとポインタを用いた関数定義.
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語 1.
第5回 プログラミングⅡ 第5回
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
情報処理Ⅱ 第7回 2004年11月16日(火).
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
コンパイラ 2012年10月11日
プログラミング 4 文字列.
コンパイラ 第12回 実行時環境 ― 変数と関数 ― 38号館4階N-411 内線5459
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
プログラミング演習I 2003年6月11日(第9回) 木村巌.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
プログラミング基礎a 第5回 C言語によるプログラミング入門 配列と文字列
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理Ⅱ 小テスト 2005年2月1日(火).
プログラミング言語論 プログラミング言語論 演習5 解答と解説 演習5 解答と解説 1 1.
プログラミング演習II 2003年10月29日(第2,3回) 木村巌.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

言語処理系(3) 金子敬一

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.7 代入 代入演算子 A := B A = B A ← B LET A = B MOVE B TO A PASCAL, ALGOL 2.7 代入 代入演算子 A := B A = B A ← B LET A = B MOVE B TO A PASCAL, ALGOL C, FORTRAN APL BASIC COBOL 以下では,:=を代入演算子,=を等号とする.

2.7 代入 l 値と r 値 A := B 名前Aの位置へ名前Bの値を代入せよ 名前は代入演算子の左辺と右辺では意味が異なる. l 値 2.7 代入 l 値と r 値 A := B 名前Aの位置へ名前Bの値を代入せよ 名前は代入演算子の左辺と右辺では意味が異なる. l 値 r 値

2.7 代入 l 値と r 値 式の r 値 ⇒ その式の示す値 一方,式は常に l 値を持つとは限らない すべての名前 2.7 代入 l 値と r 値 式の r 値 ⇒ その式の示す値 一方,式は常に l 値を持つとは限らない すべての名前 Aが配列名⇒A[I]の l 値は,配列Aの第I番目の要素の位置, r 値はA[I]に格納している値 定数は, r 値のみ持ち, l 値を持たない ポインタPの r 値は,Pの指す位置であり, l 値はPの値を格納している位置

2.7 代入 l 値と r 値 ポインタPの r 値は,Pの指す位置であり, l 値はPの値を格納している位置 P := P + 1 P P

2.7 代入 代入の実現(A := Bの1つの実現法) Bの r 値を計算し,レジスタrに入れるコードを生成 2.7 代入 代入の実現(A := Bの1つの実現法) Bの r 値を計算し,レジスタrに入れるコードを生成 AとBの型が不一致 ⇒ Bの r 値をAに適合するように型変換 必要があればAの l 値を計算するコードを生成 レジスタrの内容をAの l 値へ格納するためのコードを生成

2.7 代入 代入の実現例(X[I] := Y[J]) 1語4バイト XおよびY: 固定位置,整数型 添え字は0から始まる 2.7 代入 代入の実現例(X[I] := Y[J]) 1語4バイト XおよびY: 固定位置,整数型 添え字は0から始まる 整数型の各要素は1語を占める

2.7 代入 代入の実現例(X[I] := Y[J]) Bの r 値を計算し,レジスタrに入れるコードを生成 2.7 代入 代入の実現例(X[I] := Y[J]) Bの r 値を計算し,レジスタrに入れるコードを生成 LOAD J, r2 /* Jをr2にロードする */ MULT #4, r2 /* r2を4倍する */ LOAD Y(r2), r1

2.7 代入 代入の実現例(X[I] := Y[J]) AとBの型が不一致 ⇒ Bの r 値をAに適合するように型変換 2.7 代入 代入の実現例(X[I] := Y[J]) AとBの型が不一致 ⇒ Bの r 値をAに適合するように型変換 X[I]とY[I]の型は一致⇒コード生成不要

2.7 代入 代入の実現例(X[I] := Y[J]) 必要があればAの l 値を計算するコードを生成 2.7 代入 代入の実現例(X[I] := Y[J]) 必要があればAの l 値を計算するコードを生成 LOAD I, r2 /* Iをr2にロードする */ MULT #4, r2 /* r2を4倍する */

2.7 代入 代入の実現例(X[I] := Y[J]) レジスタrの内容をAの l 値へ格納するためのコードを生成 2.7 代入 代入の実現例(X[I] := Y[J]) レジスタrの内容をAの l 値へ格納するためのコードを生成 STORE r1, X(r2) /* r1をX(r2)にロードする */

2.7 代入 代入の実現例(X[I] := Y[J]) LOAD J, r2 /* Jをr2にロードする */ 2.7 代入 代入の実現例(X[I] := Y[J]) LOAD J, r2 /* Jをr2にロードする */ MULT #4, r2 /* r2を4倍する */ LOAD Y(r2), r1 /* Y(r2)をr1にロードする */ LOAD I, r2 /* Iをr2にロードする */ STORE r1, X(r2) /* r1をX(r2)にロードする */

2.7 代入 演算子としての代入 代入演算子を2項中置演算子として扱う言語(Cなど) Cにおいて 2.7 代入 演算子としての代入 代入演算子を2項中置演算子として扱う言語(Cなど) Cにおいて A = (B = C + D) + (E = F + G) と書かれた式は, B = C + D, E = F + G, A = B + E と解釈可能

2.7 代入 より一般的な代入 A := B の両辺が単純でない場合 2.7 代入 より一般的な代入 A := B の両辺が単純でない場合 PL/IにおいてAを整数配列とするとA := 0と書かれた式は,配列Aの全要素を0に初期化する

練習問題 2.1 r 値および l 値を持つものはどれか A[I+1] *A &A &(*A) *(&A) *(&(&A)) r 値 l 値

2.8 文 単純文と複合文 単純文:その中に文を含まない文 複合文:1つ以上の文を含む文 if 条件 then 文 2.8 文 単純文と複合文 単純文:その中に文を含まない文 複合文:1つ以上の文を含む文 if 条件 then 文 if 条件 then 文 else 文 begin 文; 文; ...; 文 end while 条件 do 文 for 識別子 := 初期値 to 終値 do 文 Pascalの 複合文

2.8 文 文の型 計算文:代入文など 順序制御文:goto文,break文,call文,return文など 構造文:END文など 2.8 文 文の型 計算文:代入文など 順序制御文:goto文,break文,call文,return文など 構造文:END文など 宣言文:コード生成なし.記号表への登録 入出力文:入出力装置を制御.書式を使用

2.9 プログラム単位 FORTRAN 1つの主プログラム+0個以上の副プログラム 副プログラム:サブルーチン,関数,ブロックデータ 2.9 プログラム単位 FORTRAN 1つの主プログラム+0個以上の副プログラム 副プログラム:サブルーチン,関数,ブロックデータ 分割コンパイル可能 主プログラム,サブルーチン,関数:宣言列+実行文列 大域データ:COMMON文で参照;その他のデータは局所的となる

2.9 プログラム単位 ALGOL ブロック構造化言語 名前の有効範囲 ・ブロックB中で宣言された名前は,ブロックBで のみ有効 2.9 プログラム単位 ALGOL ブロック構造化言語 名前の有効範囲 ・ブロックB中で宣言された名前は,ブロックBで  のみ有効 ・ブロックB’がブロックB中に入れ子になっている  ならば,Bで有効な名前は,B’でそれに対応す  る識別子が再宣言されていなければ,B’中でも  有効

2.9 プログラム単位 begin real X, Y; real Y; real X; ... end ... X X Y Y Y 2.9 プログラム単位 begin real X, Y; real Y; real X;            ... end ... X X Y Y Y ブロック3 ブロック1 ブロック2 ブロック4

2.9 プログラム単位 PL/I FORTRANとALGOLの折衷 プログラムは外部手続きの集合 そのうちの1つが主プログラム 2.9 プログラム単位 PL/I FORTRANとALGOLの折衷 プログラムは外部手続きの集合 そのうちの1つが主プログラム 分割コンパイル可能 ブロックや内部手続きを入れ子にできる

ちょっと休憩 (雑談)

ラテン語編 類似の言葉 スペイン語 フランス語 英語 botella bouteille bottle claro clair clear estudiar etudier study fruta fruit importante important música musique music moderno moderne modern papel papier paper persona personne person

ラテン語編 日本語とスペイン語 外来語 manto (マント) velludo (びろうど) capa (合羽) carta (カルタ) 要注意 No sé. (野瀬) Da me. (駄目) Y caga? (いかが?)

休憩おわり

2.10 データ環境 環境 識別子と名前との対応 文の環境 ブロックの環境 副ブロックの環境

2.10 データ環境 識別子と名前の結合 識別子→名前 名前→位置 静的な結合: FORTRAN, ALGOL, PL/I 2.10 データ環境 識別子と名前の結合 識別子→名前 名前→位置 静的な結合: FORTRAN, ALGOL, PL/I 動的な結合: LISP, APL, SNOBOL

2.10 データ環境 有効範囲規則 有効範囲:その名前を使うことのできる,プログラムの部分のこと ALGOLなど:至近規則 2.10 データ環境 有効範囲規則 有効範囲:その名前を使うことのできる,プログラムの部分のこと ALGOLなど:至近規則 LISPなど:他の規則

2.10 データ環境 有効範囲規則 LISPなど:他の規則 値をスタックに退避して,回復する. 2.10 データ環境 有効範囲規則 LISPなど:他の規則 値をスタックに退避して,回復する. (defun f (x) (setq x (+ x 1)) (g) (print x)) (defun g () (print x) (setq x 1)) (defun h () (setq x 3) (f 1) (print x) (g) (print x)) 2 1 3 3 1

2.11 引数の転送 手続きの主な特徴 プログラムのモジュール化設計 プログラミング作業の効率化 言語の拡張性の向上 2.11 引数の転送 手続きの主な特徴 プログラムのモジュール化設計 プログラミング作業の効率化 言語の拡張性の向上 演算子を手続きとして定義して,式中で利用することができる

2.11 引数の転送 引数 仮引数 integer procedure DIVIDE(X, Y) integer X, Y; 2.11 引数の転送 引数 仮引数 integer procedure DIVIDE(X, Y) integer X, Y; if Y = 0 then return 0 else return X / Y ... A := DIVIDE(B, C) ... 実引数

2.11 引数の転送 参照呼び 呼出し側:実引数の r 値へのポインタを渡す.実引数が l 値を持つ→ l 値 2.11 引数の転送 参照呼び 呼出し側:実引数の r 値へのポインタを渡す.実引数が l 値を持つ→ l 値  持たない→新しい場所を確保して,その l 値 呼び出された側:ポインタを通じての間接参照

2.11 引数の転送 参照呼び procedure SWAP(X, Y) integer X, Y; begin integer TEMP; 2.11 引数の転送 参照呼び procedure SWAP(X, Y) integer X, Y; begin integer TEMP; TEMP := X; X := Y; Y := TEMP end X 25 10 25 I Y 25 10 A[10] TEMP := X; X := Y; 10 TEMP := X; X := Y; Y := TEMP TEMP 10

2.11 引数の転送 値呼び 呼出し側:実引数を評価し, r 値を渡す. 呼び出された側:他の変数と同様に参照

2.11 引数の転送 値呼び procedure SWAP(X, Y) integer X, Y; begin integer TEMP; 2.11 引数の転送 値呼び procedure SWAP(X, Y) integer X, Y; begin integer TEMP; TEMP := X; X := Y; Y := TEMP end X 10 25 25 10 I Y 25 10 25 A[10] TEMP := X; X := Y; 10 TEMP := X; 10 X := Y; Y := TEMP TEMP

2.11 引数の転送 複写復元連係 値呼びの一般化 呼出し側:実引数の l 値を計算 呼び出された側:仮引数の値で実引数を更新

2.11 引数の転送 複写復元連係 procedure SWAP(X, Y) integer X, Y; begin 2.11 引数の転送 複写復元連係 procedure SWAP(X, Y) integer X, Y; begin integer TEMP; TEMP := X; X := Y; Y := TEMP end X 10 25 25 25 10 I Y 10 25 10 10 25 A[10] TEMP := X; X := Y; 10 TEMP := X; TEMP 10 X := Y; Y := TEMP Y := TEMP

2.11 引数の転送 名前呼び 呼出し側:実引数は評価しない. l 値を r 値を計算可能なサンクを渡す. 2.11 引数の転送 名前呼び 呼出し側:実引数は評価しない. l 値を r 値を計算可能なサンクを渡す. 呼び出された側:必要になったら実引数を評価する.

2.11 引数の転送 名前呼び I A[I] procedure SWAP(X, Y) integer X, Y; begin 2.11 引数の転送 I A[I] 名前呼び procedure SWAP(X, Y) integer X, Y; begin integer TEMP; TEMP := X; X := Y; Y := TEMP end X 25 10 25 I Y 25 A[10] TEMP := X; TEMP := X; X := Y; 10 10 X := Y; Y := TEMP TEMP 10 A[25]

2.12 記憶域管理 静的記憶割当て すべてのデータの大きさ固定 再帰手続きなし 名前と位置の結付けも静的に実行可能

2.12 記憶域管理 動的記憶割当て 再帰手続き→スタック割当て 可変データ構造→ヒープ割当て

2.12 記憶域管理 記憶域のスタック割当て→活動記録 局所的な名前,配列,ポインタ 引数渡しのための一時記憶 2.12 記憶域管理 記憶域のスタック割当て→活動記録 局所的な名前,配列,ポインタ 引数渡しのための一時記憶 翻訳時に未確定な局所的な名前と仮引数の属性に関する情報(例えば配列のサイズ) 戻り番地 呼出し側の活動記録へのポインタ

2.12 記憶域管理 記憶域のスタック割当て→活動記録 配列 配列 活動記録 次の記録へのポインタ スタック ポインタ 2.12 記憶域管理 記憶域のスタック割当て→活動記録 配列 配列 固定サイズのデータと可変 サイズ配列へのポインタ   活動記録 戻り番地 次の記録へのポインタ スタック ポインタ

2.12 記憶域管理 記憶域のスタック割当て→活動記録 ブロックC C D ブロックA ブロックB ブロックD B A

2.12 記憶域管理 再帰とディスプレイ ディスプレイ P ... 活動記録の スタック B ... A

2.12 記憶域管理 動的結合を伴う場合のスタックの割当て スタック上の最上位の識別子を探索 →時間が掛かりすぎる 2.12 記憶域管理 動的結合を伴う場合のスタックの割当て スタック上の最上位の識別子を探索 →時間が掛かりすぎる 個々の識別子に対してスタックを用意

2.12 記憶域管理 ヒープ割当て 実行時に可変長となるデータの処理 ゴミの識別,断片化,ゴミ集め 使用可能領域 未使用 Yの値 未使用 2.12 記憶域管理 ヒープ割当て 実行時に可変長となるデータの処理 ゴミの識別,断片化,ゴミ集め 使用可能領域 未使用 Yの値 未使用 Xの値 未使用 Zの値 未使用

今後の予定 5月17日 講義(情コミ実験I) 5月24日 講義(情コミ実験I) 5月31日 創立記念日 6月 7日 講義 6月14日 講義 5月17日 講義(情コミ実験I) 5月24日 講義(情コミ実験I) 5月31日 創立記念日 6月 7日 講義 6月14日 講義 6月21日 国内出張 6月28日 海外出張 7月 5日 講義 7月12日 講義 7月19日 試験