JP5496792B2 - コード変換プログラム、方法及びシステム - Google Patents

コード変換プログラム、方法及びシステム Download PDF

Info

Publication number
JP5496792B2
JP5496792B2 JP2010148295A JP2010148295A JP5496792B2 JP 5496792 B2 JP5496792 B2 JP 5496792B2 JP 2010148295 A JP2010148295 A JP 2010148295A JP 2010148295 A JP2010148295 A JP 2010148295A JP 5496792 B2 JP5496792 B2 JP 5496792B2
Authority
JP
Japan
Prior art keywords
code
programming language
method
java
lt
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2010148295A
Other languages
English (en)
Other versions
JP2012014289A (ja
Inventor
道昭 立堀
Original Assignee
インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation filed Critical インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation
Priority to JP2010148295A priority Critical patent/JP5496792B2/ja
Publication of JP2012014289A publication Critical patent/JP2012014289A/ja
Application granted granted Critical
Publication of JP5496792B2 publication Critical patent/JP5496792B2/ja
Application status is Expired - Fee Related legal-status Critical
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/53Decompilation; Disassembly
    • GPHYSICS
    • G06COMPUTING; CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/74Reverse engineering; Extracting design information from source code

Description

この発明は、コンピュータによる処理のためにコードを変換する技術に関し、より詳しくは、Java(R)バイトコードのような、仮想マシン上で実行されるコードを変換するための、コード変換プログラム、方法及びシステムに関するものである。

従来より、サーバ環境で使用されるプログラミング言語処理系、あるいは実行系として、PHPのような動的スクリプト言語と、Java(R)のようなより静的なプログラミング言語が使用されているが、近年になって、Java(R)のクラス資産をPHPなどから簡易に呼び出せるように、Java(R)仮想マシンあるいは、コンピュータ共通言語基盤(CLI)のような静的な言語プラットフォーム上でPHPのような動的スクリプト言語が、静的な言語プラットフォームのクラスを宣言し、タイプ付けされていないアクセスを可能ならしめる仕組みが提供されるようになってきている。

特に、Java(R)仮想マシン上で動作するPHPとしてのP8、RubyとしてのJRuby、PythonとしてのJythonなどが知られている。これらのJava(R)仮想マシン上で動く動的スクリプト言語は、当然に、Java(R)バイトコードを生成するが、パフォーマンス・チューニングなどの目的で、Java(R)のエキスパートが、それらの生成されたJava(R)バイトコードを、Java(R)のソースコードに逆コンパイルすることを要望する場合がある。

JDKに標準で付属しているjavapでは、Java(R)バイトコードを逆アセンブルするのみであるが、Java(R)バイトコードを、Java(R)のソースコードに逆コンパイルするツールとして、SourceAgain, JAD, JODEなどのツールが知られている。

もともとJava(R)で書かれたソースコードからjavacなどで生成されたJava(R)バイトコードであるなら、よほど難読化処理がなされていない限り、上述の逆コンパイル・ツールでJava(R)のソースコードに逆コンパイルすることは困難ではない。

しかし、P8、JRuby、Jythonなどの動的スクリブティング言語処理系だと、本質的に静的言語処理系であるJava(R)とは、言語仕様が異なるため、生成されたJava(R)バイトコードに、例えばswapのような、もともとのJava(R)にないバイトコード演算子が含まれることがある。

従って、動的スクリブティング言語処理系によって生成されたJava(R)バイトコードを、そのまま普通の逆コンパイル・ツールで逆コンパイルしようとしてもうまくいかず、Java(R)のソースコードが得られない、という問題がある。

Jerome Miecznikowski and Laurie Hendren, "Decompiling Java Bytecode: Problems, Traps and Pitfalls",in Procs. of CC 2002, LNCS 2304, Springer-Verlag, 2002, pp.111-127は、必ずしも純正のJava(R)コンパイラで生成されたのではないJava(R)バイトコードに対して、適宜コード変換を施すことにより、強制的に逆コンパイルを可能ならしめる技術を開示する。

上記非特許文献による強制逆コンパイル技術は、様々な処理系により生成されたJava(R)バイトコードを逆コンパイルすることを可能ならしめるが、コード変換の過程で、沢山の一時ローカル変数を挿入するので、Java(R)ソースコードに逆コンパイルした際に、これら多数の一時ローカル変数の存在が、ソースコードの可読性を低下させてしまう、という問題がある。

例えば、下記のようなバイトコードの列(<exprX>はJava(R)の式に相当する部分バイトコード列を意味している)を想定する。
<expr0>
<expr1>
<expr2>
<expr3>
swap
invokestatic C.foo3(P,P)
invokevirtual P.foo2(P)
invokevirtual P.foo1(P)
areturn
これは、上記非特許文献による強制逆コンパイル技術を経た後では、逆コンパイルしたソースコード(<exprX>はJava(R)の式を意味している)は、下記のようになる。

C tmp0 = <expr0>;
P tmp1 = <expr1>;
P tmp2 = <expr2>;
return tmp0.foo1(tmp1.foo2(C.foo3(<expr3>,tmp2)));

このように多数の一時変数が残ってしまう。

Jerome Miecznikowski and Laurie Hendren, "Decompiling Java Bytecode: Problems, Traps and Pitfalls",in Procs. of CC 2002, LNCS 2304, Springer-Verlag, 2002, pp.111-127

従って、この発明の目的は、Java(R)仮想マシン上で動作する動的スクリプト言語処理系などの非Java(R)ネイティブな処理系によって生成されたJava(R)バイトコードを逆コンパイルして得られるJava(R)ソースコードの可読性を高めることにある。

この発明によれば、Java(R)逆コンパイラにかける前に、コード変換器によって、Java(R)バイトコードに対して、次のような変換が施される。

すなわち、コード変換器は、Java(R)バイトコードにおいて、
Java(R)の言語要素に直接対応していない、スタック操作関連の命令を行うコードまたは、
Java(R)の言語要素が直接対応していない、スタックに値を残して戻り値をもたないメソッドを呼び出すコード、
を見出す。

そして、コード変換器は、Java(R)の言語要素に直接対応していない、スタック操作関連の命令を行うコードを見出した場合は、見出された命令の代わりに、一時変数への代入式、引数の一部をそのままかえすだけのダミーのメソッドの呼び出し、前記一時変数の読み出し式のいずれかの組み合わせを挿入し、
Java(R)の言語要素が直接対応していない、スタックに値を残して戻り値をもたないメソッドを呼び出すコードを見出した場合は、追加の第1の引数と元の引数をもち、元のメソッド・コールを実行し、該追加の第1の引数をそのまま返す新規メソッドを作り、戻り値をもたないメソッドを呼び出しの代わりに、前記新規メソッドの呼び出しを挿入する処理を行う。

このようなバイトコードの変換を行うことにより、従来技術ではソースコードへの逆コンパイル時にもたらされていた多数の一時変数が削減されて、ソースコードの可読性が高められる。すなわち、上記と同じバイトコードに対して、ソースコードは、次のようになる。
P tmp;
return <expr0>.foo1(<expr1>.foo2(C.foo3(DBF.swap(tmp=<expr2>,<expr3>),tmp)));

このようなコード変換器は、通常のJava(R)バイトコードの逆コンバイラに前段に配置してもよいし、Java(R)バイトコードの逆コンバイラの一部の処理ロジックとして組み込んでもよい。

なお、この発明は、Java(R)のバイトコードの逆コンパイルのみならず、スタック操作関連の命令をもつ、実行系のための中間コードを生成する任意の言語処理系により生成されるバイトコードを、通常の逆コンパイラでソースコードに戻せるようにする目的で、コード生成処理の一部としてのコード変換処理に適用可能である。

この発明によれば、ターゲットの言語処理系が直接対応していない命令に対して、所定のメソッドの呼び出しのコードを挿入することにより、逆コンパイル時のソースコードの可読性を高めることができるという効果が得られる。

ハードウェアの概要ブロック図である。 ソフトウェアの階層を示す図である。 機能論理ブロック図である。 コード変換器の処理のフローチャートを示す図である。

以下、図面に従って、本発明の実施例を説明する。これらの実施例は、本発明の好適な態様を説明するためのものであり、発明の範囲をここで示すものに限定する意図はないことを理解されたい。また、以下の図を通して、特に断わらない限り、同一符号は、同一の対象を指すものとする。

図1を参照すると、本発明の一実施例に係るシステム構成及び処理を実現するためのコンピュータ・ハードウェアのブロック図が示されている。図1において、システム・バス102には、CPU104と、主記憶(RAM)106と、ハードディスク・ドライブ(HDD)108と、キーボード110と、マウス112と、ディスプレイ114が接続されている。CPU104は、好適には、32ビットまたは64ビットのアーキテクチャに基づくものであり、例えば、インテル社のPentium(商標)4、インテル社のCore(商標) 2 DUO、AMD社のAthlon(商標)などを使用することができる。主記憶106は、好適には、1GB以上の容量、より好ましくは、2GB以上の容量をもつものである。

ハードディスク・ドライブ108には、オペレーティング・システム202(図2で後述)が、格納されている。オペレーティング・システム202は、Linux(商標)、マイクロソフト社のWindows(商標) 7、Windows XP(商標)、Windows(商標)2003サーバ、アップルコンピュータのMac OS(商標)などの、CPU104に適合する任意のものでよい。オペレーティング・システム202は、システムの起動時に、主記憶106にロードされて動作する。

ハードディスク・ドライブ108にはさらに、Java(R)仮想マシン(VM)204(図2で後述)を実現するためのJava(R) Runtime Environmentプログラムが保存され、システムの起動時に、主記憶106にロードされて動作する。

ハードディスク・ドライブ108にはさらに、典型的にはP8である、PHP用Java(R)バイトコード生成器206(図2で後述)、及び、PHPで書かれたソースコード208(図2で後述)、本発明の特徴機能を実装したコード変換器306(図3で後述)、及び逆コンパイラ308(図3で後述)が保存されている。コード変換器306及び逆コンパイラ308は、C、C++などの任意のコンピュータ言語で書かれていてよいが、好適には、Java(R)で書かれて、Java(R)仮想マシン204上で動作する。

図2は、ソフトウェアの階層を示す図である。下層のオペレーティング・システム202上では、Java(R)仮想マシン204が動作する。Java(R)仮想マシン204上では、PHP用Java(R)バイトコード生成器206が動作する。PHP用Java(R)バイトコード生成器206は、PHPソースコード208を、Java(R)仮想マシン204が解釈可能な、Java(R)バイトコードに変換する。PHPソースコード208とは、拡張子がphpで、<?php ・・・ ?>で指定された箇所に、PHPの言語仕様で規定されたステートメントが書かれたファイルである。

図3は、機能論理ブロック図である。図3において、PHP用Java(R)バイトコード生成器206は、上述のように、PHPソースコード208を、Java(R)バイトコード304に変換する。変換されたJava(R)バイトコード304は、主記憶106にロードしてもよいし、ハードディスク・ドライブ108にセーブしてもよい。

コード変換器306は、本発明の機能を実施するために、逆コンパイラ308に引き渡す前に、Java(R)バイトコード304を変換する機能をもつ。コード変換器306の機能は、図4のフローチャートを参照して、後で詳細に説明する。逆コンパイラ308は、SourceAgain, JAD, JODEなどの既知の任意のものでよい。但し、コード変換器306の機能を、前処理として、逆コンパイラ308に含めてしまうこともできる。そうすると、コード変換器306は単独のプログラムとしては不要により、逆コンパイラ308自体が、本発明の機能を組み込んだ特有のものになる。

あるいは、コード変換器306の機能を、後処理として、PHP用Java(R)バイトコード生成器206に組み込むことができ、そのようにしても、コード変換器306は単独のプログラムとしては不要になり、PHP用Java(R)バイトコード生成器206自体が、本発明の機能を組み込んだ特有のものになる。

次に、図4のフローチャートを参照して、コード変換器306の処理について説明する。先ず、ステップ402では、コード変換器306は、Java(R)バイトコード304の制御フローを解析して、Java(R)言語の制御構造に対応させ、制御ブロックに分割する処理を行う。この処理は例えば、丸山冬彦、小川宏高、松岡聡、「Javaバイトコードをデコンパイルするための効果的なアルゴリズム」情報処理学会論文誌、Vol.41, No.2. Feb. 2000、http://ci.nii.ac.jp/Detail/detail.do?LOCALID=ART0003013366 に記述されている方法を使用する。

次に、ステップ404では、制御ブロックの各命令について順次読み込み処理が行われる。この処理は、ステップ404から、ステップ416までのループとして実行される。

ステップ406では、コード変換器306は、対象としている命令に対し、Java(R)式の構文ノードとして対応済かどうか判断する。もしそうなら、処理は特に何もすることなく、ステップ416からステップ404に戻って、次の命令の処理へと移る。

ステップ406で、コード変換器306が、対象としている命令に対し、Java(R)式の構文ノードとして未対応であると判断すると、処理はステップ408に進み、そこで、コード変換器306は、単独または直後の命令とともに、Java(R)の構文木の一部として対応可能かどうか、パターンがマッチするかどうかで、調べる。

そして、ステップ410で、コード変換器306が、Java(R)の構文木の一部として対応可能であると判断すると、ステップ412に進み、そこでコード変換器306は、Java(R)の構文木にマッチした構文ノードを追加する。その後、ステップ416からステップ404に戻って、次の命令の処理へと移る。

ステップ410に戻って、コード変換器306が、Java(R)の構文木の一部として対応可能でないと判断すると、処理は、ステップ414に進む。このステップ414が、本発明の特徴的な処理を含む。

ステップ414では、コード変換器306は、swap、dup、pop、voidメソッド呼び出しなどのうち、スタックの状況から、他のバイトコードと組み合わせても、Java(R)の言語要素に直接対応していない命令を、ダミー・メソッド呼び出しと、ローカル変数への代入と参照、または、抽出したメソッドの呼び出しの組み合わせのパターンで置き換える処理を行う。

すなわち、コード変換器306は、Java(R)の言語要素に直接対応していない命令の置き換えルールを予め保持し、それを、ステップ414で適用する。

こうして、処理は改めてステップ406に戻り、Java(R)式の構文ノードとして対応済かどうかの判断が再度行われる。

こうして全ての命令の処理が終ると、ステップ404からステップ416までのループを脱出して、処理が完了する。

本発明の理解を促すために、上述のステップ414の命令の置き換えルールについて、より詳しく説明する。

ステップ414の処理は、Java(R)が対応可能でないコードを、次の2つの場合に分ける。
(1) Java(R)の言語要素に直接対応していない、スタック操作関連の命令を行うコードである場合。
(2) Java(R)の言語要素が直接対応していない、スタックに値を残して戻り値をもたないメソッドを呼び出すコードである場合。

(1)の場合とは典型的には、swap、dup、popの場合である。なお、これらのJava(R)バイトコードの命令の意味及び機能については、Java Virtual Machine Specification Second Edition by Tim Lindholm and Frank Yellin, 1999 Sun Microsystems, Inc. などの文献を参照されたい。

この場合、次のようなクラスが生成される。
class DFB {
static <T> T swap(Object placeholder, T preservation) {
return preservation;
}
static <T> T dup(T preservation) {
return preservation;
}
static <T> T pop(T preservation, Object erasure) {
return preservation;
}
}

このようなクラスDBFを以って、swap、dup、popのそれぞれの場合の変換規則について説明する。

まず、次のようなswapを含むバイトコードがあったとする。
...
<expr0>
<expr1>
<expr2>
swap
...

これは、図4のステップ414では、次のように変換される。
...
<expr0>
<expr1>
dup
astore 'tmp
<expr2>
invokestatic DFB.swap(Object,T):T
aload 'tmp
...

下記のような、dupを含むバイトコードがあったとする。
...
<expr0>
<expr1>
dup
...

これは、図4のステップ414では、次のように変換される。
...
<expr0>
<expr1>
dup
astore 'tmp
invokestatic DFB.dup(T):T
aload 'tmp
...

さらに、下記のような、popを含むバイトコードがあったとする。
...
<expr0>
<expr1>
pop
...

これは、図4のステップ414では、次のように変換される。
...
<expr0>
<expr1>
invokestatic DFB.pop(T,Object):T
...

(2) Java(R)の言語要素が直接対応していない、スタックに値を残して戻り値をもたないメソッドを呼び出すコードである場合とは例えば、
<expr1>
<expr2>
<expr3>
aload1 // runtime
invoke checkTimer(Runtime):void
invoke compare(P,P):P
のようなバイトコードの場合である。

この場合、コード変換器306は先ず、
private static <T> T call_checkTimer(T preservation, Runtime arg1) {
Op.checkTimer(arg1); // original call
return preservation;
}
を生成し、
<expr1>
<expr2>
<expr3>
aload1 // runtime
invoke <T>call_checkTimer(T,Runtime):T
invoke compare(P,P):P
と変換する。これによって、結果のソースコードでは、<expr3>が、call_checkTimer()の呼び出し式に引数として組み込まれ、<expr1>と<expr2>を一時変数に退避しなくてもよくなるため、一時変数は表れなくなる。

(1) Java(R)の言語要素に直接対応していない、スタック操作関連の命令を行うコードである場合について、より複雑な場合について説明する。Java(R) VMでは、スタック演算子を全て網羅すると、次のとおりである。
pop, pop2, dup, dup_x1, dup_x2, dup2, dup2_x1, dup2_x2, swap

このうち、pop, dup, swapは既に説明したので、その他のものについて説明する。

この場合は、次のようなクラスを生成する。
class DFB {
static <T> T pop2(T pr,Object er1,Object er2) {
return pr;
}
static <T> T dup2(T preservation, Object placeholder) {
return preservation;
}
static <T> dup_x1(T preservation, Object placeholder) {
return preservation;
}
static <T> dup2_x2(T pr, Object ph2, Object ph3, Object ph4) {
return pr;
}
}
ここでは省略されているが、pop, dup, swapのメソッドも記述されていてもよく、その内容は、既述である。

このようなクラスに存在のより、変換を行う例を以下、複数示す。
先ず、元のコードが<e0> <e1> <e2> pop2であった場合、下記のように変換される。
<e0> <e1> <e2> DBF.pop2

元のコードが<e0> <e1> <e2> dup2であった場合、下記のように変換される。
<e0> <e1> dup tmp1= <e2> dup tmp2= DBF.dup2() =tmp2 =tmp1 =tmp2
なお、以下のような変換でもよい。
<e0> <e1> dup tmp1= <e2> DBF.dup2_1() <e2> dup tmp2= DBF.dup2_2()
=tmp1 =tmp2 =tmp1 =tmp2
このように複数のパターンがありえるのは、スタック・オペレーションが複雑な場合には、ダミーのメソッドの入れ方にバリエーションが生じるからである。よって、そのバリエーションの1つを実装すればよい。

元のコードが<e0> <e1> <e2> dup_x1であった場合、下記のように変換される。
<e0> <e1> dup tmp1= <e2> dup tmp2= DBF.dup_x1() =tmp2 =tmp1
これは、以下のような変換でもよい。
<e0> <e1> dup tmp1= DBF.dupx1_1() <e2> dup tmp2= DBF.dupx1_2()
=tmp1 =tmp2 =tmp1

元のコードが<e0> <e1> <e2> <e3> dup_x2であった場合、下記のように変換される。
<e0> <e1> dup tmp1= <e2> dup tmp2= <e3> dup tmp3= <e4> dup tmp4=
DBF.dup2_x2() = tmp2 =tmp3 =tmp4 =tmp1 =tmp2
これは、以下のような変換でもよい。
<e0> <e1> dup tmp1= DBF.dupx2_x2_1() <e2> dup tmp2= .. <e3> dup tmp3= .. <e4>
dup tmp4= .. =tmp1 =tmp2 =tmp3 =tmp4 =tmp1 =tmp2

ところで、非特許文献1にあるような従来の技法では、
<expr0>
<expr1>
<expr2>
<expr3>
swap
invokestatic C.foo3(P,P)
invokevirtual P.foo2(P)
invokevirtual P.foo1(P)
areturn
を逆コンパイルすると、
C tmp0 = <expr0>;
P tmp1 = <expr1>;
P tmp2 = <expr2>;
return tmp0.foo1(tmp1.foo2(C.foo3(<expr3>,tmp2)));
のように一時変数が沢山残ってしまう。

一方、本発明によれば、
元のバイトコートの
<expr1>
<expr2>
<expr3>
swap
のところが、
<expr1>
<expr2>
dup
astore 'tmp
<expr3>
invokestatic DFB.swap(Object,T):T
aload 'tmp
と変換され、これによって、逆コンパイルされた結果のソースコードが、下記のように、一時変数が減らされた可読性の高いコードとなる。
P tmp;
return <expr0>.foo1(<expr1>.foo2(C.foo3(DBF.swap(tmp=<expr2>,<expr3>),tmp)));

なお、上記実施例では、PHP用バイトコード生成器によって生成されたバイトコードを変換するものとして説明がなされたが、JRuby、Jythonなど、Java(R)バイトコードを生成する任意のプログラミング言語処理系から生成されたJava(R)バイトコードに適用可能である。

また、Java(R)バイトコードに限らず、ターゲット言語が対応しない、スタック操作関連、あるいはスタックに値を残して戻り値をもたないメソッドを呼び出すコードを含む任意の言語処理系の中間コードに適用可能であることを、当業者なら理解するであろう。

102 システム・バス
104 CPU
106 主記憶
108 ハードディスク・ドライブ
110 キーボード
112 マウス
202 オペレーティング・システム
204 Java VM
206 PHP用バイトコード生成器
208 PHPソースコード
306 コード変換器

Claims (8)

  1. コンピュータの処理によって、第1のプログラミング言語の処理系によって生成された実行形式のバイトコードを、第2のプログラミング言語のソース・コードに対応させるためるようにコードを変換するコード変換プログラムであって、
    前記コンピュータに、
    前記第1のプログラミング言語の処理系によって生成された実行形式のバイトコードを順次読取るステップと、
    前記第2のプログラミング言語の言語要素に直接対応していない、スタック操作関連の命令を行うコードが見出されたことに応答して、前記見出された命令の代わりに、一時変数への代入式、引数の一部をそのままかえすだけのダミーのメソッドの呼び出し、前記一時変数の読み出し式のいずれかの組み合わせを挿入するステップと、
    前記第2のプログラミング言語の言語要素が直接対応していない、スタックに値を残して戻り値をもたないメソッドを呼び出すコードが見出されたことに応答して、追加の第1の引数と元の引数をもち、元のメソッド・コールを実行し、該追加の第1の引数をそのまま返す新規メソッドを生成し、戻り値をもたないメソッドを呼び出しの代わりに、前記新規メソッドの呼び出しを挿入するステップ
    を実行させる、
    コード変換プログラム。
  2. 請求項1に記載された前記コード変換プログラムの機能を、前処理として備えることにより、余分な一時変数を導入しない逆コンパイラ・プログラム。
  3. 請求項1に記載された前記コード変換プログラムの機能を、後処理として備えることにより、一時変数を導入しない逆コンパイラによって容易に逆コンパイル可能なようなバイトコードを生成する前記第1のプログラミング言語の処理系プログラム。
  4. 前記第1のプログラミング言語がPHP言語であり、前記第2のプログラミング言語がJavaである、請求項1に記載のコード変換プログラム。
  5. コンピュータの処理によって、第1のプログラミング言語の処理系によって生成された実行形式のバイトコードを、第2のプログラミング言語のソース・コードに対応させるためるようにコードを変換するコード変換方法であって、
    前記コンピュータの処理により、前記第1のプログラミング言語の処理系によって生成された実行形式のバイトコードを順次読取るステップと、
    前記コンピュータの処理により、前記第2のプログラミング言語の言語要素に直接対応していない、スタック操作関連の命令を行うコードが見出されたことに応答して、前記見出された命令の代わりに、一時変数への代入式、引数の一部をそのままかえすだけのダミーのメソッドの呼び出し、前記一時変数の読み出し式のいずれかの組み合わせを挿入するステップと、
    前記コンピュータの処理により、前記第2のプログラミング言語の言語要素が直接対応していない、スタックに値を残して戻り値をもたないメソッドを呼び出すコードが見出されたことに応答して、追加の第1の引数と元の引数をもち、元のメソッド・コールを実行し、該追加の第1の引数をそのまま返す新規メソッドを生成し、戻り値をもたないメソッドを呼び出しの代わりに、前記新規メソッドの呼び出しを挿入するステップを有する、
    コード変換方法。
  6. 前記第1のプログラミング言語がPHP言語であり、前記第2のプログラミング言語がJavaである、請求項5に記載のコード変換方法。
  7. コンピュータの処理によって、第1のプログラミング言語の処理系によって生成された実行形式のバイトコードを、第2のプログラミング言語のソース・コードに対応させるためるようにコードを変換するコード変換システムであって、
    前記第1のプログラミング言語の処理系によって生成された実行形式のバイトコードを順次読取る手段と、
    前記第2のプログラミング言語の言語要素に直接対応していない、スタック操作関連の命令を行うコードが見出されたことに応答して、前記見出された命令の代わりに、一時変数への代入式、引数の一部をそのままかえすだけのダミーのメソッドの呼び出し、前記一時変数の読み出し式のいずれかの組み合わせを挿入する手段と、
    前記コンピュータの処理により、前記第2のプログラミング言語の言語要素が直接対応していない、スタックに値を残して戻り値をもたないメソッドを呼び出すコードが見出されたことに応答して、追加の第1の引数と元の引数をもち、元のメソッド・コールを実行し、該追加の第1の引数をそのまま返す新規メソッドを生成し、戻り値をもたないメソッドを呼び出しの代わりに、前記新規メソッドの呼び出しを挿入する手段を有する、
    コード変換システム。
  8. 前記第1のプログラミング言語がPHP言語であり、前記第2のプログラミング言語がJavaである、請求項7に記載のコード変換システム。
JP2010148295A 2010-06-29 2010-06-29 コード変換プログラム、方法及びシステム Expired - Fee Related JP5496792B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2010148295A JP5496792B2 (ja) 2010-06-29 2010-06-29 コード変換プログラム、方法及びシステム

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
JP2010148295A JP5496792B2 (ja) 2010-06-29 2010-06-29 コード変換プログラム、方法及びシステム
US13/160,796 US20110321018A1 (en) 2010-06-29 2011-06-15 Program, method, and system for code conversion

Publications (2)

Publication Number Publication Date
JP2012014289A JP2012014289A (ja) 2012-01-19
JP5496792B2 true JP5496792B2 (ja) 2014-05-21

Family

ID=45353835

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2010148295A Expired - Fee Related JP5496792B2 (ja) 2010-06-29 2010-06-29 コード変換プログラム、方法及びシステム

Country Status (2)

Country Link
US (1) US20110321018A1 (ja)
JP (1) JP5496792B2 (ja)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10338902B1 (en) * 2017-06-26 2019-07-02 Unity IPR ApS Method and system for a compiler and decompiler

Family Cites Families (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5860008A (en) * 1996-02-02 1999-01-12 Apple Computer, Inc. Method and apparatus for decompiling a compiled interpretive code
JP3847672B2 (ja) * 2002-07-03 2006-11-22 松下電器産業株式会社 コンパイラ装置及びコンパイル方法
JP2004038876A (ja) * 2002-07-08 2004-02-05 Hitachi Ltd プログラム等のデータ形式変換方法及び装置、並びにそのデータ形式変換装置を用いたコントローラ管理システム
JP3801545B2 (ja) * 2002-08-02 2006-07-26 松下電器産業株式会社 コンパイラ用プログラム、コンパイラ装置及びコンパイル方法
US8332828B2 (en) * 2002-11-20 2012-12-11 Purenative Software Corporation System for translating diverse programming languages
US7051322B2 (en) * 2002-12-06 2006-05-23 @Stake, Inc. Software analysis framework
US7530059B2 (en) * 2005-02-18 2009-05-05 International Business Machines Corporation Method for inlining native functions into compiled java code
US7844958B2 (en) * 2005-03-11 2010-11-30 Aptana, Inc. System and method for creating target byte code
US7926046B2 (en) * 2005-12-13 2011-04-12 Soorgoli Ashok Halambi Compiler method for extracting and accelerator template program
JP5448165B2 (ja) * 2006-10-02 2014-03-19 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation レジスタ・ウィンドウ・アーキテクチャをサポートするように適合されたコンピュータ・システム、並びに当該コンピュータ・システムを制御する方法及びそのコンピュータ・プログラム
US20080209401A1 (en) * 2007-02-22 2008-08-28 Microsoft Corporation Techniques for integrating debugging with decompilation
US20080222616A1 (en) * 2007-03-05 2008-09-11 Innaworks Development Limited Software translation
US8079023B2 (en) * 2007-03-22 2011-12-13 Microsoft Corporation Typed intermediate language support for existing compilers
US8601453B2 (en) * 2010-09-19 2013-12-03 Micro Focus (Us), Inc. COBOL to bytecode translation

Also Published As

Publication number Publication date
JP2012014289A (ja) 2012-01-19
US20110321018A1 (en) 2011-12-29

Similar Documents

Publication Publication Date Title
US8307379B2 (en) Determining an extension to use to process an input object to a call in a program
Leroy Bytecode verification on Java smart cards
US8726255B2 (en) Recompiling with generic to specific replacement
US20060026575A1 (en) Method and system of adaptive dynamic compiler resolution
US6324686B1 (en) Just in time compiler technique
US6438745B1 (en) Program conversion apparatus
JP2007535761A (ja) 抗タンパーコードを生成するシステム及び方法
US20050060695A1 (en) Lazy compilation of template-generated classes in dynamic compilation execution environments
US6944846B2 (en) Algorithm for localization of a JAVA application using reflection API and a custom class loader
US6003095A (en) Apparatus and method for demand loading a dynamic link library
EP0718760B1 (en) Method and apparatus for generating platform-standard object files containing machine-independent code
JP3762867B2 (ja) コンパイラ装置、コンパイル方法、およびそのためのプログラムを格納した記憶媒体
EP1313011B1 (en) Intermediate code execution system, intermediate code execution method, and computer program product for executing intermediate code
US20030088860A1 (en) Compiler annotation for binary translation tools
EP1145120B1 (en) Generating compiled programs for interpretive runtime environments
CN100351783C (zh) 语言子集证实
US6973644B2 (en) Program interpreter
US7185327B2 (en) System and method for optimizing operations via dataflow analysis
US20050028155A1 (en) Java execution device and Java execution method
US20090222827A1 (en) Continuation based declarative definition and composition
AU712005B2 (en) System and method for runtime optimization of private variable function calls in a secure interpreter
US20110173643A1 (en) USING TRANSIENT PCRs TO REALISE TRUST IN APPLICATION SPACE OF A SECURE PROCESSING SYSTEM
JP2000267862A (ja) 資源の消費を最小限にするハイブリッド式ジャストインタイム・コンパイラ
US7380242B2 (en) Compiler and software product for compiling intermediate language bytecodes into Java bytecodes
US7434212B2 (en) Method and apparatus to guarantee type and initialization safety in multithreaded programs

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20130304

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20140212

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20140305

R150 Certificate of patent or registration of utility model

Ref document number: 5496792

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees