C-- Mizukami Tatsuo 2001/07/18.

Slides:



Advertisements
Similar presentations
コンパイラ演習 第 6 回 2005/11/17 大山 恵弘 佐藤 秀明. 今回の内容 実マシンコード生成 – アセンブリ生成 (emit.ml) – スタブ、ライブラリとのリンク 末尾呼び出し最適化 – 関数呼び出しからの効率的なリターン (emit.ml) –[ 参考 ]CPS 変換 種々の簡単な拡張.
Advertisements

2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
Region-based Memory Management in Cyclone について 発表者 : 前田俊行.
アルゴリズムとデータ構造 第2回 線形リスト(復習).
2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
This slide was a material for the “Reading PLDI Papers (PLDIr)” study group written by Kazuhiro Inaba ( ), under my own understanding of.
2006/11/9 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
コンパイラ 2011年11月14日
Ex7. Search for Vacuum Problem
Ex8. Search for Vacuum Problem(2)
2006/11/30 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
コンパイラ 第9回 コード生成 ― スタックマシン ―
情報工学概論 (アルゴリズムとデータ構造)
App. A アセンブラ、リンカ、 SPIMシミュレータ
2006/12/7 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2007/1/18 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
プログラミング言語論 第4回 手続きの引数機構 変数の有効範囲
2006/10/19 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井英二郎
アルゴリズムとデータ構造 2011年6月13日
プログラミング言語論 第10回 オブジェクト指向 情報工学科 篠埜 功.
2006/11/16 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
プログラミング論 II 電卓,逆ポーランド記法電卓
第4回放送授業.
  【事例演習6】  数式インタプリタ      解 説     “インタプリタの基本的な仕組み”.
の まとめ 2007/04/02 (Mon) / d;id:hzkr
Tokuda Lab. NISHIMURA Taichi
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
TAL : Typed Assembly Language について
型付きアセンブリ言語を用いた安全なカーネル拡張
コンパイラの解析 (4) 例外処理.
プログラミング言語入門 手続き型言語としてのJava
情報の科学的 な理解(2) 情報科教育法 8回目 2005/6/4 太田 剛.
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
暗黙的に型付けされる構造体の Java言語への導入
プログラミング言語論 第9回 Hoare論理の練習問題 手続きの引数機構 変数の有効範囲
精密工学科プログラミング基礎 第10回資料 (12/18実施)
Java Virtual Machine 高速化のためのbyte code 解析 An analysis of byte code to improve the performance of Java Virtual Machine 鈴木タカハル 谷研究室 Feb, 2003.
Java Bytecode Modification and Applet Security
プログラミング 3 構造体(2).
メモリの準備 メモリには、その準備の方法で2種類ある。 静的変数: コンパイル時にすでにメモリのサイズがわかっているもの。 普通の変数宣言
コンパイラ 2012年11月15日
Javaプログラムの変更を支援する 影響波及解析システム
A Provably Sound TAL for Back-end Optimization について
プログラミング言語論 第13回 オブジェクト指向 情報工学科 篠埜 功.
動的データ依存関係解析を用いた Javaプログラムスライス手法
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
コンパイラ資料 実行時環境.
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
Javaバイトコードの 動的依存解析情報を用いた スライシングシステムの実現
バイトコードを単位とするJavaスライスシステムの試作
Ex7. Search for Vacuum Problem
C言語を用いたマシン非依存な JITコンパイラ作成フレームワーク
プログラミング言語論 第5回 手続きの引数機構 変数の有効範囲
オブジェクト指向プログラミングと開発環境
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
精密工学科プログラミング基礎Ⅱ 第5回資料 今回の授業で習得してほしいこと: 構造体 (教科書 91 ページ)
参照されないリテラル 長谷川啓
静的情報と動的情報を用いた Javaプログラムスライス計算法
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
アルゴリズムとデータ構造 2012年6月11日
アルゴリズムとデータ構造1 2009年6月15日
18. Case Study : Imperative Objects
コンパイラ 第12回 実行時環境 ― 変数と関数 ― 38号館4階N-411 内線5459
アルゴリズムとデータ構造 2010年6月17日
全体ミーティング(6/3) 修士2年 飯塚 大輔.
回帰テストにおける実行系列の差分の効率的な検出手法
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
1.2 言語処理の諸観点 (1)言語処理の利用分野
Presentation transcript:

C-- Mizukami Tatsuo 2001/07/18

コンパイラを書こう! ⇒時間・人力がとてもかかる 以下の性質がほしいよね 出力コードが最適化されてて、暴速 Intra- inter- procedual register allocation Instruction selection, scheduling Jump elimination, et al どのマシン用にもバイナリが出力できる SPARC, MIPS, Alpha, PowerPC, Pentium … ⇒時間・人力がとてもかかる

解決方法1 中間言語にCを使用する 長所 短所 ほとんどのマシン言語にコンパイル可能 プラットホームに特化した最適化も豊富 そもそも中間言語用として設計されてない GC, tail call, multiple result, …

C code My source code My favoriate Front end SPARC x86 PowerPC Arm MIPS Alpha

解決方法2 中間言語にJVMLを使用する 長所 短所 write-once, run-anywhere 抽象化レベルが高い Java用にのみ設計されている。 write-once, test-anywhere

JVML My source code My favoriate Front end SPARC x86 PowerPC Arm MIPS Alpha

解決方法3 新たな中間言語を設計する どのようなソース言語にも対応 どのようなマシン言語も出力可能 従来のコンパイラ技術も使える GC,例外処理にも対応 だから、作ってみました。 「 C-- 」

? C-- My source code My favoriate Front end SPARC x86 PowerPC Arm MIPS Alpha

誰もが気にする名前の由来 C--は Cのサブセットではない ‘C’は設計の基準となったのが、Cだから では、‘--’は? より、アセンブラに近いから? (推論) C++に対抗意識をもった? (推論)

C--の目標 C--は実装が難しいコンパイラ技術をカプセル化する。ただし、 コード出力はCと同じくらい簡単 最適化はCと同じくらい良い GC, 例外処理のポリシーは利用者が決定

C--の特徴 Portable High-Performance Exploits existing code generator Independent of particular generator Independent of target architecture Inter-operable Human writable, readable

C--とCの差異 ローカル変数はレジスタに割り当て (レジスタは無限) 明示的なメモリアクセス tail call  (レジスタは無限) 明示的なメモリアクセス tail call multiple result 自由なCalling conventions (指定も可能) その他 (GC, 例外はそのときに説明)

/* Ordinary recursion */ sp1(word4 n) { word4 s, p; if n==1 { return( 1, 1); } else { s, p = sp1(n-1); return( s+n, p*n); } }

/* Tail recursion */ sp2(word4 n) { jump sp2_help(n, 1, 1); } sp2_help(word4 n, word4 s, word4 p) { if n==1 { return( s, p); } else { jump su_2help(n-1, s+n, p*n); } }

C-- Status Optimization Tail Calls Garbage Collection Exception Dispatch Concurrency Debugging IMPLEM. DESIGN.

GC : 概論 C--にはどのようなGCが望まれるのか? accurate garbage collection not conservative GC ソース言語の特徴に対応したGC オブジェクトのサイズ・数... Mark, Copy, et al

GC : 問題点と解決方法 データの型 メモリ管理(マシン非依存、ポリシー決定可) front endがポインタ型の情報を作成 Runtime Systemに登録して使用 メモリ管理(マシン非依存、ポリシー決定可) Runtime Systemを導入 Interfaceを使用して、好きなGCを作成

GC : データ型 関数で使用されるレジスタの型を静的に決定し、保存した構造体をDescriptorという 使用者が好きにデザインしてよい f(x : pointer, y : int) 例) data { gc1 : bit32 2; /* this procedure has 2 variable */ bit8 1; /* x is a pinter */ bit8 0; /* y is a non-pointer */ }

GC : データ型の登録・取得 コンパイラが登録を行う。 データ型の動的な取得 span GC gc1 { f(bits32 x, bits y) { ... code for f ... } } データ型の動的な取得 現在のProgram Counterをキーとして、対応するProcedureのDescriptorを得る。

GC : メモリ管理 例えば、以下のようなCopy GCが行われる (次のページはそのソースコード) gc関数の呼び出し 現在のStack frameから最古のStack frameまでスイッチし、以下の手順を行う。 フレーム内の変数のアドレスを得る。 その変数がポインタか判断 ポインタならその先をcopyする from-spaceとto-spaceのスイッチ

Copy GCの作成例 struct gc_descriptor { unsigned var_count; char heap_ptr[1]; }; void gc(void) { activation a; FirstActivation(tcb, &a); for(;;) { struct gc_descriptor *d = GetDescriptor(&a, GC); if(d != NULL) { int i; for(i = 0; i < d->var_count; i++) if(d->heap_ptr[i]) { typedef void *pointer; pointer *rootp = FindVar(a, i); if(rootp != NUL) *rootp = gc_forward(*rootp); } if(NextActivation(&a) == NULL) break; gc_copy(); Copy GCの作成例

Walking a stack Botton of stack Activation handle record Botton of stack Top of stack Activation handle Pointer to an activation record Pointer to first calle-save register Pointer to second calle-save register

例外処理 GCのところで説明したRuntime Interfaceを再利用しても、実現可能。 GCではProcedureに対応するポインタ情報を登録していた 例外用の情報も登録可能。

C--は特定の例外処理に束縛してよいのか 例外処理の対処方法 主に4つの実装方法がある Continuation-passing style (SML/NJ) Constant-time "stack-cutting" (OCaml) Unwind stack in run-time system (Poly M3) Custom code to unwind stack (Self) C--は特定の例外処理に束縛してよいのか

最新の論文の例外処理機構 例外処理の方式をfront endが選択でくるようにC--を拡張している 例外処理の選択には、次の視点がある [Norman and Simon, 2000] 例外処理の選択には、次の視点がある stackを一段づつ上るか Runtimeが処理するか

Alternatives for control transfer Stack walk required? No Yes Generated code cut to return <m/n> Run-time system SetCutToCont SetActivation and SetUnwindCont

Stack cutting Stackを頭から順に調べることなく、例外ハンドラにジャンプする 長所 短所 Constant timeでTrap可能 短所 callee-save registerの復帰ができない

Stack unwinding スタックを頭から順に調べて、例外がキャッチされるかを調べる 長所 短所 callee-save registerの復帰が可能 短所 Stackの深さの分だけ時間がかかる

Reference(1) Simon Peyton Jones, Thomas Nordin, and Dino Oliva. C--: A Portable Assembly Language. In Proceedings of the 1997 Workshop on Implementing Functional Languages, St Andrews, ed C Clack, Springer Verlag LNCS, 1998. Simon Peyton Jones, Norman Ramsey, Fermin Reig. C--: a portable assembly language that supports garbage collection.  International Conference on Principles and Practice of Declarative Programming, 1999.

Reference(2) Norman Ramsey, Simon L. Peyton Jones: A single intermediate language that supports multiple implementations of exceptions. PLDI 2000: 285-298