JP7391983B2 - プログラム論理の表現を生成する方法、逆コンパイル装置、再コンパイルシステムおよびコンピュータプログラム製品 - Google Patents

プログラム論理の表現を生成する方法、逆コンパイル装置、再コンパイルシステムおよびコンピュータプログラム製品 Download PDF

Info

Publication number
JP7391983B2
JP7391983B2 JP2021552541A JP2021552541A JP7391983B2 JP 7391983 B2 JP7391983 B2 JP 7391983B2 JP 2021552541 A JP2021552541 A JP 2021552541A JP 2021552541 A JP2021552541 A JP 2021552541A JP 7391983 B2 JP7391983 B2 JP 7391983B2
Authority
JP
Japan
Prior art keywords
code
program
intermediate language
language
terminal symbols
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.)
Active
Application number
JP2021552541A
Other languages
English (en)
Other versions
JP2022522880A (ja
Inventor
カスパー・ディーター
マイアー・ライムント
Original Assignee
フジツウ テクノロジー ソリューションズ ゲーエムベーハー
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 フジツウ テクノロジー ソリューションズ ゲーエムベーハー filed Critical フジツウ テクノロジー ソリューションズ ゲーエムベーハー
Publication of JP2022522880A publication Critical patent/JP2022522880A/ja
Application granted granted Critical
Publication of JP7391983B2 publication Critical patent/JP7391983B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/447Target code generation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/53Decompilation; Disassembly
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44568Immediately runnable code
    • G06F9/44578Preparing or optimising for loading
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
    • G06F9/45516Runtime code conversion or optimisation
    • G06F9/4552Involving translation to a different instruction set architecture, e.g. just-in-time translation in a JVM
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Description

本発明は、第1のプロセッサアーキテクチャのための低水準プログラミング言語における第1のプログラムコードに基づいて、中間言語におけるプログラム論理の表現を生成するための方法に関する。本発明はさらに、第1のプロセッサアーキテクチャのプロセッサのための第1のプログラムコードを逆コンパイルするための装置、第1のプロセッサアーキテクチャの第1のプログラムコードを第2のプロセッサアーキテクチャのための実行可能なプログラムコードに変換するための再コンパイルシステム、およびコンピュータプログラム製品に関する。
1950年代後半から1980年代末にかけて、関連するプロセッサアーキテクチャを有するいわゆるメインフレームコンピュータが多数開発された。このようなコンピュータシステムは、そのハードウェアのコストが比較的高いため、通常、コンピュータセンターで一元的に管理されていた。このプロセスでは、異なるアプリケーションを動作させるための異なるコンピュータプログラムが、同じコンピュータシステムのリソースを共有した。
コンピュータシステムの縮小化とそれに関連するコスト削減、および特にコンピュータシステムとその資源の仮想化におけるさらなる技術的進歩により、当時のメインフレームアーキテクチャの集中化されたアプローチは、かなり時代遅れになっている。それにもかかわらず、特に、このようなメインフレームシステム上で動作させるために元々開発された会計、税務管理および複雑な制御システムの分野では特に、比較的多数の専門化されたコンピュータプログラムが引き続き使用されている。
多くの場合、コンピュータプログラムの元々のソースコードは、もはや利用できないか、または合理的な労力では判定することができない。このようなコンピュータプログラムは、元々のアーキテクチャを備えた、まだ機能しているか、若しくは複製されたメインフレームシステム上で実行されるか、または仮想化システムを使用して、このようなメインフレームシステムのアーキテクチャをエミュレートする仮想化システム上で実行されることが増えている。
比較的広範なメインフレームコンピュータアーキテクチャは、それぞれIBM System/360(S/360)、IBM System/370(S/370)およびIBM System/390(S/390)に基づく。これらのプロセッサアーキテクチャには、多数のプログラムが存在する。今日では、これらは通常、Intelからのいわゆるx86アーキテクチャのプロセッサを有するコンピュータシステム上で実行される。2つのプロセッサアーキテクチャ間の差を補償するために、関連するプロセッサを有するS/360、S/370またはS/390システムの動作は、通常、x86アーキテクチャを有するプロセッサ上でエミュレートされる。
エミュレータは、コンピュータプログラムを、例えば、S/390バイナリコードの個々の機械命令を解釈することによって、いわゆるS/390バイナリコードの形式で実行する。このような解釈は、コンピュータプログラムの基礎となるプログラム論理から独立しており、ソースプラットフォームの機械命令の意味の分析のみを必要とするため、実装することは概念的には比較的容易である。例えば、S/390アーキテクチャのレジスタおよびメモリアドレスは、x86アーキテクチャまたは別のターゲットプラットフォームのレジスタおよびメモリアドレスにマッピングされる。
実行時のS/390バイナリコードの解釈、および基礎となるCISCプロセッサアーキテクチャにおける違いにより、効率が大幅に失われる。特に、機械コードのいわゆる「ポンピング」または膨張がある。なぜなら、例えば、使用される符号化された数値のバイト順序をビッグエンディアンからリトルエンディアンに変換しなければならず、既存のレジスタのレジスタ幅が異なり、メモリアクセス中に個々のビットをマスクしなければならず、条件の結果を一時的に記憶しなければならず、追加のレジスタをメインメモリの領域にマッピングし、そこから再ロードしなければならないからである。この追加的な研究は、高水準言語における元々のコンピュータプログラムのセマンティクスに起因するのではなく、ソースプラットフォーム上での元々の技術的実装にのみ起因する。これらの効率損失の技術的原因は極めて複雑であり、したがって一般に避けることができない。
その結果、ターゲットプラットフォーム上でS/390バイナリコードを解釈するには、典型的には、ソースプラットフォーム上でS/390バイナリコードを実行するよりもはるかに多くのプロセッササイクルを必要とする。追加的に、例えば既知のエラー(「バグ」)を除去するために、この方法でコンピュータプログラムを拡張または維持することはできない。
図1は、S/390バイナリコード2の形式であるコンピュータプログラム1を動作させるための2つの改善されたアプローチを示す。
第1の改善されたアプローチでは、いわゆるジャスト・イン・タイム(JIT)トランスレータ3が、実行時にS/390バイナリコード2の機械命令をターゲットプラットフォームTPの機械命令の対応するシーケンスに変換し、変換されたシーケンスを第1のx86バイナリコード4としてキャッシュする。S/390バイナリコード2の同じ機械命令が再度実行された場合、通常、新しい変換は行われない。その代わりに、キャッシュされた第1のx86バイナリコード4の対応する部分が再度実行され、これは、変換労力を大幅に低減し、コンピュータプログラム1の実行を高速化する。
しかしながら、ポンピングの問題もあるため、ターゲットプラットフォームTP上の第1のx86バイナリコード4の実行は、典型的には、ソースプラットフォームSP上のS/390バイナリコード2の実行よりもかなり多くのプロセッササイクルを必要とする。さらに、このアプローチは、多くの制約を満たすコンピュータプログラム1にのみ適用可能である。このようなコンピュータプログラム1は、良性または英語の用語「ウェル・ビヘイビア」と呼ばれる。例えば、S/390バイナリコード2の変更につながる可能性のある動作が検出された場合、x86バイナリコード4を破棄しなければならない。キャッシュされたx86バイナリコード4の安全な実行を確実にするために、JITトランスレータ3によって合計約30の条件を監視しなければならない。これらの条件の1つが違反された場合、キャッシュされたx86バイナリコード4は破棄され、元々のS/390バイナリコード2は上述のように再解釈される。実行時に条件をチェックすると、追加の労力が発生し、生成されたx86バイナリコード4の速度が低下する。追加的に、このようにしてコンピュータプログラム1を拡張または改善することもできない。
第2の改善されたアプローチは、最初に、逆アセンブラ5によってバイナリコード2を、ソースプラットフォームSPのためのアセンブラコード6、すなわち、S/390アセンブラプログラムに逆アセンブリし、次に、変換プログラム7、例えば、富士通テクノロジーソリューションズ社のプログラムASSTRANによって、命令ごとにアセンブラコード6を、ターゲットプラットフォームTPのためのバイナリコード、例えば、第2のx86バイナリコード8に変換することからなる。とりわけ、このアプローチは、コンピュータプログラム1がターゲットプラットフォームTP上で再度実行されるごとにではなく、分析および変換のための労力が1回しか生じないという利点を有する。S/390バイナリコード2の複雑さに依存して、生成されたx86バイナリコード8のわずかな最適化が、例えばターゲットプラットフォームTPのCPUレジスタの使用に関して、個々の場合にも可能である。第1の改善されたアプローチによるJIT変換と比較して、ジャンプターゲットを各ジャンプ命令に対して新たに判定する必要はない。
しかし、このような変換は、さらに大きな制約の下でのみ可能である。例えば、基本的に、自己修正または自己解釈するコンピュータプログラムでは不可能である。しかし、自己修正バイナリ符号の使用は、S/390アーキテクチャでは非常に一般的であった。さらに、S/390バイナリコード2にデータを埋め込むと、すでに逆アセンブリが成功しない可能性がある。例えば、実際には、第2の改善されたアプローチは、Cobolコンパイラによって生成されたコンピュータプログラムに対しては機能しない。さらに、元々のS/390バイナリコード2のポンピングは、以前として発生する。なぜなら、高水準言語で変換されるコンピュータプログラム1の元々のプログラム論理ではなく、S/390バイナリコード2のプログラム論理のみであるためである。したがって、コンピュータプログラム1の第2のx86バイナリコード8は、典型的には、元々のS/390バイナリコード2またはそのソースプラットフォームSP上での実行よりも、より広範で、実行が遅い。
本発明は、とりわけ、機械に近い低水準の表現、特にバイナリコードとしてのみ利用可能なコンピュータプログラムのより良い保守および使用の可能性を創出することを目的とする。とりわけ、別のコンピュータプラットフォーム上でこのようなコンピュータプログラムの実行を加速するための可能性が創出される。
この目的は、中間言語によるプログラム論理の表現を生成する方法によって、特許請求の範囲にしたがって解決される。本方法は、
第1のプロセッサアーキテクチャのための低水準プログラミング言語での第1のプログラムコードを捕捉するステップであって、第1のプログラムコードは、プログラム論理を実装し、高水準言語で定義されたプログラム論理をコンパイラでコンパイルすることによって生成されている、捕捉するステップと、
検出された第1のプログラムコードを、コンパイラに特有の少なくとも部分的にパラメータ化されたコードパターンの所定のセットに基づいてコードセクションのシーケンスに分割するステップであって、各コードセクションに対して、対応するパラメータ化されたコードパターンの各パラメータに対する特定のパラメータ値が捕捉され、中間言語の対応する終端記号は、各コードセクションに割り当られる、分割するステップと、
コードセクションのシーケンスに割り当てられた終端記号を、中間言語の文脈自由文法に基づいて中間言語の非終端記号に割り当てるステップであって、割り当てられた非終端記号の全体が、中間言語における第1のプログラムコードの前記プログラム論理を記述する、割り当てるステップと、
中間言語の関連する非終端記号および捕捉されたパラメータ値に基づいて、第1のプロセッサアーキテクチャから独立したプログラム論理の表現を生成するステップと、を含む。
上述のステップにより、低水準プログラミング言語のプログラムコードに基づくコンピュータプログラムのプログラム論理を、第1のプロセッサアーキテクチャのために復元することができる。用語「プログラム論理」は、コンピュータプログラムの意味、すなわち、高水準言語でプログラマによって表わされるデータ処理のためのアルゴリズムを指す。プログラム論理の復元は、とりわけ、第1のプログラムコードを生成するために元々使用されたコンパイラのコードパターンを考慮することによって可能となる。このプロセスにおいて、プログラム論理は、元々使用された高水準言語ではなく、特定の高水準言語または機械アーキテクチャに特有でない中間言語で表現される。
一般に、コンピュータプログラムのソースコードを、コンパイルされたコンピュータプログラムのアセンブリまたはバイナリコードに基づいて高水準言語で復元することはできない。しかし、本発明者らは、アセンブリまたはバイナリコードおよび/またはそれを生成するために使用されるコンパイラおよび/またはそれを生成するために使用されるプログラミング言語が既知であるか、少なくとも格納可能であるならば、少なくともそのプログラム論理を復元することができると認識した。特に、プログラム論理は、コンパイラが、元々高水準言語で符号化されたコンピュータプログラムの特定の要素を符号化するためにどのコードパターンを使用したかが既知であれば、再構成することができる。このようなコードパターンは、例えば、コンパイラのいわゆるコード生成器バックエンドを分析することによって判定することができる。
これらのコードパターンによって、特に、第1のプログラムコードに含まれるパラメータを識別することができる。各コードセクションに特定のパラメータ値を割り当てることにより、特に、異なるループ変数を持つ異なるまたはネストされたプログラムループなどの、異なる変数または式に向けられているが類似するコードパターンを区別することが可能となる。
また、本発明者らは、COBOLプログラミング言語が、検討したプログラムの約80%において、メインフレームアーキテクチャのためのコンピュータプログラムをコンパイルするために非常に頻繁に使用され、また、元々のCOBOLプログラムコードは、コードの最適化を伴わない少数の線形コンパイラのみを使用することによって、コンピュータプログラムのバイナリコード表現に翻訳されたことを認識した。したがって、使用されるコンパイラの既知の特殊性、特に既知のCOBOLコンパイラを考慮に入れると、コンピュータプログラムによって中間言語で実装されるプログラム論理の表現を得ることができる。この表現は、特に、プログラマによって使用される変数名またはコメントなどの、元々プログラミングに使用された高水準言語の完全なソースコードを含まないが、とりわけ、コンピュータプログラムのメンテナンス、および所望のターゲットプラットフォームのための効率的なバイナリコードの自動的な静的生成を許容する。
記述されたような中間言語で所定のプログラム論理の表現を生成することによって、第1のプログラムコードのうち、元々のターゲットプラットフォームに特に特有であるが、新しいターゲットプラットフォームに効率的にマッピングすることができない部分を、実際のプログラム論理から分離することができ、したがって、コンピュータプログラムをターゲットプラットフォームのための効率的なコードに変換することを可能にする。
少なくとも1つの実施形態において、分割するステップにおいて、第1のプログラムコードのコードセクションは、パターンマッチングによって、コンパイラに特有の少なくとも部分的にパラメータ化されたコードパターンの所定のセットと比較される。対応する終端記号は、対応するパラメータ化されたコードパターンの各パラメータに対するパラメータ値の一貫した割り当てが、検査されたコードセクションに対して可能である場合にのみ割り当てられる。このようなパラメータベースのパターンマッチングは、第1のプログラムコードの分析中に起こり得る割り当て間違いを防止する。例えば、それは、所定のコードパターンに対応することがあるが、実際には関係する機能性を満たさず、コンパイラによって生成されなかった機械命令のシーケンスを、コンパイラのコード生成モジュールによって実際に生成された内部的に一貫性のあるパラメータ値を有する同等のシーケンスから区別するために使用することができる。
少なくとも1つの実施形態において、割り当てるステップにおいて、中間言語の非終端記号に少なくとも1つのコンテキスト依存条件が、分割するステップで検出されたパラメータ値に基づいてチェックされ、少なくとも1つのコンテキスト依存条件が、対応するコードセクションの検出されたパラメータ値によって満たされない場合、非終端記号への可能な割り当てが不正確であるとして拒否される。また、個別の終端記号を非終端記号、すなわち、中間言語のより複雑な表現に割り当てるときに、誤った割り当ての可能性を防止するために、割り当てられたパラメータ値を使用することができる。例えば、ループ変数のアップカウンタを、おそらくネストされた多数のプログラムループの正しいプログラムループに割り当てることができる。まとめると、割り当てられたパラメータに依存し、したがって、文脈依存する中間言語の非終端記号の全ての割り当て規則の条件は、プログラム論理の復元において従うべき宣言型規則システムを形成する。中間言語の可能な割り当て規則による割り当ては、対応する条件が、具体的にパラメータ化された非終端記号によって観察される場合にのみ、許容可能である。
少なくとも1つの実施形態において、割り当てるステップにおいて、コードセクションのシーケンスに割り当てられた終端記号のシーケンスは、パーサ、特にボトムアップパーサによって、プログラム論理の階層的表現、特に構文ツリーに変換される。階層的表現の高レベル要素または構文ツリーの内側ノードは、中間言語の非終端記号に対応する。階層的表現の低レベル要素または構文ツリーのリーフは、中間言語の終端記号にのみ対応する。
換言すれば、中間言語の終端記号は高水準言語の原子要素(atomic element)であり、非終端記号はプログラム構成(program construct)、特に複合プログラム構成である。高水準言語のプログラム構成は、例えば、式および条件の評価、プログラムループの動作、およびサブルーチンの呼び出しを含む。
このようなパーサを階層的表現と併せて使用することにより、文法の縮小規則により、より複雑な一般的なプログラム構成に異なる原子要素を単純に割り当てることが可能となる。このような表現は、例えば、中間言語のプログラム構成の文脈自由文法(いわゆるChomsky階層におけるタイプ2文法としても知られる)を使用して、ボトムアップパーサ、特にLRパーサによって作成することができる。
少なくとも1つの実施形態によれば、ツリー表現のリーフは、分割するステップにおいて捕捉されたパラメータ値が記憶される第1の属性を含む。
少なくとも1つの実施形態によれば、ツリー表現のノードは、捕捉されたパラメータ値から導出されたパラメータ値が、割り当てるステップにおいて記憶される第2の属性を含む。
少なくとも1つの実施形態によれば、中間言語の非終端記号は、COBOL、FORTRAN、S3、Algol、および/またはCなどの複数の命令型高級プログラミング言語の特徴である。上記のプログラミング言語の全ては、条件のチェック、プログラムセクションの条件付き実行、算術式の評価、変数への値の割り当て、1つ以上のパラメータ値または参照を任意で渡す別のプログラムセクションへの呼び出し、特にサブルーチンへの呼び出しおよびそれからのリターン、およびプログラムループのトラバーサルなどの同様のプログラム構成を使用する。このようなプログラム構成は、例えば、条件付きジャンプまたは条件付きコードにおけるジャンプを介して、より低いレベルで実現することができる。コンピュータプログラムを作成するために特に一般的に使用されるプログラミング言語の背景知識を利用することによって、探索されたプログラム論理の適切な中間言語への検索を簡素化することができる。
少なくとも1つの実施例では、生成するステップにおいて、第2のプログラムコードが、中間言語の関連する非終端記号に基づいて第2のプロセッサアーキテクチャのための低水準プログラミング言語で生成される。この場合、プログラムステップは、第2のプロセッサアーキテクチャを有するプロセッサ上で第2のプログラムコードが実行されると、高水準言語で定義されたプログラム論理にしたがって実行される。この実施形態は、インテルx86アーキテクチャなどの所与のターゲットプラットフォームのための実行可能コードを自動的に生成するのに特に有用である。
少なくとも1つの実施形態において、第2のプロセッサアーキテクチャのための最適化された第2のプログラムコードは、生成するステップで生成される。中間言語における表現に基づいて、生成されたプログラムコードの最適化は、例えば、ターゲットプラットフォームのために最適化されたデータ型を使用することによって、またはプログラム論理のデータフロー分析に基づいて可能であり、これは、生成された第2のプログラムコードの実行におけるさらなる加速につながる。
上記の目的は、特許請求の範囲による逆コンパイル装置、再コンパイルシステム、およびコンピュータプログラム製品によってさらに解決される。
本発明のさらに有利な実施形態は、実施形態の以下の説明および同封の特許請求の範囲に開示されている。
本発明は、以下、同封の図面に基づく例示的な実施形態によって詳細に説明される。
既知のコード変換方法の概略図である。 本発明によるコード変換方法の概略図である。 プログラム論理の表現を生成するための方法のフローチャートである。 逆コンパイルデバイスおよび再コンパイルシステムの概略図である。 様々なプログラム構成に対するパラメータ化されたトークンの例示的な割り当てである。 様々なプログラム構成に対するパラメータ化されたトークンの例示的な割り当てである。 再構成されたプログラム論理の一部のツリー表現である。
図2は、ソースプロセッサアーキテクチャのバイナリコードをターゲットプロセッサアーキテクチャの対応するバイナリコードに変換するための本発明による方法を概略的に示す。比較可能性を高めるために、再度、図2に、バイナリコードレベルL1におけるS/390のバイナリコード2の第1のx86のバイナリコード4への直接変換、アセンブリコードレベルL2における第2のx86のバイナリコード8への間接変換の可能性を示す。追加的に、特に、中間言語レベルL4におけるコンピュータプログラム1のプログラム論理PLの表現の生成を含む第3の方法が示される。
例示的な実施形態では、逆コンパイル装置9は、S/390バイナリコード2から直接、中間言語ILで汎用プログラムコード10を生成する。汎用プログラムコード10は、プログラム論理PLの形式で、高水準言語レベルL5上のコンピュータプログラム1によって定義される意味を記述する。これに使用される手順は、図3のフローチャートを参照して以下に詳細に記述される。代替的には、汎用プログラムコード10は、分析プログラム11によって分解されたアセンブリコード6から生成することができる。
中間言語ILにおける汎用プログラムコード10は、演算式の評価、プログラムループの定義、またはサブルーチンの呼び出しなどの命令型プログラミング言語のグループに典型的なプログラム構成、および変数または定数へのアクセスなどの、それ以上分解することができない個々の原子要素を含む。このようなプログラム構成によって、上記のプログラミング言語に加えて、いくつかのオブジェクト指向プログラミング言語のプログラムを表現することができる。このような中間言語で表現できないのは、純粋な宣言型プログラミング言語のプログラムだけである。
復元されたプログラム論理PLに基づいて、1つ以上のターゲットプラットフォームTPのための機械またはアセンブリコードが、好適なコード生成モジュールを使用して生成される。例示的な実施形態では、GNUコンパイラコレクション(GCC)のx86コード生成器12を使用して、第3の実行可能なx86バイナリコード13を生成する。その際、使用されるコード生成モジュールは、ターゲットプラットフォームTPのプロセッサアーキテクチャの能力を直接考慮する。したがって、追加的なコード最適化レベルL3で第3のバイナリコード13を生成する場合には、コードオプティマイザ14を任意選択で使用することができ、これは、ターゲットプラットフォームTPのプロセッサアーキテクチャの機械命令に、特に効率的な方式で、中間言語ILにおける汎用プログラムコード10をマッピングする。
図2は、達成可能な性能利得を示す。例えば、COBOLのような高水準言語におけるコンピュータプログラム1の単一の文は、ソースプラットフォームSP、ここではS/390の7つの機械命令に変換することができる。ターゲットプラットフォームTPの第1のx86バイナリコード4へのJIT変換は、7つのS/390命令から28x86機械命令をもたらす。同じS/390バイナリコード2を、変換プログラム7 ASSTRANによって、第2のx86バイナリコード8に変換することはできない。なぜなら、S/390バイナリコード2は、元々COBOLコンパイラによって生成されたからである。図2に示されているように、S/390バイナリコード2のプログラム論理PLの表現が、まず、中間言語ILにおいて復元され、続いて、x86コード生成器12を使用して第3のx86バイナリコード13に変換される場合、同じ文は、ターゲットアーキテクチャのx86プロセッサの4つの機械命令によってのみ実装することができる。このように、ターゲットプラットフォームTP上のコンピュータプログラム1の実行においてかなりの利得があり、本例では、JIT変換器3と比較して7倍である。
図2に示す中間言語レベルL4、コード最適化レベルL3、およびおそらく基礎となるアセンブリコードレベルL2は、現代のコンパイラによって使用されているが、1950年代から1980年代の多くのコンパイラには存在しなかったことに留意されたい。したがって、ソースプラットフォームSPのためのS/390バイナリコード2の作成のための対応する中間ステップまたはレベルL2~L4は、破線またはハッチング領域によって図2にのみ示され、概念的に理解されるべきである。実際、メインフレームシステムのための多くのコンパイラは、コンピュータプログラム1をCOBOLのような高水準言語からターゲットプラットフォームTPのバイナリコード、例えばS/390バイナリコード2に直接変換している。典型的には、コード最適化のない線形コンパイラが使用され、これは、比較的非効率的なバイナリコードを生成した。しかし、このようにして生成されたバイナリコードは、特に分析が容易であり、以下に説明するように、本発明にしたがってそこに符号化されたプログラム論理PLの再構成を単純化する。
以下、COBOLプログラミング言語で元々作成され、S/390バイナリコード2にコンパイルされたコンピュータプログラム1の、対応するx86バイナリコード13への「再コンパイル」と呼ばれる変換について説明する。もちろん、本発明は、前述のソースプラットフォームおよびターゲットプラットフォーム、COBOLプログラミング言語、または後述する中間言語ILのコードパターンおよび記号に限定されない。むしろ、ICLシリーズ39、IBM S/360またはS/370、FORTRAN、S3、AlgolまたはCプログラミング言語および関連コードパターン、および他の文法を有する中間言語のような様々な他のプラットフォームに転送可能である。
図3は、中間言語ILにおけるS/390バイナリコード2のプログラム論理PLの表現を生成し、その後、この表現に基づいて第3のx86バイナリコード13を生成するための方法30のフローチャートを示す。この方法は、図4に概略的に示す再コンパイルシステム40によって実行される。
再コンパイルシステム40は、コンピュータシステムのメモリに記憶され、コンピュータシステムのプロセッサによって実行可能なコンピュータプログラムの実行可能なプログラムコードを含む。コンピュータプログラムは、例えば、ソースプラットフォームSP、ターゲットプラットフォームTP、または別のプラットフォームためのコンピュータプログラムであってもよい。コンピュータプログラムはまた、1つ以上のコードブロックが第1のコンピュータシステム上で実行され、1つ以上の他のコードブロックが第2のコンピュータシステム上で実行される分散システム上で実行されてもよい。
方法30の第1のステップS1では、S/390バイナリコード2に含まれる機械コード41と、必要に応じてS/390バイナリコード2に含まれる追加のいわゆるインラインデータとが取得される。S/390バイナリコード2は、元々、コンピュータプログラム1を高水準COBOL言語でコンパイルすることによって生成された。しかし、COBOLのソースコードは使用できなくなっている。
例示的な実施形態では、アドレスオフセット値x8000は、まず、アーカイブファイルにおける機械コード部分の第1の命令の開始アドレスとして指定される。このアドレスでは、実際の機械コード41は、S/390バイナリコード2内で開始する。S/390バイナリコード2は、個々のバイトのシーケンスに分解され、いわゆるバイトストリーム42として逆コンパイルデバイス9に利用可能とされる。
第2の方法ステップS2では、捕捉されたS/390バイナリコード2は、正式な中間言語ILの対応する終端記号TSを有するコードパターンCMのリストに分割される。この場合、中間言語ILの終端記号TSに割り当てられたコードパターンCMは、本質的に、S/390バイナリコード2を生成するために使用されるコンパイラ、例えば、COBOLコンパイラのコードパターンに対応する。このようなコードパターンCMの一例は、特定のアドレスに記憶された変数の値にアクセスするための、または定数値を有するレジスタをロードするための機械命令のシーケンスである。
この分割では、現在のS/390バイナリコードにおける実際の機械コード41が、認識されなければならない。特に、機械命令がS/390バイナリコード2において位置する場所が判定されなくてはならない。これらは、S/390バイナリコード2に含まれる他のデータ、いわゆるインラインデータと区別されなければならない。
このような分析は、通常、バイナリコードが逆アセンブル可能である場合に可能である。このためには、コンピュータプログラム1の開始アドレスと、ソースプラットフォームSPのプロセッサの命令セットとが知られていなければならず、特に、個々の機械命令が有する長さが知られていなければならない。これは、典型的には、各機械命令を実行するために必要とされるパラメータの数によって与えられ、したがって、既知のコンピュータプラットフォームに対して文書化される。
既存のバイナリコードが機械命令のシーケンスであると仮定される古典的な逆アセンブリとは対照的に、バイナリコードを生成するために使用されたコンパイラが、例えば大きな定数を記憶するために、特定のパターンにしたがってインラインデータを生成されたバイナリコードに挿入した場合には、説明した逆コンパイルデバイス9における機械命令の認識も可能である。使用されるコンパイラの既知のコードパターンを考慮することによって、バイナリコードに含まれる任意のインラインデータの位置および範囲を推論することが可能である。例えば、実行時に特定のプログラム部品の通過を制御するために、既知のコードパターンによって生成された場合には、必要に応じて、自己修正バイナリコードでさえも分析することができる。コンパイラによって使用されるパターンが既知であれば、機械命令がバイナリコード2のどこに含まれるかを判定することができ、したがって、それらを他のデータから分離することができる。
ステップS2の実装のために、元々使用されたコンパイラに典型的な複数のコードパターンCMが、第1のサブステップS2.1において提供される。提供されたコードパターンCMの全体は、S/390バイナリコード2を中間言語ILの終端記号TSに逆コンパイルするための文法に対応する。これらのコードパターンCMの少なくともいくつかは、変化しない形式でS/390バイナリコードにおいて必ずしも発生しないが、それ自体、数値、メモリアドレス、またはレジスタなどの少なくとも1つのパラメータによって特徴付けられる。インラインデータは、コードパターンで定義することもできる。パターン照合器は、そのようなパラメータ化されたコードパターンCMを認識するのに特に好適ある。
典型的には、各コンパイラは、COBOLなどの高水準言語の入力側コンピュータプログラム1から、低水準プログラミング言語の出力側コンパイルされたコード、特にバイナリコードまたはアセンブリコードを生成するために、コード発生器と多数の所定のコードパターンCMを使用する。以下に説明するプログラム論理PLの復元は、これらのコードパターンCMの分析または知識に基づく。
例示的な実施形態では、個々のコードパターンCMに含まれるパラメータの定義を含む、使用されるコードパターンCMは、「トークン」という名前でテキストファイル43において指定される。そこに含まれるコードパターンCMは、パターンパーサ44によって逆コンパイル装置9に読み込まれる。
コードパターンCMは、コンパイラのいわゆるコード生成器バックエンドを分析することによって提供することができ、高水準言語の既知の原子要素を実装するために使用される機械コード・シーケンスはパターンとして提供される。高水準言語の原子要素は、例えば、定数値および変数内容の検索または割り当てを含む。代替的には、好ましくは高水準言語のソースコードと低水準プログラミング言語のコンパイルされたコードの両方が利用可能である既知のコンピュータプログラム1を分析することによって対応するパターンを判定することも可能である。この手順は、コンパイラ自体のソースコードがもはや使用できない場合に特に有用である。
使用されるコンパイラの複雑さに応じて、多数の異なるコードパターンCMを使用することができる。比較的古いCOBOLコンパイラの説明された例示的な実施形態では、多数のテストプログラムを、分析によって判定された37のコードパターンCMで首尾よく逆コンパイルすることができた。しかし、特に、これらがコンパイラのコード生成モジュールから自動的に導出できる場合には、より多数のコードパターンCMを考慮することも可能である。
説明された例示的な実施形態では、コードパターンCMは、個々の変数または配列にアクセスするためのコードパターン、S/390プラットフォーム上で典型的な二進化十進数(BCD)処理のための値を割り当てるためのコードパターン、条件付きおよび無条件のジャンプ、並びに対応するリターンを含むが、これらに限定されない。
続いて、ステップS1で生成されたS/390バイナリコード2のバイトストリーム42が、ステップS2.1で検出されたコードパターンCMと比較され、中間言語ILの関連する終端記号TSを判定する。例示的な実施形態では、パターン認識スキャナを実装するいわゆる照合器45が、この目的のために使用される。例示的な実施形態では、照合器45は、バイトストリーム42の所定の開始アドレスで可能なコードパターンの割り当てを開始する。原理的には、照合器45自体は、サブステップS2.2に従う第1の実行において、コンピュータプログラム1において具体的に使用され、パラメータ化されたコードパターンCMのシーケンスを判定するアセンブラのように機能する。第1の実行では、個々のコードパターンCMの限界、したがって、その中に含まれるジャンプ命令のジャンプターゲットは、まだ既知ではない。したがって、第1の実行では、対応するジャンプラベルのみが生成されるが、パラメータ化されたコードパターンCMの出力は生成されない。
次の第2の実行では、サブステップS2において、コンピュータプログラム1で具体的に使用され、おそらくパラメータ化されるコードパターンCMのシーケンスが、第1の実行で生成されたジャンプラベルに基づいて生成される。照合器45の出力として、対応する適切にパラメータ化されたトークン46が、各割り当てられたコードパターンCMに対して出力され、このトークン46は、コードパターンCMのインスタンスの具体的な出現を、S/390バイナリコード2の関連するパラメータで表す。
入力バイトストリーム42の各部はコードパターンCMに割り当てられる。例示的な実施形態では、使用されるコードパターンCMの大部分はパラメータ化可能である。これにより、コンピュータプログラム1で使用される具体的にパラメータ化されたトークン46の出力ストリームをもたらし、各トークンは中間言語ILの終端記号TSに対応する。
照合器45の動作は、BCD番号として符号化されたインデックス変数にアクセスするための名前「ARRAY_BCDIDX」を有するコードパターンに基づいて以下に説明する。以下に示すコードパターンARRAY_BCDIDXは、パターンパーサ44によって読み取られ、合計9つのパラメータa、b、o、l、t、r、t1、t2およびl2によってパラメータ化される。これは、本質的に、オペランドが上述のパラメータによって定義されるS/390機械コマンドのシーケンスを含む。ここで、第2の列に表現されている対応する機械命令(例えば16進数F2h)のアセンブリ言語のいわゆるニーモニック(例えば、PACK)を有する第1の列は、より良く理解するためだけのものである。照合器45は、S/390バイナリコード2から直接、それぞれの機械命令の16進値をサーチする。
Figure 0007391983000001
例示的な実施形態では、山括弧内の表現は、コードパターンCMのパラメータ、または固定値を有するパラメータの組み合わせのいずれかである。バイナリコードにおける個々のパラメータの長さは、例示的な実施形態において、それらの命名によって暗黙的に指定されるが、当然ながら、明示的に指定することもできる。
これおよび他のコードパターンCMは、パターンパーサ44によってテキストファイル43から読み込まれ、可能なコードパターンCMを有するアレイにおいて解析され、記憶される。パターンパーサ44自体は、トップダウン・パーサとして、例えば、再帰的降下パーサとして実装され、実施形態の例では、数百のコードパターンCMをサポートする。もちろん、コードパターンCMを定義するために、他のパーサまたは構成メカニズムを使用することもできる。
S/390バイナリコード2の入力バイトストリーム42が所定のコードパターンCMの1つに対応する場合、対応するコードパターンCMが複製され、割り当てられたコードパターンに含まれるパラメータに対するバイトストリーム42の具体的なパラメータ値が複製されたコードパターンCMに記憶される。したがって、コードパターンの定数値とパラメータ値を考慮しなければならない。あるパラメータがコードパターンCM中に数回発生する場合、対応するコードパターンCMは、その中に含まれる全てのパラメータの一貫した割り当てが可能である場合にのみ割り当てられる。山括弧内の式は、照合器45によって評価され、バイトストリーム42の対応する位置の値と比較される。したがって、パラメータの割り当ては、宣言型コードパターンCMの解を表す。
例えば、ARRAY_BCDIDXでは、パラメータt1を合計5回使用する。これらの場所の各々では、コードパターンARRAY_BCDIDXを割り当て可能となるには、t1と同じ値、または式t1+7-l2と式t1+7のパラメータ値t1から導出された値がバイナリコードになければならない。別の例として、第2の行の機械コード41では、機械命令コードD7(.XC)の後のバイトストリーム42の第1のバイトが、第1の機械命令F2(.PACK)の第1のオペランドとしてバイトストリーム42から読み込まれた値をl2のパラメータ値として用いて、式7-l2-1の結果のバイナリ表現に続く4つのゼロビット(16進数0hに対応する)に対応するかどうかをチェックしなければならない。さらに、第3のオペランドの値が第2のオペランドの値に対応するかどうかがチェックされる。なぜなら、これらの2つのオペランドが、コードパターンARRAY_BCDIDXにおける同じパラメータt1などに対応すべきであるためである。
一貫した割り当てができない場合、最初にチェックされたものとは別のコードパターンCMを使用しなければならないことがある。一貫した割り当てがまったく可能でない場合、入力S/390バイナリコード2は、コードパターンまたは対応するパラメータ化されたトークンに分割することができず、したがって、首尾よく逆コンパイルすることができない。この場合、手順30はエラーで終了する。これは特に、S/390バイナリコード2がコードパターンCMの定義のために分析されたコンパイラによって生成されたのではなく、別のコンパイラによって、またはアセンブラプログラムから直接生成された場合に当てはまる。
説明された実施形態では、照合器45は、既知のCOBOLコンパイラによって生成されたS/390バイナリコード2が、典型的には、固定コードパターンを使用する単一の線形コード生成プロセスにおいて生成されるという事実を利用する。したがって、逆に、S/390バイナリコード2は、単一パスにおいて対応するコードパターンCMに再割り当てすることもできる。したがって、元々COBOLでプログラミングされたコンピュータプログラムのS/390バイナリコード2に対する固有の割り当ては、通常、照合器45によって可能である。
方法30のステップS3では、照合器45によってコードパターンCMの1つに首尾よく割り当てられた中間言語ILの終端記号TSに対応するパラメータ化されたトークン46が、中間言語ILの非終端記号NTSに対応する所定のプログラム構成に割り当てられる。割り当ては、2組の別個の規則を満たさなければならない。一方では、1つ以上のトークン46の縮小は、中間言語ILの文脈自由文法の変換ルールまたは構成を満たさなければならない。他方、関与するパラメータ化されたトークン46のパラメータは、それぞれの構成規則について与えられた宣言型規則に準拠しなければならない。宣言型規則によって、割り当ての文脈依存が確立される。割り当てが許容される場合、生成された非終端記号には、中間言語ILの関与する終端記号TSに割り当てられたパラメータ値が渡される。
言語理論では、形式言語は4タプルG = (NTS、TS、S、P) として表現される文法Gで定義される。ここでは、NTSは、非終端記号のアルファベットを記述し、TSは、終端記号TSのアルファベットを記述し、Sは、開始記号を記述し、Pは、非終端記号NTSの1つ以上の終端記号TSまたは非終端記号NTSへの変換を記述する変換規則または生成のセットを記述する。
中間言語ILは、自己完結型の文脈依存言語であり、その非終端NTSおよび生成Pは、コンピュータプログラム1をプログラミングするために使用される高水準言語に特有のものではなく、アセンブリまたはバイナリコード表現でコンパイルすることによって生成されるコンピュータプログラムの全クラスに適用することができる。
上述した逆コンパイルデバイス9では、ボトムアップまたはアップワードパーサの特殊な形態であるいわゆるLRパーサ47が、照合器45によって既に認識された終端記号TSを、中間言語ILの合成非終端記号NTSに割り当てるか、または縮小するタスクを引き継ぐ。文脈自由文法のための既知のパーサとは対照的に、割り当てられる非終端記号NTSの文脈依存がここで利用される。
個々の非終端記号の文脈は、宣言型規則を使用して、末端記号TSに関連するパラメータ値をチェックすることに基づいて縮小するステップにおいて、例示的な実施形態においてチェックされる。例えば、非終端記号NTSの定義は、異なる終端記号TSまたは非終端記号NTSを、カウント変数でプログラムループを実行するような、より高レベルの非終端記号NTSに縮小するために、どのパラメータが、照合器45によって認識されるコードパターンCMのパラメータと一致しなければならないかを指定することができる。説明された例示的な実施形態では、チェックされるべきルールは、LRパーサ47のプログラムコードにおいて固定的に実装される。代替的には、起動時に構成ファイルの形式でパーサ47にチェックされるべきルールを読み取ることもできる。
パラメータ化されたトークン46または終端記号TSおよび中間言語ILの文法のプログラム構成または非終端記号NTSから形成された構文ツリーは、元々のコンピュータプログラム1の下にあるプログラム論理PLを全体として表す。構文ツリーのルートは文法の開始記号Sに対応し、そこから完全なプログラム論理PLを導出することができる。換言すれば、各具体的なコンピュータプログラム1に対して、中間言語ILの単語に対応する構文ツリーが存在する。
ステップS3の実装のために、LRパーサ47は、第1のサブステップS3.1において、関連する変換ルールPにしたがって、以前に判定されたトークン46および/または既に首尾よく割り当てられた非終端記号NTSを置き換えるのに適していると思われる中間言語ILの文法Gにしたがって、非終端記号NTSを選択する。そうすることで、LRパーサ47は、照合器45によって提供されるトークン46のシーケンスと、中間言語ILの現在選択されている非終端記号NTSとの間の一致を可能な限り長く見つけようと試みる。
次のサブステップS3.2では、サブステップS3.1で割り当てられたトークン46のパラメータが、選択された非終端記号NTSの宣言型規則または関連する生成規則に対応するかどうかがチェックされる。あてはまる場合、適用可能なプログラム構成が判定される。
そうでなければ、LRパーサ47は、サブステップS3.1にジャンプして戻り、別の可能な非終端記号NTSに変換することができる記号の別のシーケンスを見つけようとする。次に、関与するトークン46のパラメータの割り当ては、最後に、首尾よい割り当てが見つかるか、または、非終端記号NTSが文法の規則にしたがって首尾よく割り当てられないために、手順がエラーで終了するまで、サブステップS3.2で再度チェックされる。
サブステップS3.1およびS3.2は、記号のシーケンスが文法の開始記号Sに遡るまで再帰的に繰り返され、これは、コンピュータプログラム1のプログラム論理PLに記号的に対応する。これが可能であれば、コンピュータプログラム1を逆コンパイルすることができる。そうでなければ、コンピュータプログラム1は逆コンパイル可能ではなく、方法30はエラーで終了する。
以下では、LRパーサ47の動作が、例によってさらに説明される。この目的のために、図5Aおよび図5Bは、矢印によって、トークン46のシーケンスにしたがって、パラメータ化された終端記号TSへの非終端記号NTSの割り当てのチェックの2つの例を図表で示す。矢印は、関与する終端記号TSのパラメータへの依存性を示す。
図5Aによる例では、5つの対応するパラメータ化されたコードパターンBASE、ARRAY_LVAL、ARRAY_BCD_IDX、BCD_COPYのシーケンスに対応する合計5つのパラメータ化されたトークン46が、プログラム構成要素「parameter array assign」に割り当てられる。ここで、第1の条件C1によれば、第1のパラメータ化されたコードパターンBASEの第1のパラメータbの値が、パラメータ化されたコードパターンARRAY_LVALの第2のパラメータbの値と一致しなければならない。同様に、パラメータ化されたコードパターンARRAY_LVALの第1のパラメータaの値が、第2の条件C2によるパラメータ化されたコードパターンARRAY_BCDIDXの第1のパラメータaの値と一致しなければならない。ここで、「a = 0x5 parlist-f2_o_000[]」という表現は、オフセット0を有するパラメータリストがアドレス0x5でレジスタaに記憶されることを意味する。
これらの依存関係は、LRパーサ47によって検証されるものとする。同様に、パラメータ化されたコードパターンARRAY_BCDIDXの第1のパラメータaによるマッピングは、パラメータ化されたコードパターンBCD_COPYの第1のパラメータb1と一致しなければならず、第2のパラメータ化されたコードパターンBASEの第1のパラメータbによるマッピングは、パラメータ化されたコードパターンBCD_COPYの第3のパラメータb2と一致しなければならない(図5Aにおいて破線で示されている)。
図5Bは、2つの値の追加に関する第2のプログラム構成要素に対する依存関係を同様に示す。ここでも、LRパーサ47が、示された4つのパラメータ化されたトークン46または対応するコードパターンをプログラム構成要素「追加」に首尾よく割り当てることができるように、宣言型規則の形式で定義された境界条件が観察されなければならない。
図5Bの例では、とりわけ、2つの条件C1およびC2がチェックされる。関連する規則の宣言的および帰属的部分は、文法Gの低減規則の追加条件として表現することができる。以下、それぞれの条件を、対応する縮小規則の後に二重角括弧で示す:
Figure 0007391983000002
$$、$1などの記号を持つ上記の構文は、Yacc/Bisonプロジェクトから知られている構文に適合され、ここで、$$は、低減された非終端記号を表し、$1および$2は、それぞれ構成規則の第1および第2のコンポーネントを表し、ドット演算子は、割り当てられるか検索される中間言語ILのそれぞれの終端または非終端要素の属性を表す。
方法30の次のステップS4では、元々のコンピュータプログラム1のプログラム論理PLの階層的表現48が、中間言語ILの割り当てられたプログラム構成に基づいて生成される。この表現は、異なる目的に役立つことができ、したがって、非常に異なるものとすることができる。
第1の変形例S4.1によれば、図6に示すように、中間言語ILの非終端記号NTSおよび終端記号TSの構文ツリー60を出力することができる。図6は、図5Bの例からの追加式の構文ツリー60を効果的に示す。図6に見られるように、トップレベルの追加は、割り当て式61に対応する。代入式61の手段によって、より低いレベルの追加式62の結果が、選択された変数63に割り当てられる。追加式62は、さらに別の式64と定数65からなる。さらなる表現64は、従属因子66を表し、これは、今度はコードパターンBCD_PACKの形態の変数呼び出し67を含む。
図6に見られるように、式61、62および64ならびに因子66は、中間言語ILの非終端記号NTSによって具体化される。割り当てられた変数63、定数65、および変数呼び出し67は、BCD変数をアンパックするためのパラメータ化されたコードパターンBCD_UNPACK、定数を追加するためのBCD_ADD_CONST、およびBCD変数をパックするためのBCD_PACKに対応する終端記号TSによって具体化される。
このような構文ツリー60は、中間言語ILの終端記号TSおよび非終端記号NTSへの個々のパラメータの割り当てをチェックする際に特に有用である。
例示的な実施形態では、LRパーサ47は、いわゆるLALR(1)文法(ルックアヘッドLRパーサ文法)によって、トークン46のリストから中間言語ILにおけるプログラム論理PLの対応部分の表現を生成する。これは、例において、図5Bに示される追加式のための構文ツリー60として図6に抜粋して示されるように、コンピュータプログラム1の階層的表現48を効果的に生成する。明瞭にするために図6には示されていないが、完全なプログラム論理PLの階層的表現48は、中間言語ILの開始記号Sに対応するルート要素プログラムを有し、それから元々のコンピュータプログラム1のプログラム論理PL全体を導出することができる。
第2の変形例S4.2によれば、認識されたプログラム構成および認識されたパラメータの擬似コード表現が出力され得る。このような表現は、コンピュータプログラム1の元々のソースコードが失われているが、元々のコンピュータプログラム1のエラーが訂正されるか、または変更された要件にしたがってコンピュータプログラム1がさらに開発される場合に特に有用である。プログラマは、このような表現を使用して、コンピュータプログラム1がどの機能ブロックを通過するかを見ることができ、したがって、合理的な労力によって個々のパラメータの意味を取り戻すことができる。換言すれば、このような表現は、元々のソースコードがもはや利用可能ではない、特に、いわゆるレガシーコードである、文書化されていない、または十分に文書化されていないコンピュータプログラム1を維持する上で特に有用である。
有利な実施形態によれば、任意選択のサブステップS4.3において、中間言語ILにおけるプログラム論理PLは、ターゲットプラットフォームTPのための低水準プログラミング言語、特にアセンブリまたは機械コードのプログラムコードに変換される。この目的のために、例示的な実施形態では、ステップS4.1で生成されたプログラム論理PLの階層的表現48を解析し、それをスクリーン出力または時間記録のような任意のランタイムライブラリなしでx86プロセッサのためのバイナリまたはアセンブラコード50に変換するx86コード生成器12が使用される。もちろん、他の自動コード生成方法も適用してもよい。このような変換は、x86プロセッサのような所与のターゲットプラットフォームTP上のコンピュータプログラム1の効率的な実行を可能にする。
中間言語ILにおけるプログラム論理PLの表現、例えば、プログラム論理の完全な構文ツリー60に基づいて、ターゲットプラットフォームTPのためのバイナリまたはアセンブリコード50を生成することは、比較的容易である。最適化が実行されない場合、バイナリまたはアセンブリコード50は、中間言語ILにおけるプログラム論理PLの階層的表現48の個々の要素によって直接生成することができる。例えば、バイナリまたはアセンブリコード50は、そのルート要素から開始する構文ツリー60を再帰的に解析することによって出力されてもよい。
このようにして生成されたアセンブリコード50に基づいて、必要に応じて、アセンブリコード50を備えるか、または含む標準ライブラリまたはさらなるプログラム部品を含め、ターゲットプラットフォームTPのための完全に実行可能なアセンブリプログラム51は生成することができる。アセンブリコード50またはアセンブリプログラム51は、アセンブラ52を用いてそれ自体公知の方法でインテルx86プロセッサのための実行可能なコード53に変換することができる。
好ましくは、所与のターゲットプラットフォームTPのためのさらなる最適化は、アセンブリコード50または対応するバイナリコードの生成前または生成中に行われてもよい。例えば、本実施形態では、x86プラットフォーム上で実行するために最適化されたアセンブリコード50を生成するために、コードオプティマイザ14が使用されてもよい。
例えば、個々のプログラム構成において使用されるパラメータの実際の意図は、中間言語ILの表現において認識することができる。これに基づいて、元々使用されたコンパイラによって使用されたデータフォーマットが、意図されたターゲットプラットフォームTPに必要かつ好適であり、最適であるかどうかを分析することができる。COBOLコンピュータプログラム1の記載例において、調査中のCOBOLコンパイラは、しばしば、非常に少数の数値を符号化するために、いわゆるBCD変数を使用する。また、元々のS/390プラットフォームは、BCD変数の処理に非常に優れたテクニカルサポートを提供するため、BCD変数は、例えば、配列の個々の値にアクセスするためのインデックスとしても使用される。対照的に、x86プラットフォームは、BCD変数を効率的で直接的なサポートはほとんど提供しない。したがって、インデックス変数の許容値は、基本的には、損失なしで2進数として表現することができる符号なし整数であるため、BCD変数の形式でインデックスによって配列のエントリにアクセスすることは、技術的な観点からは必要とされない比較的複雑な動作である。したがって、出力アセンブリコード50を最適化するために、変数が、中間言語ILの認識された構成に基づくインデックス変数であることを認識し、ターゲットプラットフォームTPの要件にしたがってそのデータ型を変更することが可能である。
具体的には、BCD変数の値が小数点以下第19位以下であり、SRP (Shift and Round Packed BCD)命令がBCD番号を丸めるためにそれに適用されず、変数が配列インデックスにアクセスするために使用される場合、またはデータフロー分析により、それがループ変数または帰納変数として使用されることが判明した場合、再コンパイルシステムは、自動的に40のBCD変数を64ビット長整数変数に自動的に置き換える。上記の場合、ソースプラットフォームSPで元々使用されていたデータ型を、ターゲットプラットフォームTPのための異なるデータ型に置き換えても、精度の損失はもたらさない。換言すれば、プログラム論理PLは同じままである。しかし、代用として使用される64ビット長整数変数は、x86プロセッサによってはるかに高速に処理することができる。
図5Bおよび図6による例では、BCD変数を再フォーマットするためのS/390に特有の機械コードは、実行される全体的な追加の意味には無関係であり、したがって、ターゲットプラットフォームTPの対応する機械コードにマッピングされる必要はない。したがって、ターゲットプラットフォームTPのための効率的な機械コードを生成することができる。図6は、図5Bによる例について、対応する、自動的に生成されるx86アセンブラコードフラグメント68を示す。
他の可能な最適化は、ローカル変数とグローバル変数との間の区別、サブ関数の呼び出し、プロローグ、エピローグまたは手続きの個々のセクション(またはバケット)、条件付きジャンプ、基本レジスタのロードに関するものであり、これらは、プログラム論理PLを変更することなく、ターゲットプラットフォームZPの対応する機械コマンドによって置き換えることができる。
1 コンピュータプログラム、2 S/390バイナリコード、3 JITトランスレータ、4 第1のx86バイナリコード、5 逆アセンブラ、6 (逆アセンブルされた)アセンブラコード、7 変換プログラム、8 第2のx86バイナリコード、9 逆コンパイラ、10 汎用プログラムコード、11 分析プログラム、12 x86コード生成器、13 第3のx86バイナリコード、14 コードオプティマイザ、30 方法、40 再コンパイルシステム、41 機械コード、42 バイトストリーム、43 テキストファイル、44 サンプルパーサ、45 トークン、47 LRパーサ、48 (プログラム論理の)階層的表現、50 アセンブラコード(ターゲットプラットフォーム用)、51 実行可能なアセンブラプログラム、52 アセンブラ、53 実行可能なコード(ターゲットプラットフォーム用)、60 構文ツリー、61 割り当て式、62 追加式、63 変数割り当て、64 さらなる式、65 定数、66 因子、67 変数検索、68 アセンブラコードフラグメント、L1 バイナリコードレベル、L2 アセンブラコードレベル、L3 コード最適化レベル、L4 中間言語レベル、L5 高言語レベル、CM コードパターン、IL 中間言語、SP ソースプラットフォーム、TP ターゲットプラットフォーム、PL プログラム論理、TS 終端記号、NTS 非終端記号

Claims (11)

  1. 中間言語におけるプログラム論理の表現を生成するための方法であって、
    第1のプロセッサアーキテクチャのための低水準プログラミング言語での第1のプログラムコードを捕捉するステップであって、前記第1のプログラムコードは、プログラム論理を実装し、高水準言語で定義された前記プログラム論理をコンパイラでコンパイルすることによって生成されている、捕捉するステップと、
    前記捕捉された第1のプログラムコードを、前記コンパイラに特有の少なくとも部分的にパラメータ化されたコードパターンの所定のセットに基づいてコードセクションのシーケンスに分割するステップであって、前記コードパターンは、前記コンパイラが前記高水準言語の既知の原子要素を前記第1のプログラムコードにおいて実装するために使用されており、各コードセクションに対して、対応するパラメータ化されたコードパターンの各パラメータに対する特定のパラメータ値が捕捉され、前記中間言語の終端記号は、各コードセクションに割り当られる、分割するステップと、
    前記コードセクションのシーケンスに割り当てられた前記終端記号を、前記中間言語の文脈自由文法に基づいて前記中間言語の非終端記号に割り当てるステップであって、前記割り当てられた非終端記号の全体が、前記中間言語における前記第1のプログラムコードの前記プログラム論理を記述する、割り当てるステップと、
    前記中間言語の前記割り当てられた非終端記号および前記捕捉されたパラメータ値に基づいて、前記第1のプロセッサアーキテクチャから独立した前記プログラム論理の表現を生成するステップと、を含む、方法。
  2. 前記分割するステップにおいて、前記第1のプログラムコードの前記コードセクションは、パターンマッチングによって、前記コンパイラに特有の少なくとも部分的にパラメータ化されたコードパターンの前記所定のセットと比較され、検査されたコードセクションに対して、対応するパラメータ化されたコードパターンの各パラメータに対するパラメータ値の一貫した割り当てが可能である場合にのみ、対応する終端記号が割り当てられる、請求項1に記載の方法。
  3. 前記割り当てるステップにおいて、前記中間言語の非終端記号に少なくとも1つのコンテキスト依存条件が、前記分割するステップで捕捉された前記パラメータ値に基づいてチェックされ、前記少なくとも1つのコンテキスト依存条件が、前記対応するコードセクションの前記捕捉されたパラメータ値によって満たされない場合、前記非終端記号への可能な割り当てが不正確であるとして拒否される、請求項1または2に記載の方法。
  4. 前記割り当てステップにおいて、前記コードセクションのシーケンスに割り当てられた終端記号のシーケンスが、パーサ、特にボトムアップパーサによって、前記プログラム論理の階層的表現に変換され、前記階層的表現の上位要素は、前記中間言語の前記非終端記号に対応し、前記階層的表現の下位要素は、前記中間言語の前記終端記号にのみ対応する、請求項1~3のいずれか一項に記載の方法。
  5. 前記生成するステップにおいて、第2のプログラムコードが、前記中間言語の関連する前記非終端記号に基づいて第2のプロセッサアーキテクチャのための低水準プログラミング言語で生成され、前記第2のプロセッサアーキテクチャを有するプロセッサ上で前記第2のプログラムコードを実行すると、プログラムステップが、前記高水準言語で定義された前記プログラム論理にしたがって実行される、請求項1~4のいずれか一項に記載の方法。
  6. 逆コンパイル装置であって、
    第1のプロセッサアーキテクチャのプロセッサのために捕捉された第1のプログラムコードを、少なくとも部分的にパラメータ化されたコードパターンの所定のセットに基づいてコードセクションのシーケンスに分割するための照合器であって、前記第1のプログラムコードは、プログラム論理を実装し、コンパイラによって高水準言語で定義されたコンピュータプログラムをコンパイルすることによって生成されており、前記コードパターンは、前記コンパイラが前記高水準言語の既知の原子要素を前記第1のプログラムコードにおいて実装するために使用されており、前記照合器は、対応するパラメータ化されたコードパターンの各パラメータに対して各コードセクションの特定のパラメータ値について捕捉し、各コードセクションに中間言語の終端記号を割り当てる、照合器と、
    前記コードセクションのシーケンスに割り当てられた終端記号のシーケンスを前記中間言語の非終端記号に縮小するためのパーサ、特にボトムアップパーサであって、縮小によって前記パーサによって生成された前記非終端記号の全体が、前記中間言語における前記コンピュータプログラムの前記プログラム論理を記述する、パーサと、を含む、逆コンパイル装置。
  7. 前記照合器が、さらに、前記第1のプロセッサアーキテクチャのためのバイナリコードまたはアセンブリコードを捕捉し、そこに含まれる前記第1のプログラムコードの機械コードを抽出するように適合された、請求項6に記載の逆コンパイル装置。
  8. 前記パーサは、非終端記号に縮小するときに、少なくとも1つの文脈条件とのコンプライアンスをチェックし、前記少なくとも1つの文脈条件が、前記対応するコードセクションの前記捕捉されたパラメータ値によって満たされない場合、前記非終端記号への可能な縮小を不正確として拒否するように適合された、請求項6または7に記載の逆コンパイル装置。
  9. 前記少なくとも部分的にパラメータ化されたコードパターンの所定のセットの定義を有する少なくとも1つのテキストファイル内で読み取るためのパターンパーサをさらに含む、請求項6~8のいずれか一項に記載の逆コンパイル装置。
  10. 請求項6~9のいずれか一項に記載の逆コンパイル装置と、前記中間言語で表現された前記プログラム論理を、第2のプロセッサアーキテクチャのための前記コンピュータプログラムに対応する機械コードに変換するための少なくとも1つのコード生成装置と、を含む、再コンパイルシステム。
  11. コンピュータシステムのプロセッサに、
    第1のプロセッサアーキテクチャのプロセッサのための捕捉された第1のプログラムコードを、少なくとも部分的にパラメータ化されたコードパターンの所定のセットに基づいてコードセクションのシーケンスに分割するステップであって、前記第1のプログラムコードは、プログラム論理を実装し、コンパイラによって高水準言語で定義されたコンピュータプログラムをコンパイルすることによって生成されており、前記コードパターンは、前記コンパイラが前記高水準言語の既知の原子要素を前記第1のプログラムコードにおいて実装するために使用されており、対応するパラメータ化されたコードパターンの各パラメータに対する特定のパラメータ値が、各コードセクションに対する前記分割中に捕捉され、中間言語の終端記号が、各コードセクションに割り当てられる、分割するステップと、
    前記コードセクションの分割されたシーケンスに割り当てられた前記終端記号を、前記中間言語の文脈自由文法に基づいて前記中間言語の非終端記号に割り当てるステップであって、前記割り当てられた非終端記号の全体が、前記中間言語で前記コンピュータプログラムの前記プログラム論理を記述する、割り当てるステップと、を実行させるためのプログラムコード
JP2021552541A 2019-03-04 2020-02-12 プログラム論理の表現を生成する方法、逆コンパイル装置、再コンパイルシステムおよびコンピュータプログラム製品 Active JP7391983B2 (ja)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
DE102019105418.4 2019-03-04
DE102019105418.4A DE102019105418B3 (de) 2019-03-04 2019-03-04 Verfahren zum Erzeugen einer Darstellung einer Programmlogik, Dekompiliervorrichtung, Rekompiliersystem und Computerprogrammprodukte
PCT/EP2020/053637 WO2020177994A1 (de) 2019-03-04 2020-02-12 Verfahren zum erzeugen einer darstellung einer programmlogik, dekompiliervorrichtung, rekompiliersystem und computerprogrammprodukt

Publications (2)

Publication Number Publication Date
JP2022522880A JP2022522880A (ja) 2022-04-20
JP7391983B2 true JP7391983B2 (ja) 2023-12-05

Family

ID=69699831

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2021552541A Active JP7391983B2 (ja) 2019-03-04 2020-02-12 プログラム論理の表現を生成する方法、逆コンパイル装置、再コンパイルシステムおよびコンピュータプログラム製品

Country Status (5)

Country Link
US (2) US11748076B2 (ja)
EP (1) EP3935489A1 (ja)
JP (1) JP7391983B2 (ja)
DE (1) DE102019105418B3 (ja)
WO (1) WO2020177994A1 (ja)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114327497A (zh) * 2020-09-30 2022-04-12 华为技术有限公司 一种代码处理方法、装置及设备

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2007249991A (ja) 2003-05-02 2007-09-27 Transitive Ltd プログラム・コード変換用の中間表現を生成するための改善されたアーキテクチャ

Family Cites Families (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH05134880A (ja) 1991-06-05 1993-06-01 Fujitsu Ltd デイジタル計算機
US5860008A (en) 1996-02-02 1999-01-12 Apple Computer, Inc. Method and apparatus for decompiling a compiled interpretive code
US5916305A (en) * 1996-11-05 1999-06-29 Shomiti Systems, Inc. Pattern recognition in data communications using predictive parsers
US7363310B2 (en) * 2001-09-04 2008-04-22 Timebase Pty Limited Mapping of data from XML to SQL
EP1910923A2 (en) * 2005-07-25 2008-04-16 Hercules Software, LLC Direct execution virtual machine
EP2008200B1 (en) * 2006-04-06 2017-09-27 Yale University Framework of hierarchical sensory grammars for inferring behaviors using distributed sensors
US7818311B2 (en) * 2007-09-25 2010-10-19 Microsoft Corporation Complex regular expression construction
US20100037213A1 (en) * 2008-08-07 2010-02-11 Microsoft Corporation Grammar-based generation of types and extensions
CN107908955B (zh) * 2017-11-30 2019-11-12 华中科技大学 一种基于中间语言分析的控制流完整性保护方法及系统

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2007249991A (ja) 2003-05-02 2007-09-27 Transitive Ltd プログラム・コード変換用の中間表現を生成するための改善されたアーキテクチャ

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
NOLAN, Godfrey,"デコンパイリングJava",初版,株式会社オライリー・ジャパン,2010年06月,p.135-136,143-144,ISBN: 978-4-87311-449-1

Also Published As

Publication number Publication date
EP3935489A1 (de) 2022-01-12
US20220147329A1 (en) 2022-05-12
WO2020177994A1 (de) 2020-09-10
US11748076B2 (en) 2023-09-05
US20230367569A1 (en) 2023-11-16
JP2022522880A (ja) 2022-04-20
DE102019105418B3 (de) 2020-08-13

Similar Documents

Publication Publication Date Title
USRE38104E1 (en) Method and apparatus for resolving data references in generated code
Grimm Better extensibility through modular syntax
US5586328A (en) Module dependency based incremental compiler and method
Fraser et al. Engineering a simple, efficient code-generator generator
US5230049A (en) Program source code translator
US7992140B2 (en) Compiler supporting programs as data objects
US20030088860A1 (en) Compiler annotation for binary translation tools
US5838980A (en) Compilation and virtual machine arrangement and process for source code including pre-runtime executable language structure constructs
JPH06501583A (ja) 多言語最適化コンパイラ内のフォールディングメカニズムを構成する方法
EP1672488A2 (en) Compile time linking via hashing technique
US20230367569A1 (en) Method of generating a representation of a program logic, decompilation apparatus, recompilation system and computer program products
CN112379917A (zh) 浏览器兼容性提升方法、装置、设备及存储介质
US6625807B1 (en) Apparatus and method for efficiently obtaining and utilizing register usage information during software binary translation
Aaby Compiler construction using flex and bison
Biboudis et al. Recaf: Java dialects as libraries
US7152223B1 (en) Methods and systems for compiling and interpreting one or more associations between declarations and implementations in a language neutral fashion
US7207036B2 (en) Preprocessing of interfaces to allow fast call through
Sah et al. An introduction to the Rush language
CN110110299B (zh) 文本变换方法、装置以及服务器
Brady Cross-platform compilers for functional languages
Nguyen Compiler design and implementation in OCaml with LLVM framework
Pammer Fast Machine-code generation for stack-based languages
Flatt The Racket Reference
JP3596570B2 (ja) クラスの主記憶装置への配置方法
Louden et al. Compilers and Interpreters.

Legal Events

Date Code Title Description
A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20211102

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20211102

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20221125

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20230110

A711 Notification of change in applicant

Free format text: JAPANESE INTERMEDIATE CODE: A711

Effective date: 20230309

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20230407

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20230725

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20231024

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: 20231107

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20231122

R150 Certificate of patent or registration of utility model

Ref document number: 7391983

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150