240 likes | 373 Views
Survey: A Compositional Account of the Java Virtual Machine. POPL99 http://www.sun.com/tech/people/yelland/. 2000/05/24 中尾 晴彦. 本研究の動機. JVM の仕様を厳密に記述する必要性が高いが、現在その手段がない。 今までにも JVM の仕様を形式的に行う研究はなされてきたが、 JVM のサイズと複雑さのため、それらの多くは部分的な仕様定義であったり扱いにくいものであった。. 本研究の目的.
E N D
Survey:A Compositional Account of theJava Virtual Machine POPL99 http://www.sun.com/tech/people/yelland/ 2000/05/24 中尾 晴彦
本研究の動機 • JVMの仕様を厳密に記述する必要性が高いが、現在その手段がない。 • 今までにもJVMの仕様を形式的に行う研究はなされてきたが、JVMのサイズと複雑さのため、それらの多くは部分的な仕様定義であったり扱いにくいものであった。
本研究の目的 • 包括的で扱いやすい形式でJVMの仕様を厳密に記述すること。
本研究のアプローチ • HASKELLのプログラムでJVMの仕様を記述する。 • この際、プログラムのデータ型の型付けを巧くすることによりVERIFIERにおけるチェックをHASKELLの型チェックで行う。
プログラムの概要 • microinstructionと呼ばれるHaskellの小さな関数群(μJVM)を用意しJVMの各Primitiveをそれらを用いて表す。 • μJVM • getl ローカル変数を取り出す • pushs スタックにプッシュする • load l tst k = getl l $ λw.pushs (tst w) $ k • pInt Int型であるかチェックする • Primitive • iload l = load l pInt • Int型のローカル変数を取り出し、スタックにプッシュする
省略事項 • 基本データ型は、Integer型とFloat型のみとする。 • オブジェクト操作は、creation, initialization, virtual method invocationのみとし、static method invocation, direct field accessは省略する。 • 全てのmethodはInteger型を返すものとする。 • 例外をサポートしない。 • インターフェースをサポートしない。 • マルチスレッドをサポートしない。 • ネイティブメソッド呼び出しをサポートしない。
Dynamic Semantics of μJVM • DataTypeの定義 • JVMの基本データ型、クラス、オブジェクト、メソッド、マシンステート等を表現するHaskellのデータ型を定義する。 • microinstructionの定義 • バイトコードのプリミティブを表現するHASKELL関数のための補助的な関数を定義する。
DataTypes Data type の例 • data Word t = WInt Int | WFloat Float | WRef Int • data JClassRT = TagA | TagB | TagC | TagD • data JClass t = MkJClass JClassRT • data Method p n = MkMethod (JClass(p, n)) Int • data VMState s l h = MkVMState{stack::s, locals::l, heap::h} • data Cont s l h = MkCont {cfn::VMState s l h → Int }
Microinstructions Micorinstruction の例 • inInt v = WInt v • outInt(WInt v) = v • outInt _ = error "Verify error: Integer word expected” • pushs w (MkCont cfn) = MkCont (λvms. let MkVMState {stack = s} = vms in cfn vms {stack ← (w, s)})
Microinstructions • Call (MkMethod (MkClass imptag) mrslt) (Wref ref) fn = MkCont(λvms. let MkVMState {heap = MkHeap { store = s, hwm = hi} = vms in if (ref < 0 || ref > hi) then error “Verify error: Illeagal reference” else case (s ref) of MkObject {initialized = True, tag = otag} | otag ≦ imptag → let (MkCont cfn) = fn (inInt mrslt) in cfn vms _ → error “Verify error: Illeagal method invocation”)
Static Semantics of μJVM • はじめに • 型システムを用いて何をしようとしているのか。 • クラスの継承関係の表現 • クラスの継承関係をどのように型を用いて表現するのか。 • microinstructionの型付け • microinstructionに型を付ける。
7 2 5 はじめに (Int,Int,Int,()) • スタックの初期状態(vms)の型 • vms :: VMState s0 • スタックにIntをPushする関数(f1)の型 • f1:: VMState s → VMState (Int, s) • スタックからIntをPopする関数(f2)の型 • f2:: VMState (Int, s) → VMState s • スタックからFloatをPopする関数(f3)の型 • f3:: VMState (Float, s) → VMState s f2 (f1 vms) OK f3 (f1 vms) 型エラー
A B C D クラスの継承関係の表現 classA::TAclassB::TBclassC::TCclassD::TD TA = JClass ((T, T, T, T), (a, b, c, d)) TB = JClass ((a, T, c, T), (F, b, F, d)) TC = JClass ((a, b, T, T), (F, F, c, d)) TD =JClass ((a, b, c, T), (F, F, F, d))
A B C D クラスの継承関係の表現 A = (a, b, c, d), B = (a, T, c, T) A ~ B ⇔ (定義) A = (a, b, c, d) → (a, T, c, T) B = (a, T, c, T) → (a, T, c, T) TX = JClass (X+, X-) TY = JClass (Y+, Y-) XがYのSuper classである。 ⇔ X- ~ Y+
クラスの継承関係の表現 wantClassB :: [ClassBのsubclass] → Int wantClassB :: JClass ((F, b, F, d), n) → Int classA :: JClass ((T, T, T, T), (a, b, c, d)) classB :: JClass ((a, T, c, T), (F, b, F, d)) classC :: JClass ((a, b, T, T), (F, F, c, d)) classD :: JClass ((a, b, c, T), (F, F, F, d)) wantClassB classA 型エラー wantClassB classB OK wantClassB classC 型エラー wantClassB classD OK
クラスの継承関係の表現 wantInherit :: [superclass] → [subclass] → Int wantClassB :: JClass (m, n) → JClass (n, o) → Int classA :: JClass ((T, T, T, T), (a, b, c, d)) classB :: JClass ((a, T, c, T), (F, b, F, d)) classC :: JClass ((a, b, T, T), (F, F, c, d)) classD :: JClass ((a, b, c, T), (F, F, F, d)) wantClassB classA classB OK wantClassB classB classC 型エラー
microinstructionの型付け 型付けの例 • pushs :: Word t → Cont ((Word t), s) l h → Cont s l h • call :: Method n m → Word(WRef-,(m,(h, h’))) → (Word(WInt+,ch) → Cont s l (Heap h’)) → Cont s l (Heap h)
Bytecode • 補助関数 • load l tst k = getl l $ λw.pushs (tst w) $ k • pInt w = inInt(outInt w) • Bytecode • iload l = load l pInt • invoke meth k = pops $ λw.call meth w $ λw’.pushs w’ $ k
Bytecode • 補助関数 • new alloc site cls k = alloc site cls $ λl . pushs l $ k • new1 = new allocate site1 • constr k = pops $ λl. initialize l k • retn pr = pops $ λv. result (pr v) • ireturn = retn outInt • Bytecode • p1 = new1 classD $ dup $ constr $ invokemethodB $ ireturn • result = evaluate p1
μJVMの健全性 • M := c | x | m1 m2 | λx.m | let x = m1 in m2 • e := evaluate m | let x = m in e ∀e : closed ┣ e ⇒ 【e】 ≠ VError
関連研究 • Qian: • A Formal specification of Java Virtual Machineinstructions for objects, methods and subroutines. (http://www.informatik.uni-bremen.de/~qian/abs-fsjvm.html) • 本研究と同様にJVMのdynamicな側面とstaticな側面を別々に扱っている。 • 本研究とは違いdynamic及びstatic behaviorを記述するのにoperational semanticsを用いている。
関連研究 • Stata, Abadi: • A type system for Java bytecode subroutines. • Freund, Mitchell: • A Type System for Object Initialization in the Java Bytecode Language. • これらの研究はQianの研究や本研究と違いJVM仕様の一部分に焦点を当てたものである。
関連研究 • Saraswat: • The Java bytecode verification problem. (http://www.research.att.com/~vj/) • Hagiya, Tozawa: • On a new method for dataflow analysis of Java Virtual Machine subroutines. (http://nicosia.is.s.u-tokyo.ac.jp/members/hagiya.html) • これらの研究はデータフロー解析を用いてBytecode verificationを行っている。
関連研究 • Jones: • The functions of the Java bytecode. • 本研究と同様な手法を用いた研究で、本研究とは独立にほぼ同時期に発表されている。 • 本研究と違い、拡張されたHASKELLのTYPE SYSTEMを用いている。