コンパイラの解析 (2) GCJのデータ構造 - 1.

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
コンパイラの解析 (1) プログラムのリンクと実行.
プログラミング基礎I(再) 山元進.
~手続き指向からオブジェクト指向へ(Ⅰ)~
第4回 iPhoneアプリ開発勉強会 Objective-C 基礎講座 -クラス- 鷲見政明.
WebサービスII (第10回) 2007年11月28日 植田龍男.
アルゴリズムとデータ構造1 2007年6月12日
アルゴリズムとプログラミング (Algorithms and Programming)
Javaのインタフェース についての補足 2006年5月17日 海谷 治彦.
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
2006/10/19 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井英二郎
Androidソースコード公開後のJNI
プログラミングIII演習 第1回目.
社会人学習講座 「Javaプログラミング概論」
C#とC++とオブジェクト指向 上甲 健史.
Javaプログラムの実行まで バイト Javaの コード 実行 ソースコード Java ファイル名 ファイル名 abc.java
RMI ソフトウェア特論 第6回 /
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
~手続き指向からオブジェクト指向へ[Ⅱ]~
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
プログラミング言語入門 手続き型言語としてのJava
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
WebサービスII (第7回) 2007年11月7日 植田龍男.
コンパイラの解析 (3) クラスとインスタンスの初期化.
関数の定義.
第6回 2007年6月1日 応用Java (Java/XML).
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第七回 知能情報学部 新田直也.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
パッケージ,アクセス修飾子 2008年4月27日 海谷 治彦.
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
計算機プログラミングI 第5回 配列 文字列(Stringクラス) mainの引数 配列の利用例
オブジェクト・プログラミング 第8回.
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクト指向 プログラミング 第九回 知能情報学部 新田直也.
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
プログラムが実行されるまで 2002年4月14日 海谷 治彦.
C#プログラミング実習 第3回.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
Chapter 5 5.5 thisキーワード 5.6 インスタンス変数とインスタンスメソッド 結城 隆
メンバとメソッド C言語の構造体 変数の集まり C#言語のクラス + それを処理する関数の集まり フィールド または メンバ変数 メンバ
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
プログラミング演習I 2003年6月11日(第9回) 木村巌.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
情報処理Ⅱ 2005年11月25日(金).
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

コンパイラの解析 (2) GCJのデータ構造 - 1

Table of Contents おさらい Cygnus Native Interface インスタンス構造の推測 Virtual Method Table Instance Fields

おさらい (1) GNU Java Compiler (gcj)が使用するJavaの実行時ライブラリ Java VM + Java APIをコンパイルしたもの これを外側から使用すれば、Javaコンパイラの作成が可能

おさらい (2) ちょっとしたルールさえ知っていれば、JavaのAPIをC言語からも使える 例:sin.java.lang.Math.sinの外部利用 (2) 実行例 double _ZN4java4lang4Math3sinEd(double); int main() { printf("sin(3.14) = %lf\n", _ZN4java4lang4Math3sinEd(3.14)); }

おさらい (3) Javaの機能を全て実現するには、下記のことも考慮しなければならない Javaの名前空間とオブジェクトファイルの名前空間 クラスの登録 クラスの初期化 インスタンスの生成 ポリモーフィズムの実現 配列の扱い インスタンスの破棄 ガーベジコレクタとの調和 例外の処理 synchronizeの処理

Cygnus Native Interface (CNI) GCJでC++を使ってネィティブメソッドを書く方法 JNIより効率よくメソッド呼び出し 移植性は低い (GCJでしか動かない)

CNIの利用 (1) まずは単純なクラスを作成 nativeメソッドとして宣言 public class Cni { public static native void main(String[] args); }

CNIの利用 (2) 次のコマンドを入力 javac Cni.java gcjh Cni クラスファイルを生成 (gcj –C Cni.java と同様) gcjh Cni CniクラスのCNIヘッダを生成 javac Cni.java gcjh Cni

CNIの利用 (3) 以下のような宣言を含むヘッダが生成される class Cni : public ::java::lang::Object { public: Cni (); static void main (JArray< ::java::lang::String *> *); static ::java::lang::Class class$; };

CNIの利用 (4) 次のように書ける #include "Cni.h" #include <stdio.h> #include <gcj/array.h> #include <java/lang/String.h> void Cni::main(JArray<java::lang::String *> *args) { puts("Hello, CNI!"); }

CNIの利用 (5) コンパイルして実行 $ gcj --main=Cni Cni.class natCni.cc $ ./a.out Hello, CNI!

仮説 同じようなオブジェクトコードを生成すればJavaから呼び出せる C言語からJavaの関数を呼び出せるのは前述の通り

問題点 GCJはJavaをC言語に変換できない アセンブラを読む/オブジェクトコードを読む 大規模なので相当がんばる必要あり -S でアセンブルコードには変換できる アセンブラを読む/オブジェクトコードを読む デバッガも併用 大規模なので相当がんばる必要あり

インスタンス構造の推測 インスタンスは2つの情報を持つ インスタンスごとに固有の情報 同じクラスのインスタンスで共通の情報 インスタンスフィールド 同じクラスのインスタンスで共通の情報 クラスの情報 (instance of java.lang.Class) Virtual Method Table (vtable)

For your information… 古いOfficial Java VMでのインスタンス構造 Instance Fields + Instance Methods

Virtual Method Table (VTable) 仮想メソッド(Javaの普通のメソッド)を呼び出すためのテーブル ポリモーフィズムの実現に Interface Method Tableもある

VTableの構造 (1) 基底クラスでは通常のメソッドテーブル call obj->vtable[5] : Object::toString()

VTableの構造 (2) オーバーライドしたメソッドはテーブルを上書き call obj->vtable[6] : Hoge::toString()

VTableの構造 (3) 同じシーケンスで子クラスのメソッドを呼べる インスタンスごとに何を呼ぶのか変動する

Virtual Method呼び出しのトレース Hoge.javaをコンパイルして追ってみる Hoge::foo _ZN4Hoge3fooEv: ; Hoge::foo() ... (prologue) ; eax = this movl (%eax), %edx ; edx = this->vtable addl $20, %edx ; edx = &(this->vtable[5]) pushl %eax ; args[0] = this movl (%edx), %eax ; eax = this->vtable[5] call *%eax ; call this->vtable[5]

解析1 – VTableを探す (1) どうやって解析しよう?

VTableを探す (2) 下記(Hoge.s:34)にブレークポイントを貼る _ZN4Hoge3fooEv: ; Hoge::foo() ... (prologue) ; eax = this movl (%eax), %edx ; edx = this->vtable addl $20, %edx ; edx = &(this->vtable[5]) pushl %eax ; args[0] = this movl (%edx), %eax ; eax = this->vtable[5] call *%eax ; call this->vtable[5]

VTableを探す (3) Break Point + Examine Memory $ gdb a.out (gdb) break Hoge.s:34 (gdb) run Breakpoint 1, Hoge::foo () at Hoge.s:34 34 movl (%eax), %edx (gdb) x *$eax 0x80492c8 <_ZTVN4HogeE+8>: ...

VTableを探す (4) Hoge.s:163 – 明らかにVTable _ZTVN4HogeE: .long 0 .long 0 .long _ZN4Hoge6class$E .long 4 .long _ZN4java4lang6Object8finalizeEv .long _ZN4java4lang6Object8hashCodeEv .long _ZN4java4lang6Object6equalsEPS1_ .long _ZN4Hoge8toStringEv .long _ZN4java4lang6Object5cloneEv .long _ZN4Hoge3fooEv

インスタンスの構造 (1) ここまでは判明

解析2 – Instance Fieldを探す (1) 今度はどうする?

Instance Fieldを探す (2) 方針 インスタンスフィールドを使うプログラムを用意 アセンブルファイルへとコンパイル ハンドトレース デバッガで確認

Instance Fieldを探す (3) 下記のようなクラスを作ってコンパイル gcj –S –O0 Foo.java # -> Foo.s public class Foo { int field0; int field1; void m0() { this.field0 = 123; } void m1() { this.field1 = 456; } }

Instance Fieldを探す (4) ハンドトレースすると自明なものが登場 デバッガでトレースするまでも無い _ZN3Foo2m0Ev: ; this.field0 = 123 .. (prologue) ; eax = this movl $123, 4(%eax) ; *(int *)(this+4) = 123 _ZN3Foo2m1Ev: ; this.field1 = 456 .. (prologue) ; eax = this movl $456, 8(%eax) ; *(int *)(this+8) = 456

インスタンスの構造 (2) 最低限は判明

次回 興味のあるところから Javaの名前空間とオブジェクトファイルの名前空間 クラスの登録 クラスの初期化 インスタンスの生成 ポリモーフィズムの実現 : 今回分 配列の扱い インスタンスの破棄 ガーベジコレクタとの調和 例外の処理 synchronizeの処理