Survey: A Compositional Account of the Java Virtual Machine

Post on 11-Jan-2016

35 views 1 download

description

Survey: A Compositional Account of the Java Virtual Machine. POPL99 http://www.sun.com/tech/people/yelland/. 2000/05/24 中尾 晴彦. 本研究の動機. JVM の仕様を厳密に記述する必要性が高いが、現在その手段がない。 今までにも JVM の仕様を形式的に行う研究はなされてきたが、 JVM のサイズと複雑さのため、それらの多くは部分的な仕様定義であったり扱いにくいものであった。. 本研究の目的. - PowerPoint PPT Presentation

Transcript of Survey: A Compositional Account of the Java Virtual Machine

Survey:A Compositional Account of theJava Virtual Machine

2000/05/24

中尾 晴彦

POPL99

http://www.sun.com/tech/people/yelland/

本研究の動機

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, virtua

l method invocation のみとし、 static method invocation, direct field access は省略する。

全ての method は Integer 型を返すものとする。 例外をサポートしない。 インターフェースをサポートしない。 マルチスレッドをサポートしない。 ネイティブメソッド呼び出しをサポートしない。

Dynamic Semantics of μJVM

DataType の定義– JVM の基本データ型、クラス、オブジェクト、

メソッド、マシンステート等を表現する Haskellのデータ型を定義する。

microinstruction の定義– バイトコードのプリミティブを表現する HASKE

LL 関数のための補助的な関数を定義する。

DataTypes

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 }

Data type の例

Microinstructions

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)})

Micorinstruction の例

Microinstructions Call (MkMethod (MkClass imptag) mrslt) (Wref ref) fn =

MkCont(λvms. let MkVMState {heap = MkHeap { store = s,

hwm = hi} = vmsin if (ref < 0 || ref > hi) then

error “Verify error: Illeagal reference” else

case (s ref) ofMkObject {initialized = True, tag

= otag} | otag imptag →≦ let (MkCont cfn) = fn (inIn

t mrslt) in cfn vms _ →

error “Verify error: Illeagal method invocatio

n”)

Static Semantics of μJVM はじめに

– 型システムを用いて何をしようとしているのか。 クラスの継承関係の表現

– クラスの継承関係をどのように型を用いて表現するのか。

microinstruction の型付け– microinstruction に型を付ける。

はじめに スタックの初期状態( 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) OKf3 (f1 vms) 型エラー

5

27

(Int,Int,Int,())

クラスの継承関係の表現

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 TX = JClass (X+, X-)

TY = JClass (Y+, Y-)

X が Y の Super class である。

⇔ X- ~ Y+

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)

クラスの継承関係の表現

wantClassB :: [ClassB の subclass] → Int

wantClassB :: JClass ((F, b, F, d), n) → IntclassA :: 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 OKwantClassB classC 型エラーwantClassB classD OK

クラスの継承関係の表現

wantInherit :: [superclass] → [subclass] → Int

wantClassB :: JClass (m, n) → JClass (n, o) → IntclassA :: 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 OKwantClassB 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 Machine   i

nstructions 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://ww

w.research.att.com/~vj/)

Hagiya, Tozawa:– On a new method for dataflow analysis of Java Virt

ual 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 を用いている。