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

What's hot

マーク&スイープ勉強会
マーク&スイープ勉強会マーク&スイープ勉強会
マーク&スイープ勉強会
7shi
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
Kousuke Ruichi
 
JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1
Susisu
 
Lisp batton - Common LISP
Lisp batton - Common LISPLisp batton - Common LISP
Lisp batton - Common LISPMasaomi CHIBA
 
TaPL_chap11
TaPL_chap11TaPL_chap11
TaPL_chap11
a-hisame
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
Shinichi Kozake
 
LLdeade Python Language Update
LLdeade Python Language UpdateLLdeade Python Language Update
LLdeade Python Language Update
Atsushi Shibata
 
言語処理系入門€5
言語処理系入門€5言語処理系入門€5
言語処理系入門€5
Kenta Hattori
 
Material
MaterialMaterial
Material
_TUNE_
 
Tagless Final DSL
Tagless Final DSLTagless Final DSL
Tagless Final DSL
Hikaru Yoshimura
 
XLWrapについてのご紹介
XLWrapについてのご紹介XLWrapについてのご紹介
XLWrapについてのご紹介Ohsawa Goodfellow
 
続・SECDマシン
続・SECDマシン続・SECDマシン
続・SECDマシン
t-sin
 
マスターオブゴールーチンアンドチャネル スタートGo #1
マスターオブゴールーチンアンドチャネル   スタートGo #1マスターオブゴールーチンアンドチャネル   スタートGo #1
マスターオブゴールーチンアンドチャネル スタートGo #1
Takuya Ueda
 
Haskell勉強会 in ie
Haskell勉強会 in ieHaskell勉強会 in ie
Haskell勉強会 in ie
maeken2010
 
はてなブックマーク in Scala
はてなブックマーク in Scalaはてなブックマーク in Scala
はてなブックマーク in Scala
Lintaro Ina
 
Java8から始める関数型プログラミング
Java8から始める関数型プログラミングJava8から始める関数型プログラミング
Java8から始める関数型プログラミング
stylefreeslide
 
Lisp Tutorial for Pythonista : Day 5
Lisp Tutorial for Pythonista : Day 5Lisp Tutorial for Pythonista : Day 5
Lisp Tutorial for Pythonista : Day 5
Ransui Iso
 
XLWrapについてのご紹介
XLWrapについてのご紹介XLWrapについてのご紹介
XLWrapについてのご紹介Ohsawa Goodfellow
 
[Basic 10] 形式言語 / 字句解析
[Basic 10] 形式言語 / 字句解析[Basic 10] 形式言語 / 字句解析
[Basic 10] 形式言語 / 字句解析
Yuto Takei
 

What's hot (19)

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

Viewers also liked

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

Viewers also liked (11)

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

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

関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
Hideyuki Tanaka
 
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと 12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと Haruka Ozaki
 
Frege, What a Non-strict Language
Frege, What a Non-strict LanguageFrege, What a Non-strict Language
Frege, What a Non-strict Language
y_taka_23
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
Kimikazu Kato
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
Masao Kato
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
bitter_fox
 
Intoroduction of Pandas with Python
Intoroduction of Pandas with PythonIntoroduction of Pandas with Python
Intoroduction of Pandas with PythonAtsushi Hayakawa
 
現実世界のJRuby
現実世界のJRuby現実世界のJRuby
現実世界のJRuby
Hiroshi Nakamura
 
現実世界のJRuby(ショートバージョン)
現実世界のJRuby(ショートバージョン)現実世界のJRuby(ショートバージョン)
現実世界のJRuby(ショートバージョン)
Hiroshi Nakamura
 
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへNaoki Kitora
 
HiRoshimaR3_IntroR
HiRoshimaR3_IntroRHiRoshimaR3_IntroR
HiRoshimaR3_IntroR
SAKAUE, Tatsuya
 
TensorFlow White Paperを読む
TensorFlow White Paperを読むTensorFlow White Paperを読む
TensorFlow White Paperを読む
Yuta Kashino
 
Chainerの使い方と自然言語処理への応用
Chainerの使い方と自然言語処理への応用Chainerの使い方と自然言語処理への応用
Chainerの使い方と自然言語処理への応用
Seiya Tokui
 
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
Kazuyuki TAKASE
 
Prelude to Halide
Prelude to HalidePrelude to Halide
Prelude to Halide
Akira Maruoka
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
do_aki
 

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

関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと 12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
 
Frege, What a Non-strict Language
Frege, What a Non-strict LanguageFrege, What a Non-strict Language
Frege, What a Non-strict Language
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
 
Intoroduction of Pandas with Python
Intoroduction of Pandas with PythonIntoroduction of Pandas with Python
Intoroduction of Pandas with Python
 
現実世界のJRuby
現実世界のJRuby現実世界のJRuby
現実世界のJRuby
 
現実世界のJRuby(ショートバージョン)
現実世界のJRuby(ショートバージョン)現実世界のJRuby(ショートバージョン)
現実世界のJRuby(ショートバージョン)
 
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
 
HiRoshimaR3_IntroR
HiRoshimaR3_IntroRHiRoshimaR3_IntroR
HiRoshimaR3_IntroR
 
TensorFlow White Paperを読む
TensorFlow White Paperを読むTensorFlow White Paperを読む
TensorFlow White Paperを読む
 
Chainerの使い方と自然言語処理への応用
Chainerの使い方と自然言語処理への応用Chainerの使い方と自然言語処理への応用
Chainerの使い方と自然言語処理への応用
 
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
 
Prelude to Halide
Prelude to HalidePrelude to Halide
Prelude to Halide
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 

More from Masahiro Sakai

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

More from Masahiro Sakai (19)

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

Recently uploaded

LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
Takayuki Nakayama
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
Matsushita Laboratory
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
0207sukipio
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
harmonylab
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
t m
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
chiefujita1
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
Toru Tamaki
 

Recently uploaded (9)

LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
 

“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っ ぽい使い⽅をしているに違いない • ビルトイン関数の引数 (特定の型以外は警告が出る)