SlideShare a Scribd company logo
PLDIr#6 (PLDI 2002)

        2010-02-11
         酒井 政裕
Adoption and Focus:
Practical Linear Types for
Imperative Programming




         Citation Count: 52
背景
• Type-state とか Vault とかみたいな、状態をトラッキ
  ングする型システムはエイリアシングと相性が悪い
  – e.g. close(a); read(b) は a と b が同じものを指していたら不
    正
• なので、状態をトラッキングする型では、エリアシング
  を禁⽌ (線形型)
• 線形型をフィールドに持つような型も線形型にしなくて
  はいけない
  – でないと、 close(a.f); read(b.f) が安全にならない
• が、これはデータ構造の設計への強い制約になってし
  まって、現実的ではない

• ⇒ この問題を解決する型システムを考えました!
概要
• Adoption/focus という概念を導⼊することで、
  ⾮線形な型が線形なフィールドを持つことを許
  し、かつアクセスの安全性を保証する。

• adoption construct
  – 状態をトラッキングする型や、それらを参照する型
    の、エイリアスを安全に許す仕組み
• focus construct
  – エイリアスされたオブジェクトに対して、状態のト
    ラッキングが出来る、⼀時的なスコープを導⼊する
    仕組み。
⾮線形な型fileptrが
                                       トラッキングされる
従来ダメだった例                                型(線形型)を参照

struct fileptr { tracked(@open) file f; }

void reset_logs($G:fileptr msgs, $G:fileptr errs) {
 tracked fileptr log = msgs;
 close(log.f);
 log.f = open(MSG_LOG_FILENAME);
                                       msgsとerrsがエイリ
    log = errs;                        アスしている可能性
    close(log.f);
    log.f = open(ERR_LOG_FILENAME);
}
fileptrは、
                   解決⽅法                   フィールドを初
                                          期化するために
                                          線形型で確保、
struct fileptr { tracked(@open) file f; } adoptionで⾮
                                          線形な型に変換
void reset_logs($G:fileptr msgs, $G:fileptr errs) {
 tracked fileptr log = msgs;
 close(log.f);
 log.f = open(MSG_LOG_FILENAME);

    log = errs;
                 • focusを推論
    close(log.f);
                 • focus内では
    log.f = open(ERR_LOG_FILENAME);
                    • logは線形型を持つ
}               • msgsのエイリアスの可能性があるerrs
                  へのアクセスは禁⽌ (ガード$Gで判断)
ヒープモデル
• 従来モデルでは、ヒープオブジェクトは
  線形・⾮線形に分類されていた
• このモデルでは、
 – すべてのオブジェクトは線形な状態で確保・
   破棄される
 – Adoptionで、線形な参照を消費して、⾮線形
   なエイリアスを⽣成
 – Focusで、⾮線形なエイリアスから⼀時的に
   線形な参照を取得して、操作
型の扱い⽅
• トラッキングされている型は tr(ρ)
  – 属するのはそのオブジェクトただ⼀つだけ
  – ρは静的に決まる名前でcapabilityのキー
• capabilityのエントリ {ρ ↦ τ}
  – そのプログラムポイントで、ρでトラッキングされる
    オブジェクトが⽣きていて、型τでアクセス可能
• Guarded type ρ▹τ
  – ρがcapabilityに含まれるときに、(focusを使って)型
    τとしてアクセス可能。
  – ⾃由にエイリアス可能
Type language
Expressions
Adoption (養⼦縁組)
• adopt e1 by e2
  – e1の線形な参照を消費して、e2からe1への
    内部的な参照を作成
  – e1が養⼦、e2が養親
  – 結果はe1への⾮線形な参照
• 型は、e1 : τ, e2 : tr(ρ) のとき、
  adopt e1 by e2 : ρ▹τ
Adoption
Focus
• let x = focus e1 in e2
• e1 が ρ1▹τ であって、capabilityにρ1が
  含まれているときに、e2を以下の⽂脈で
  評価:
 – フレッシュな名前ρを使って、x : tr(ρ) とお
   いて、capabilityに {ρ ↦ τ} を追加し ρ1 を
   削除。
 – e2の実⾏後のcapabilityも {ρ ↦ τ} を含まな
   くてはならない。
Focus
Motivating Example
fun dict_lookup(phone:int, ssn:int, d:dictionary) {
... let c = newCell(d) in ...
}
fun add_amount(cell:ref<int[]>, elem:int) {
... resize(cell, newsize) ...
}
fun add_entry(d:dictionary, phone:int, ssn:int,
   amount:int) {
  let cell = dict_lookup(phone, ssn, d)
  in add_amount(cell, amount)
}
Motivating Example (2)
• ⼆種類のインデックスでひけて、値が配
  列である辞書。
• 配列はサイズを変更するので、ダングリ
  ングポインタがないことを保証するため
  に、線形型にしたい。
• しかし、それを持つrefは⼆種類のイン
  デックスの間でエイリアスされる。
newCell
fun newCell(dct : tr(ρd)) : ρd ▹〈int[]•〉
  pre {ρd ↦ dictionary}
  post {ρd ↦ dictionary}
{
  let cell : tr(ρ) = new<1> in
    cell.1 := newarray(10);
    adopt cell : ρd ▹〈int[]•〉 by dct
}
                       h• := ∃[ρ|{ρ ↦ h}]. tr(ρ)
⽂脈の変化
• let cell : tr(ρ) = new<1> in の実⾏後:
  – {ρd ↦ dictionary} ⊗ { ρ ↦ 〈int〉}
  – dct : tr(ρd), cell : tr(ρ)


• cell.1 := newarray(10); の実⾏後:
  – {ρd ↦ dictionary} ⊗ { ρ ↦ 〈tr(ρ2)〉} ⊗
    { ρ2 ↦ int[] }
  – dct : tr(ρd), cell : tr(ρ)
⽂脈の変化
• cell.1 := newarray(10); の実⾏後:
  – { ρd ↦ dictionary } ⊗ { ρ ↦ 〈tr(ρ2)〉} ⊗ { ρ2 ↦
    int[] }
  – dct : tr(ρd), cell : tr(ρ)
• Packして、
  – { ρd ↦ dictionary } ⊗ { ρ ↦ 〈int[]• 〉}
  –…
• adopt cell : ρd ▹〈int[]•〉 by dct で
  – { ρd ↦ dictionary } という capability と、
  – ρd ▹〈int[]•〉という型に

                              h• := ∃[ρ|{ρ ↦ h}]. tr(ρ)
resize
fun resize[ρd](cell : ρd ▹ 〈int[]•〉, size:int): int
  pre {ρd ↦ dictionary}
  post {ρd ↦ dictionary}
{
  let newa = newarray(size) in
  let fcell = focus cell in
  let olda = fcell.1 in
    copy(olda,newa);
    fcell.1 := newa;
    free olda
}
⽂脈の変化
• Focus前:
  – { ρd ↦ dictionary } ⊗ { ρ1 ↦ int[] }
  – cell : ρd ▹ 〈int[]•〉, newa : tr(ρ1), size : int
• Focus後:
  – { ρ1 ↦ int[] } ⊗ { ρ ↦ 〈int[]•〉}
  – fcell : tr(ρ), newa : tr(ρ1), size : int
• Unpackして:
  – { ρ1 ↦ int[] } ⊗ { ρ ↦ 〈tr(ρ2)〉} ⊗
    { ρ2 ↦ int[] }
  – fcell : tr(ρ), newa : tr(ρ1), size : int
⽂脈の変化
• let olda = fcell.1 in の実⾏後:
  – { ρ1 ↦ int[] } ⊗ { ρ ↦ 〈tr(ρ2)〉} ⊗
    { ρ2 ↦ int[] }
  – fcell : tr(ρ), newa : tr(ρ1), olda : tr(ρ2), size: int
• fcell.1 := newa; の実⾏後:
  – {ρ1 ↦ int[]} ⊗ {ρ ↦ 〈tr(ρ1)〉} ⊗ {ρ2 ↦ int[]}
• free(olda) の実⾏後:
  – {ρ1 ↦ int[]} ⊗ {ρ ↦ 〈tr(ρ1)〉}
⽂脈の変化
• free(olda) の実⾏後:
 – { ρ1 ↦ int[] } ⊗ { ρ ↦ 〈tr(ρ1)〉}
• Packして
 – { ρ ↦ 〈int[]• 〉}
• Focusが終了して
 – { ρd ↦ dictionary } ⊗ { ρ ↦ 〈int[]•〉 }
Vaultに実装
Direct3Dの例
interface VERTEX_BUFFER {
  type buffer;
  tracked($B) buffer CreateVertexBuffer () [new
   $B@raw];
  void Clear (tracked($B) buffer) [$B@raw->clear];
  void BeginScene (tracked($B) buffer) [$B@clear-
   >rendering];
  void DrawPrimitive ($B:buffer, ...) [$B@rendering];
  void EndScene (tracked($B) buffer) [$B@rendering-
   >ready];
  void Present (tracked($B) buffer) [$B@ready-
   >raw];
}
Direct3Dの例
MaJIC: Compiling MATLAB
for Speed and Responsivenes




          Citation Count: 8
概要
• MATLAB⽤の JIT/AOT コンパイラ
• MATLABは型無しの⾔語なので、型推論
 – 値の範囲、配列・⾏列・ベクトルのサイズも
   推論
 – JITでは引数と⽂脈から推論
 – AOTでは型を投機的に決定
  • 予測が外れたらJITの⽅にフォールバック
MaJIC compiler passes
Type speculation で使うヒント
• インデックス操作では、虚部は無視され、実部は丸めら
  れるので、普通は整数型しか⽤いられない
• ⽐較演算は、虚部を無視するし、ベクトルの⽐較も稀
• ブラケットの引数は、同じ⾏数もしくは同じ列数のベク
  トル。特に⼀個でもスカラーなら全部スカラー。
• Fortran由来のインデックス操作の構⽂なら、Fortranっ
  ぽい使い⽅をしているに違いない
• ビルトイン関数の引数 (特定の型以外は警告が出る)
インタプリタと⽐較しての
    性能向上

More Related Content

PPT
Glibc malloc internal
PDF
JavaScript 勉強会 ― 変数・演算子・文
PDF
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
PDF
Python勉強会4-制御構文とパッケージ
PDF
Ruby 3のキーワード引数について考える
PDF
Cocoa勉強会#43-Blocksを使う
PDF
Java SE 8 lambdaで変わる プログラミングスタイル
PDF
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
Glibc malloc internal
JavaScript 勉強会 ― 変数・演算子・文
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Python勉強会4-制御構文とパッケージ
Ruby 3のキーワード引数について考える
Cocoa勉強会#43-Blocksを使う
Java SE 8 lambdaで変わる プログラミングスタイル
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー

What's hot (19)

PDF
マーク&スイープ勉強会
PDF
並行プログラミングと継続モナド
PDF
JavaScript 講習会 #1
PDF
Lisp batton - Common LISP
KEY
TaPL_chap11
PDF
たのしい関数型
PDF
LLdeade Python Language Update
PPT
言語処理系入門€5
PDF
Material
PPTX
Tagless Final DSL
PPTX
XLWrapについてのご紹介
PDF
続・SECDマシン
PDF
マスターオブゴールーチンアンドチャネル スタートGo #1
PDF
Haskell勉強会 in ie
PDF
はてなブックマーク in Scala
PPTX
Java8から始める関数型プログラミング
PDF
Lisp Tutorial for Pythonista : Day 5
PDF
XLWrapについてのご紹介
PDF
[Basic 10] 形式言語 / 字句解析
マーク&スイープ勉強会
並行プログラミングと継続モナド
JavaScript 講習会 #1
Lisp batton - Common LISP
TaPL_chap11
たのしい関数型
LLdeade Python Language Update
言語処理系入門€5
Material
Tagless Final DSL
XLWrapについてのご紹介
続・SECDマシン
マスターオブゴールーチンアンドチャネル スタートGo #1
Haskell勉強会 in ie
はてなブックマーク in Scala
Java8から始める関数型プログラミング
Lisp Tutorial for Pythonista : Day 5
XLWrapについてのご紹介
[Basic 10] 形式言語 / 字句解析
Ad

Viewers also liked (11)

PDF
Aluminum: Principled Scenario Exploration through Minimality
PDF
Omega test and beyond
PDF
“Design and Implementation of Generics for the .NET Common Language Runtime”他...
PDF
代数的実数とCADの実装紹介
PDF
Introduction to Max-SAT and Max-SAT Evaluation
PDF
自動定理証明の紹介
PDF
萩野服部研究室 スキー合宿 2012 自己紹介(酒井)
PDF
ゼロピッチ: MOOC
PDF
SAT/SMT solving in Haskell
KEY
How a CDCL SAT solver works
PDF
SAT/SMTソルバの仕組み
Aluminum: Principled Scenario Exploration through Minimality
Omega test and beyond
“Design and Implementation of Generics for the .NET Common Language Runtime”他...
代数的実数とCADの実装紹介
Introduction to Max-SAT and Max-SAT Evaluation
自動定理証明の紹介
萩野服部研究室 スキー合宿 2012 自己紹介(酒井)
ゼロピッチ: MOOC
SAT/SMT solving in Haskell
How a CDCL SAT solver works
SAT/SMTソルバの仕組み
Ad

Similar to “Adoption and Focus: Practical Linear Types for Imperative Programming”他の紹介@PLDIr#6 (20)

PDF
これから Haskell を書くにあたって
KEY
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
ODP
これから Haskell を書くにあたって
PDF
すごいH 第12章モノイド
PDF
Haskell勉強会2 in ie
KEY
PPTX
サンプルで学ぶAlloy
KEY
形式手法とalloyの紹介
PDF
Freer Monads, More Extensible Effects
PDF
Ekmett勉強会発表資料
PDF
Introduction to Categorical Programming (Revised)
PDF
Introduction to Categorical Programming
PDF
すごいHaskell読書会
PDF
オブジェクト指向開発におけるObject-Functional Programming
PDF
すごい配列楽しく学ぼう
KEY
Applicative functor
PDF
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
PDF
関数プログラミング入門
ODP
Ekmett勉強会発表資料
PDF
Move semantics
これから Haskell を書くにあたって
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
これから Haskell を書くにあたって
すごいH 第12章モノイド
Haskell勉強会2 in ie
サンプルで学ぶAlloy
形式手法とalloyの紹介
Freer Monads, More Extensible Effects
Ekmett勉強会発表資料
Introduction to Categorical Programming (Revised)
Introduction to Categorical Programming
すごいHaskell読書会
オブジェクト指向開発におけるObject-Functional Programming
すごい配列楽しく学ぼう
Applicative functor
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
関数プログラミング入門
Ekmett勉強会発表資料
Move semantics

More from Masahiro Sakai (17)

PDF
DeepXplore: Automated Whitebox Testing of Deep Learning
PDF
Towards formal verification of neural networks
PDF
関数プログラマから見たPythonと機械学習
PDF
Writing a SAT solver as a hobby project
PDF
RClassify: Classifying Race Conditions in Web Applications via Deterministic ...
PDF
Relaxed Dependency Analysis
PDF
“Symbolic bounds analysis of pointers, array indices, and accessed memory reg...
PDF
自然言語をラムダ式で解釈する体系PTQのHaskell実装
PDF
Whole Program Paths 等の紹介@PLDIr#3
PDF
Run-time Code Generation and Modal-ML の紹介@PLDIr#2
PPT
融合変換による最適化の理論的基盤と正当性 (2006-06-27)
PPT
融合変換による最適化の理論的基盤と正当性 (2006-06-20)
PPT
Ruby-GNOME2におけるGC問題
PDF
LLW2004 その場でどう書く - Haskell
PDF
非正格関数に対して適用可能な融合変換
PDF
Haskell - LLRing2006 Language Update
PDF
LLDN / キミならどう書く Haskell 編 (自由演技)
DeepXplore: Automated Whitebox Testing of Deep Learning
Towards formal verification of neural networks
関数プログラマから見たPythonと機械学習
Writing a SAT solver as a hobby project
RClassify: Classifying Race Conditions in Web Applications via Deterministic ...
Relaxed Dependency Analysis
“Symbolic bounds analysis of pointers, array indices, and accessed memory reg...
自然言語をラムダ式で解釈する体系PTQのHaskell実装
Whole Program Paths 等の紹介@PLDIr#3
Run-time Code Generation and Modal-ML の紹介@PLDIr#2
融合変換による最適化の理論的基盤と正当性 (2006-06-27)
融合変換による最適化の理論的基盤と正当性 (2006-06-20)
Ruby-GNOME2におけるGC問題
LLW2004 その場でどう書く - Haskell
非正格関数に対して適用可能な融合変換
Haskell - LLRing2006 Language Update
LLDN / キミならどう書く Haskell 編 (自由演技)

“Adoption and Focus: Practical Linear Types for Imperative Programming”他の紹介@PLDIr#6

  • 1. PLDIr#6 (PLDI 2002) 2010-02-11 酒井 政裕
  • 2. Adoption and Focus: Practical Linear Types for Imperative Programming Citation Count: 52
  • 3. 背景 • Type-state とか Vault とかみたいな、状態をトラッキ ングする型システムはエイリアシングと相性が悪い – e.g. close(a); read(b) は a と b が同じものを指していたら不 正 • なので、状態をトラッキングする型では、エリアシング を禁⽌ (線形型) • 線形型をフィールドに持つような型も線形型にしなくて はいけない – でないと、 close(a.f); read(b.f) が安全にならない • が、これはデータ構造の設計への強い制約になってし まって、現実的ではない • ⇒ この問題を解決する型システムを考えました!
  • 4. 概要 • Adoption/focus という概念を導⼊することで、 ⾮線形な型が線形なフィールドを持つことを許 し、かつアクセスの安全性を保証する。 • adoption construct – 状態をトラッキングする型や、それらを参照する型 の、エイリアスを安全に許す仕組み • focus construct – エイリアスされたオブジェクトに対して、状態のト ラッキングが出来る、⼀時的なスコープを導⼊する 仕組み。
  • 5. ⾮線形な型fileptrが トラッキングされる 従来ダメだった例 型(線形型)を参照 struct fileptr { tracked(@open) file f; } void reset_logs($G:fileptr msgs, $G:fileptr errs) { tracked fileptr log = msgs; close(log.f); log.f = open(MSG_LOG_FILENAME); msgsとerrsがエイリ log = errs; アスしている可能性 close(log.f); log.f = open(ERR_LOG_FILENAME); }
  • 6. fileptrは、 解決⽅法 フィールドを初 期化するために 線形型で確保、 struct fileptr { tracked(@open) file f; } adoptionで⾮ 線形な型に変換 void reset_logs($G:fileptr msgs, $G:fileptr errs) { tracked fileptr log = msgs; close(log.f); log.f = open(MSG_LOG_FILENAME); log = errs; • focusを推論 close(log.f); • focus内では log.f = open(ERR_LOG_FILENAME); • logは線形型を持つ } • msgsのエイリアスの可能性があるerrs へのアクセスは禁⽌ (ガード$Gで判断)
  • 7. ヒープモデル • 従来モデルでは、ヒープオブジェクトは 線形・⾮線形に分類されていた • このモデルでは、 – すべてのオブジェクトは線形な状態で確保・ 破棄される – Adoptionで、線形な参照を消費して、⾮線形 なエイリアスを⽣成 – Focusで、⾮線形なエイリアスから⼀時的に 線形な参照を取得して、操作
  • 8. 型の扱い⽅ • トラッキングされている型は tr(ρ) – 属するのはそのオブジェクトただ⼀つだけ – ρは静的に決まる名前でcapabilityのキー • capabilityのエントリ {ρ ↦ τ} – そのプログラムポイントで、ρでトラッキングされる オブジェクトが⽣きていて、型τでアクセス可能 • Guarded type ρ▹τ – ρがcapabilityに含まれるときに、(focusを使って)型 τとしてアクセス可能。 – ⾃由にエイリアス可能
  • 11. Adoption (養⼦縁組) • adopt e1 by e2 – e1の線形な参照を消費して、e2からe1への 内部的な参照を作成 – e1が養⼦、e2が養親 – 結果はe1への⾮線形な参照 • 型は、e1 : τ, e2 : tr(ρ) のとき、 adopt e1 by e2 : ρ▹τ
  • 13. Focus • let x = focus e1 in e2 • e1 が ρ1▹τ であって、capabilityにρ1が 含まれているときに、e2を以下の⽂脈で 評価: – フレッシュな名前ρを使って、x : tr(ρ) とお いて、capabilityに {ρ ↦ τ} を追加し ρ1 を 削除。 – e2の実⾏後のcapabilityも {ρ ↦ τ} を含まな くてはならない。
  • 14. Focus
  • 15. Motivating Example fun dict_lookup(phone:int, ssn:int, d:dictionary) { ... let c = newCell(d) in ... } fun add_amount(cell:ref<int[]>, elem:int) { ... resize(cell, newsize) ... } fun add_entry(d:dictionary, phone:int, ssn:int, amount:int) { let cell = dict_lookup(phone, ssn, d) in add_amount(cell, amount) }
  • 16. Motivating Example (2) • ⼆種類のインデックスでひけて、値が配 列である辞書。 • 配列はサイズを変更するので、ダングリ ングポインタがないことを保証するため に、線形型にしたい。 • しかし、それを持つrefは⼆種類のイン デックスの間でエイリアスされる。
  • 17. newCell fun newCell(dct : tr(ρd)) : ρd ▹〈int[]•〉 pre {ρd ↦ dictionary} post {ρd ↦ dictionary} { let cell : tr(ρ) = new<1> in cell.1 := newarray(10); adopt cell : ρd ▹〈int[]•〉 by dct } h• := ∃[ρ|{ρ ↦ h}]. tr(ρ)
  • 18. ⽂脈の変化 • let cell : tr(ρ) = new<1> in の実⾏後: – {ρd ↦ dictionary} ⊗ { ρ ↦ 〈int〉} – dct : tr(ρd), cell : tr(ρ) • cell.1 := newarray(10); の実⾏後: – {ρd ↦ dictionary} ⊗ { ρ ↦ 〈tr(ρ2)〉} ⊗ { ρ2 ↦ int[] } – dct : tr(ρd), cell : tr(ρ)
  • 19. ⽂脈の変化 • cell.1 := newarray(10); の実⾏後: – { ρd ↦ dictionary } ⊗ { ρ ↦ 〈tr(ρ2)〉} ⊗ { ρ2 ↦ int[] } – dct : tr(ρd), cell : tr(ρ) • Packして、 – { ρd ↦ dictionary } ⊗ { ρ ↦ 〈int[]• 〉} –… • adopt cell : ρd ▹〈int[]•〉 by dct で – { ρd ↦ dictionary } という capability と、 – ρd ▹〈int[]•〉という型に h• := ∃[ρ|{ρ ↦ h}]. tr(ρ)
  • 20. resize fun resize[ρd](cell : ρd ▹ 〈int[]•〉, size:int): int pre {ρd ↦ dictionary} post {ρd ↦ dictionary} { let newa = newarray(size) in let fcell = focus cell in let olda = fcell.1 in copy(olda,newa); fcell.1 := newa; free olda }
  • 21. ⽂脈の変化 • Focus前: – { ρd ↦ dictionary } ⊗ { ρ1 ↦ int[] } – cell : ρd ▹ 〈int[]•〉, newa : tr(ρ1), size : int • Focus後: – { ρ1 ↦ int[] } ⊗ { ρ ↦ 〈int[]•〉} – fcell : tr(ρ), newa : tr(ρ1), size : int • Unpackして: – { ρ1 ↦ int[] } ⊗ { ρ ↦ 〈tr(ρ2)〉} ⊗ { ρ2 ↦ int[] } – fcell : tr(ρ), newa : tr(ρ1), size : int
  • 22. ⽂脈の変化 • let olda = fcell.1 in の実⾏後: – { ρ1 ↦ int[] } ⊗ { ρ ↦ 〈tr(ρ2)〉} ⊗ { ρ2 ↦ int[] } – fcell : tr(ρ), newa : tr(ρ1), olda : tr(ρ2), size: int • fcell.1 := newa; の実⾏後: – {ρ1 ↦ int[]} ⊗ {ρ ↦ 〈tr(ρ1)〉} ⊗ {ρ2 ↦ int[]} • free(olda) の実⾏後: – {ρ1 ↦ int[]} ⊗ {ρ ↦ 〈tr(ρ1)〉}
  • 23. ⽂脈の変化 • free(olda) の実⾏後: – { ρ1 ↦ int[] } ⊗ { ρ ↦ 〈tr(ρ1)〉} • Packして – { ρ ↦ 〈int[]• 〉} • Focusが終了して – { ρd ↦ dictionary } ⊗ { ρ ↦ 〈int[]•〉 }
  • 25. Direct3Dの例 interface VERTEX_BUFFER { type buffer; tracked($B) buffer CreateVertexBuffer () [new $B@raw]; void Clear (tracked($B) buffer) [$B@raw->clear]; void BeginScene (tracked($B) buffer) [$B@clear- >rendering]; void DrawPrimitive ($B:buffer, ...) [$B@rendering]; void EndScene (tracked($B) buffer) [$B@rendering- >ready]; void Present (tracked($B) buffer) [$B@ready- >raw]; }
  • 27. MaJIC: Compiling MATLAB for Speed and Responsivenes Citation Count: 8
  • 28. 概要 • MATLAB⽤の JIT/AOT コンパイラ • MATLABは型無しの⾔語なので、型推論 – 値の範囲、配列・⾏列・ベクトルのサイズも 推論 – JITでは引数と⽂脈から推論 – AOTでは型を投機的に決定 • 予測が外れたらJITの⽅にフォールバック
  • 30. Type speculation で使うヒント • インデックス操作では、虚部は無視され、実部は丸めら れるので、普通は整数型しか⽤いられない • ⽐較演算は、虚部を無視するし、ベクトルの⽐較も稀 • ブラケットの引数は、同じ⾏数もしくは同じ列数のベク トル。特に⼀個でもスカラーなら全部スカラー。 • Fortran由来のインデックス操作の構⽂なら、Fortranっ ぽい使い⽅をしているに違いない • ビルトイン関数の引数 (特定の型以外は警告が出る)