JP2013506171A - 意味論的値を利用するオブジェクト・レベルの互換性及びクラスのサイズ変更 - Google Patents

意味論的値を利用するオブジェクト・レベルの互換性及びクラスのサイズ変更 Download PDF

Info

Publication number
JP2013506171A
JP2013506171A JP2012530061A JP2012530061A JP2013506171A JP 2013506171 A JP2013506171 A JP 2013506171A JP 2012530061 A JP2012530061 A JP 2012530061A JP 2012530061 A JP2012530061 A JP 2012530061A JP 2013506171 A JP2013506171 A JP 2013506171A
Authority
JP
Japan
Prior art keywords
binary
class
hard
value
computing device
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.)
Granted
Application number
JP2012530061A
Other languages
English (en)
Other versions
JP5506936B2 (ja
Inventor
ガンドルフィ、フェデリコ、エイドリアン
クレアラー、ロバート、エム、エヌ
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
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 Corp filed Critical International Business Machines Corp
Publication of JP2013506171A publication Critical patent/JP2013506171A/ja
Application granted granted Critical
Publication of JP5506936B2 publication Critical patent/JP5506936B2/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

Landscapes

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

Abstract

【課題】 コンピュータ・システムのための実行可能プログラムを作成する方法を提供すること。
【解決手段】 高水準言語で記述されたソフトウェア・コードを計算装置上でバイナリ・オブジェクトに変換する方法は、高水準言語で記述されたソフトウェア・コードを計算装置において受け取ることと、計算装置においてソフトウェア・コードをバイナリ・オブジェクトのファイルに翻訳することとを含む。翻訳することは、値がバイナリ・オブジェクトにハードコード化されることを必要とする対象項目をソフトウェア・コードが含むこと、及びクラスがサイズ変更可能であることを判定することと、ハードコード化された値を表す意味変数を作成し、意味変数及びハードコード化された値をバイナリ・オブジェクト内のテーブルに格納することとを含む。
【選択図】 図3

Description

本発明は、コンピュータ・システムのための実行可能プログラムを作成することに関し、より具体的には、意味論的値を使用してソフトウェア・コードを翻訳することに関する。
コンピュータ・プログラムは、典型的には、バイナリ・オブジェクトと呼ばれる1つ又は複数のコンポーネントから構成される。各バイナリ・オブジェクトは、プログラムをそのコンポーネントとして構成する実行可能コード又はモジュールの一部を表す。バイナリ・オブジェクトは、典型的には、より高水準の言語で記述されたソフトウェア・コードをバイナリ・オブジェクトに変換するコンパイラ(トランスレータとも呼ばれる)によって作成される。
バイナリ・オブジェクトは次に、互いにリンクされて、完全な実行可能プログラムを構成する。このタスクを実行するソフトウェア・ツールは、リンカと呼ばれる。
プログラムを実行する前に、そのプログラムをコンピュータのメモリ内にロードしなければならない。このタスクを実行するオペレーティング・システムのコンポーネントは、プログラム・ローダと呼ばれる。種々の理由のために、プログラムのいくつかのコンポーネントは、リンカによってプログラムにリンクされないことがある。その代わり、これらのコンポーネントは、ローダによって実行可能プログラム(executable)に加えられる。このようなコンポーネントは、典型的には、共有オブジェクト、共有ライブラリ、又は動的にロードされたライブラリと呼ばれる。
プログラムを多数のバイナリ・オブジェクトに分割することの利点の1つは、モジュール性である。1つのバイナリ・オブジェクトに対応するソース・コードを、その他のすべてのバイナリ・オブジェクトに対する変更を必要とすることなく、変更することができるようにすることが可能である。特に、コンパイラを用いて再び翻訳する必要があるのは、そのソース・コードが変更されたバイナリ・オブジェクトのみである。共有ライブラリを含めて、影響を受けないモジュールは、再翻訳される必要はない。
AIX、Linux、Windows及びZ/OSを含むがこれらに限定されない現代のオペレーティング・システムにおいて広く用いられているリンカ/ローダ技術は、普及しているオブジェクト指向プログラミング言語の登場の前に考案された。そのため、これらの言語は、今日利用可能な種類のモジュール性によっては上手く対処できない新たな複雑さを生じさせる。具体的には、オブジェクト指向プログラマの日常の仕事中に一般に生じるいくつかのアクティビティは、直接影響を受けるバイナリ・オブジェクトだけでなく、プログラム全体を再翻訳することを必要とする。これらのアクティビティとしては、仮想関数をクラス・インターフェースに加えること、仮想関数をクラス・インターフェースから取り除くこと、仮想関数を因数分解して基底クラスのインターフェースにすること、データメンバをクラス・インターフェースに加えること、及び、新しい基底クラスを既存のクラスに加えることが挙げられるが、これらに限定されない。
プログラムの構成要素のバイナリ・オブジェクトのすべてをその共有ライブラリも含めて再コンパイルすることなく、これらのアクティビティを実行することができないことは、多大な制限である。単一の共有ライブラリが、多くの別々のアプリケーション・プログラムによって用いられている場合がある。結果として、これらの変更のいずれかが共有ライブラリ内でなされた場合、その共有ライブラリをコンポーネントとするすべてのアプリケーション・プログラムも再翻訳(再コンパイル)しなければならないことになる。アプリケーションのユーザは、熟練したプログラマではなく、適切なソフトウェア・ツールを所有せず、又はプログラムのソース・コードへのアクセス手段を持たないので、これは不可能である場合が多い。そのうえ、ユーザは、将来的にリンクするモジュール又は過去の開発に由来するモジュールを制御することができないかもしれない。結果として、共有ライブラリの作者は、自身のソフトウェアに対して行うことができる変更の種類に関して著しく制約される。場合によっては、これらの制約は単純なバグの修復さえ不可能にする。これは、リリース間バイナリ互換性(RRBC)問題として文献公知である。
本発明の目的は、上記の問題を解決する、コンピュータ・システムのための実行可能プログラムを作成する方法を提供することである
本発明の1つの実施形態によれば、高水準言語で記述されたソフトウェア・コードを計算装置上でバイナリ・オブジェクトに変換する方法が開示される。この実施形態は、高水準言語で記述されたソフトウェア・コードを計算装置において受け取ることと、計算装置においてソフトウェア・コードをバイナリ・オブジェクト・ファイルに翻訳することとを含む。翻訳することは、値がバイナリ・オブジェクトにハードコード化されることを必要とする対象項目をソフトウェア・コードが含むことと、そのクラスがサイズ変更可能であることとを判定することを含む。この実施形態における翻訳することは、ハードコード化された値を表す意味変数を作成することと、意味変数及びハードコード化された値をバイナリ・オブジェクト内のテーブルに格納することも含む。
本発明の別の実施形態は、複数のバイナリ・オブジェクトから実行可能プログラムを作成するための方法に向けられる。この実施形態の方法は、計算装置において、ハードコード化された値を必要とする少なくとも1つの値についてのハードコード化された値を表す意味変数のテーブルをすくなくとも1つが含む、第1の複数のバイナリ・オブジェクトを受け取ることと、第1の複数のバイナリ・オブジェクトを互いにリンクし、少なくとも1つのバイナリ・オブジェクト内の意味変数を少なくとも1つのテーブル内のハードコード化された値で置換することと、を含む。本方法は、第1の複数のバイナリ・オブジェクトを1つ又は複数の追加のバイナリ・オブジェクトと組み合わせて、動作のために計算装置へとロードすることも含む。
さらなる特徴及び利点は、本発明の技術を通じて理解される。本発明のその他の実施形態及び態様は、本明細書において詳細が説明され、特許請求される発明の一部と見なされる。本発明を利点及び特徴と共により良く理解するために、説明及び図面を参照されたい。
本発明と見なされる主題は、本明細書の結論部分の特許請求の範囲において具体的に指示され、明確に特許請求される。本発明の前述及びその他の特徴及び利点は、添付の図面と併せて解釈される以下の詳細な説明から明らかである。
本発明の実施形態に従う計算装置についてのシステム図である。 本発明の実施形態によって実行される処理の例を示すデータフロー図である。 本発明の実施形態に従う翻訳の方法を示す。 本発明の実施形態に従うバイナリ・オブジェクトをリンクする方法を示す。
本発明の実施形態は、典型的にはコンパイラによってバイナリ・オブジェクトに記述される特定の値が、その代わりに、変数と、後でリンカ又はローダのいずれかによって記述される値とで置き換えられる、コンパイラ−リンカ−ローダ・システムに向けられる。このようなシステムは、C又はC++といった高水準プログラミング言語で記述されたプログラムでの使用に特に有用であり得る。当然のことながら、本発明は、C又はC++で記述されたプログラムでの使用のみに限定されず、他の言語で記述されたプログラムで使用することもできる。
従来のC++実装は、トランスレータの実行中に(すなわち、コンパイル時に)、以下の項目、すなわち、いずれかのクラス型のサイズ、いずれかのデータメンバのクラス内でのオフセット、及びいずれかの仮想関数ポインタのクラスの仮想テーブル(vテーブル又は均等物)内でのオフセット、を計算する。これらの値は、トランスレータによってオブジェクト・ファイルに記述される。本発明においては、トランスレータは、その代わりに、値にリンクされた変数を含むテーブルを作成する。値ではなく変数がオブジェクトに記述され、この変数をリンカ又はローダが用いて、テーブルにアクセスして値を置換する。したがって、再コンパイルされる必要があるのは、プログラムのすべての部分ではなく、上記の項目の定義を変更するオブジェクト・ファイルのみである。
図1は、本発明の実施形態を実装することができるコンピュータ・システムの例を示す。システムは分散型とすることもでき、後述のシステムの部分が、互いに異なる物理的位置に存在することができることを理解すべきである。
この実施形態において、システム100は、1つ又は複数の中央処理装置(プロセッサ)101a、101b、101c等(集合的又は総称的にプロセッサ101と呼ばれる)を有する。1つの実施形態において、各プロセッサ101は、縮小命令セットコンピュータ(RISC)マイクロプロセッサを含むことができる。プロセッサ101は、システム・バス113を介してシステム・メモリ114及び種々の他のコンポーネントに結合される。読み出し専用メモリ(ROM)102は、システム・バス113に結合され、システム100の特定の基本機能を制御する基本入力/出力システム(BIOS)を含むことができる。
図1は、さらに、システム・バス113に結合された入力/出力(I/O)アダプタ107及びネットワーク・アダプタ106を示す。I/Oアダプタ107は、ハードディスク103及び/又はテープ記憶ドライブ105又はその他のいずれかの同様のコンポーネントと通信する、小型コンピュータ・システム・インターフェース(SCSI)アダプタとすることができる。I/Oアダプタ107、ハードディスク103及びテープ記憶装置105は、ここでは集合的に大容量記憶装置104と呼ばれる。ネットワーク・アダプタ106は、バス113を、データ処理システム100が他のこのようなシステムと通信するのを可能にする外部ネットワーク116と相互接続させる。スクリーン(例えば、ディスプレイ・モニタ)115は、グラフィックを多用するアプリケーションの性能を向上させるためのグラフィック・アダプタとビデオ・コントローラとを含むことができるディスプレイ・アダプタ112によって、システム・バス113に接続される。1つの実施形態において、アダプタ107、106及び112は、中間バス・ブリッジ(図示せず)を介してシステム・バス113に接続される1つ又は複数のI/Oバスに接続することができる。ハードディスク・コントローラ、ネットワーク・アダプタ及びグラフィック・アダプタといった周辺機器を接続するための好適なI/Oバスは、典型的には、周辺コンポーネント・インターフェース(PCI)のような共通のプロトコルを含む。付加的な入力/出力装置は、ユーザ・インターフェース・アダプタ108及びディスプレイ・アダプタ112を介してシステム・バス113に接続されるものとして描かれている。キーボード109、マウス110及びスピーカ111はすべて、例えば、多数のデバイス・アダプタが単一の集積回路に組み込まれたスーパーI/Oチップを含むことができるユーザ・インターフェース・アダプタ108を介して、バス113に相互接続される。
このように、図1において構成されるように、システム100は、プロセッサ101の形態の処理手段と、システム・メモリ114及び大容量記憶装置104を含む記憶手段と、キーボード109及びマウス110といった入力手段と、スピーカ111及びディスプレイ115を含む出力手段とを含む。1つの実施形態において、システム・メモリ114及び大容量記憶装置104の一部は、図1に示される種々のコンポーネントの機能を連係させるために、IBM(登録商標)コーポレーションのAIX(登録商標)オペレーティング・システムのようなオペレーティング・システムを集合的に格納する。
システム100は、任意の好適なコンピュータ又は計算プラットフォームとすることができ、端末、無線装置、情報家電、デバイス、ワークステーション、ミニコンピュータ、メインフレーム・コンピュータ、携帯情報端末(PDA)又はその他の計算装置を含むことができることが理解されよう。システム100は、通信ネットワークによって互いにリンクされる多数の計算装置を含むことができることを理解されたい。例えば、2つのシステム間にクライアント−サーバ関係が存在してもよく、その2つの間で処理を分割することができる。
システム100がサポートできるオペレーティング・システムの例は、Windows(登録商標)95、Windows(登録商標)98、Windows NT(登録商標)4.0、Windows XP(登録商標)、Windows(登録商標)2000、Windows(登録商標)CE、Windows Vista(登録商標)、Mac OS、Java(登録商標)、AIX(登録商標)、LINUX及びUNIX(登録商標)、又はその他のいずれかの好適なオペレーティング・システムを含む。システム100は、ネットワーク116上での通信のためのネットワーク・インターフェース106も含む。ネットワーク116は、ローカル・エリア・ネットワーク(LAN)、都市域ネットワーク(MAN)、又はインターネット若しくはワールド・ワイド・ウェブといった広域ネットワーク(WAN)とすることができる。
システム100のユーザは、標準的な電話回線、デジタル加入者回線、LAN又はWANリンク(例えば、T1、T3)、ブロードバンド接続(フレーム・リレー、ATM)及び無線接続(例えば、802.11(a)、802.11(b)、802.11(g))
といった任意の好適なネットワーク・インターフェース116接続を通じてネットワークに接続することができる。
本明細書で開示されるように、システム100は、ユーザのスクリーン115上に示される情報の取り込み及び対話式表示のための、機械可読媒体(例えば、ハードディスク104)上に格納される機械可読命令を含む。ここで論じられるように、命令は、「ソフトウェア」120と呼ばれる。ソフトウェア120は、当該技術分野で公知のソフトウェア開発ツールを用いて生成することができる。ソフトウェア120は、当該技術分野で公知のユーザ対話能力を提供するための種々のツール及び特徴を含むことができる。
いくつかの実施形態において、ソフトウェア120は、別のプログラムへのオーバーレイとして提供される。例えば、ソフトウェア120は、アプリケーション(又はオペレーティング・システム)に「アドイン」として提供することができる。「アドイン」という用語は、当該技術分野で公知のように補足的なプログラム・コードのことを一般に指すことに留意されたい。このような実施形態において、ソフトウェア120は、そのソフトウェアが協働するアプリケーション又はオペレーティング・システムの構造又はオブジェクトを置換することができる。
図2は、1つの実施形態によるシステム内のデータ移動を示すデータフロー図である。システムは、トランスレータ202を含む。トランスレータ202は、いずれかの既知のコンパイラに基づくものとすることができる。トランスレータ202は、1つ又は複数のソース・コード・ファイル204を受け取り、各ソース・コード・ファイルをオブジェクト・ファイル206に変換する。当然のことながら、ソース・コード・ファイルの正確な数は様々であり得、例えば、多くのアプリケーションによって用いられる共有ライブライリ又は他のソース・コード・ファイルを含んでいてもよい。
しかしながら、トランスレータ202は、ソース・コードからオブジェクト・ファイルを作成する方式が典型的なトランスレータとは異なり得る。特に、トランスレータ202は、従来のコンパイラでは典型的にはハードコード化されてオブジェクト・ファイルにされていた特定の値にリンクする変数を含むテーブル208を、各オブジェクト・ファイル内に作成することができる。値ではなく変数がオブジェクトに記述され、その変数をリンカ210又はローダ212が用いてテーブルにアクセスし、そのときに変数が値で置換される。
システムは、リンカ210も含む。リンカ210は、従来のリンカと類似したものとすることができる。リンカ又はリンク・エディタは、コンパイラ202によって生成された1つ又は複数のオブジェクト206を取得し、それらを組み合わせて単一の実行可能プログラム212にするプログラムである。しかしながら、本発明の1つの実施形態によるリンカ210は、各オブジェクト・ファイル206のテーブル208を調べて、従来技術のコンパイラの場合には典型的にはオブジェクト・ファイル206に記述されていた静的値を変数に代入するように構成することができる。これらの値は、実行可能プログラム内でハードコード化される。ハードコード化された値は、変化しない値である。ハードコード化された値の例は、変数が特定の整数に割り当てられる場合である。当然のことながら、テーブルに含まれた値のすべてがハード値に変換されるわけではなく、実行可能プログラムは、実行可能変数テーブル214を含むことができる。
システムは、ローダ216を含むこともできる。ローダは、プログラムを実行可能プログラム(すなわち、実行可能ファイル)からメモリへとロードし、実行のためにそれらを準備し、次いでそれらを実行することを担当する、オペレーティング・システムの一部である。従来技術において、ローダは、通常はオペレーティング・システムのカーネルの一部であり、通常は、システムの起動時にロードされ、そして、システムが再起動され、シャットダウンされ又は電源が切られるまでメモリ内にとどまる。ページ可能カーネルを有するいくつかのオペレーティング・システムは、ローダをメモリのページ可能部分に有する場合があり、したがって、ローダはときにはメモリからスワップアウトすることがある。プログラムのローディングをサポートするすべてのオペレーティング・システムが、ローダを有する。
本発明の実施形態によるローダ216は、従来技術のローダと類似した動作を行う。しかしながら、ローダ216もまた、各実行可能プログラム212の実行可能変数テーブル214を調べて、従来技術のコンパイラの場合には典型的にはオブジェクト・ファイル206に記述されていたハード値を変数に代入する。
図3は、本発明の1つの実施形態によるトランスレータ202(図2)の動作の方法を示す。ブロック302において、翻訳される1つの部分又はすべての部分がトランスレータで受け取られる。トランスレータ(又はコンパイラ)は、コンピュータ言語(ソース言語)で記述されたソース・コードを別のコンピュータ言語(オブジェクト・コードとして知られるバイナリ形式を有する場合が多い目的言語)に変形するコンピュータ・プログラム(又はプログラムの集合)である。ソース・コードを変形することが所望される最も一般的な理由は、実行可能プログラムを作成するためである。
ブロック304において、翻訳されるべきさらなるセクション(ソース・コード・ファイル全体又はそのセクションのどちらか)が存在するかどうかが判定される。存在しなければ、方法は終了し、翻訳は完了する。
行われるべきさらなる翻訳が存在する場合には、ブロック306において、次のセクション又はファイルが翻訳される。ブロック306(翻訳)の一部として、ブロック308において、セグメントが対象項目を含むかどうかが判定される。本明細書において用いられる「対象項目」という用語は、従来技術のトランスレータならば翻訳中に静的値を作成したであろうコード・セグメントを指すものとする。対象項目の例としては、クラス型のサイズ、クラス・オブジェクト内の非静的データメンバにアクセスするために用いられるオフセット、及び仮想関数テーブル・オフセットを挙げることができるが、これらに限定されない。従来のC++実装は、トランスレータの実行中に(すなわち、コンパイル時に)、以下の項目、すなわち、いずれかのクラス型のサイズ、いずれかのデータメンバのクラス内でのオフセット、及びいずれかの仮想関数のポインタのクラスのvテーブル(仮想テーブル又は均等物)内でのオフセット、を計算することが理解されよう。これらの計算値は、今まではトランスレータによってオブジェクト・ファイルに記述されていた、上記の「静的な」又はハードコード化された値である。
説明として、C++プログラミング言語は、クラスの使用を通じて、プログラマがプログラム特有のデータ型を定義することを可能にする。これらのデータ型のインスタンスはオブジェクトとして知られており、メンバ変数、定数、メンバ関数、及びプログラマによって定義される多重定義演算子を含むことができる。構文的には、クラスは、関数又は多重定義演算子を含むことができないC構造の拡張である。以下の説明は、C++言語についての例を説明するが、他の言語も想定されており、それらは本発明の範囲内であることを理解されたい。
ブロック310において、変数名を有する翻訳が作成される。これは、非限定的な以下の例によって示されるように、従来技術とは異なる。
コンパイル時に、C++言語トランスレータによって「sizeof」式の値が計算される。sizeof演算子は、char型のサイズに関してそのオペランドのサイズを与える。従来のC++実装は、sizeof式を、オクテットで数えたそのオペランドのサイズに等しいて定数値で置き換える。例えば、
struct S{
int datum;
};
const size_t char_size=sizeof(S);
というステートメントは、以下のように翻訳され、
const size_t char_size=4
ここで、値「4」が、バイナリ・オブジェクトへとハードコード化されることになる。
本発明の実施形態は、sizeof演算子に対するオペランドがクラス型であるか又はクラス型を有する場合に、変形された式が、sizeof式を序数値ではなく記号定数で置き換えるという点で、従来の実装とは異なり得る。例えば、本発明のトランスレータは、上記のステートメントを、
const size_t char_size=_SYMBOL_sizeof_S
と翻訳することができる。
ブロック312において、_SYMBOL_sizeof_Sのハード値(この例では4)が、テーブルに格納される。このテーブルを次にリンカ又はローダが用いて、後で式_SYMBOL_sizeof_Sに値4が挿入される。このことにより、プログラム全体を再コンパイルする必要なく、1つのセクションにおいて変更がなされ、変更を有するセクション(例えば、変更されたオブジェクト・ファイル)のみを再コンパイルすることが可能になる。このことは、上述の問題のいくつか又はすべてを軽減する。
以下の項は、コンパイラに対して行うことができるその他の変更と、それらをどのように理解することができるかを説明する。例えば、従来技術において動的にメモリを割り当てる(例えば「new」式)の場合、
struct S{
int datum;
};
S*sptr=new S
のようなステートメントは、
struct S{
int datum;
};
S*sptr=::operator new(4)
というステートメントに変形することができる。
上述のように、値「4」は、バイナリ・オブジェクトにハードコード化されるものであり、メモリ・アロケータから要求される記憶域(storage)の量を表す。この値は、メモリ・アロケータを呼び出す関数::operator newに対する引数として渡される。本発明の実施形態は、new式に対するオペランドがクラス型である場合に、変形されたnew式が、::operator newに対する引数として序数値ではなく記号定数を渡すという点で、この従来の実装とは異なり得る。例えば、上記のステートメントは、本発明の実施形態によれば、
struct S{
int datum;
};
S*sptr=::operator new(_SYMBOL_sizeof_S)
に変形することができる。
別の例として、自動スコープ指定(automatically−scoped)オブジェクトの割当ては、本発明においては異なり得る。従来技術においては、値関数パラメータを含む自動スコープ指定オブジェクトは、プログラム・スタック上で割り当てられる。所与のクラス・オブジェクトのためにスタック上に確保される記憶域の量は、バイナリ・オブジェクトにハードコード化される。本発明の実施形態は、割り当てられるオブジェクトがクラス型を有する場合に、確保される記憶域の量が、上述の方式と同じような方式で、序数値ではなく記号定数によって決定されるという点で、従来の実装とは異なり得る。
さらに別の例として、静的スコープ指定オブジェクトの割当ての場合を考える。典型的には、静的割当てを伴うクラス・オブジェクトは、プログラムがロードされるときにそれらのために確保されたメモリ内に格納される。この目的のために確保されるべき記憶域の量は、この目的のために存在するバイナリ・オブジェクト・ファイルのセクションにおいて指定される。例えば、共通オブジェクト・ファイル形式(COFF)において、各静的クラス・オブジェクトのために確保される記憶域の量は、オブジェクト・ファイルの.bssセクションにおいて指定される。本発明の実施形態においては、トランスレータは、従来のプラクティスに従ってオブジェクト・ファイルの.bssセクション(又は均等物)をコード化するが、ただし、.bssセクション(又は均等物)内の各エントリは、その静的割当てが表されているクラス・オブジェクトの型を示す追加情報を含むことになる。この追加情報を、プログラム・ローダが用いることができる。
別の例として、多重継承の存在下でのサブオブジェクトのオフセットの場合を考える。多重継承の存在下では、クラス・オブジェクトの型を大部分の派生型から基底型へ、又は基底型間で変換する場合に、「this」ポインタをオフセットを用いて調整することが必要である。例えば、以下の式を考える。
struct Left{
int datum1;
};
struct Right{
int datum2;
};
struct Derived:Left,Right{
int datum3;
};
void fn(Right*arg);
int main(){
Derived dobj;
fn(&dobj);
この例のクラス・オブジェクトdobjは、Left型のサブオブジェクトと、別のRight型のサブオブジェクトとを含む。従来のC++のコンパイラならば、Left型のサブオブジェクトをdobj内にオフセット0で配置する。Right型のサブオブジェクトは、_SYMBOL_sizeof_LeftをクラスLeft型のサイズを表す記号定数とすることで計算されるオフセットで、dobj内に配置される。DerivedMembersを、その基底クラスから継承されたメンバを除く、クラスDerived型の非静的データメンバのすべての総計サイズを表す記号定数とする。DerivedMembersは、必要とされるあらゆるアラインメント・パディングのサイズも含む。dobj内のRight型のサブオブジェクトのオフセットは、_SYMBOL_sizeof_LeftとDerivedMembersとの合計である。従来のC++トランスレータにおいては、このオフセットは、必要に応じて計算され、オブジェクト・ファイルに直接コード化される。例えば、fn()という名前の関数に対するコールにおいて、式&dobjの型は、Derived*型からRight*型に変換されなければならない。これを達成するためには、式&dobjによって表されるポインタは、オブジェクトdobjのアドレスではなく、dobjが含むRight型のサブオブジェクトのアドレスを示すように調整されなければならない。この調整は、dobjのアドレスに、dobjに対するRightサブオブジェクトのオフセットを加えることによって達成される。intのsizeofが4であり、intのアラインメントが4であると仮定すると、dobj内のRightのオフセットは8である。したがって、従来のC++コンパイラは、上記の関数main()を、
int main(){
Derived dobj;
fn(static_cast<Right*>(&dobj+8));

に変形することになる。
オフセットは、生成されたコードにおいて数値として直接的に表現される。本発明においては、そのようなオフセットは、序数値としてではなく記号定数として表される。
int main(){
Derived dobj;
fn(static_cast<Right*>(&dobj+
_SYMBOL_offsetof_Right_within_Derived));
これらの同じオフセットが、仮想関数が呼び出されるときに用いられる。しかしながら、オフセットの値は仮想関数をディスパッチするために用いられるオブジェクトの動的な型に依存するので、プログラムが実行されるまでオフセットの動的な型を知ることができないという理由で、オフセットを関数コール位置内にコード化することができない。この理由のため、オフセットは、vテーブル内に「this adjustment」としてコード化される。これを達成するための2つの一般的な技術が存在し、すなわち(1)vテーブルの各エントリは、仮想関数及び適切なオフセットに対するポインタから構成されるペアである、又は(2)vテーブルは、実行可能コードに対するポインタからのみ構成され、このポインタによって参照されるコードは、仮想関数、又はオフセットがゼロ以外である場合には「アジャスタ・サンク」のいずれかとすることができ、アジャスタ・サンクは、正しいオフセットを呼出し元オブジェクトのthisポインタに加え、次に仮想関数へと分岐する。いずれの場合でも、従来のC++トランスレータは、数値を用いてオフセットを表す。本発明においては、上述のように、オフセットは記号定数を用いて表される。
別の例は、動的キャスト・テーブルに関係するものであり得る。C++実装は、プログラム実行中にクラス型の相互変換が計算されることを可能にするために、動的キャスト・テーブルを生成する。動的キャスト・テーブルは、上で説明されたものと類似した、サブオブジェクトのオフセットを含む。本発明においては、これらのオフセットは、上述のように、記号定数を用いて表される。
クラスのサイズに加えて、従来のC++実装は、クラス・オブジェクト内の非静的データメンバにアクセスするために用いられるオフセットをハードコード化する。本発明において、オフセットは、記号定数を用いて表される。この技術は、直接メンバ・アクセス、及び非静的データメンバに対するポインタの両方に適用される。
さらに、本発明の実施形態は、上記の技術を、仮想関数テーブル・オフセットの場合に適用することができる。あるクラスのvテーブル内の個々のエントリは、そのvテーブル内へのオフセットを用いてアクセスされる。従来のC++実装は、これらのオフセットを関数コール位置にハードコード化する。例えば、
struct Base{
virtual void foo()const{}
virtual void bar()const{}
};
struct Derived:Base{
virtual void bar()const{}
};
int main(){
const Base&ref=Derived();
ref.bar();
各vテーブル・エントリが4バイトを占有し、vテーブルに対するポインタが、クラス型がBase又はDerivedのオブジェクトの開始からオフセット0で配置される場合には、main()内の関数bar()に対するコールは、以下のように変形される。
(**((void(**)()const)(ref−>0+4)))(ref)
部分式ref−>0は、vテーブルの開始のアドレスを表し、数字4は、仮想メンバ関数bar()を表すエントリのvテーブル内でのオフセットである。本発明においては、この数字は、記号定数によって置き換えられる。
クラスのvテーブルは、仮想基底ポインタ(VBP)を含むこともできる。これらは、親クラス(containing class)オブジェクト内部での基底クラス・サブオブジェクトのオフセットに等しく、上で説明したのと同様に扱われる。
上述の説明は、ブロック310で行うことができる置換の例を詳述する。それらを表すのに用いられる値及び記号定数は、ブロック312においてオブジェクト・ファイルのテーブル内に格納されることを理解されたい。
上記において識別した記号定数の各々は、ブロック312において作成されたオブジェクト・ファイル形式の随意的なヘッダ又はフッタ・セクション内に配置される4つのテーブルのうちの1つにおいて定義することができる。プログラム・リンカ及びローダを本発明に従って拡張して、プログラム・リンカ及びローダがこのセクションを読み取ることを可能にすることができる。1つの実施形態において、4つのテーブルは、以下のテーブルを含む。すなわち、1)クラス型ごとに単一の列を充てる、クラス型サイズのテーブル。このテーブルにおいて、所与の列は、情報の3つの項目、すなわち、クラス型のサイズを表す記号定数の名前と、通常の方法を用いて言語トランスレータによって判定されたクラス型のサイズと、そのクラス型がリンカ/ローダによってサイズ変更することができるかどうかを示すフラグとを含む。2)上述のような、親クラス内でのサブオブジェクト・オフセットのテーブル。所与の列は、情報の2つの項目、すなわち、記号定数の名前と、オフセットの値とを含む。3)非静的データメンバ・オフセットのテーブル。所与の列は、情報の2つの項目、すなわち、記号定数の名前と、オフセットの値及び値とを含む。4)vテーブル・オフセットのテーブル。
1つの実施形態において、目的の実行可能プログラムが動的ライブラリ又は共有ライブラリにリンクしていない場合には、上述の記号定数のすべてをリンカによって解決することができる。実行可能コード内に現れる各記号定数は、適切なテーブルによって判定されように、対応する値で置換される。これらのテーブルを含むヘッダ又はフッタ・セクションは随意的であるので、本発明を具体化するリンカは、これらのファイルを含むバイナリ・オブジェクトを、これらを含まないバイナリ・オブジェクトと同様に消費することができる。この理由から、既存のC++のコンパイラを拡張して本発明を具体化することが可能であり、より以前のバージョンのコンパイラによって作成されたバイナリ・オブジェクトを、そのテーブルを生成した新しいバージョンのコンパイラによって作成されたバイナリ・オブジェクトにリンクすることができる。
図4は、本発明の実施形態に従ってリンカ又はローダがどのように動作し得るかのフローチャートを示す。ブロック402において、トランスレータによって作成されたバイナリ・オブジェクトが、リンカで受け取られる。受け取りは、リンカと同じ位置又は異なる位置のコンパイラからであり得る。リンカは、ブロック404において、オブジェクト・ファイルを調査して、本発明に従ういずれかテーブルをオブジェクト・ファイルが含むかどうか判定する。テーブルが存在する場合には、ブロック406において、リンカによって、記号定数が静的値で置換される。このプロセスは、以下で詳述する。ブロック408において、リンカは、従来技術と同様にオブジェクトをリンクし続ける。
上述のように、ブロック406において記号定数が置換される。通常、クラス型は、それを用いるあらゆるプログラム・モジュール内で定義されている。あるクラス型が何らかの方法で修正される場合には、そのクラス型を定義するプログラム・モジュールに対応するあらゆるバイナリ・オブジェクトを再コンパイルしなければならない。従来のC++トランスレータ/リンカ環境において、あるクラスがなんらかの方法で修正された後の、そのクラス定義を含むあらゆるモジュールの再翻訳の失敗は、実行中のリンク時間エラー又はプログラム誤動作を生じさせることになる。本発明の実施形態によるリンカは、この問題に対処することができる。クラス定義がそのサイズが変更されるような方法で修正される場合、又はいずれかの非静的データメンバ若しくは基底クラス・サブオブジェクトのその中での位置が変更される場合を考える。上述のテーブルは、リンカが、所与のクラス型の定義に関するバイナリ・オブジェクト間の不一致を検出することを可能にするのに十分な情報を含む。これらの不一致の調整は、以下の方法のいずれかで行うことができる。すなわち、1)時刻及び日付スタンプ:最新に作成されたバイナリ・オブジェクトからの情報を使用する。2)クラス・バージョン管理:プログラマがプラグマ・ダイレクティブ(programa directive)によってバージョン番号をそのクラスに関連付けることを可能にし、クラスの最新のバージョンに関連付けられた情報を使用する。3)プログラマの対話:プログラマが、リンカを呼び出すときに、不一致をどのように解決するかを直接指定することを可能にする。4)最も大きいクラスを作り出す結果となるクラス定義のバージョンをもたらす。5)不一致の原因となるクラスに対応するvテーブルを含むバイナリ・オブジェクトからの情報をもたらす。
ローダは、1つ又は複数の共有ライブラリが利用される場合には、リンカに関して上で説明した方式と同じように動作することができることに留意されたい。
当然のことながら、当業者であれば認識するように、本発明の実施形態は、いくつかの個別の状況においては困難に遭遇するかもしれない。これらの困難としては、例えば、多相的クラスへの項目の付加及びそこから項目の削除、関数のインライン展開、及びテンプレートの取り扱いを挙げることができる。それゆえ、これらの型のクラスをサイズ変更不可としてマークすることができ、コンパイラは、これらに対しては、従来技術の場合と同様に動作する。
本発明書で用いられる用語は、特定の実施形態を説明することのみを目的とし、本発明を限定することを意図しない。本明細書で使用される場合、単数形「1つの(a)、(an)」及び「その(the)」は、文脈がそうでないことを明らかに示さない限り、複数形も同様に含むことが意図される。「含む(comprises)」及び/又は「含んでいる(comprising)」という用語は、本明細書で使用される場合には、言及された特徴、整数、ステップ、動作、要素及び/又はコンポーネントの存在を特定するが、1つ又は複数の他の特徴、整数、ステップ、動作、要素、コンポーネント及び/又はそれらの群の存在又は付加を排除するものではないことがさらに理解されるであろう。
以下の特許請求の範囲内のすべての「手段又はステップと機能との組合せ(ミーンズ又はステップ・プラス・ファンクション)」要素の対応する構造、材料、動作及び均等物は、明確に特許請求されている他の特許請求された要素と組み合わせてその機能を実行するための、いかなる構造、材料又は動作をも含むことが意図される。本発明の説明は、例証及び説明の目的で提示されたものであるが、網羅的であることを意図するものでもなく、開示された形態の発明に限定することを意図するものでもない。本発明の範囲及び真意から逸脱することのない多くの修正及び変形が、当業者には明らかであろう。実施形態は、本発明の原理及び実際の適用を最も良く説明するように、及び、当業者が、企図される特定の使用に適するように種々の修正を伴う種々の実施形態について本発明を理解することを可能にするように、選択され、説明されている。
本明細書で示されるフロー図は、単に1つの例である。本発明の真意から逸脱することなく、この図及びその中に記載されたステップ(又は動作)に対して多くの変形が存在し得る。例えば、ステップを異なる順序で実行することもでき、又はステップを追加し、削除し又は修正することもできる。これらの変形のすべては、特許請求される発明の一部と見なされる。
本発明の好適な実施形態を説明してきたが、現在及び将来の両方において、当業者が、以下の特許請求の範囲内に入る種々の改善及び強化を行うことができることが理解されよう。これらの特許請求の範囲は、最初に記載される発明の適正な保護を維持するよう解釈されるべきである。
104:大容量記憶装置
208、214:テーブル

Claims (20)

  1. 高水準言語で記述されたソフトウェア・コードを計算装置上でバイナリ・オブジェクトに変換する方法であって、
    前記高水準言語で記述された前記ソフトウェア・コードを前記計算装置において受け取ることと、
    前記計算装置において前記ソフトウェア・コードをバイナリ・オブジェクト・ファイルに翻訳することと、
    を含み、前記翻訳することが、
    値が前記バイナリ・オブジェクトにハードコード化されることを必要とする対象項目を前記ソフトウェア・コードが含むこと、及びそのクラスがサイズ変更可能であることを判定することと、
    前記ハードコード化された値を表す意味変数を作成し、前記意味変数及び前記ハードコード化された値を前記バイナリ・オブジェクト内のテーブルに格納することと、
    を含む方法。
  2. 前記高水準言語が、C++である、請求項1に記載の方法。
  3. 前記対象項目が、クラス型サイズ、非静的データメンバに対するオフセット、及び仮想関数テーブル・オフセットのうちの1つである、請求項1に記載の方法。
  4. 前記テーブルが、vテーブル・オフセットのテーブルである、請求項1に記載の方法。
  5. 前記テーブルが、クラス型サイズのテーブルである、請求項1に記載の方法。
  6. 前記テーブルが、親クラス内でのサブオブジェクト・オフセットのテーブルである、請求項1に記載の方法。
  7. 前記テーブルが、非静的データメンバ・オフセットのテーブルである、請求項1に記載の方法。
  8. 前記テーブルが、前記バイナリ・オブジェクトのヘッダ部分に格納される、請求項1に記載の方法。
  9. 前記計算装置上のリンカにおいて複数のバイナリ・オブジェクトを受け取るステップと、
    前記複数のバイナリ・オブジェクトを互いにリンクするステップと、
    事前定義された優先度に基づいて、テーブルを有する各オブジェクト内の前記テーブル間の不一致を解決するステップと
    をさらに含む、請求項8に記載の方法。
  10. バイナリ・オブジェクトごとに、少なくとも1つのテーブルを含む、請求項9に記載の方法。
  11. 少なくとも1つのバイナリ・オブジェクトが、テーブルを含まない、請求項10に記載の方法。
  12. 前記事前定義された優先度が、より新しいテーブルがより古いテーブルに優先して選択されるようにさせる、請求項9に記載の方法。
  13. 前記事前定義された優先度が、より高いバージョン番号を有するテーブルがより低いバージョン番号を有するテーブルに優先して選択されるようにさせる、請求項9に記載の方法。
  14. 前記事前定義された優先度が、前記バイナリ・オブジェクト間の不一致の原因となる仮想テーブルを含むオブジェクトが、それを含まないオブジェクトに優先して選択されるようにさせる、請求項9に記載の方法。
  15. 複数のバイナリ・オブジェクトから実行可能プログラムを作成するための方法であって、
    計算装置において、ハードコード化された値を必要とする少なくとも1つの値についてのハードコード化された値を表す意味変数のテーブルを少なくとも1つが含む、第1の複数のバイナリ・オブジェクトを受け取ることと、
    前記第1の複数のバイナリ・オブジェクトを互いにリンクし、少なくとも1つのバイナリ・オブジェクト内の意味変数を前記少なくとも1つのテーブル内の前記ハードコード化された値で置換することと、
    前記第1の複数のバイナリ・オブジェクトを1つ又は複数の追加のバイナリ・オブジェクトと組み合わせて、動作のために前記計算装置へとロードすることと
    を含む方法。
  16. ハードコード化された値を要求する前記値が、クラス型サイズ、非静的データメンバに対するオフセット、及び仮想関数テーブル・オフセットのうちの1つである、請求項15に記載の方法。
  17. 前記少なくとも1つのテーブルが、vテーブル・オフセットのテーブルであることを特徴とする、請求項15に記載の方法。
  18. 前記少なくとも1つのテーブルが、クラス型サイズのテーブルである、請求項15に記載の方法。
  19. 前記少なくとも1つのテーブルが、親クラス内でのサブオブジェクト・オフセットのテーブルである、請求項15に記載の方法。
  20. 前記少なくとも1つのテーブルが、前記バイナリ・オブジェクトのヘッダ部分に格納される、請求項15に記載の方法。
JP2012530061A 2009-09-25 2010-09-22 意味論的値を利用するオブジェクト・レベルの互換性及びクラスのサイズ変更 Active JP5506936B2 (ja)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
CA2,678,095 2009-09-25
CA2678095A CA2678095C (en) 2009-09-25 2009-09-25 Object level compatibility and class resizing utilizing semantic values
PCT/CA2010/001504 WO2011035431A1 (en) 2009-09-25 2010-09-22 Object level compatibility and class resizing utilizing semantic values

Publications (2)

Publication Number Publication Date
JP2013506171A true JP2013506171A (ja) 2013-02-21
JP5506936B2 JP5506936B2 (ja) 2014-05-28

Family

ID=41397458

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2012530061A Active JP5506936B2 (ja) 2009-09-25 2010-09-22 意味論的値を利用するオブジェクト・レベルの互換性及びクラスのサイズ変更

Country Status (7)

Country Link
US (1) US8813045B2 (ja)
JP (1) JP5506936B2 (ja)
CN (1) CN102511033B (ja)
CA (1) CA2678095C (ja)
DE (1) DE112010003774T5 (ja)
GB (1) GB2488254B (ja)
WO (1) WO2011035431A1 (ja)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9164735B2 (en) * 2012-09-27 2015-10-20 Intel Corporation Enabling polymorphic objects across devices in a heterogeneous platform
US10747880B2 (en) 2013-12-30 2020-08-18 University Of Louisiana At Lafayette System and method for identifying and comparing code by semantic abstractions
US9785456B2 (en) * 2014-04-22 2017-10-10 Oracle International Corporation Metadata-driven dynamic specialization
CN111399848B (zh) * 2020-03-17 2023-05-23 阿波罗智联(北京)科技有限公司 一种硬编码数据检测方法、装置、电子设备和介质

Family Cites Families (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH05257664A (ja) * 1991-12-12 1993-10-08 Internatl Business Mach Corp <Ibm> バージョン独立のオブジェクト指向アプリケーション・プログラムを生成するシステム及び方法
US5613120A (en) 1994-10-20 1997-03-18 Silicon Graphics, Inc. System and method for enabling, without recompilation, modification of class definitions and implementations in an object-oriented computer program
US6978450B2 (en) * 1999-01-15 2005-12-20 Hewlett-Packard Development Company, L.P. Method and system for optimizing compilation time of a program by selectively reusing object code
CA2262316A1 (en) * 1999-02-22 2000-08-22 Ibm Canada Limited-Ibm Canada Limitee System and method for detecting release-to-release binary compatibility in compiled object code
JP2002108625A (ja) 2000-09-26 2002-04-12 Toshiba Corp 言語処理装置及び言語処理プログラムを格納した記録媒体
JP2002215451A (ja) 2001-01-17 2002-08-02 Hitachi Software Eng Co Ltd データ構造の動的管理方法およびクラスオブジェクト
US7665075B1 (en) * 2004-03-17 2010-02-16 Sun Microsystems, Inc. Methods for sharing of dynamically compiled code across class loaders by making the compiled code loader reentrant
US7587612B2 (en) * 2005-06-30 2009-09-08 Intel Corporation Generating and communicating information on locations of program sections in memory
US7743368B2 (en) * 2005-08-09 2010-06-22 Hewlett-Packard Development Company, L.P. Method and apparatus for providing class hierarchy information for function devirtualization
US8291395B2 (en) * 2006-03-31 2012-10-16 Apple Inc. Fast function call dispatching
CN100533383C (zh) * 2006-11-03 2009-08-26 北京飞天诚信科技有限公司 一种对软件中的数据进行替换的方法
CN102023854B (zh) * 2009-09-18 2015-04-15 上海智问软件技术有限公司 一种基于模板的语义变量抽取方法

Also Published As

Publication number Publication date
GB2488254A (en) 2012-08-22
US8813045B2 (en) 2014-08-19
CN102511033A (zh) 2012-06-20
CA2678095C (en) 2012-05-01
DE112010003774T5 (de) 2012-10-04
GB201204883D0 (en) 2012-05-02
JP5506936B2 (ja) 2014-05-28
CA2678095A1 (en) 2009-12-02
GB2488254B (en) 2017-02-08
CN102511033B (zh) 2014-09-03
US20120174080A1 (en) 2012-07-05
WO2011035431A1 (en) 2011-03-31

Similar Documents

Publication Publication Date Title
US11175896B2 (en) Handling value types
CN108139896B (zh) 扩展虚拟机指令集体系架构
US11599346B2 (en) Accessing a migrated member in an updated type
US5247678A (en) Load time linker for software used with a multiprocessor system
US5613120A (en) System and method for enabling, without recompilation, modification of class definitions and implementations in an object-oriented computer program
US7380242B2 (en) Compiler and software product for compiling intermediate language bytecodes into Java bytecodes
JP4841118B2 (ja) ソフトウェア開発インフラストラクチャ
EP2340481B1 (en) Caching runtime generated code
US20070294679A1 (en) Methods and apparatus to call native code from a managed code application
JP2006092544A (ja) プリオペレーティングシステム環境におけるモジュールの動的リンク
CN113656008A (zh) 用于模块化反射的限制性访问控制
US10417024B2 (en) Generating verification metadata and verifying a runtime type based on verification metadata
US12008351B2 (en) Modeling foreign functions using executable references
JP5506936B2 (ja) 意味論的値を利用するオブジェクト・レベルの互換性及びクラスのサイズ変更
US7207036B2 (en) Preprocessing of interfaces to allow fast call through
US11030097B2 (en) Verifying the validity of a transition from a current tail template to a new tail template for a fused object
KR20230058378A (ko) 코드 스트림 폴딩을 지원하는 하이브리드 바이너리
US11875168B2 (en) Optimizing execution of foreign method handles on a virtual machine
US10838657B1 (en) Reducing RAM usage in a runtime
Kennedy et al. Pre-compilation for .NET Generics
Franz et al. Goodbye Java Virtual Machine Migrating to a Superior Mobile-Code Alternative

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20130604

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

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20140318

R150 Certificate of patent or registration of utility model

Ref document number: 5506936

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150