コンパイラ演習 第 4 回 (2011/10/27) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴

Slides:



Advertisements
Similar presentations
1 B10 CPU を作る 1 日目 解説 TA 高田正法
Advertisements

コンパイラ演習 第 6 回 2005/11/17 大山 恵弘 佐藤 秀明. 今回の内容 実マシンコード生成 – アセンブリ生成 (emit.ml) – スタブ、ライブラリとのリンク 末尾呼び出し最適化 – 関数呼び出しからの効率的なリターン (emit.ml) –[ 参考 ]CPS 変換 種々の簡単な拡張.
コンパイラ演習 第 6 回 (2011/11/17) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴 潮田 資秀 小酒井 隆広 山下 諒蔵 佐藤 春旗 大山 恵弘 佐藤 秀明 住井 英二郎.
コンパイラ演習 第 12 回 (2012/01/05) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴 潮田 資秀 小酒井 隆広 山下 諒蔵 佐藤 春旗 大山 恵弘 佐藤 秀明 住井 英二郎.
2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
2006/11/9 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
ML 演習 第 8 回 2007/07/17 飯塚 大輔, 後藤 哲志, 前田 俊行
2006/10/5 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2006/11/30 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
コンパイラ演習番外編 (その2): JVM コンテスト
コンパイラ演習番外編 (その1): min-rt 改 コンテスト
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
プログラミング基礎I(再) 山元進.
2006/10/12 山下 諒蔵 佐藤 春旗 前田俊行 大山 恵弘 佐藤 秀明 住井 英二郎
コンパイラ演習 第 8 回 (2011/12/01) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴
2012年度 計算機システム演習 第4回 白幡 晃一.
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
コンパイラ演習 第 9 回 (2011/12/08) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴
2006年度 計算機システム演習 第4回 2005年5月19日.
計算機システムⅡ 命令セットアーキテクチャ
コンパイラ演習 第12回 2006/1/26 大山 恵弘 佐藤 秀明.
2006/12/7 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2007/1/18 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
第8回 プログラミングⅡ 第8回
2006/10/19 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井英二郎
2006/11/02 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2006/11/16 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
  【事例演習6】  数式インタプリタ      解 説     “インタプリタの基本的な仕組み”.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
2007/1/11 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
TAL : Typed Assembly Language について
型付きアセンブリ言語を用いた安全なカーネル拡張
目的コードの生成 中田育男著 コンパイラの構成と最適化 朝倉書店, 1999年 第9章.
勉強会その3    2016/5/1 10 8分35秒 データの表現 演算.
アルゴリズムとデータ構造1 2006年6月16日
コンピュータ系実験Ⅲ 「ワンチップマイコンの応用」 第1週目 アセンブリ言語講座
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
依存型で型付けされた 副作用のある関数のための 型保存コンパイラ
コンパイラ演習 第11回 2006/1/19 大山 恵弘 佐藤 秀明.
コンパイラ資料 実行時環境.
オブジェクト指向プログラミングと開発環境
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
2007/6/12(通信コース)2007/6/13(情報コース) 住井
コンピュータアーキテクチャ 第 2 回.
コンピュータアーキテクチャ 第 2 回.
コンピュータアーキテクチャ 第 5 回.
コンピュータアーキテクチャ 第 4 回.
第4回 CPUの役割と仕組み2 命令の解析と実行、クロック、レジスタ
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
2006/6/27(通信コース)2006/7/5(情報コース) 住井
プログラム分散化のための アスペクト指向言語
コンピュータアーキテクチャ 第 5 回.
言語プロセッサ 第12日目 平成20年1月9日.
SMP/マルチコアに対応した 型付きアセンブリ言語
X64 函数呼び出し規約 長谷川啓
コンパイラ 2012年10月11日
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
プログラミング演習I 2003年6月11日(第9回) 木村巌.
情報システム基盤学基礎1 コンピュータアーキテクチャ編
プログラミング演習II 2003年11月19日(第6回) 木村巌.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング演習II 2003年10月29日(第2,3回) 木村巌.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
6.5 最終コード生成 (1)コードの形式 ①絶対2進コード(AB : absolute binary) 命令後のオペランドが絶対番地指定。
Presentation transcript:

コンパイラ演習 第 4 回 (2011/10/27) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴 潮田 資秀 小酒井 隆広 山下 諒蔵 佐藤 春旗 大山 恵弘 佐藤 秀明 住井 英二郎

MinCaml  アセンブリ言語への道: 前回までのあらすじ K 正規化 (第2回) 式の評価で現れる中間結果に 全て明示的に変数を束縛した ついでに幾つかの最適化を行った クロージャ変換 (第3回) ネストした関数定義を平らにした

でもアセンブリ言語とはまだ隔たりがある メモリ・メモリ操作が構造化・抽象化されている 変数が任意数個存在しうる 関数呼出しが存在する タプル・クロージャ・配列など アセンブリ言語のメモリはただのフラットなバイト列 変数が任意数個存在しうる アセンブリ言語では有限個のレジスタしかない 関数呼出しが存在する アセンブリ言語にはジャンプ・分岐命令しかない if-then-else がある

MinCaml における今後の変換 今日の内容 メモリ操作をアセンブリ命令の組み合わせに変換する (virtual.ml) 変数をレジスタに対応させる (regalloc.ml) 関数呼出しをアセンブリ命令に変換する (regalloc.ml) 関数呼出し規約に従ってレジスタの退避・復帰させる if-then-else をラベルと分岐命令の組合わせに変換する (emit.ml) 今日の内容

MinCaml の仮想マシンコード 特徴 定義は SPARC/asm.ml にある メモリ操作はアセンブリ言語風 レジスタは無限個ある (とみなす) 関数呼出しがある if-then-else がある 定義は SPARC/asm.ml にある (実際はレジスタ割り当て後も使い回しているが……)

メモリ操作の仮想マシンコードへの変換 ここまで 1 命令として扱われていた 以下のメモリ操作を 複数の命令の組み合わせに変換する クロージャ作成・クロージャからの値の読み出し タプル作成・タプルからの値の読み出し 配列の要素の読み書き

MinCaml での浮動小数点数の処理 関数の引数を 浮動小数点数とそれ以外に分ける (汎用レジスタと浮動小数点数レジスタが異なることを仮定しているため) 型情報を利用する これは後のフェーズのための準備 等号・不等号プリミティブを 浮動小数点数用とそれ以外用に分離する これも型情報を利用する 浮動小数点数の定数テーブルを作成 浮動小数点数の即値セットのため (浮動小数点数を即値として扱えないことを仮定しているため)

関数呼出し規約とは? 関数の呼出し元と 呼出される関数との間の約束事 普通は各コンパイラ・アーキテクチャごとに 決められている 関数呼出し時に各レジスタが保持すべき値 関数呼出し時のあるべきメモリの状態 呼出された関数による レジスタ・メモリの状態への影響 etc. 普通は各コンパイラ・アーキテクチャごとに 決められている

関数呼出し規約の例: レジスタの使い方 汎用レジスタ: R0 から Rn-1 まで n 個 返り番地用レジスタ: Rret ヒープポインタ用レジスタ: Rhp スタックポインタ用レジスタ: Rsp

ヒープポインタ・スタックポインタの 使い方の例 low ヒープ Rhp 未使用 Rsp スタック 関数フレーム high

関数呼出し規約の例: 呼出し側 生きている変数の値をスタックに退避する 呼び出される関数のクロージャのアドレスを R0 に入れる (クロージャを通じて呼び出す場合) 引数を R1、R2、R3、… に入れる 返り番地を Rret に入れる 呼び出される関数のアドレスを クロージャから取り出す 取り出したアドレスにジャンプする

関数呼出し規約の例: 呼出される側 R0 の指すクロージャから 自由変数の値を取り出す (自由変数がある場合) R1、R2、R3、… を引数として 関数本体を実行する 返り値を R1 に入れる Rret にジャンプする

レジスタの使い方の例: SPARC アーキテクチャなら… g0 不使用: 常に値が 0 なので g1~g7 不使用: ライブラリの都合 o0~o4 一般レジスタとして使用 (R13~R17) o6 不使用: OSやデバッガのため o5、o7 R0、Rret l0~l7 一般レジスタとして使用(R5~R12) i0、i1 Rsp、Rhp i2~i5 一般レジスタとして使用(R1~R4) i6、i7 不使用: OSやデバッガのため ※ 上は MinCaml での規約で、 標準の規約とは異なるので、   main 関数や外部関数にはスタブが要る

レジスタの使い方の例: PowerPC アーキテクチャなら… r2 、 r5~r29 一般レジスタとして使用 (R1~R26) r30、lr R0、Rret r3、r4 Rsp、Rhp ※ これも標準とは異なるので、main 関数や外部関数には   スタブが要る

レジスタの使い方の例: POWER アーキテクチャなら… r3~r29 一般レジスタとして使用 (R1~R27) r30、lr R0、Rret r1、r31 Rsp、Rhp ※ これは PowerPC ではなく POWER アーキテクチャ向けの説明で、ソースコードは公開されていないが MinCaml の PowerPC 向けポートよりも先に (少なくとも 2006 年度には) 存在していたスライドである。 ※ これも標準とは異なるので、main 関数や外部関数には   スタブが要る

callee-save register を 導入する手もある 各レジスタを caller 側で保存・復元するか callee 側で保存・復元するかは規約しだい 特に小さい関数や leaf 関数で callee-save register の効果が出る

共通課題 三つの共通課題のうち一つ以上を 解いてください

共通課題 1 自分たちのアーキテクチャの 関数呼出し規約を定義・説明せよ 自分たちのアーキテクチャの 関数呼出し規約を定義・説明せよ また他のアーキテクチャについて 関数呼び出し規約がどうなっているか 調べて述べよ 少なくとも 2 つ以上の種類について調べること 既存の CPU アーキテクチャ (Itanium, ARM, etc.) や 他の班のアーキテクチャでもよい 以上少なくとも 3 つの関数呼出し規約について 比較し類似点・相違点・利害得失等を論ぜよ

共通課題 2 クロージャ変換後の中間コードに含まれる ネストしたタプルの平坦化を実装せよ let a = (1, (2, 3)) in ... let a = (1, 2, 3) in ...

共通課題 3 クロージャ変換後の中間コードに含まれる タプル (や配列) の生成を 不要なら削除するような最適化を実装せよ a が関数の引数や返り値に含まれるときや 配列に代入されるときには注意が必要 let a = (1, 2) in ... let (x, y) = a in ... let x = 1 in let y = 2 in ... ...

課題3をよりまじめに解くためのヒント: 関数の引数のタプルを扱う 関数の引数を展開したものを用意することで 対応できる let rec f a = let (x, y) = a in ... in f (1, 2) let rec f’ x’ y’ = let (x, y) = (x’, y’) in ... in f’ 1 2

課題3をよりまじめに解くためのヒント: 配列中のタプルを扱う 配列の中にタプルを埋め込むこともできる 配列 配列 タプル 1 1 2 3 2 4 5 6 3 4 7 8 9 5 10 11 12 6 7 13 14 15 8 16 17 18 9 10 19 20 21 11 22 23 24 12 13 14 15 16 17 18 19 20 21 22 23 24

課題3をよりまじめに解くためのヒント: タプルを配列に埋め込むときの注意 配列内のタプルに副作用がないか、 あってもプログラムの意味が変わらないか 注意する必要がある 例えば右のような場合 注意が必要 注意が必要な 場合は他にもあるので 注意 ... let a = (1, 2) in b.(0) <- a; let c = (3, 4) in b.(0) <- c; let (x, y) = a in x

課題の提出先と締め切り 提出先: compiler-report-2011@yl.is.s.u-tokyo.ac.jp 締め切り: 2 週間後 (11/10) の午後 1 時 (JST) Subject: Report 4 <学籍番号: 5 桁> 例: Report 4 11099 本文にも氏名と学籍番号を明記のこと 半角スペース 1 個ずつ 質問は compiler-query-2011@yl.is.s.u-tokyo.ac.jp まで