JP4841118B2 - ソフトウェア開発インフラストラクチャ - Google Patents

ソフトウェア開発インフラストラクチャ Download PDF

Info

Publication number
JP4841118B2
JP4841118B2 JP2004178869A JP2004178869A JP4841118B2 JP 4841118 B2 JP4841118 B2 JP 4841118B2 JP 2004178869 A JP2004178869 A JP 2004178869A JP 2004178869 A JP2004178869 A JP 2004178869A JP 4841118 B2 JP4841118 B2 JP 4841118B2
Authority
JP
Japan
Prior art keywords
type
sda
code
software development
compiler
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
JP2004178869A
Other languages
English (en)
Other versions
JP2005050312A (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.)
Microsoft Corp
Original Assignee
Microsoft 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
Priority claimed from US10/609,275 external-priority patent/US7120898B2/en
Priority claimed from US10/607,591 external-priority patent/US7685581B2/en
Priority claimed from US10/610,692 external-priority patent/US7559050B2/en
Priority claimed from US10/625,892 external-priority patent/US7146606B2/en
Priority claimed from US10/626,251 external-priority patent/US7305666B2/en
Application filed by Microsoft Corp filed Critical Microsoft Corp
Publication of JP2005050312A publication Critical patent/JP2005050312A/ja
Application granted granted Critical
Publication of JP4841118B2 publication Critical patent/JP4841118B2/ja
Expired - Fee Related 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/20Software design
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/436Semantic checking
    • G06F8/437Type checking

Description

技術分野は、ソフトウェア開発に関し、特に、ソフトウェア開発ツールの作成を容易にするためのアーキテクチャに関する。
多くのプログラミング言語が、各言語に特有のプログラミングにおける利点をプログラマに提供するために利用可能である。同様に、数多くのプロセッサが、各プロセッサに特有のタスクを実行する利点を提供するために利用可能である。例えば、組込みプロセッサは、電子デバイス内の明確なタスクを処理するのに特に適している一方、Intel(登録商標)Pentium(登録商標)プロセッサのような汎用プロセッサはよりフレキシブルであり、複雑なタスクを処理することができる。さらに、ソフトウェアの信頼性、セキュリティ、および高い性能に対するますます増大する需要にプログラマが対処するのを助けるために作成されたさまざまなツールタイプがある。このように、コンピューティング環境、コンフィギュレーション(構成)、およびデバイスにおける多様性がますます増大している。したがって、ソフトウェア開発者は、一連の目まぐるしく多様なソフトウェア開発シナリオの中で適応し作業することに直面している。
このような多様性に対処することの必要性は、既に非常に複雑になっているソフトウェア開発ツール構築の分野を複雑にしている。このようなソフトウェア開発ツールは、アセンブラ、逆アセンブラ、デコーダ、エンコーダ、命令選択コンポーネント、および命令合法化(instruction legalization)コンポーネント等の種々のコンポーネントを含み得る。多くの場合、このようなコンポーネントは重複する要求を有し、それらのコンポーネント自体が複数の開発ツールに(例えばコンパイラとデバッガに)現れることがある。
BACON, "Fast and Effective Optimization of Statically Typed, Object-Oriented Languages", PhD thesis, Computer Science Division, University of California, Berkeley, 3 pages of introduction and pp. i-141, 1997. DEAN et al., "Optimizations of Object-Oriented Programs Using Static Class Hierachy Analysis", European Conference on Object-Oriented Programming, pp. 77-101, 1995. GAY et al., "Fast Escape Analysis and Stack Allocation for Object-Based Programs", Proceedings of the 2000 International Conference on Compiler Construction, 12 pages, 2000. MUELLER et al., "Avoiding Unconditional Jumps by Code Replications", Proceedings of the SIGPLAN '92 Conference on Programming Language Design and Implementation, pp. 322-330, June 1992. RUF, "Effective Synchronization Removal for Java", ACM SIGPLAN Conference on Programming Language Design and Implementation, pp.208-218, BC, Canada, 2000. KNOOP et al., "Partial Dead Code Elimination," In Proceedings of the ACM SIGPLAN '94 Conference on Programming Language Design and Implementation, 12 pages, June 1994.
類似のコンポーネント機能が広く必要とされているにもかかわらず、特に一連のプログラミング言語やその他のプログラム表現の間で設計および実装を共有するツールコンポーネントを開発することはこれまで困難であった。多くの場合、各ツールの各コンポーネントは固有の実装を有するため、冗長な作業や重複したコードが多い。また、同一ソースベース内でさえ、アーキテクチャ間に統一性がほとんどないことがある。したがって、あるコンポーネントのコードでなされた改良は特定の実装を改善するが、その改良は、同じ機能を実装する他のツールやアーキテクチャに自動的には伝わらない。最後に、特定のソフトウェア開発シナリオ(筋書き)に対処するために努力を費やしても、異なるシナリオに対処するためには通常はやり直しをしなければならない。
ソフトウェア開発ツールのさまざまなコンポーネントを構築するためのソフトウェア開発アーキテクチャ(SDA)が提供される。コンポーネントは、1つまたは複数のソース言語またはバイナリ実行可能ファイルのようなコンピュータ可読入力で書かれたプログラムに対して使用可能である。そして、これらのコンポーネントは、ソフトウェア開発ツールを作成するために組み合わせることができる。SDAは種々の態様を含む。種々の態様を別個独立に使用してもよく、あるいは、種々の態様を種々のコンビネーション(結合)またはサブコンビネーション(副結合)で使用してもよい。
一態様では、SDAは、複数のプログラミング言語およびバイナリ実行可能ファイルのような他のコンピュータ可読プログラムフォーマット(書式)を表現することが可能な中間表現と、複数のプログラミング言語または他のコンピュータ可読プログラムフォーマットをサポートすることが可能な1つまたは複数の例外処理モデルと、複数のソース言語または他のコンピュータ可読プログラムフォーマットの型表現(type representation)を表現することが可能な型システム(型体系)とを使用する。また、中間表現は、複数の実行アーキテクチャのためのバイナリ実行ファイルを表現することができる。したがって、この中間表現を用いて書かれたコンポーネントは、さまざまなプログラミング言語で書かれたプログラム、バイナリ実行可能ファイルまたはオブジェクトファイルのようなプログラムのコンピュータ可読表現、および特定のターゲットアーキテクチャのためのプログラムに適用可能である。こうして、コンポーネントの共有を可能にすることにより、ソフトウェアツールの開発コストが低減される。また、異種コンポーネントからなるプログラムの解析および最適化を改善することが容易になる。コンポーネントは、データフロー解析、制御フロー解析、プログラム変換、データ表現最適化、レジスタ割付け、および命令スケジューラを含むことができる。
一態様では、ソフトウェア開発シナリオに機能仕様を実装するための仕様をソフトウェア開発シナリオ非依存フレームワークに統合することによって、ソフトウェア開発ツールのコンポーネントを作成する方法が提供される。このようなソフトウェア開発シナリオは、プログラミング言語、ターゲット実行アーキテクチャ、中間表現のレベル等に関係し得る。
さらにもう1つの態様では、中間表現および共有コンポーネントの拡張バージョンからなるソフトウェア開発ツールを生成するためのコンピュータ実行可能ソフトウェアが提供される。このソフトウェアは、ターゲットソフトウェア開発ツールを記述するソフトウェアのための複数のコンフィギュレーションの1つの選択を受け取り、ターゲットソフトウェア開発ツールにデータ仕様を中間表現に組み込むことが可能であり、コンフィギュレーションおよびデータと整合したターゲットソフトウェア開発ツールを備えたコンポーネントを生成することができる。このようにして、コンポーネントおよび中間表現は、既存のツールに対する新たな要求、新規なタイプのツール、新しい、または改良されたプログラミング言語、および新しいコンピュータアーキテクチャのような、新規の予期しない状況で使用されるように拡張することができる。
これらおよびその他の態様は、添付図面を参照する以下の詳細な説明から明らかとなるであろう。
さまざまなソフトウェア開発ツールのコンポーネントを構築し、それらのコンポーネントを結合することによりツールを形成するためのSDA(ソフトウエア開発アーキテクチャ)が提供される。SDAは、任意個数のターゲット実行アーキテクチャの入力および出力コードとして任意個数のプログラミング言語をとり得る、さまざまなソフトウェア開発ツールを構築することが可能である。
例示的なターゲット実行アーキテクチャ
本明細書に記載のターゲット実行アーキテクチャは、さまざまなハードウェアマシンまたは仮想マシンのいずれも含み得る。ターゲット実行アーキテクチャは、コードを実行するためのいかなる環境も含み得る。このようなターゲット実行アーキテクチャとしては、Intel(登録商標)x86、AMD、IPF、ARMおよびMIPSアーキテクチャ、ならびに以下で実装されるものを含む他のアーキテクチャが挙げられる。
Intel(登録商標)x86アーキテクチャには、以下のものに限定されないが、Intel Corporationから入手可能な80x86、80x88、Intel186、Intel286、Intel386、Intel486、およびPentium(登録商標)プロセッサのようなIntel(登録商標)x86アーキテクチャに基づくいずれのプロセッサも含まれる。AMDアーキテクチャとしては、以下のものに限定されないが、Advanced Micro Devices(AMD),Inc.から入手可能なAMD64およびAMD32アーキテクチャがある。IPF(Itanium processor family)アーキテクチャとしては、以下のものに限定されないが、Intel Corporationから入手可能なIA64アーキテクチャがある。ARMアーキテクチャとしては、ARM Ltd.から入手可能な数多くの16ビットおよび32ビット組込みRISCマイクロプロセッサがある。MIPSアーキテクチャとしては、以下のものに限定されないが、MIPS Technologies Inc.から入手可能なMIPS64(商標)およびMIPS32(商標)アーキテクチャがある。
例示的なソフトウェア開発ツール
本明細書に記載のソフトウェア開発ツールは、ソフトウェアを開発するために有用なさまざまなツールのいずれも含み得る。このようなツールとしては、ネイティブコードコンパイラ、ジャストインタイム(JIT)コンパイラ、デバッガ、シミュレータ、解析ツール、欠陥検出ツール、コンパイラ開発キット(CDK)およびオプティマイザが挙げられる。
このようなソフトウェア開発ツールは、プログラム変換コンポーネント、プログラム解析コンポーネント、アセンブラ、逆アセンブラ、デコーダ、エンコーダ、命令選択コンポーネント、命令合法化コンポーネント等のコンポーネントを含み得る。場合によっては、コンポーネント自体がツールとして作用することもある。
例示的なソフトウェア開発シナリオ
数多くのソフトウェア開発シナリオのいずれも、SDAの機能に影響を及ぼし得る。例えば、特定のソフトウェア開発ツールに対するソフトウェア開発シナリオとしては、そのソフトウェア開発ツールがターゲットとされる種々のターゲット実行アーキテクチャ(例えば、IPF、X86、AMD、ARM等)が挙げられる。また、ソフトウェア開発シナリオは、実行されるコンパイルのタイプ(例えば、JITまたはネイティブ最適化コンパイラ)にも関係し得る。ソフトウェア開発シナリオは、解析、最適化、シミュレーション、デバッグ、コード生成等のタイプのような、ソフトウェア開発ツールによって実行される他の機能のタイプにも関係し得る。さらにもう1つのソフトウェア開発シナリオとして、ソフトウェア開発ツールが特別に設定され得る特定のプログラミング言語(例えば、JAVA(登録商標)、C++、C#等)に関係し得るものがある。このような言語は、異なる例外処理モデルを有することがある。さらに、ソフトウェア開発シナリオは、ツールがマネージド実行環境(例えば、Microsoft .NET Frameworkによって提供されるMicrosoft CLRの環境)で使用されるかどうかにも関係し得る。他のシナリオも可能である。
SDAは、任意の1つまたは複数のソフトウェア開発シナリオに対処するツールのコンポーネントを作成するために使用可能である。例えば、SDAは、任意の1つまたは複数のプログラミング言語を受け付け、複数のターゲット実行アーキテクチャのいずれかのためのコードを生成する等のように動作可能なツールのコンポーネントを作成するために使用可能である。
ソフトウェア開発アーキテクチャ
図1は、SDAを用いて複数のコンフィギュレーションのうちのいずれかにおける任意個数のコンポーネントを構築することにより、さまざまなソフトウェア開発ツールを構築するための基礎として使用されるSDAのブロック図を示している。コンポーネントのセット100は、任意のコンフィギュレーションにより使用可能なモジュールを表す。これらのモジュールは、SDAにより提供されるコア機能を用いて構築される。SDAコア100は、オブジェクトファイルまたはソースコードのセットとして提供されてもよい。SDAコア100は、複数のマネージドおよび/またはネイティブアプリケーションプログラムインタフェース102(API)を提示する。SDAコアおよびAPI102を取り囲む各ブロックは、SDAを用いて構築される可能なソフトウェア開発ツールを表す。これらのツールとしては、ネイティブコンパイラ104、Pre−JITコンパイラ106、JITコンパイラ108、最適化ツール110、欠陥検出ツール112、解析ツール114、およびコンパイラ開発キット(CDK)116が挙げられる。
ネイティブコンパイラ104は、複数のターゲット実行アーキテクチャおよび複数のソース言語のための、ネイティブマシンコードの1つまたは複数のコンパイラを表す。例えば、SDAを用いて構築されたネイティブコンパイラ104は、C++プログラミング言語で書かれたプログラムを、x86ターゲット実行アーキテクチャ上で実行するためのネイティブコードにコンパイルすることができる。
Pre−JITコンパイラ106は、任意個数のターゲット実行アーキテクチャでアプリケーションを実行する前に、Microsoftの.NETプラットフォームの共通中間言語(CIL)のようなアーキテクチャ非依存のプログラム表現からネイティブコードを最適化し生成することができる。Pre−JITコンパイラは、サーバ上でインストール時にキャッシュされて動作することも、クライアント上でロード時にオンザフライで(またはバックグラウンドで)動作することも可能である。例えば、SDAのPre−JITの使用法106としては、CILをx86ターゲット実行アーキテクチャ上で実行するためのネイティブコードにコンパイルするように設計されたPre−JITコンパイラを作成することがある。
JITコンパイラ108は、必要に応じてランタイム時(ジャストインタイム)に、ターゲット実行アーキテクチャ上でCILのようなアーキテクチャ非依存表現からコードをコンパイルすることができる。例えば、SDAからのインタフェースを用いて構築されるJITコンパイラ108としては、AMDターゲット実行アーキテクチャ上でランタイム時にCILをネイティブコードにコンパイルするように設計してもよい。
欠陥検出ツール110は、1つまたは複数の言語で書かれたコードにおいて静的に(プログラムが実行される前に)欠陥を検出することができる。欠陥検出ツールは、任意個数のターゲット実行アーキテクチャ上で動作するように構築することができる。例えば、SDAの欠陥検出の使用法110としては、C++プログラミング言語で書かれたコードを入力として取り、そのコード内の欠陥を検出するように設計された欠陥検出ツールを作成することがある。欠陥検出ツールは、例えばx86ターゲット実行アーキテクチャ上で実行されるように設計することが可能である。
解析ツール112は、1つまたは複数の言語で書かれたコードを解析する。解析ツールは、任意個数のターゲット実行アーキテクチャ上で動作するように構築することができる。例えば、SDAの解析ツールの使用法112としては、C#プログラミング言語で書かれたコードを受け取り、1つの特定のモジュールにおける変化によりソースコードのどのモジュールまたは行が影響を受ける可能性があるかを判断することがある。これは、プログラムスライシングとして知られており、大規模なシステムを修正する場合に有益である。
オプティマイザツール114は、複数の言語で書かれたコードを最適化する。例えば、SDAの最適化ツールの使用法114としては、C++プログラミング言語で書かれたコードを受け取り、プロファイルデータに基づいてフィールドのレイアウトを最適化するように設計された最適化ツールを作成するために使用するものがある。別法として、マネージドC++のようなMicrosoft .NET言語からのCILを最適化するように設計された最適化ツールを作成することも可能である。
CDKの使用116により、サードパーティが独立にコンパイラを開発することができる。CDKとしては、SDAのコンポーネントの一部または全部のバイナリ、SDAのコンポーネントの一部または全部のライブラリ、およびサードパーティがシステムの特定の側面を修正することを可能にするためのコンポーネントの一部または全部のソースコードが挙げられる。例えば、SDAを用いて構築されるCDKツール116としては、WinCEを使用するデバイスのためのコンパイラを高い費用効果で迅速に作成することに関心のあるチップベンダによるものがある。
本明細書に記載のツールは、SDAコア100の要素の全部または一部を使用する。さらに、本明細書に記載のツールは、SDAコアに存在しない追加的コンポーネントを含むことができる。スループット、フットプリント、ホスト、ターゲット、およびコード品質要求に基づいて、コンフィギュレーションに対するフェーズおよびコンポーネントの追加または削除をすることができる。
例えば、ネイティブコンパイラ104は、コンパイル時間およびメモリフットプリント(メモリ設置面積)において最高のバジェット(経費、予算)を有し、最良のコード品質を生成することが期待されるかもしれない。したがって、このコンフィギュレーションツールでは、コードの最適化が改善されるかもしれない。これに対して、JITコンパイラ108は、依然としてある程度最適化されたコードを生成しながら、より高速なコンパイル時間、およびより小さいメモリフットプリントのコンフィギュレーションを要求するかもしれない。したがって、このツールは、フローグラフ、ループグラフおよびSSAグラフのようなデータ構造をできるだけ維持し、コストのかかる再構築を避けるかもしれない。さらに、中間表現を処理するパス数を最小にすることができる。
図2Aは、SDAを用いてソフトウェア開発ツールを作成する方法のフローチャートである。ブロック200は、SDAが受け取る1つまたは複数の仕様を示している。ブロック202で、仕様から(例えばソースコードを生成してからコンパイルすることによって)ソフトウェア開発コンポーネントを作成する。ブロック204で、コンポーネントをSDAにリンクすることにより、カスタマイズされたソフトウェア開発ツールを作成する。別法として、追加的機能を提供するカスタムコードを仕様に追加し、コンポーネントに統合することも可能である。その場合、ソフトウェア開発ツールは、SDAとコンポーネントの組合せから作成することができる。
別法として、図2Bは、SDAの実行可能バージョンを用いてソフトウェア開発ツールを作成する方法のもう1つのフローチャートを示している。ブロック206で、ソフトウェア開発コンポーネントが提供される。ブロック208で、コンポーネントをSDAにリンクすることにより、カスタマイズされたソフトウェア開発ツールを(例えばランタイム時に動的に、ソースコードへのアクセスなしに)作成する。
仕様は、1つまたは複数のソフトウェア開発シナリオに機能仕様を実装するための情報を指定するのに適したいかなるコンピュータ可読言語あるいは形式(例えば、オブジェクトもしくは実行可能コード、ソースコード、またはカスタム言語)であってもよい。
図3は、SDA300を用いてソフトウェア開発ツールのコンポーネントを作成するシステムのハイレベルブロック図である。ソフトウェア開発シナリオのターゲット仕様の詳細を記述するために、1つまたは複数の仕様302が作成される。例えば、仕様302は、ターゲットツールがどのプログラミング言語(例えば、Visual Basic、C#、CIL等のNET(ネットワーク)言語、またはC++)を入力としてとり得るかを指示するかもしれない。同様に、仕様は、ターゲットソフトウェア開発ツールのターゲット実行アーキテクチャ(例えば、x86、AMD、MIPS、またはIPFアーキテクチャ)を指示するかもしれない。さらに、仕様は、入力言語を型チェック(型検査)するためのルールセットや、SDAコアデータ構造を拡張可能なように構成するためのクラス拡張宣言のセット等の他の情報を含んでもよい。そして、仕様302を用いて、SDA300にリンクすることが可能なソフトウェア開発コンポーネントが作成される。リンクされるコンポーネント304およびSDA300を組み合わせて用いて、JITコンパイラ、Pre−JITコンパイラ、ネイティブコンパイラ等のソフトウェア開発ツールのような任意個数のツール306を作成することができる。別法として、ターゲットソフトウェア開発ツール304に対する追加的機能を実装するために、カスタムコードを追加してもよい。
こうして、特定のコンフィギュレーションにおけるSDAのような単一のソースベースから、1つまたは複数のソフトウェア開発シナリオのターゲットソフトウェア開発ツールをカスタマイズするために、単にターゲット仕様データ(target specific data)を供給するだけで、ソフトウェア開発ツールの任意個数のコンポーネントを作成することができる。したがって、ソフトウェア開発ツールは、ターゲット仕様(target specific)モジュールおよびターゲット不問(target agnostic)モジュールの両方に区分されるとみなすことができる。図4はこの概念を例示している。図4は、図3に示されているようなシステムを用いて作成された3つのターゲット実行アーキテクチャ(x86、AMD、MIPS)のそれぞれに対するJIT、Pre−JIT、Microsoft(登録商標)Visual C++(登録商標)ネイティブコンパイラ、デバッガ、およびオプティマイザのブロック図である。実行アーキテクチャのための種々のツールが共通SDAおよび仕様から構築されるので、仕様またはカスタムコードによって供給されるソフトウェア開発ツールのターゲット仕様コードは、共通SDAによって供給することができるターゲット不問コードから区分される。したがって、ターゲット実行アーキテクチャのコンポーネントは、同一の仕様から作成されるので、異なるタイプのソフトウェア開発ツールで同一とすることができる。
ソフトウェア開発ツールは、ターゲット仕様コンポーネントのみを変更すればよいので、異なる実行アーキテクチャ間で容易にリターゲットすることができる。また、ターゲット仕様コードまたはターゲット不問コードのいずれで発見されるバグも、大規模に修正することができる。
例えば、開発者が、Intel(登録商標)x86アーキテクチャ用のJITコンパイラ400を、AMDまたはMIPSアーキテクチャで機能するようにリターゲットしたいとする。開発者は、AMDまたはMIPS実行アーキテクチャにデータ仕様を含む適切な仕様を書くだけでよい。そして、そのターゲット仕様データを、Intel(登録商標)x86アーキテクチャ用のJITコンパイラ400を作成するために使用したのと同一または類似の共通SDAに統合する。そして、統合されたSDAおよび仕様を用いて、AMDアーキテクチャ用のJITコンパイラ402、またはMIPSアーキテクチャ用のJITコンパイラ404を作成する。
次に、開発者がIntel(登録商標)x86アーキテクチャ用に書かれた仕様を用いて構築されたオプティマイザ406でソフトウェア欠陥を見つけたとする。ソフトウェア欠陥がターゲット不問コードに見つかった場合、そのコードは共通SDAの一部である可能性が最も高い。したがって、そのソフトウェア欠陥は、図4に示されているツール全体にわたって現れる可能性がある。
共通SDAを用いて構築されたコンポーネントまたは共通SDA自体における改良がいったん構築された後は、1つのソースコードベース(コンポーネントまたは共通SDA)において修正を実装することにより、図示されている15個のツール(3つの異なるアーキテクチャのそれぞれについて3個のコンパイラ、2個のツール)の改良を同時に開始することができる。15個のツールの更新された訂正バージョンは、各ターゲット実行アーキテクチャの仕様を更新されたSDAで単に再コンパイルすることによって、またはSDAおよびコンポーネントの新たなバイナリを配布することによってのいずれかにより、作成することができる。
同様に、ソフトウェア欠陥がIntel(登録商標)x86実行アーキテクチャのオプティマイザ406のターゲット仕様コードに見つかった場合、そのソフトウェア欠陥は、Intel(登録商標)x86実行アーキテクチャ用に書かれた仕様にある可能性が最も高い。この場合も、Intel(登録商標)x86実行アーキテクチャ用のツール全体にわたるソフトウェア欠陥を修正するには、1つのソースコード(Intel(登録商標)x86仕様)を訂正し、更新された仕様を共通SDAで再コンパイルするだけでよい。
代替実行アーキテクチャへの迅速なリターゲティング(再対象化、新しい目標に向けること)を可能にすることに加えて、図4に示されているソフトウェア開発ツールは、別のプログラミング言語を入力として受け付けるように迅速に再設計することができる。例えば、この例の目的上、デバッガ408がC++を入力としMIPS実行アーキテクチャをターゲットとすることを指示する仕様から、デバッガ408が作成されたとする。C#を入力としながら依然としてMIPSアーキテクチャで実行されるようにデバッガ408を再設計することは、異なる入力言語を指示するように仕様を書き直すのと同程度に簡単である。そして、新しい仕様を同一または類似のSDAに統合することができ、C#を入力とする新しいデバッガが生成される。
SDAコアデータ構造およびアブストラクション
マシンモデル − アブストラクション(抽象化)のリターゲティング
本明細書に記載のSDAを用いて作成されたソフトウェア開発ツールの迅速なリターゲティングをサポートするため、SDAコアはターゲット不問部分とターゲット仕様部分に分割される。可能な限り、共通のターゲット仕様コードをターゲット不問SDAに組み入れるとともに、情報を取得し、または変換を実行するためのターゲット仕様コードへの呼出しを設ける。単なる一例であるが、以下のセクションでは、SDAコアの一実施形態の実装の詳細を説明する。代替的なSDAコアとして、以下の、または他の特徴のいかなる組合せを使用するものもあり得る。
レジスタ
マシンレジスタファイルにAPI経由でアクセスすることにより、レジスタファイル(例えば、汎用、浮動小数点、プレディケート)の個数を問い合わせ、どのマシンタイプ(例えば、int32,float64、MMX)を処理することができるかを判定し、マシンレジスタ(例えば、EAX、r0、p3)を表すオブジェクトを取得することができる。レジスタオブジェクトは、レイアウト(Layout)クラスから導出され、以下の情報を追加することができる:データフロー等の内部列挙番号;テキスト文字列によるレジスタ名;アトリビュート;バイナリエンコーディング;拡張性オブジェクト。
マシン依存オペコード
マシンオペコードテーブルにAPI経由でアクセスすることにより、オペコード(オペラーションコード)の個数を問い合わせ、オペコード(例えば、ADD、MOVZX)を表すオブジェクトを取得することができる。オペコードオブジェクトは、以下の情報をカプセル化することができる:内部オペコード列挙、テキスト文字列によるオペコード名、アトリビュート、および拡張性オブジェクト。
呼出し規約
呼出し規約は、ローレベル化(lowering)フェーズ(相、段階)によって明示的にすることができ、ターゲット不問フレームワークにおけるアプリケーションバイナリインタフェース(ABI)仕様のコールバックを通じて実装することができる。このフレームワークは、パラメータをレジスタに割り付けることや、レジスタオペランドをメモリオペランドに降格(demote)させること(スタック渡しのために)等のような共通のアクションのためのサブルーチンを含むことができる。
各呼出し命令に、その呼出しで使用される呼出し規約のタイプを記述するターゲット仕様のアトリビュート(属性)を注釈付けすることによって、複数の呼出し規約をサポートすることができる。このアトリビュートは、ハイレベルおよびマシン非依存の最適化フェーズによって維持し伝搬させることができる。
例外処理モデル
種々の例外処理(EH)モデルをターゲット不問な形で実装することができる。ただし、マシンモデルの問合せおよびコールバックをターゲット仕様コードに組み込むことが必要である。例外処理については、後で別のセクションでさらに詳細に説明する。
コード生成
本実施形態では、コード生成は、命令選択/ローレベル化、intrinsic(組み込み)/switch(切り替え)/question(問合せ) op展開、および命令合法化からなる。レジスタ割付けおよびスケジューリングは、別個のフェーズとみなすことができる。コード生成については、後で別のセクションでさらに詳細に説明する。
エンコード
エンコーディングは、コンパイラIR(中間表現)をバイナリマシンコードに翻訳するプロセスである。作り出されたターゲット仕様コードで生じる大量の仕事を伴うエンコーディングのためのマシン不問フレームワークがあり得る。
スケジューリングテーブル
スケジューリングテーブルは、大域(グローバル)および局所(ローカル)スケジューリングにおいて使用可能である。マシンスケジューリングテーブルは、各マシン命令によって要求される命令レイテンシ(待ち時間、呼び出し時間)および機能ユニットを含むことができる。テーブルは、コード生成で使用されるリターゲティングツールにより生成することができる。
逆アセンブラ
逆アセンブリは、コード生成ファイルによって駆動されることが可能である。逆アセンブリは、共通インタフェースを用いたリンカー(linker)およびデバッガにより共有されるDLL(動的リンクライブラリ)として実装することができる。
プロローグ/エピローグ
関数プロローグ(序文)およびエピローグ(結び文)は、ターゲット不問フレームワークにおいてターゲット仕様コールバックを用いて生成することができる。プロローグは以下の項目の一部または全部を含み得る:フレームポインタ初期化;スタックアラインメント;スタック割付け;不揮発性レジスタセーブ;例外処理構造体初期化;ランタイムチェックおよび初期化。エピローグは以下の項目の一部または全部を含み得る:不揮発性レジスタリストア;スタック割付け解除;フレームポインタ復元;ランタイムチェック。関数ごとに、局所ポインタおよびパラメータポインタという2つのフレームポインタが存在する可能性がある。これらはマシン依存および関数依存であり得る。
エンディアンサポート
クロスターゲティングシナリオでは、SDAがエンディアンネス(edianness:バイトの並び順の種類)を認識している必要がある。仕様は、ターゲット実行アーキテクチャのエンディアンネスを記述することができる。それに応じて、エミッションルーチン(emission routine)は、このエンディアンネスを守るように設計することができる。
スタック割付け
仕様は、スタックのアラインメントおよび伸長方向の情報を含むことができる。スタック割付けパッケージは、最大所要局所アラインメントおよび使用される全スタック空間の計算を担当することができる。さらに、スタックパッキング最適化を使用しない場合、スタックオフセットを局所変数に割り付けることができる。
型システム
IRに対する型システム(型体系)は多くの重要な目的に役立つ。これについては、後で別のセクションでさらに詳細に説明する。
関数
関数(Function)またはメソッド(Method)オブジェクトは、単一の手続きを構成するコードを記述することができる。以下の属性が、関数オブジェクトを記述する際に考慮され得る:
1)関数ID:メソッドの一意的識別子。
2)関数名
3)返値の型
4)呼出し規約
5)関数シグネチャまたは引数リスト
6)例外情報
関数は、不連続にレイアウトされる項目を含むことができる。それに従って、例外情報や、関数のレイアウトに従う情報を有するその他のデータ構造を修正することができる。
関数が種々のコンパイラ段階を通っていく時、関数は、後の段階にとって重要なほとんどの情報を含む唯一のエンティティ(構成要素、実体)であり得る。また、関数オブジェクトは、ほとんどの変換、すなわち、コード分離、インライン化、ループ展開等に耐えて持続するオブジェクトであり得る。したがって、各関数に関連する情報は、それらの変換に合わせていく意識的な努力がなければ、たちまち古くなってしまうかもしれない。
データフロー解析が関数全体にわたって成功するためには、たとえ関数全体がもはや物理的に連続していなくても、関数全体を表現できることが望ましい。
関数とメソッド
本実施形態では、関数とメソッドを区別することは必要でないかもしれない。これは単に、クラス階層が導入される場合の用語の相違であり得る。
クラス
クラス(Class)オブジェクトは、そのクラスに属するすべての関数またはメソッドのためのコンテナであり得る。以下の属性が、クラスオブジェクトを記述することができる:
1)クラス名
2)サイズ
3)関数のリスト
4)仮想呼出しテーブルを含むデータメンバに対する型/レイアウト情報
本実施形態では、クラス定義が複数のモジュールに分解されないこともあるので、最適化の目的上、クラス内部表現を並べ替えることができることが重要である。そのようなクラス並べ替えの一例は、クラスオブジェクトに関係する多くのデータ構造が存在することに起因して、ワーキングセット縮小に関与する。それらのデータ構造もまた、クラス内部レイアウトに従うために並べ替えなければならないことがある。
フェーズ制御
本明細書に記載のSDAの構成可能性および拡張性と、コンポーネントを結合するための統一的メカニズムを提供することが望ましいことから、ハードコーディングよりもデータによってフェーズ制御を提供することができる。フェーズ順序は、フェーズオブジェクトのリストを生成することによって指定することができる。フェーズリストは、コンフィギュレーション、マシンターゲット、およびユーザ拡張性によって変更され得る。
各フェーズオブジェクトは、デバッグ事前条件(実行されるべきデバッグチェック)、実行事前条件(フェーズの実行を制御するコンパイルフラグ、例えば、大域最適化のための−Od)、プレフェーズ拡張性、フェーズエントリポイント、ポストフェーズ拡張性、デバッグ事後条件、テキスト形式のフェーズ名、ならびに次フェーズおよび前フェーズへのポインタをカプセル化することができる。
個別のフェーズは、関数が「ビック」(大きい)であることを認識し、変換を適切に抑制することを担当することができる。例えば、関数がn個より多くのIRノードを有する場合、干渉パッケージ(interference package)は、正確さを保証するために控え目(conservative)に動作し、徹底的な解析をあきらめることに決めるかもしれない。あるいは、最適化は、関数全体に対して実行するのは高くつきすぎるので、代わりに各領域に作用するか、または完全に停止することに決めるかもしれない。
メインドライバ
メインドライバは、SDAおよびアタッチされている拡張性モジュールを初期化することを担当する。起動時に、(主としてフェーズリストを設定する)コンパイラコンフィギュレーションに従って、種々のシステムパッケージを初期化することができる。次に、ターゲット仕様の初期化を実行することができる(これは、拡張性機能を提供してもよい)。次に、拡張性モジュールを初期化することができる(これは、フェーズリストを変更し、種々のデータ構造にアタッチすること等が可能である)。この時点で、コマンドラインプロセッサを呼び出してもよい。最後に、エラーが生じなかった場合、コンパイルマネージャ(これはコンフィギュレーション依存であってもよい)が制御をとることができる。
中間表現(IR)
本明細書に記載のツールのコンポーネントを作成するためのSDAの一実施形態では、ツールの実行全体の期間中におけるメモリ内のユーザプログラムを表現するための、単一の共通IRフォーマットが提供される。IRフォーマットは、ハイレベルのマシン非依存オペレーションから、ローレベルのターゲットマシンコードまでのさまざまなコードを、単一の統一された形式を用いて表すことができる。図5は、SDAを用いて作成されたコンパイラにおける例示的なコンパイルプロセスのブロック図を示している。このコンパイラは、複数の言語を入力とし、複数の言語を出力とし、複数の実行アーキテクチャをターゲットとすることができる。
ソースコード500〜506は、4つの異なるソース言語で書かれている。例えば、ソースコード500はC#で書かれている一方、ソースコード506はC++で書かれている。さらに、PEバイナリ等の実行可能フォーマットも入力として受け付けることができる。まず、ソースコードをリーダ508で処理しシステムに入力する。次に、ソース言語をハイレベルIR(HIR)に翻訳する。次に、ブロック510で、随意に、HIRを解析し最適化することができる。次に、HIRを中間レベルIR(MIR)に翻訳する。この表現は、HIRよりローレベルであるが、依然としてマシン非依存である。この時点で、ブロック512で、随意に、MIRを解析し最適化することができる。次に、ブロック514のコード生成により、MIRをマシン依存ローレベルIR(LIR)に翻訳する。次に、ブロック516で、随意に、LIRを解析し最適化することができ、ブロック518で、エミッタに供給することができる。エミッタは、システムに読み込まれた原ソースコードを表現する多くのフォーマット520〜526の1つでコードを出力する。このプロセス全体を通じて、プロセスを完了するのに必要なデータは、何らかの形式の永続的メモリ528に格納される。
このように、コンパイルプロセスは、あるレベルまたは表現から別のレベルまたは表現へ命令を変換することを伴う。一実施形態では、IRをハイレベルオペレーションからマシンコードに翻訳するプロセスは、基本的な形式を全く変えずに、IRにますます多くの情報を単に帰属させる一連の最適化およびコード生成パスであり得る。例えば、図6A〜図6Dは、ソースの読み込みからハイレベルマシン非依存IRを経てローレベルマシン依存IRまでのIR変換を順を追って示している。これらの図が示しているように、IRは単に、レジスタや実マシンオペコードのようなターゲットマシンの詳細によって拡大し、それらの属性が付与される。しかし、形式は実質的に同一のままにとどまる。
また、IRは、異なるSDAコンフィギュレーションにおいて使用するためにスケーリング(拡大・縮小)されることも可能である。例えば、ジャストインタイム(JIT)コンパイラコンフィギュレーションは速度およびメモリの制約があるので、SDAのJITコンフィギュレーションを用いて作成されるJITコンパイラで使用されるIRの形式は、コンパイル速度を低下させ、またはメモリフットプリントを増大させる傾向がある性質を追加または削除することにより構成されることが可能である。これに対して、ハイエンドの、全プログラムを最適化するネイティブコンパイラは、非常に大量のリソースを消費し、高いコード品質を要求する傾向がある。したがって、SDAのネイティブコンパイラコンフィギュレーションを用いて作成されるネイティブコンパイラで使用されるIRの形式は、コンパイル速度を制限し、またはコンパイラに利用可能なメモリの量を減少させる傾向のある性質を追加または削除することにより構成されることが可能である。
本実施形態では、SDAで使用されるIRは、演算子によって表現されるデータフローオペレーションの線形ストリーム、データフローソースのセットおよびデータフローデスティネーションのセットとして編成されたグラフデータ構造であり得る。データフロー情報および副作用は、データフローセットに明示的に含まれることが可能である。IRは、ロバスト(頑健)なコード生成および型チェックを可能にするために、ソースレベルの型情報によって強く型付けされてもよい。また、IRは、プログラムを完全に記述するのに必要なデータフローおよび制御フローのリンクの一部または全部を含んでもよい。すなわち、すべての必要なリンクが存在する場合、フローグラフや例外処理ツリー/グラフのような他のデータ構造は不要である。
さらに、オペレーションによって使用または定義されるいずれのリソースも、明示的か暗黙的かを問わず、オペレーションのソースまたはデスティネーション(目的)のリストに現れ得る。データフロー解析およびコンパイラ構築は一般的に単純化される。というのは、オペレーションの完全な副作用を決定するために解析する必要があるのはオペランドだけだからである。したがって、新しいオペレーションは、同一の小さいオペランドのセットを新たな方法で単に結合し直すだけで実装されるので、追加するのが容易である。
IRは、メモリの曖昧性を解消しオペランドに関連する単一の「タグ」を通じて別名(alias)解析を決定するための単一のモデルを含むことができる。タグは、控え目であってもよく、あるいは、広範な解析を通じて非常に厳密にされてもよい。コンパイラのすべてのフェーズは単にタグに従い、オペレーションの副作用についての「オラクル(oracle)」を問い合わせることができるだけである。
以下のセクションでは、本明細書に記載のSDAの実施形態における使用に適したIRの一実施形態の実装の詳細について説明する。
例示的なIR
SDAの実施形態の例示的なIRは、型付きのタプルの線形ストリームとして実装することができる。各タプルは、入力オペランドのセット(ソースリスト)、演算子、および出力オペランドのセット(デスティネーションリスト)を有することができる。副作用(例えばすべての副作用)は、実または暗黙のレジスタuse/defおよびシンボルuse/defの情報を含めて、命令に対して明示的であり得る。間接演算子(indirection)には干渉情報がアタッチされる。
IRは、フローグラフの有無を問わず存在し得るが、大域最適化はフローグラフを必要とすることがある。例外処理領域グラフおよび最適化領域グラフもまた、IR情報を増強するために使用可能である。IRは、フローグラフ、ループグラフを構築し、例外処理領域グラフへのマッピングを再確立するための十分な情報を有していなければならない。フローグラフ(ならびにそれほどではないがループおよび例外処理領域グラフ)はほとんど常に存在し得るので、これらのグラフがコアIRの一部であるシステムの場合と同様に、設計はこれらのグラフへの容易なアクセスを提供することができる。
IRは、ツリーベースおよびSSAベースの最適化を直接サポートするように設計することができる。これは、リーフタプル(leaf tuple)にdefフィールドを追加することによって行うことができる。その最も単純な形式では、式一時変数(expression temp)をつなぎ合わせて式ツリーを形成することができる。これは、あらかじめローレベル化された(pre-lowered)コードに対して不変であり得る。この式スレッド化は、式ビューを使用する必要のない解析では無視することができる。変換は、それらを正しい状態のままにすることができ、クリーンアップのために式オプティマイザを使用してもよい。本格的なSSAは、同じdefフィールドを使用し、PHI命令のような特別のオペレーションを含むことができる。SSAの下では、式一時変数は単にSSAグラフ全体のサブセットとなり得る。
インラインの_codeをサポートするため、コンパイラの初期フェーズは、_asmシーケンスのデータフロー効果を要約する「outline」命令を見ることができる。実際の_asm命令シーケンスは、ローレベル化の非常に後の段階がシーケンスをインライン化するまで、サイドリストとして置いておくことができる。
IRの種々の例がローレベル化プロセスを示しているが、IRは高レベル化(raising)プロセスでも使用可能である。例えば、ツールは、バイナリを入力として取り、そのバイナリに対するIRを構築することができる。
オペランド
オペランドは、命令のリーフノード(leaf node)であること、ならびに、命令のソースリストおよびデスティネーションリストに現れることが可能である。すべての副作用を命令に対して明示的にすることができるので、オペランドは、即値、レジスタ、メモリ、および条件コードを含む、一部または全部の、実際のまたは潜在的な、リソース使用を記述するために存在する。各リーフノードは、その抽象型を表す関連する型を有することができる。これはさらに、ローレベル化された命令に対するマシンタイプにマッピングされる。
レジスタ
レジスタオペランドは、実際の物理レジスタまたは仮想レジスタのいずれかを指定することができる。
一時レジスタ
一時オペランドは次の2つの形式の一方をとり得る:1)式一時変数(すなわちtemp reg)は、式中で使用される単一def、単一useの一時変数であり得る;または2)一般一時変数(すなわちtemp var)は、questionOp、CSE、スカラー置換、およびインダクション変数等のためにコンパイラによって導入されることが可能であり、複数のdefおよびuseを有することができる。
式一時変数はレジスタ内にのみ存続することが可能であり、基本ブロック境界を越えて存続することはない。一般一時変数は、レジスタまたはメモリ内に存続することができ、基本ブロック境界を越えて存続することができる。いずれも、アドレスが取られることはない。
物理レジスタ
物理レジスタは、実際のマシンレジスタである。これには、整数、浮動小数点、マルチメディア、ベクトル、および専用レジスタがある。
名前付きレジスタ
名前付きレジスタは、物理マシンレジスタの候補であるか、または物理マシンレジスタに割り付けられたユーザ変数であり得る。
メモリ
メモリオペランドは、メモリまたは抽象メモリに格納される値を指定することができる。抽象メモリは、明示的な干渉計算のために使用可能である。
名前付きメモリ
名前付きメモリは、メモリに格納されているユーザ変数を指定することができる。
ベクトルメモリ
ベクトルメモリは、ベクトル演算のベクトルオペランドにおいて使用され得る。
間接メモリ
メモリ間接演算は、任意のターゲットマシン上で最も強力なアドレスモードを表すことが可能である。間接演算は、干渉情報を含んでもよい。
抽象メモリ
抽象メモリは、直接参照による以外の、明示的なメモリuse/def副作用の注釈(すなわち干渉情報)を命令に付けるために使用され得る。
アドレス
アドレスオペランドは、コードまたはデータの位置を指定することができる。
有効アドレス
有効メモリアドレスオペランドは、任意のターゲットマシン上で最も強力なアドレスモードを表すことが可能である。
データアドレス
データアドレスは、データにアクセスするために使用される有効アドレスの単純な形式であり得る。
コードアドレス
コードアドレスは、非局所コードのために使用される有効アドレスの単純な形式であり得る。
ラベル
ラベルは、局所コードのために使用される有効アドレスの単純な形式であり得る。
条件コード
IRは、条件コードのための抽象概念を使用することができる。
レジスタセット
レジスタセットは、killセットおよび副作用を表現するために使用可能である。
即値
即値オペランドは、命令に現れ得る既知の値を指定することができる。この値は、常にコンパイラに既知であることもあり、あるいは、ローレベル化、リンク、およびロード状態を含む後の段階でのみ決定されることもある。
整数即値
整数即値は、最大整数サイズに正規化され得る。
浮動小数点即値
浮動小数点即値は、内部/ポータブル形式に正規化され得る。
シンボリック即値
シンボリック即値は、コンパイラによって計算され、あるいはおそらくはリンカーによって/ランタイム時に修正される定数値を表現するシンボルであり得る。
演算(マシン非依存オペコード)
演算はいくつかのカテゴリに分けることができる。これらのカテゴリは、以下のように、異なる可変サイズの種類の命令にグループ分けあるいは分解することができる:
・算術演算
・オーバーフロー付き算術演算
・論理演算
・ポインタ演算
・構造体演算
・オブジェクト演算
○割付け
○呼出し(仮想、インスタンス)
○フィールドアクセス/更新
・配列演算
○割付け
○読み書き
○境界チェックなしの読み書き
○長さ演算
・ベクトル演算
・分岐演算
・呼出し演算
・組み込み (intrinsic)呼出し演算
・復帰演算
・スイッチ(switch)演算
・例外演算
・型変換(動的/静的キャスト)
・型テスト演算
・セキュリティ演算
・スレッド化(threading)演算
・同期演算
・チェック演算
○ヌルポインタ(null pointer)チェック演算
○境界チェック演算
○型テスト演算
・アウトライン擬似演算
・データ演算
ブロック
フローグラフが存在する場合、特別のブロック擬似命令が、基本ブロックの開始および終了を表すことができる。
ラベル
ラベルは、ユーザが定義しても、コンパイラが生成してもよい。
プラグマ
プラグマ(pragma)は、ユーザが定義しても、コンパイラが生成してもよい。
注釈
注釈は、ユーザが定義しても、コンパイラが生成してもよい。通常、注釈は、ネイティブコンパイラおよびJITコンパイラがコード品質を改善するために使用可能な追加的な意味情報を伝える。
リスト
リストIRノードは、制御命令によって指定されるフロー内のリンクを作成するために使用される補助ノードであり得る。
分岐リスト
分岐リストノードは、ラベルにアタッチされ、すべての到達する分岐を表すことができる。
ケースリスト
ケース(case)リストノードは、スイッチ演算にアタッチされ、すべてのケース値および分岐を表すことができる。
デバッグ情報(行およびカラム)
あらゆる命令が、ソース行およびカラム情報を記述するデバッグ情報を持つことができる。コードを展開/ローレベル化する場合または最適化を行う場合、この情報は、デバッグ目的で維持されることが可能である。
型システム
IRは、IRの種々の形式における一貫性をチェックするための型の表現も含むことができる。具体的には、型付き言語および型なし言語、ゆるく型付けされた言語および強く型付けされた言語、ならびにガーベジコレクション(メモリ整理)のある言語およびガーベジコレクションのない言語等の複数のソース言語で書かれたプログラムを表現する際に使用するのに適した、型付けされた中間言語を提供することができる。さらに、プログラムコンポーネントのためのソース言語および/またはコンパイル段階に応じて、異なる型および型チェックルールの使用を可能にする型チェッカアーキテクチャをSDAにおいて提供することができる。
例えば、さまざまな言語で書かれたプログラムに適用されるハイレベルオプティマイザがあれば望ましいであろう。これらの言語は、異なるプリミティブ(基本)型およびプリミティブ演算を有し得る。ある言語は、例えば複素算術のための型および演算を含むかもしれない一方で、別の言語は、コンピュータグラフィックスに対する型仕様および演算仕様を含むかもしれない。中間表現が異なる型システムによってパラメトライズされることを可能にすることにより、オプティマイザは、異なるプリミティブ型およびプリミティブ演算を有する言語に使用することが可能となる。
もう1つの例として、ある特定のコンポーネントは言語の強く型付けされたサブセットで書かれ、他のコンポーネントは、型安全(type-safe)でないフル言語で書かれているというプログラムがあり得る。前者のセットのコンポーネントに対して、より多くのエラーチェックがあれば望ましい。これは、異なるコンポーネントに対して異なる型チェックルールを使用することによって達成することができる。
さらにもう1つの例として、コンパイル中に型情報を落とすことがある。型チェッカおよびコンパイラは、初期段階では厳密な情報が維持されることを強制する一方で、後の段階で型情報が落ちることを許容することがある。これは、異なるコンパイル段階に対して異なる型チェックルールとともに未知(unknown)型を使用することによって達成することがある。
SDAの一実施形態では、型付きIRによって種々の言語の型システムを表現することができるように、いくつかの型表現を型クラス階層において定義することができる。すべての型に対して、抽象基本クラスを「Phx::Type」として定義することができる。基本クラスは、例えば、実型、シンボリック型または未知(すなわち可変)型のような種々の型に対するサイズ情報「sizekind」を含むことができる。また、基本クラスは、型分類を指定するために「typekind」も含むことができる。さらに、型付きIRから原ソースコードへの逆マッピングを提供するために、外部的に定義された型をラップする抽象型として外部(external)型を提供することができる。
基本クラスの下で、「Phx::PtrType」として定義されるクラスが、ポインタ型を表現することができる。種々のポインタを同様に定義することができる。例えば、ガーベジコレクトされるマネージドポインタ(ガーベジコレクトされるオブジェクト内の位置を指す)、ガーベジコレクトされないマネージドポインタ(ガーベジコレクトされないオブジェクト内の位置を指す)、アンマネージドポインタ(例えば、C++で書かれたコードに見られるもの等)、参照ポインタ(ガーベジコレクトされるオブジェクトのベースを指す)、およびヌルがある。
階層内の同一レベルにおいて、「Phx::ContainerType」として定義されるクラスは、内部メンバを含む型のようなコンテナ型を表現することができる。内部メンバは、フィールド、メソッド等の型を有することができる。「Phx::FuncType」として定義されるクラスは、関数型を表現し、必要な呼出し規約、引数リストおよび返値型リストを含む。また、「Phx::UnmgdArrayType」として定義されるクラスは、アンマネージド(unmanaged)配列型を表現することができる。階層内の「Phx::ContainerType」の下には、さらに4つのクラスを定義することができる。「Phx::ClassType」として定義されるクラスはクラス型を表現し、「Phx::StructType」として定義されるクラスは構造体(struct)型を表現し、「Phx::InterfaceType」として定義されるクラスはインタフェース型を表現し、「Phx::EnumType」として定義されるクラスは列挙型を表現することができる。階層内の「Phx::ClassType」の下で、「Phx::MgdArrayType」として定義されるもう1つのクラスは、マネージド配列型を表現することができる。
クラス「primtype」は、構造体型の特別のインスタンスとして定義することができる。「primtype」は、int、float、unknown、void、条件コード、unsigned int、xint等のような種々の型を含むことができる。これらの表現は、型付きIRのHIRまたはLIRの両方で使用可能である。
さらに、ターゲット仕様プリミティブ型を型表現に含めることができる。いくつかの言語は、型システムが複素算術型を認識すれば効率的に処理することが可能な複素算術型を有する。例えば、「MMX」命令を考える。このような命令は、マルチメディアおよび通信データ型に対する単一命令/複数データ演算をサポートするためにx86プロセッサのいくつかのバージョンに組み込まれた追加命令セットの1命令である。型システムは、型表現の最小限の変更で、これらの命令を認識し使用するようにカスタマイズすることができる。
上記の型の型表現の実施形態は、「未知(unknown)」型も含むことができる。これは、任意の型を表現することができ、随意に、それに関連するサイズを有する。サイズは、値のマシン表現のサイズであってもよい。未知型は、型情報を特定の型から未知型に変更することによって、コンパイラが制御された形で型情報を落とすことを可能にする。これにより、コンパイラは、型が未知である場合であっても、操作されている値のサイズに依存するコードを生成することができる。他の型が未知型を使用するかもしれないので、未知型は、部分的な型情報の表現(その場合、全部ではないが一部の情報が既知である)も可能にする。
例えば、int型へのポインタを考える。ローレベル化のある段階で、その型情報、すなわちintを落とすことが望ましい場合がある。unknown型は、コンパイラがint型をunknown型で置き換えることを可能にする。その場合、型チェッカは、当該ポインタが正しい型を指していることをチェックする必要がない。これは本質的に、指されている値がランタイム時にプログラム機能に悪影響を及ぼさないように渡されると見込むことである。
unknown型を使用するもう1つの例として、関数の型を定義する場合がある。引数の型がunknownである関数が呼び出され、その引数の型は前にintへのポインタであった場合、コンパイラは、正しい型が渡されていることを信頼しなければならない。そのポインタを逆参照した結果がintであることが分かる場合も分からない場合もあるが、それはintとして使用される。もっと複雑な例として、仮想関数呼出しのハイレベルからローレベルへの中間表現の変換中に、中間一時変数を導入する場合がある。オブジェクト指向言語において仮想呼出しを実装するために、仮想テーブル(vtable)が広く使用されている。ローレベル中間表現において仮想関数呼出しを行う場合の最初のステップは、メモリのオブジェクトの最初のフィールドをフェッチ(fetch)することである。最初のフィールドは、vtableへのポインタを含む。次に、フェッチの結果を一時変数に代入する。一時変数の型(vtableへのポインタを表現する型であって、ここでvtableは多くのフィールドを有し得る)を構築することは複雑であり表現が面倒な場合がある。その代わりに、コンパイラは単に、中間一時変数に「pointer to unknown」を代入することができる。こうして、詳細な型情報を保持することが不要な場合やコンパイラ開発者(implementer)にとって多大な負担となる場合に、unknown型を使用することにより、後のコンパイル段階が単純化される。
図7は、コンパイルの種々の段階でIRを型チェックし、したがってローレベル化の種々のレベルで型付きIRを型チェックするコンパイラシステムの一実施形態を示している。ソースコード700は、さまざまなソース言語のいずれか1つを表す。ソースコード700は、型付きIRのHIR702に翻訳される。その際、ソース言語の型表現が、型付きIRの内部の型表現に翻訳される。
HIRは、コンパイルプロセス全体を通じてローレベル化される。この説明の目的上、高(HIR)702、中(MIR)704、および低(LIR)706の各レベルの表現が示されている。しかし、本実施形態はそのようには限定されない。任意個数のコンパイル段階で型チェックが可能である。
表現の各レベルにおけるIRは、型チェッカ708によって型チェックされ得る。型チェッカ708は、コンパイルプロセスの各段階に、したがってIRの各表現に、1つまたは複数のルールセット710を適用するためのアルゴリズムまたは手続きを実装する。ルールセット710は、ソース言語、コンパイル段階、型付けの強さの程度等のようなさまざまな性質に基づいて選択される。
例えば、ソースコード700が、C++プログラミング言語で作成されたコードを含むと仮定する。C++ソースコード700は、まず、型付きIRのHIR702に翻訳される。必要であれば、この時点で、型チェッカ708が、任意個数の性質を判定するためにHIR702と対話することができる。そのような性質としては、コンパイル段階(HIR)、与えられたソースコードのタイプ(C++)、その言語が型付きかどうか(yes)、それがゆるく型付けされているかそれとも強く型付けされているか(ゆるく型付けされている)等が挙げられる。これらの性質に基づいて、型チェッカは、適切なルールのセットを選択することができる。ルールセットを選択した後、型チェッカは、そのルールセットに従ってHIRを型チェックする。HIRがMIRまたはLIRにローレベル化された後は、それらの性質が再びアクセスされ、同一のルールセットが適切な場合も、異なるルールセットが適切な場合もある。
一実施形態では、型チェックルールの3つのセットを型チェッカに供給することができる。1つのセットは、C#やCILを型チェックするために望ましい「強い」型チェックに対応し得る。もう1つのセットは、「強い」(strong)型チェックよりもゆるい(looser)型チェックである「弱い」(weak)型チェックに対応し得る。例えば、弱い型チェックルールセットは型キャストを許容することができる。型キャストとは、ある型の変数を、一度限りの使用のために別の型のようにふるまうようにする場合のことである。例えば、型intの変数は、char(文字)のようにふるまうようにすることができる。次のコードは、文字「P」を印字するために型キャストを使用している。
int a;
a = 80;
cout << (char)a;
このように、たとえ「a」が型intとして定義され、値80が代入されていても、cout文は、型キャストにより変数「a」を型charとして扱うので、80ではなく「P」(ASCII値80)を表示することになる。
最後に、第3のセットは「表現」(representation)チェックに対応し得る。「表現」チェックは、unknown型の使用等により中間プログラム表現の一部で型情報を落とすことを可能にし、このような型情報をいつ落とすことができるか、あるいはunknown型を別の型でいつ置き換えることができるかを規定するルールを含むことができる。例えば、型Voidの値を返す関数の結果は、unknown型の変数に代入されることが禁止されてもよい。
さらに、単一のコンパイル段階で複数のルールセットを使用することができる。例えば、ソースコード700は単一の言語を含むが、強く型付けされたセクションと、ゆるく型付けされたいくつかのセクションとを含むと仮定する。型チェッカは、ある特定の強く型付けされたセクションのHIRに対してあるルールセットを使用し、ゆるく型付けされたコードセクションに対しては別のルールセットを使用することができる。
図8は、本明細書に記載のIRとともに使用するための型チェッカのブロック図である。型チェッカ800は、異なるソース言語および/または異なるコンパイル段階に対応する任意個数のルールセットを入力として受け付けることができる。図8では、4個のルールセット802〜808が型チェッカ800に提供されている。ルールセット802は、強い型付けを有する言語のHIRに対するルールセットを表し、ルールセット804は、弱い型付けを有する言語のHIRに対するルールセットを表し、ルールセット806は、型付けのない言語のHIRに対するルールセットを表し、ルールセット808は、LIRに対するルールセットを表す。プログラムモジュール810は、HIRにおける強い型付けを有する言語を表し、プログラムモジュール812は、LIRにローレベル化された後のプログラムモジュール810を表す。
型チェッカ800は、型チェックされるプログラムモジュールの性質に基づいて適切なルールセットを選択し、組み込まれている手続きまたはアルゴリズムを用いてプログラムモジュールに選択したルールセットを適用する。例えば、型チェッカ800は、プログラムモジュール810(HIRにおける強い型付けを有する言語を表す)を型チェックするためにルールセット802(強い型付けを有する言語のHIRに対するルールセットを表す)を選択することができる。その後、型チェッカ800は、プログラムモジュール812(LIRにおける強い型付けを有する言語を表す)を型チェックするためにルールセット808(LIRに対するルールセットを表す)を選択することができる。
本明細書に記載の型チェックシステムのルールセットは、全く新しい言語に容易に拡張されるとともに、既存の言語の新しい特徴にも容易に拡張される。例えば、新しい言語が導入される場合、その新しい言語に対して新しいルールセットが単に作成される。ルールセットは型チェッカやコンパイラシステム自体とは別個であり、別個のエンティティとしてルールセットを受け付けるように設計されるので、新しい言語に対する新しいルールセットは、既存の型チェックシステムやコンパイラを再配布または更新することを必要とせずに配布することができる。同様に、例えばXMLサポートをC++に追加する場合のように、新しい特徴が既存の言語に追加される場合、種々のコンパイル段階におけるC++に対応するルールセットは、その新しい特徴を処理するように動的に容易に再構成することができる。この場合も、新たなコアシステムを更新したり配布したりする必要はない。
ルールセットは、型に対する制約も可能にする。例えば、クラスが別のクラスを継承する場合に特定の型に対するサブタイピング(部分型化)が許容されるかどうかは、そのルールに記述される制約であり得る。もう1つの制約として、データがそのデータを含む仮想テーブルに変換可能かどうかを示すことが望ましい場合のような、ボックス(囲み)制約(boxed constraint)があり得る。他の制約として、サイズ制約や、同一型のプリミティブの必要性を示すプリミティブ型制約が挙げられる。ルールセットの他の部分と同様、新しい制約を必要に応じて追加することができる。
型チェッカによって使用されるルールセットは、ルールセットを作成するためのアプリケーションへのプログラミングインタフェースを通じて構築することができる。そのアプリケーションは、型付きIRの個別の命令に割り当てられたルールを用いてルールセットが型プリミティブの階層において表現されるように、ルールを構築することができる。この階層は、特定のプログラムモジュールまたはコンパイル単位に関連する型の種々の要素を明示的に表す型グラフの形式で提供することができる。シンボルや演算のようなIR要素は、型システムの要素に関連づけられる。型グラフノードは、コンポーネント、ネストされた型、関数シグネチャ、インタフェース型、階層の要素およびその他の情報(例えば、ソース名およびモジュール/アセンブリ外部型要素への参照)のような、プリミティブ型および構築された型ならびにそれらの関係を記述する。
例外処理
SDAとともに使用するための本明細書に記載のIRは、C++、Microsoft CLR、およびMicrosoft Windows(登録商標)の構造化例外処理(SEH)のような、さまざまな言語固有の例外処理モデルをサポートすることができる。
図9は、コンパイラバックエンド940によって、複数のソース言語(905〜908)に対しIR(言語費依存中間表現)930において統一的例外処理を実装するシステム900を示している。図9に示すように、システム900は、複数のソースコード表現905〜908のそれぞれに対する中間言語(IL)表現910〜913を含む。中間言語(IL)表現910〜913は、ILリーダ920によって構文解析すなわち読み取りが行われる。ILリーダ920は、複数のIL表現910〜913を単一のIR930に翻訳する。IL表現は、IR930よりも高いレベルの中間表現であり、CIL(Microsoft CLR)(C#、Visual Basic、JScript、C、およびFORTRANの場合)およびC++ IL(C++の場合)のような任意個数の周知の中間言語で表され得る。複数の言語に対する統一的な例外処理フレームワークを生成するシステム900は、複数のソース言語に対する単一のIRリーダプロセスを有するように示されているが、このようなリーダを複数実装し、それぞれが1つまたは複数のIL表現910〜913に対応するようにすることも可能である。
図10Aは、複数の異なるソース言語で表された例外処理コンストラクトに対する統一的な中間表現のセットを生成するためにILリーダ920を使用する一般的な全体的方法1000を示している。1010で、リーダ920がソフトウェアの中間言語表現(例えば、ソースコードファイルの中間言語表現)を受け取る。1015で、ファイルの読み取りすなわち構文解析を行い、ILコードストリーム内の例外処理コンストラクトを識別する(1020)。次に、1030で、リーダ920(これは仮想マシンとみなすこともできる)が、前に1020で識別された例外処理コンストラクトの単一の統一的IRを生成する。その後、このような例外処理フレームワークを使用することにより、コード最適化やコード生成のようなコンパイラバックエンドのプロセスを単純化することができる。
例外処理コンストラクトを有するソフトウェアの統一的IRは、ソフトウェアの例外処理制御を明示的に表すことができる。図10Bは、ソフトウェアの統一的IRから実行ファイルを生成する方法1050を示している。このような方法は、例えば、コンパイラ等のソフトウェア開発ツールがソフトウェアの実行可能バージョン(例えば、マシン仕様コード等のオブジェクトコード)を生成する際に使用可能である。
1060で、統一的IRを(例えばコンパイラ等のソフトウェア開発ツールにより)読み取る。例えば、図10Aの方法によって生成された統一的IRを使用することができる。統一的中間表現への他の変換、翻訳、または最適化を必要に応じて実行することができる。
1070で、ソフトウェアのコンピュータ実行可能バージョンを(例えばコンパイラ等のソフトウェア開発ツールにより)生成する。ソフトウェアのコンピュータ実行可能バージョンは、統一的IRに基づいて、ソフトウェアの例外処理制御フローを実装する。
図11は、複数のIL表現の形式で表された複数のソース言語内の例外処理コンストラクトの単純で統一的なIRを生成するシステムのもう1つの実施形態を示している。図11に示すように、まず、Microsoftの.NETフレームワーク内でサポートされるソース言語グループ1110(例えば、C#、C、Microsoft Visual Basic、Jscript、およびFORTRAN)をCIL表現1140に変換する。しかし、他のソース言語との差異のため、C++はCIL1130として知られる別の中間言語で表される。C++ ILおよびCIL内の制御フローおよび例外処理モデルは基本的に異なる方法で表されるため、C++ ILおよびCIL表現に対して別個のILリーダ(1135および1145)を提供する必要があるかもしれない。
リーダ1135および1145はいずれも、それぞれのリーダ内に実装された適切なアルゴリズムを用いてそれぞれの中間言語コードストリームの構文解析すなわち読み取りを行う。これにより、例外処理命令の統一的フレームワークを用いて中間言語コードストリーム内の例外処理コンストラクトまたは命令または表現1150を表し、これがコンパイラバックエンド1160に提供される。
コード生成
SDAを用いて任意個数の実行アーキテクチャに対するソフトウェア開発ツールを生成するために、SDAは、共通IRから任意個数のマシン依存表現を生成することが可能なコードジェネレータを含むことができる。図12に、このようなコード生成のためのシステムの一実施形態を示す。この例では、ターゲット仕様データを有するターゲット実行アーキテクチャ仕様1200がリターゲティングツール1202に供給される。別法として、仕様1200、およびターゲット不問データを有する第2の仕様1204が、リターゲティングツール1202に供給されることも可能である。
リターゲティングツール1202は、1つまたは複数のコード生成コンポーネントに関係するデータについて仕様1200/1204を構文解析するソフトウェアである。仕様1200/1204内のデータに基づいて、リターゲティングツールは1つまたは複数のコンポーネントを作成する。各コンポーネントは、コード生成コンポーネントを作成するデータを提供する。
例えば、図12の実施形態では、(例えばlexフォーマットの)トークン化(文字列などの分割)文法1206、および(例えばyaccフォーマットの)パーサ(構文解析)文法1208、ならびに一連のCソースおよびヘッダファイル1210が生成される。
lexを使用する例では、トークン化文法1206が、コンパイラの字句(lexical)解析コンポーネントを生成するのに必要なソースコードおよびヘッダファイル1214を作成するためにlexコンパイラ1212に提供される。lexは、特にコンパイラ字句解析コンポーネントを作成するために設計された言語である。
yaccを使用する例では、パーサ文法1208が、コンパイラの構文解析コンポーネントを生成するのに必要なソースコードおよびヘッダファイル1214を作成するためにyaccコンパイラ1216に提供される。yaccは、ソースコード入力の構造と、そのような各構造が認識される時に呼び出されるべきコードとを指定する一般的ツールを提供する。
ソフトウェア開発ツールを構築するのに必要なコンポーネントを生成することを最終的に担当するソースコードは、リターゲティングツールによって生成される一連のCソースおよびヘッダファイル1210/1214を、SDAのコンフィギュレーション内に含まれる共通フレームワーク1218と統合することによって生成される。例えば、字句および構文解析コンポーネントは、一連のCソースおよびヘッダファイル1214を、共通フレームワークのソースコードおよびヘッダファイル1218と統合したものをコンパイルすることによって生成される。同様に、一連のCソースおよびヘッダファイル1210を、共通フレームワークのソースコードおよびヘッダファイル1218と統合したものをコンパイルすることによって、他のソフトウェア開発ツールコンポーネントを生成することができる。
このように、Cソースおよびヘッダファイル1210/1214と共通フレームワークのソースコードおよびヘッダファイル1218を統合したものを表すソースコード1220をコンパイラ1222に提供することにより、SDA内の共通フレームワークに準拠する仕様1200に記述されたターゲット実行アーキテクチャをターゲットとするコンパイラ1224が生成される。
上記のように、ソフトウェア開発ツールコンポーネントは合法化テーブルを含む。このようなテーブルは、特定の形式のターゲット命令を識別するのに十分な情報を含む。合法化フレームワークは、命令選択、命令合法化、エンコーディング、およびリスティングコンポーネントによって使用される書式指標(form index)を提供することができる。
図13は、本明細書に記載の技術とともに使用するのに適したコード生成のためのソフトウェアに実装される方法の一実施形態のフローチャートである。1302で、ターゲット実行アーキテクチャ仕様を処理することにより、ソースコードによって表現されるいくつかのコンポーネントを作成する。次に、1304で、ソースコンポーネントを統合して、ソースコードにより表現されるフレームワークを形成する。フレームワークは、SDAコアによって提供されること、またはSDAコアとともに含まれることが可能である。必要であれば、ブロック1306で、カスタムコードも含めることができる。その後、ブロック1308で、統合されたソースコードをコンパイルすることにより、コード生成コンポーネントからソフトウェア開発ツールを作成する。
コアデータ構造の拡張
SDAのもう1つの実施形態では、SDAコアデータ構造を拡張可能なように構成する方法およびシステムが提供される。SDAコアデータ構造の拡張フィールドは、ソフトウェア開発シナリオ、SDAのどのコンフィギュレーションが構築されているか、あるいはターゲットソフトウェア開発ツールの個別の所望の特性に応じたその他の要因に依存してもよい。図14Aは、コアフレームワークを拡張することによってツールを構築するためにコアクラス定義を拡張する全体的プロセスを示している。まず、1402で、拡張(エクステンション)を指示するデータを受け取り、1404で、エクステンションによって指示されるように、ソフトウェア開発ツールのクラスを拡張する。
図14Bは、SDAコアフレームワークを拡張するためにソフトウェアシナリオ依存エクステンションを使用することによってソフトウェア開発ツールを構築する全体的プロセスを示している。1410で、単純化されたオブジェクト定義言語(ODL)を用いてコアクラスを定義することができる。次に、1420で、ソフトウェア開発シナリオ等の任意個数の要因に基づいて、特定のSDAに対するコンフィギュレーションを決定することができる。ソフトウェア開発シナリオは、作成されているソフトウェア開発ツールのタイプ、ターゲット実行アーキテクチャ、ターゲット入力言語等を指示してもよい。次に、1430で、考慮されている要因の一部または全部に基づいて、オブジェクト記述言語を用いてエクステンションを定義することにより、コアクラスを拡張するのに必要な追加の、または異なるクラスメンバを表現する。
1440で、エクステンションをコアクラスに関連づけることにより、コアクラス定義を適切に拡張することができる。オブジェクト記述言語の構文は、コアクラスが拡張可能かどうかを定義するとともに、拡張クラスメンバの特定のセットを選択されたコアクラスのエクステンションとして関連づけるように図るべきである。さらに、プリプロセッサ翻訳プログラムを用いて、データまたはオブジェクト記述言語をプログラミング言語に翻訳することができる。このような前処理の後、1450で、拡張されたクラス定義をさらにコンパイルし、それを用いることにより、コアフレームワークを拡張することによって特定のコンフィギュレーションの他のソフトウェア開発ツールを実装することができる。
上記のプロセスを用いて、エクステンションの複数の異なる定義を別個に提供することができる。各エクステンションは、複雑な継承関係を維持することを必要とせずに、必要に応じてコアまたは基本クラスを単に拡張することができる。コアクラスの特定のエクステンションを提供するプログラマは、コアクラスの他のエクステンションについて知っている必要はない。これは、エクステンションを定義する作業を単純化するだけでなく、拡張されたコアクラスのユーザは、拡張されたコアクラスを使用するためにコアクラス名を知っているだけでよい。したがって、プログラマは、拡張されたクラス定義を使用する時に、クラス定義の間の複雑な階層関係を記憶する作業から解放されることが可能となる。
コアフレームワークプログラムを拡張するための1つの手法として、コアプログラムのソースコードファイルへのアクセスを取得し、オブジェクト記述言語を用いてエクステンションを定義することにより必要に応じてコアクラスを静的に拡張するというものがあり得る。その後、このエクステンションを処理することにより、エクステンションをコアクラスに自動注入し、拡張されたクラスを生成することができる。別法として、ソースコード言語によるソースコードに直接、エクステンションを手で追加することによって、拡張されたクラスを生成してもよい。図15Aは、この手法により、コアフレームワークファイル1510を拡張するためにコアフレームワークファイル1510にエクステンション1520、1530および1540を追加し、こうして拡張されたコアフレームワークファイル1510の一部としてエクステンション1520、1530および1540をコンパイルする様子を示している。
しかし、この手法はすべての目的に適しているとは限らない。というのは、1520、1530および1540のようなエクステンションの定義を提供するプログラマは、コアフレームワーク1510のソースコードにアクセス可能であることが必要となるからである。これは、コアフレームワーク1510のプロバイダがコアフレームワークのソースコードを秘密に保ちたいという状況では望ましくないことがある。その場合、図15Bに示す第2の手法を使用することができる。これによれば、コアコンパイラフレームワーク1550は、エクステンション1560、1570、および1580とは別個のファイルとしてコンパイルされる。
この第2の手法では、エクステンション1560、1570および1580とコアフレームワーク1550が互いへのリンクを有するように適応させることにより、ランタイム時に、エクステンションがコアフレームワークにリンクされて、コアフレームワークを適切に拡張することができる。リンクは、特定のコアクラスを拡張するためにどのエクステンションを使用すべきかを指定する単純なリンクリストとして実装されてもよい。これは、必要な場合にコアクラスにエクステンションを適切に関係づける単純な名前付け規約を使用することによっても達成することができる。第1の手法と比べると、この第2の手法は、ランタイム時にリンクを行うという側面(aspect)に関連する追加的なオーバーヘッド処理を必要とすることがあるため、より低速の実装となる可能性がある。他方、この第2の手法は、コアフレームワークのソースコードにアクセスできない開発者によるコアクラスの拡張を可能にするというフレキシビリティを提供する。
図16は、上記で図15Aを参照して示したように、コンパイル時の前にコアフレームワークプログラムに関係するクラスを静的に拡張する方法を示している。コアクラスおよびそのエクステンションは、オブジェクト記述言語を用いて定義することができる。コアクラスおよびエクステンションの定義は、同時に、あるいは一緒に生成される必要はない。しかし、エクステンションを追加するには、コアプログラムのソースコードへのアクセスが必要となる。
このようなクラス定義を取得した後、1610で、コアクラスおよびそのエクステンションの定義をODLプリプロセッサにより一緒に処理する。ODLプリプロセッサは、オブジェクト記述言語表現をソースコード表現に翻訳することができる。すると、1620で、ODLプリプロセッサによる前処理の結果は、コアクラスおよびそのエクステンションの定義をC++のようなソースコード言語で表すヘッダファイルあるいは他のコードとなる。その後、1630で、コアクラスメンバおよび拡張クラスメンバを含む拡張されたクラス定義を有するヘッダファイルを、こうして拡張されたコアフレームワークに関係するコードの残りの部分とともにコンパイルすることにより、カスタム構成されたソフトウェア開発ツールを生成する。
図17は、図16のプロセスを実装する例示的システムを示している。図17に示すように、コアクラス定義1720に対するエクステンションの複数の定義1710を、オブジェクト記述言語ファイルとして格納することができる。コアクラス定義およびエクステンション定義にそれぞれ対応するファイル1710および1720を受け取ることが可能なODLプリプロセッサ1730を提供することができる。プリプロセッサは、ファイル1710および1720を、それらのオブジェクト記述言語形式からソースコード表現1740に翻訳することも可能でなければならない。ソースコード表現は、コンピュータプロセッサによって実行可能な形式に最終的にコンパイルすることができるいかなる言語であってもよい。プリプロセッサ1730によって生成されるソースコード1740としては、クラス定義が通常格納されるヘッダファイルが挙げられる。プリプロセッサ1730によって出力されるソースコード1740の言語に適したソースコードコンパイラ1750を提供することができる。ソースコードコンパイラ1750は、ソースコード表現1740をコンパイルすることにより、コンパイラ等のソフトウェア開発ツールのようなコアソフトウェアプログラムのカスタマイズされた拡張バージョン1760を作成する。
図18は、ランタイム時に適切なコアクラスにエクステンションをリンクすることにより拡張可能コアフレームワークソフトウェアプログラムのコアクラス定義を拡張する方法を示している。コアクラス定義およびエクステンションは、オブジェクト記述言語を用いて別個に表現することができる。記述言語は、コアクラス定義が動的に拡張可能であることを表現するのに適しているかもしれない。また、このような言語は、特定のコアクラス定義とそのエクステンションとの間の関連づけを表現するのに適しているかもしれない。1つのこのような好適な言語の構文について以下でさらに詳細に説明する。定義が表現された後、1810でODLプリプロセッサを使用することにより、1820で、オブジェクト記述言語表現による定義をソースコード表現に翻訳することができる。しかし、静的プロセス(図16)とは異なり、図18の動的プロセスでは、コアクラス定義は、ODLプリプロセッサによって、そのエクステンションの定義と一緒には処理されない。その代わりに、コアクラス定義に対応するソースコードヘッダファイルおよびクラスエクステンション定義に対応するソースコードヘッダファイルが別個に生成される。これらは、異なるODLプリプロセッサにより生成してもよいが、必ずしもそうする必要はない。さらに、1830で、コアクラス定義を含むヘッダファイルおよびエクステンション定義を含むヘッダファイルを別個にコンパイルすることにより、コンピュータにより実行可能な別個のファイルを作成する。しかし、1840で、ランタイム時に、クラスエクステンション定義を適切なコアクラス定義にリンクすることにより、定義の通りにコアクラスを拡張することができる。
図19は、図18のプロセスを実装する例示的システムを示している。図19に示すように、クラスエクステンション定義がオブジェクト記述言語で提供され、ファイル1910に格納される。必ずしも各エクステンションが図示のように別個のファイルとして格納される必要はない。コアクラス定義もまたオブジェクト記述言語で提供され、ファイル1920に格納される。図18に記載のプロセスによれば、コアクラス定義をオブジェクト記述言語表現からソースコード言語表現に翻訳することによってコアクラス定義を処理し、ヘッダファイル1935として格納するために、ODLプリプロセッサ1925が提供される。同様に、クラスエクステンションファイル1910を処理することによりエクステンションを含むソースコードヘッダファイル1940を生成するために、さらにもう1つのODLプリプロセッサ1930を提供することができる。クラスエクステンションヘッダファイル1940をコンパイルすることによりクラスエクステンション定義を含むコンピュータ実行可能ファイル1960を生成するために、ソースコードコンパイラ1945を提供することができる。同様に、コアクラス定義を含むヘッダファイル1935をコンパイルすることによりコアクラス定義を含むコンピュータ実行可能ファイル1955を生成するために、ソースコンパイラ1950を提供することができる。その後、ランタイム時に、コアクラスに対応する実行可能ファイル1955および拡張クラスに対応する実行ファイルが実行されると、コアおよび拡張クラス内に提供されるリンク1970により、コアクラスを適切に拡張することができる。
ソフトウェア成果物
図20は、本明細書に記載の技術のコンピュータソフトウェア成果物(deliverable)のブロック図である。ソフトウェア成果物2000はSDA2002を含む。SDA2002は、本明細書に記載のIR、例外処理モデル、型システム、コードジェネレータ、またはコアデータ構造拡張技術の1つまたは複数を実装するためのソースコードまたはオブジェクトを含むことができる。SDA2002は、任意個数のソフトウェア開発シナリオにおいて、さまざまなソフトウェア開発ツールのいずれかを生成するように構成されることが可能である。そのコンフィギュレーションとしては、以下のものに限定されないが、ネイティブコンパイラコンフィギュレーション2004、JITコンパイラコンフィギュレーション2006、Pre−JITコンパイラコンフィギュレーション2008、解析ツールコンフィギュレーション2010、欠陥検出コンフィギュレーション2012、オプティマイザコンフィギュレーション2014、またはCDKコンフィギュレーション2016が挙げられる。
ソフトウェア成果物は、ターゲットソフトウェア開発ツールを生成するために、好適なコンピュータシステムで実行することができる。コンポーネント2018が、コンピュータシステム上のソフトウェア成果物2000/SDA2002に提供される。コンポーネント2018は、以下のものに限定されないが、ターゲット実行アーキテクチャに関連するデータ2020、クラス拡張宣言のセット2022、ターゲットソフトウェア開発ツールの入力言語に関連するデータ2024、および1つまたは複数の型ルールセット2026、の1つまたは複数を含むことができる。
ソフトウェア成果物は、選択されたコンフィギュレーションおよびコンポーネント2018に基づいてソフトウェア開発ルールを生成することができる。例えば、図21は、図20に記載のソフトウェア実行ファイルの一具体例を示すブロック図である。
ソフトウェア成果物2100は、オプティマイザコンフィギュレーションでのSDA2102を含む。コンポーネント2104は、x86に関連するデータ2106、オプティマイザコンフィギュレーションと整合するクラス拡張宣言のセット2108、入力言語C++に関連するデータ2110、および型チェックのための3個のルールセット2112(例えば、1つのセットは強い型チェックに対応し、1つは弱い型チェックに対応し、1つは表現型チェックに対応する)を含む。コンポーネント2104がソフトウェア成果物2100/SDA2102にリンクされることにより、オプティマイザ2114が作成される。オプティマイザ2114は、C++言語で書かれたソースコードを入力とし、x86アーキテクチャをターゲットとする。
図22は、本明細書に記載の技術のコンピュータソフトウェア成果物のもう1つの実施形態を示している。この実施形態では、ソフトウェア成果物2200は、SDA2210のバイナリ等のコンピュータ実行可能ファイルバージョンであり得る。その場合、ソフトウェア開発コンポーネント2220が(例えば、ソースコードにアクセスせずにランタイム時に)ソフトウェア成果物2200に(例えば動的に)リンクされることが可能である。結果として得られるコンポーネントとソフトウェア成果物の組合せから、ソフトウェア開発ツール2230を作成することができる。
別法として、図23に示すように、既存のソフトウェア開発ツール2300を修正することができる。ソフトウェア開発ツール2300は、本明細書に記載の種々の方法等において、SDA2310を用いて生成することができる。そして、ソフトウェア開発ツールの修正バージョン2330を作成するために、新しいコンポーネント2320を作成し、SDA2310にリンクすることができる。
さらにもう1つの実施形態では、SDAを用いて相互互換(inter-compatible)ソフトウェアツールを作成することができる。図24は、SDA2410を用いて生成された第1のソフトウェア開発ツール2400のブロック図である。続いて、第2のソフトウェアツールの機能を含む1つまたは複数の新しいコンポーネント2420を作成し、バイナリ等の実行可能フォーマットのSDA2430にリンクすることにより、第2のソフトウェア開発ツール2440を形成することができる。第1および第2のソフトウェアツール2400/2440は、それらがSDAの(共通IRのような)特性を共有していることにより、相互互換である。
例示的なIRフォーマットの拡張性
SDAに対して定義されるコアクラスが拡張可能であるので、IRフォーマット自体も拡張可能である。例えば、新しいクラスメンバをコアクラスに追加し、IRフォーマットで表現することができる。このような構成は、スケーラビリティの目的上、有益となり得る。例えば、JITコンパイラのために(例えばパフォーマンスの理由から)軽量(ライトウェイト)データ構造を使用することが望ましい場合がある。他方、全プログラムの最適化コンパイラのためには、より包括的なデータ構造が適切な場合がある。
コアクラスは、本明細書に記載のオブジェクト記述言語メカニズムにより拡張可能である。したがって、コアクラスは、適切なソフトウェアコンポーネントまたはツールの開発時またはランタイム時のいずれにも(例えば、コアクラスのソースコードにアクセスせずに)拡張可能である。このようにして、システムは、IRフォーマットのランタイム拡張性をサポートすることができる。
例示的なソフトウェア開発シナリオ非依存性
ソフトウェア開発シナリオ非依存性は、さまざまな方法で示すことができる。例えば、1つまたは複数のソフトウェア開発シナリオに関する非依存性である。例えば、実装は、プログラミング言語(例えば入力言語)、ソフトウェア実行アーキテクチャ(例えば、プロセッサまたは仮想マシン)、例外処理モデル、マネージドコードシナリオ等、またはそれらの任意の組合せから非依存であり得る。
例示的なオペレーティング環境
図25は、SDAの一実施形態のためのオペレーティング環境として作用するコンピュータシステムの一例を示している。コンピュータシステムとしてはパーソナルコンピュータ2520があり、これは処理ユニット2521、システムメモリ2522、およびシステムメモリを含む種々のシステムコンポーネントを処理ユニット2521と相互接続するシステムバス2523を含む。システムバスは、メモリバスまたはメモリコントローラ、周辺バス、およびローカルバスを含む、いくつかのタイプのバス構造のいずれを備えてもよい。バス構造が使用するバスアーキテクチャとしては、いくつか例を挙げれば、PCI、VESA、マイクロチャネル(MCA)、ISAおよびEISA等がある。システムメモリは、読み出し専用メモリ(ROM)2524およびランダムアクセスメモリ(RAM)2525を含む。起動中等にパーソナルコンピュータ2520内の要素間で情報を転送するのに役立つ基本ルーチンを含む基本入出力システム2526(BIOS)がROM2524に格納される。パーソナルコンピュータ2520はさらに、ハードディスクドライブ2527、磁気ディスクドライブ2528(例えばリムーバブルディスク2529の読み書きを行う)、および光ディスクドライブ2530(例えば、CD−ROMディスク2531の読み出し、または他の光媒体の読み書きを行う)を含む。ハードディスクドライブ2527、磁気ディスクドライブ2528、および光ディスクドライブ2530は、それぞれハードディスクドライブインタフェース2532、磁気ディスクドライブインタフェース2533、および光ドライブインタフェース2534によりシステムバス2523に接続される。ドライブおよびそれらに関連するコンピュータ可読媒体は、パーソナルコンピュータ2520のためのデータ、データ構造、コンピュータ実行可能命令(ダイナミックリンクライブラリ、および実行可能ファイルのようなプログラムコード)等の不揮発性ストレージを提供する。上記のコンピュータ可読媒体の記載では、ハードディスク、リムーバブル磁気ディスクおよびCDに言及しているが、磁気カセット、フラッシュメモリカード、ディジタルビデオディスク、ベルヌーイカートリッジ等のような、コンピュータで読むことができる他のタイプの媒体も含み得る。
複数のプログラムモジュールが、ドライブおよびRAM2525に格納され得る。そのようなプログラムモジュールとしては、オペレーティングシステム2535、1つまたは複数のアプリケーションプログラム2536、他のプログラムモジュール2537、およびプログラムデータ2538がある。ユーザは、キーボード2540およびマウス2542等のポインティングデバイスを通じてパーソナルコンピュータ2520にコマンドおよび情報を入力することができる。他の入力デバイス(図示せず)としては、マイクロフォン、ジョイスティック、ゲームパッド、サテライトディッシュ、スキャナ等が挙げられる。これらおよび他の入力デバイスは、システムバスに結合したシリアルポートインタフェース2546を通じて処理ユニット2521に接続されることが多いが、パラレルポート、ゲームポートまたはユニバーサルシリアルバス(USB)のような他のインタフェースにより接続されてもよい。モニタ2547または他のタイプのディスプレイデバイスもまた、ディスプレイコントローラまたはビデオアダプタ2548のようなインタフェース経由でシステムバス2523に接続される。モニタに加えて、パーソナルコンピュータは通常、スピーカおよびプリンタのような他の周辺出力デバイス(図示せず)を含む。
パーソナルコンピュータ2520は、リモートコンピュータ2549のような1つまたは複数のリモートコンピュータへの論理接続を用いたネットワーク環境で動作し得る。リモートコンピュータ2549は、サーバ、ルータ、ピアデバイスまたは他の普通のネットワークノードであってよく、通常、パーソナルコンピュータ2520に関して前述した要素の多くまたはすべてを含む。ただし、図25にはメモリストレージデバイス2550のみが例示されている。図25に示す論理接続は、ローカルエリアネットワーク(LAN)2551および広域ネットワーク(WAN)2552を含む。このようなネットワーキング環境は、オフィス、企業規模のコンピュータネットワーク、イントラネットおよびインターネットで一般的である。
LANネットワーキング環境で使用される場合、パーソナルコンピュータ2520はネットワークインタフェースすなわちアダプタ2553を通じてローカルネットワーク2551に接続される。WANネットワーキング環境で使用される場合、パーソナルコンピュータ2520は通常、インターネットのような広域ネットワーク2552を通じて通信を確立するためのモデム2554等の手段を含む。モデム2554は、内蔵でも外付けでもよいが、シリアルポートインタフェース2546経由でシステムバス2523に接続される。ネットワーク環境では、パーソナルコンピュータ2520に関して図示したプログラムモジュールまたはその部分は、リモートメモリストレージデバイスに格納されてもよい。図示したネットワーク接続は単なる例示であり、コンピュータ間に通信リンクを確立する他の手段を使用してもよい。
代替形態
以上、例示的な実施形態の原理について図示し説明したが、当業者には明らかなように、実施形態は、このような原理から逸脱することなく、構成および細部において変更可能である。
多くの可能な実施形態を考慮すると、例示した実施形態は単なる例を含んでいるだけであり、本発明の範囲に対する限定と解釈してはならないことが認識されるであろう。むしろ、本発明は、特許請求の範囲によって規定される。したがって、本発明者等は、特許請求の範囲内に入るすべてのそのような実施形態を本発明として主張するものである。
さまざまなソフトウェア開発ツールを構築するためのSDAを示すブロック図である。 SDAを用いてソフトウェア開発ツールを作成する方法を示すフローチャートである。 SDAを用いてソフトウェア開発ツールを作成する別の方法を示すフローチャートである。 SDAを用いてソフトウェア開発ツールのコンポーネントを作成するシステムのハイレベルブロック図である。 図3に示されているようなシステムを用いて作成された3つのターゲット実行アーキテクチャのそれぞれに対するコンパイラ、デバッガ、およびオプティマイザを示すブロック図である。 SDAを用いて作成されたコンパイラにおける例示的なコンパイルプロセスを示すブロック図である。 ソースの読み込みからハイレベルマシン非依存IRを経てローレベルマシン依存IRまでのIR変換を順を追って示す最初の段階の図である。 ソースの読み込みからハイレベルマシン非依存IRを経てローレベルマシン依存IRまでのIR変換を順を追って示す後続の図である。 ソースの読み込みからハイレベルマシン非依存IRを経てローレベルマシン依存IRまでのIR変換を順を追って示すさらに後続の図である。 ソースの読み込みからハイレベルマシン非依存IRを経てローレベルマシン依存IRまでのIR変換を順を追って示す最後の段階の図である。 コンパイルの種々の段階でIRを型チェックするコンパイラシステムの一実施形態のブロック図である。 IRとともに使用するための型チェッカのブロック図である。 IRにおいて統一的例外処理を実装するシステムを示す図である。 ILリーダを用いて例外処理コンストラクトのための中間表現の統一的なセットを生成する方法を示す図である。 ソフトウェアの統一的IRから実行ファイルを生成する方法を示す図である。 複数のIL表現の形式で表された複数のソース言語内の例外処理コンストラクトの単純で統一的なIRを生成するシステムのブロック図である。 コード生成のためのシステムのブロック図である。 コード生成のためのソフトウェアに実装される方法の一実施形態のフローチャートである。 コアフレームワークを拡張することによってツールを構築するためにコアクラス定義を拡張する全体的プロセスを示す図である。 SDAコアフレームワークを拡張するためにソフトウェアシナリオ依存エクステンションを使用することによってソフトウェア開発ツールを構築する全体的プロセスを示す図である。 コアコンパイラフレームワークを拡張するためにコアコンパイラフレームワークにエクステンションを追加する手法を示す図である。 コアコンパイラフレームワークがエクステンションとは別個のファイルとしてコンパイルされる手法を示す図である。 コンパイル時の前にコアフレームワークプログラムに関係するクラスを静的に拡張する方法を示す図である。 図16のプロセスを実装する例示的システムを示す図である。 ランタイム時に適切なコアクラスにエクステンションをリンクすることにより拡張可能コアフレームワークソフトウェアプログラムのコアクラス定義を拡張する方法を示す図である。 図18のプロセスを実装する例示的システムを示す図である。 コンピュータソフトウェア成果物のブロック図である。 図20に記載のソフトウェア実行ファイルの一具体例を示すブロック図である。 コンピュータソフトウェア成果物のもう1つの実施形態を示す。 既存のソフトウェア開発ツールを修正するためのコンピュータソフトウェア成果物を示す図である。 SDAからの相互互換ソフトウェアツールの作成を示す図である。 SDAの一実施形態のためのオペレーティング環境として作用するコンピュータシステムの一例を示す図である。
符号の説明
100 SDAコア
102 マネージドおよび/またはネイティブアプリケーションプログラムインタフェース(API)
104 ネイティブコンパイラ
106 Pre−JITコンパイラ
108 JITコンパイラ
110 最適化ツール
112 欠陥検出ツール
114 解析ツール
116 コンパイラ開発キット(CDK)
300 SDA
302 仕様
304 コンポーネント
306 ツール
700 ソースコード
702 HIR
704 MIR
706 LIR
708 型チェッカ
710 ルールセット
800 型チェッカ
802,804,806,808 ルールセット
810,812 プログラムモジュール
905〜908 ソース言語
910〜913 中間言語(IL)表現
920 ILリーダ
930 IR
940 コンパイラバックエンド
1110 ソース言語グループ
1130 CIL
1135,1145 ILリーダ
1160 バックエンド
1200,1204 仕様
1202 リターゲティングツール
1206 トークン化文法
1208 パーサ文法
1210 Cソースおよびヘッダファイル
1212 lexコンパイラ
1214 ソースコードおよびヘッダファイル
1216 yaccコンパイラ
1218 共通フレームワークのソースコードおよびヘッダファイル
1220 ソースコード
1222,1224 コンパイラ
1510 コアフレームワークファイル
1520,1530,1540 エクステンション
1550 コアコンパイラフレームワーク
1560,1570,1580 エクステンション
1710 エクステンションの定義
1720 コアクラス定義
1730 ODLプリプロセッサ
1740 ソースコード表現
1750 ソースコードコンパイラ
1760 コアソフトウェアプログラムのカスタマイズされた拡張バージョン
1925,1930 ODLプリプロセッサ
1935,1940 ヘッダファイル
1945,1950 ソースコードコンパイラ
1955 コアクラス定義を含むコンピュータ実行可能ファイル
1960 クラスエクステンション定義を含むコンピュータ実行可能ファイル
1970 リンク
2000 ソフトウェア成果物
2002 SDA
2004 ネイティブコンパイラコンフィギュレーション
2006 JITコンパイラコンフィギュレーション
2008 Pre−JITコンパイラコンフィギュレーション
2010 解析ツールコンフィギュレーション
2012 欠陥検出コンフィギュレーション
2014 オプティマイザコンフィギュレーション
2016 CDKコンフィギュレーション
2018 コンポーネント
2020 ターゲット実行アーキテクチャに関連するデータ
2022 クラス拡張宣言のセット
2024 ターゲットソフトウェア開発ツールの入力言語に関連するデータ
2026 型ルールセット
2100 ソフトウェア成果物
2102 SDA
2104 コンポーネント
2106 x86に関連するデータ
2108 クラス拡張宣言のセット
2110 入力言語C++に関連するデータ
2112 ルールセット
2114 オプティマイザ
2200 ソフトウェア成果物
2210 SDA
2220 ソフトウェア開発コンポーネント
2230 ソフトウェア開発ツール
2300 ソフトウェア開発ツール
2310 SDA
2320 コンポーネント
2330 ソフトウェア開発ツールの修正バージョン
2400 第1のソフトウェア開発ツール
2410,2430 SDA
2420 コンポーネント
2440 第2のソフトウェア開発ツール
2520 パーソナルコンピュータ
2521 処理ユニット
2522 システムメモリ
2523 システムバス
2524 読み出し専用メモリ(ROM)
2525 ランダムアクセスメモリ(RAM)
2526 基本入出力システム(BIOS)
2527 ハードディスクドライブ
2528 磁気ディスクドライブ
2529 リムーバブルディスク
2530 光ディスクドライブ
2531 CD−ROMディスク
2532 ハードディスクドライブインタフェース
2533 磁気ディスクドライブインタフェース
2534 光ドライブインタフェース
2535 オペレーティングシステム
2536 アプリケーションプログラム
2537 他のプログラムモジュール
2538 プログラムデータ
2540 キーボード
2542 マウス
2546 シリアルポートインタフェース
2547 モニタ
2548 ビデオアダプタ
2549 リモートコンピュータ
2550 メモリストレージデバイス
2551 ローカルエリアネットワーク(LAN)
2552 広域ネットワーク(WAN)
2553 ネットワークインタフェース(アダプタ)
2554 モデム

Claims (1)

  1. ソース言語で記述されたプログラムモジュールをコンパイルするためのコンパイラシステムであって、
    プログラムモジュールを型チェックするための複数のルールセットと、
    ソフトウェア開発シナリオ非依存の中間言語を表現する手段であって、該中間表現はレベルを有し、該中間表現のレベルは、ハイレベル、ミドルレベル、またはローレベルである、中間言語表現手段と、
    前記複数の異なるソース言語の型表現を表す型システムであって、
    前記ソース言語で記述されたプログラムモジュールが、ソース言語から前記ハイレベル中間表現に変換されたとき、型チェッカがルールセットに従ってハイレベル中間表現を型チェックし、
    前記ソース言語で記述されたプログラムモジュールが、前記ハイレベル中間表現から前記ミドルレベル中間表現に変換されたとき、型チェッカがルールセットに従って前記ミドルレベル中間表現を型チェックし、
    前記ソース言語で記述されたプログラムモジュールが、前記ミドルレベル中間表現から前記ローレベル中間表現に変換されたとき、型チェッカがルールセットに従って前記ローレベル中間表現を型チェックし、
    前記ルールセットは、ソース言語、中間表現のレベル又は型付けの強さに基づいて選択される
    型システムと、
    複数の実行アーキテクチャをターゲットとするコードを生成するコードジェネレータと
    備え、
    前記コードジェネレータは、前記複数の異なるソース言語に対する複数のプログラミング言語固有の例外処理をサポートすることが可能なコードを生成する、
    ことを特徴とするコンパイラシステム。
JP2004178869A 2003-06-26 2004-06-16 ソフトウェア開発インフラストラクチャ Expired - Fee Related JP4841118B2 (ja)

Applications Claiming Priority (12)

Application Number Priority Date Filing Date Title
US10/609,275 2003-06-26
US10/609,275 US7120898B2 (en) 2003-06-26 2003-06-26 Intermediate representation for multiple exception handling models
US10/607,591 US7685581B2 (en) 2003-06-27 2003-06-27 Type system for representing and checking consistency of heterogeneous program components during the process of compilation
US10/607,591 2003-06-27
US10/610,692 2003-06-30
US10/610,692 US7559050B2 (en) 2003-06-30 2003-06-30 Generating software development tools via target architecture specification
US10/625,892 US7146606B2 (en) 2003-06-26 2003-07-22 General purpose intermediate representation of software for software development tools
US10/625,892 2003-07-22
US10/626,251 2003-07-23
US10/626,251 US7305666B2 (en) 2003-07-23 2003-07-23 Description language for an extensible compiler and tools infrastructure
US10/628,054 US7707566B2 (en) 2003-06-26 2003-07-25 Software development infrastructure
US10/628,054 2003-07-25

Publications (2)

Publication Number Publication Date
JP2005050312A JP2005050312A (ja) 2005-02-24
JP4841118B2 true JP4841118B2 (ja) 2011-12-21

Family

ID=33425848

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2004178869A Expired - Fee Related JP4841118B2 (ja) 2003-06-26 2004-06-16 ソフトウェア開発インフラストラクチャ

Country Status (5)

Country Link
US (1) US7707566B2 (ja)
EP (1) EP1491999A3 (ja)
JP (1) JP4841118B2 (ja)
KR (1) KR101150003B1 (ja)
CN (1) CN1664779B (ja)

Families Citing this family (82)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7299225B2 (en) * 2002-11-26 2007-11-20 International Business Machines Corporation High performance predicate push-down for non-matching predicate operands
US7051322B2 (en) 2002-12-06 2006-05-23 @Stake, Inc. Software analysis framework
US7516459B2 (en) * 2004-02-20 2009-04-07 Intel Corporation Methods and apparatus to optimize managed application program interfaces
EP1615127B1 (en) * 2004-07-06 2015-04-22 Comptel Corporation Data processing in a mediation or service provisioning system
US20060031819A1 (en) * 2004-08-06 2006-02-09 Microsoft Corporation Methods and apparatus for creating solutions
US7770159B2 (en) * 2004-10-20 2010-08-03 Microsoft Corporation Virtual types
KR100683853B1 (ko) * 2005-02-04 2007-02-16 삼성전기주식회사 프리 컴파일링 장치
US7406683B2 (en) * 2005-03-02 2008-07-29 Cisco Technology, Inc. System and method providing for interaction between programming languages
US7500230B2 (en) * 2005-03-25 2009-03-03 Microsoft Corporation Raising native software code
US8549466B2 (en) * 2005-07-15 2013-10-01 Texas Instruments Incorporated Tiered register allocation
US7620938B2 (en) 2005-10-31 2009-11-17 Microsoft Corporation Compressed program recording
US7353504B2 (en) * 2005-12-09 2008-04-01 Bea Systems, Inc. System and method for efficiently generating native code calls from byte code in virtual machines
CN100451954C (zh) * 2005-12-29 2009-01-14 吉林大学 框架定制的模型驱动软件生成方法
US20070250820A1 (en) * 2006-04-20 2007-10-25 Microsoft Corporation Instruction level execution analysis for debugging software
US7631014B2 (en) * 2006-04-27 2009-12-08 International Business Machines Corporation Method and apparatus for fast deletion of physically clustered data
JP2007304840A (ja) * 2006-05-11 2007-11-22 Matsushita Electric Ind Co Ltd コンパイル方法、デバッグ方法、コンパイルプログラムおよびデバッグプログラム
US7844978B2 (en) * 2006-06-02 2010-11-30 International Business Machines Corporation Artifact management for an extensible runtime environment
US20070288883A1 (en) * 2006-06-09 2007-12-13 International Business Machines Corporation Method for consolidated launching of multiple tasks
US8302073B2 (en) * 2006-06-15 2012-10-30 International Business Machines Corporation Moving and copying dependencies along with source code
US7870536B2 (en) * 2006-06-15 2011-01-11 International Business Machines Corporation Computer implemented method and system for sharing resources among hierarchical containers of resources
US20080059949A1 (en) * 2006-09-01 2008-03-06 Sap Ag System and method for implementing a safe framework
US8079027B2 (en) * 2006-09-08 2011-12-13 Via Technologies, Inc. Programming language translation systems and methods
US8584109B2 (en) 2006-10-27 2013-11-12 Microsoft Corporation Virtualization for diversified tamper resistance
US8209662B2 (en) * 2006-12-04 2012-06-26 Microsoft Corporation Application retargeting
US8613080B2 (en) 2007-02-16 2013-12-17 Veracode, Inc. Assessment and analysis of software security flaws in virtual machines
US8141049B2 (en) * 2007-03-14 2012-03-20 Nec Laboratories America, Inc. System and method for scalable flow and context-sensitive pointer alias analysis
WO2008110411A1 (en) * 2007-03-14 2008-09-18 International Business Machines Corporation Automatic formatting of computer program source code
US8484629B2 (en) * 2007-05-24 2013-07-09 Microsoft Corporation Programming model for modular development
US7917887B2 (en) * 2007-06-28 2011-03-29 Microsoft Corporation DDEX (data designer extensibility) default object implementations for software development processes
US8166455B2 (en) * 2007-06-28 2012-04-24 Yahoo! Inc. Desktop application factory and application templates
KR100928895B1 (ko) * 2007-10-16 2009-11-30 씨에스캠 주식회사 제어시스템 개발을 위한 툴생성장치
EP2071452A1 (en) * 2007-12-07 2009-06-17 Alcatel Lucent Device and method for automatically building applications from specifications and from off-the-shelf components selected by semantic analysis
US8352906B2 (en) * 2007-12-28 2013-01-08 Cadence Design Systems, Inc. Method, system, and computer program product for implementing external domain independent modeling framework in a system design
CN101482845B (zh) * 2008-01-08 2011-08-10 国际商业机器公司 一种调用即时调试器的方法和系统
US8181167B2 (en) * 2008-01-09 2012-05-15 Kan Zhao Method and system for presenting and analyzing software source code through intermediate representation
US20090210853A1 (en) * 2008-02-19 2009-08-20 Anand Kumar Systems and apparatus for software development
US20090276730A1 (en) * 2008-03-04 2009-11-05 Alexandre Aybes Techniques for navigation of hierarchically-presented data
KR101019688B1 (ko) * 2008-04-24 2011-03-07 (주)아이엠시티 고레벨 언어 기반 임베디드 시스템
US8689195B2 (en) * 2008-06-03 2014-04-01 International Business Machines Corporation Identifying structured data types as requiring designated initializers
US20100030598A1 (en) * 2008-08-01 2010-02-04 Electronic Data Systems Corporation Platform provisioning system and method
US20100088686A1 (en) * 2008-10-06 2010-04-08 Microsoft Corporation Programming language with extensible syntax
US9910688B2 (en) * 2008-11-28 2018-03-06 Red Hat, Inc. Implementing aspects with callbacks in virtual machines
US20110047358A1 (en) * 2009-08-19 2011-02-24 International Business Machines Corporation In-Data Path Tracking of Floating Point Exceptions and Store-Based Exception Indication
US8458684B2 (en) * 2009-08-19 2013-06-04 International Business Machines Corporation Insertion of operation-and-indicate instructions for optimized SIMD code
US9703550B1 (en) * 2009-09-29 2017-07-11 EMC IP Holding Company LLC Techniques for building code entities
US8627303B2 (en) * 2009-11-30 2014-01-07 International Business Machines Corporation Memory optimization of virtual machine code by partitioning extraneous information
US8719804B2 (en) * 2010-05-05 2014-05-06 Microsoft Corporation Managing runtime execution of applications on cloud computing systems
US20120084749A1 (en) * 2010-10-01 2012-04-05 Microsoft Corporation Programming language support for reactive programming
US9645869B2 (en) * 2010-12-01 2017-05-09 Ncr Corporation Using exception information
KR101803303B1 (ko) 2010-12-21 2017-12-29 삼성전자주식회사 멀티미디어 아키텍처 패턴 결정 방법, 싱글코어에서 멀티코어 기반으로의 아키텍처 전환 장치 및 방법
US9043755B2 (en) * 2011-01-13 2015-05-26 Sap Se Custom code lifecycle management
US20120324377A1 (en) * 2011-06-15 2012-12-20 Microsoft Corporation User interface extensibility for web application development tool
US8856724B2 (en) * 2011-06-20 2014-10-07 Ebay Inc. Systems and methods for incremental software development
IN2011CH02818A (ja) * 2011-08-18 2015-05-29 Infosys Ltd
US9183001B2 (en) 2011-09-12 2015-11-10 Microsoft Technology Licensing, Llc Simulation of static members and parameterized constructors on an interface-based API
KR20130073374A (ko) * 2011-12-23 2013-07-03 삼성전자주식회사 응용 프로그램의 분산형 컴파일 시스템, 장치 및 방법
US9286063B2 (en) 2012-02-22 2016-03-15 Veracode, Inc. Methods and systems for providing feedback and suggested programming methods
KR101422737B1 (ko) * 2012-11-02 2014-07-24 엄원우 다중 언어 코드 동시 실행 장치와 그 방법
KR101282970B1 (ko) 2012-11-30 2013-07-08 (주)인스웨이브시스템즈 프로그램 개발시 화면 객체의 상황인지 위치 결정 장치 및 그 방법
US9569342B2 (en) * 2012-12-20 2017-02-14 Microsoft Technology Licensing, Llc Test strategy for profile-guided code execution optimizers
US9250937B1 (en) * 2013-11-06 2016-02-02 The Regents Of The University Of California Code randomization for just-in-time compilers
CN104714829B (zh) * 2013-12-15 2017-11-28 中国航空工业集团公司第六三一研究所 一种保证目标码和源代码一致性的编译链接方法
US9785456B2 (en) 2014-04-22 2017-10-10 Oracle International Corporation Metadata-driven dynamic specialization
RU2614557C2 (ru) * 2015-06-30 2017-03-28 Закрытое акционерное общество "Лаборатория Касперского" Система и способ обнаружения вредоносных файлов на мобильных устройствах
US20170168792A1 (en) * 2015-12-15 2017-06-15 Futurewei Technologies, Inc. Space and time aware organization and isolation of components in real time systems
CN106909353B (zh) * 2015-12-22 2019-12-13 阿里巴巴集团控股有限公司 应用程序的运行方法和装置
KR101691600B1 (ko) * 2016-04-28 2017-01-02 지티원 주식회사 공통 구조 변환 기반 프로그램 분석 방법 및 장치
CN108304191B (zh) * 2016-09-30 2021-06-01 龙芯中科技术股份有限公司 函数动态调用方法和装置
US10289394B2 (en) * 2016-10-11 2019-05-14 Oracle International Corporation Selective generation of multiple versions of machine code for source code functions for execution on different processor versions and/or architectures
US10379825B2 (en) * 2017-05-22 2019-08-13 Ab Initio Technology Llc Automated dependency analyzer for heterogeneously programmed data processing system
US10613844B2 (en) * 2017-11-10 2020-04-07 International Business Machines Corporation Using comments of a program to provide optimizations
KR102439778B1 (ko) * 2018-04-23 2022-09-05 삼성에스디에스 주식회사 애플리케이션의 보안성 향상을 위한 애플리케이션 변환 장치 및 방법
JP7003842B2 (ja) * 2018-05-31 2022-01-21 オムロン株式会社 サポート装置およびサポートプログラム
US11790263B2 (en) 2019-02-25 2023-10-17 International Business Machines Corporation Program synthesis using annotations based on enumeration patterns
KR102214698B1 (ko) * 2019-04-05 2021-02-10 주식회사 티맥스 소프트 통합개발환경 상에서 가상 머신 프로그램 및 네이티브 프로그램의 디버깅을 위한 서버 및 컴퓨터 프로그램
US11074055B2 (en) * 2019-06-14 2021-07-27 International Business Machines Corporation Identification of components used in software binaries through approximate concrete execution
US11176329B2 (en) 2020-02-18 2021-11-16 Bank Of America Corporation Source code compiler using natural language input
US11250128B2 (en) 2020-02-18 2022-02-15 Bank Of America Corporation System and method for detecting source code anomalies
US20210263711A1 (en) * 2020-02-26 2021-08-26 Red Hat, Inc. Application framework developer tool
US20200327118A1 (en) * 2020-06-27 2020-10-15 Intel Corporation Similarity search using guided reinforcement learning
US11275671B2 (en) * 2020-07-27 2022-03-15 Huawei Technologies Co., Ltd. Systems, methods and media for dynamically shaped tensors using liquid types
CN117461023A (zh) * 2020-12-28 2024-01-26 坦珀系统股份有限公司 从通用规范为许多编程语言产生惯用软件文档

Family Cites Families (97)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4197978A (en) 1978-06-29 1980-04-15 The Boeing Company Method of making an integral structural member
US4734854A (en) * 1985-10-08 1988-03-29 American Telephone And Telegraph Company System for generating software source code components
CA1248238A (en) 1985-10-17 1989-01-03 Francis D. Lawlor Compiler including retargetable data generation
US5339419A (en) 1990-06-25 1994-08-16 Hewlett-Packard Company ANDF compiler using the HPcode-plus compiler intermediate language
US5659753A (en) 1991-02-27 1997-08-19 Digital Equipment Corporation Interface for symbol table construction in a multilanguage optimizing compiler
IL100989A (en) * 1991-02-27 1995-10-31 Digital Equipment Corp Analysis of inductive expressions in multilingual mehadoptimization
US5598560A (en) 1991-03-07 1997-01-28 Digital Equipment Corporation Tracking condition codes in translation code for different machine architectures
JP3602857B2 (ja) * 1991-04-23 2004-12-15 株式会社日立製作所 多機種対応型情報処理システム、および、方法
US5488727A (en) 1991-09-30 1996-01-30 International Business Machines Corporation Methods to support multimethod function overloading with compile-time type checking
US5805885A (en) * 1992-12-24 1998-09-08 Microsoft Corporation Method and system for aggregating objects
CA2102089C (en) 1993-10-29 1999-05-25 David M. Gillies Recompilation of computer programs for enhanced optimization
US5761511A (en) 1994-01-28 1998-06-02 Sun Microsystems, Inc. Method and apparatus for a type-safe framework for dynamically extensible objects
US5628016A (en) 1994-06-15 1997-05-06 Borland International, Inc. Systems and methods and implementing exception handling using exception registration records stored in stack memory
US5742828A (en) 1994-08-03 1998-04-21 Microsoft Corporation Compiler and method for evaluation of foreign syntax expressions in source code
US5778227A (en) 1995-08-01 1998-07-07 Intergraph Corporation System for adding attributes to an object at run time in an object oriented computer environment
US5754858A (en) 1996-05-01 1998-05-19 Microsoft Corporation Customizable application project generation process and system
US6151703A (en) * 1996-05-20 2000-11-21 Inprise Corporation Development system with methods for just-in-time compilation of programs
IL127492A (en) 1996-06-11 2004-06-01 Edgar Codd Delta model processing logic representation and execution system
US6041179A (en) 1996-10-03 2000-03-21 International Business Machines Corporation Object oriented dispatch optimization
US6463581B1 (en) 1996-10-03 2002-10-08 International Business Machines Corporation Method for determining reachable methods in object-oriented applications that use class libraries
US5778233A (en) 1996-10-11 1998-07-07 International Business Machines Corporation Method and apparatus for enabling global compiler optimizations in the presence of exception handlers within a computer program
US6247169B1 (en) 1996-11-04 2001-06-12 Sun Microsystems, Inc. Structured exception-handling methods, apparatus, and computer program products
US5937195A (en) 1996-11-27 1999-08-10 Hewlett-Packard Co Global control flow treatment of predicated code
US5943499A (en) 1996-11-27 1999-08-24 Hewlett-Packard Company System and method for solving general global data flow predicated code problems
US5857105A (en) 1997-02-05 1999-01-05 Hewlett-Packard Company Compiler for reducing number of indirect calls in an executable code
US6212672B1 (en) 1997-03-07 2001-04-03 Dynamics Research Corporation Software development system with an executable working model in an interpretable intermediate modeling language
US5918235A (en) 1997-04-04 1999-06-29 Hewlett-Packard Company Object surrogate with active computation and probablistic counter
US6149318A (en) 1997-04-15 2000-11-21 Samuel C. Kendall Link-time and run-time error detection, and program instrumentation
US5999739A (en) 1997-05-29 1999-12-07 Hewlett-Packard Company Method and apparatus for elimination of redundant branch instructions from a program
US6009273A (en) 1997-05-29 1999-12-28 Hewlett-Packard Company Method for conversion of a variable argument routine to a fixed argument routine
US6070011A (en) 1997-10-21 2000-05-30 Hewlett-Packard Co. Compiler for performing a loop fusion, dependent upon loop peeling and/or loop reversal
US5966702A (en) 1997-10-31 1999-10-12 Sun Microsystems, Inc. Method and apparatus for pre-processing and packaging class files
US6148302A (en) 1998-02-26 2000-11-14 Sun Microsystems, Inc. Method, apparatus, system and computer program product for initializing a data structure at its first active use
US6202204B1 (en) 1998-03-11 2001-03-13 Intel Corporation Comprehensive redundant load elimination for architectures supporting control and data speculation
US6330717B1 (en) 1998-03-27 2001-12-11 Sony Corporation Of Japan Process and system for developing an application program for a distributed adaptive run-time platform
US6249910B1 (en) 1998-05-04 2001-06-19 Hewlett-Packard Company Apparatus and method for incrementally update static single assignment form for cloned variable name definitions
US6578090B1 (en) 1998-06-08 2003-06-10 Ricoh Company, Ltd. System and method for interfacing two modules supporting various applications
JP3320358B2 (ja) 1998-06-18 2002-09-03 インターナショナル・ビジネス・マシーンズ・コーポレーション コンパイル方法、例外処理方法、及びコンピュータ
US6247172B1 (en) 1998-07-02 2001-06-12 Hewlett-Packard Company Method for a translation system that aggressively optimizes and preserves full synchronous exception state
US6131187A (en) 1998-08-17 2000-10-10 International Business Machines Corporation Method and system for translating exception handling semantics of a bytecode class file
US6289446B1 (en) * 1998-09-29 2001-09-11 Axis Ab Exception handling utilizing call instruction with context information
US6182284B1 (en) 1998-09-30 2001-01-30 Hewlett-Packard Company Method and system for eliminating phi instruction resource interferences and redundant copy instructions from static-single-assignment-form computer code
US6292938B1 (en) 1998-12-02 2001-09-18 International Business Machines Corporation Retargeting optimized code by matching tree patterns in directed acyclic graphs
US6253304B1 (en) 1999-01-04 2001-06-26 Advanced Micro Devices, Inc. Collation of interrupt control devices
US6412109B1 (en) 1999-01-29 2002-06-25 Sun Microsystems, Inc. Method for optimizing java bytecodes in the presence of try-catch blocks
US6353924B1 (en) 1999-02-08 2002-03-05 Incert Software Corporation Method for back tracing program execution
US6526570B1 (en) 1999-04-23 2003-02-25 Sun Microsystems, Inc. File portability techniques
US6363522B1 (en) 1999-04-23 2002-03-26 Sun Microsystems, Inc. Method and apparatus for handling exceptions as normal control flow
US6286134B1 (en) 1999-04-23 2001-09-04 Sun Microsystems, Inc. Instruction selection in a multi-platform environment
US6374368B1 (en) 1999-05-21 2002-04-16 Microsoft Corporation Weakest precondition analysis
US6484312B1 (en) 1999-06-07 2002-11-19 Microsoft Corporation Inferring operand types within an intermediate language
US20020166115A1 (en) 1999-06-10 2002-11-07 A.V.S. Sastry System and method for computer program compilation using scalar register promotion and static single assignment representation
US6662356B1 (en) 1999-06-30 2003-12-09 Microsoft Corporation Application program interface for transforming heterogeneous programs
US6481008B1 (en) 1999-06-30 2002-11-12 Microsoft Corporation Instrumentation and optimization tools for heterogeneous programs
US6460178B1 (en) 1999-06-30 2002-10-01 Microsoft Corporation Shared library optimization for heterogeneous programs
US6381738B1 (en) 1999-07-16 2002-04-30 International Business Machines Corporation Method for optimizing creation and destruction of objects in computer programs
US6629312B1 (en) 1999-08-20 2003-09-30 Hewlett-Packard Development Company, L.P. Programmatic synthesis of a machine description for retargeting a compiler
US6560774B1 (en) * 1999-09-01 2003-05-06 Microsoft Corporation Verifier to check intermediate language
US6487716B1 (en) 1999-10-08 2002-11-26 International Business Machines Corporation Methods and apparatus for optimizing programs in the presence of exceptions
US6625808B1 (en) 1999-12-10 2003-09-23 Microsoft Corporation Method and apparatus for facilitating memory management in a program comprised of heterogeneous components
US6598220B1 (en) 1999-12-17 2003-07-22 Dell Products L.P. System and method for allowing registerable runtime modification of object behaviors
US6745383B1 (en) 1999-12-29 2004-06-01 Veritas Operating Corporation Early warning mechanism for enhancing enterprise availability
US6748584B1 (en) 1999-12-29 2004-06-08 Veritas Operating Corporation Method for determining the degree to which changed code has been exercised
US6738967B1 (en) * 2000-03-14 2004-05-18 Microsoft Corporation Compiling for multiple virtual machines targeting different processor architectures
JP3974742B2 (ja) 2000-04-14 2007-09-12 インターナショナル・ビジネス・マシーンズ・コーポレーション コンパイル装置、最適化方法および記録媒体
US6981249B1 (en) 2000-05-02 2005-12-27 Microsoft Corporation Methods for enhancing type reconstruction
US6678805B1 (en) 2000-05-25 2004-01-13 Microsoft Corporation Structure organization for improved cache performance
US6625804B1 (en) 2000-07-06 2003-09-23 Microsoft Corporation Unified event programming model
US6578581B1 (en) * 2000-09-12 2003-06-17 Siri Nam Khalsa Method and apparatus for relieving fluid build-up in the middle ear
CA2321018A1 (en) 2000-09-27 2002-03-27 Ibm Canada Limited-Ibm Canada Limitee Optimizing compilation by forward store movement
US6854110B2 (en) 2000-12-21 2005-02-08 Microsoft Corporation System and method for obtaining scratch registers in computer executable binaries
US6925639B2 (en) 2001-02-23 2005-08-02 Microsoft Corporation Method and system for register allocation
US7013460B2 (en) * 2001-05-15 2006-03-14 Hewlett-Packard Development Company, L.P. Specifying an invariant property (range of addresses) in the annotation in source code of the computer program
JP3790683B2 (ja) 2001-07-05 2006-06-28 インターナショナル・ビジネス・マシーンズ・コーポレーション コンピュータ装置、その例外処理プログラム及びコンパイル方法
US6986125B2 (en) * 2001-08-01 2006-01-10 International Business Machines Corporation Method and apparatus for testing and evaluating a software component using an abstraction matrix
US7117488B1 (en) 2001-10-31 2006-10-03 The Regents Of The University Of California Safe computer code formats and methods for generating safe computer code
US6834383B2 (en) 2001-11-26 2004-12-21 Microsoft Corporation Method for binary-level branch reversal on computer architectures supporting predicated execution
US7426719B2 (en) 2001-11-29 2008-09-16 Microsoft Corporation Method and system for rewriting unwind data in the presence of exceptions
US7600222B2 (en) * 2002-01-04 2009-10-06 Microsoft Corporation Systems and methods for managing drivers in a computing system
US6934940B2 (en) * 2002-01-30 2005-08-23 International Business Machines Corporation Source code transformation-temporary object reduction
JP3870112B2 (ja) 2002-03-13 2007-01-17 インターナショナル・ビジネス・マシーンズ・コーポレーション コンパイル方法、コンパイル装置、及びコンパイル用プログラム
JP4202673B2 (ja) 2002-04-26 2008-12-24 株式会社東芝 システムlsi開発環境生成方法及びそのプログラム
US7228540B2 (en) 2002-05-14 2007-06-05 Microsoft Corporation Preparation for software on demand system
US7213245B2 (en) 2002-05-14 2007-05-01 Microsoft Corporation Software on demand system
US7185328B2 (en) 2002-05-30 2007-02-27 Microsoft Corporation System and method for improving a working set
US7055132B2 (en) 2002-06-28 2006-05-30 Microsoft Corporation System and method for associating properties with objects
US7367022B2 (en) 2002-09-05 2008-04-29 Intel Corporation Methods and apparatus for optimizing the operating speed and size of a computer program
US7240346B2 (en) 2002-11-13 2007-07-03 Microsoft Corporation Method and system for accessing drawing resources
US7370321B2 (en) * 2002-11-14 2008-05-06 Microsoft Corporation Systems and methods to read, optimize, and verify byte codes for a multiplatform jit
US7203941B2 (en) 2002-11-14 2007-04-10 Microsoft Corporation Associating a native resource with an application
US7281248B2 (en) 2002-11-19 2007-10-09 Microsoft Corporation Virtualized and realized user interface controls
US7546607B2 (en) 2002-11-19 2009-06-09 Microsoft Corporation Native code exposing virtual machine managed object
US7484205B2 (en) * 2002-12-12 2009-01-27 Microsoft Corporation Preprocessor-based source code instrumentation
US7472400B2 (en) 2003-02-28 2008-12-30 Bea Systems, Inc. Method for dynamically generating a wrapper class
US7380242B2 (en) * 2003-05-14 2008-05-27 Mainsoft Israel Ltd. Compiler and software product for compiling intermediate language bytecodes into Java bytecodes
US7120898B2 (en) 2003-06-26 2006-10-10 Microsoft Corporation Intermediate representation for multiple exception handling models
US7559050B2 (en) * 2003-06-30 2009-07-07 Microsoft Corporation Generating software development tools via target architecture specification

Also Published As

Publication number Publication date
EP1491999A3 (en) 2007-05-23
CN1664779B (zh) 2010-05-12
US7707566B2 (en) 2010-04-27
EP1491999A2 (en) 2004-12-29
KR101150003B1 (ko) 2012-06-01
JP2005050312A (ja) 2005-02-24
US20040268309A1 (en) 2004-12-30
KR20050001472A (ko) 2005-01-06
CN1664779A (zh) 2005-09-07

Similar Documents

Publication Publication Date Title
JP4841118B2 (ja) ソフトウェア開発インフラストラクチャ
US6738967B1 (en) Compiling for multiple virtual machines targeting different processor architectures
US5535391A (en) System and methods for optimizing object-oriented compilations
JP5851396B2 (ja) 処理方法
US7992140B2 (en) Compiler supporting programs as data objects
US7146606B2 (en) General purpose intermediate representation of software for software development tools
US8423976B2 (en) Extreme pipeline and optimized reordering technology
US6247174B1 (en) Optimization of source code with embedded machine instructions
US6748587B1 (en) Programmatic access to the widest mode floating-point arithmetic supported by a processor
US6484313B1 (en) Compiling and persisting of intermediate language code
EP1639461A2 (en) An extensible type system for representing and checking consistency of program components during the process of compilation
Cifuentes et al. The design of a resourceable and retargetable binary translator
Chen et al. Type-preserving compilation for large-scale optimizing object-oriented compilers
Cifuentes et al. The university of queensland binary translator (uqbt) framework
Palacz et al. Engineering a common intermediate representation for the Ovm framework
Gough Multi-language, multi-target compiler development: Evolution of the Gardens Point compiler project
Proebsting et al. A new implementation of the Icon language
Von Ronne A Safe and Efficient Machine-independent Code Transportation Format Based on Static Single Assignment Form and Applied to Just-in Time Compilation
Adve et al. Software implications of virtual instruction set computers
Liblit Local Qualification Inference for Titanium
XL Getting Started with XL C
Cureton SPARCompiler™ Compilation Technology
To Fictitious imperative language system
Shemitz JIT and CIL
Kienle Universit at Stuttgart Fakult at Informatik Institut f ur Informatik Abteilung Programmiersprachen und Compilerbau

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20070523

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20101015

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20110114

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20110201

RD13 Notification of appointment of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7433

Effective date: 20110217

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A821

Effective date: 20110217

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20110601

RD13 Notification of appointment of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7433

Effective date: 20110602

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A821

Effective date: 20110602

A911 Transfer to examiner for re-examination before appeal (zenchi)

Free format text: JAPANESE INTERMEDIATE CODE: A911

Effective date: 20110622

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20110826

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20110901

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

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20111004

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20141014

Year of fee payment: 3

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

S111 Request for change of ownership or part of ownership

Free format text: JAPANESE INTERMEDIATE CODE: R313113

R371 Transfer withdrawn

Free format text: JAPANESE INTERMEDIATE CODE: R371

S111 Request for change of ownership or part of ownership

Free format text: JAPANESE INTERMEDIATE CODE: R313113

R360 Written notification for declining of transfer of rights

Free format text: JAPANESE INTERMEDIATE CODE: R360

R360 Written notification for declining of transfer of rights

Free format text: JAPANESE INTERMEDIATE CODE: R360

R371 Transfer withdrawn

Free format text: JAPANESE INTERMEDIATE CODE: R371

S111 Request for change of ownership or part of ownership

Free format text: JAPANESE INTERMEDIATE CODE: R313113

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

LAPS Cancellation because of no payment of annual fees