(57)【特許請求の範囲】
【請求項１】
ソースプログラムを、複数の抽象レジスタを定義した抽象レジスタマシンに対する命令列を構成要素とする、対象計算機の機種に依存しない抽象オブジェクトプログラムに翻訳するコンパイラであって、前記抽象レジスタマシン向けの最適化処理を行って前記抽象オブジェクトプログラムを生成するとともに当該抽象オブジェクトプログラムにインストーラ側における最適化処理に利用される生成制御命令を含ませるコンパイラと、
前記対象計算機毎に準備され、前記抽象オブジェクトプログラムを、複数の実レジスタを備える対象計算機それぞれに対応した機械語プログラムに変換して実行するインストーラであって、前記抽象オブジェクトプログラムに含まれる前記生成制御命令に基づいて当該対象計算機向けの最適化処理を行って機械語プロラムを生成するインストーラと、を有し、
前記生成制御命令はレジスタ割付の優先度をオペランドのひとつとするレジスタ割付に関する生成制御命令であり、
前記レジスタ割付の優先度は、当該生成制御命令のあとに出現する抽象レジスタを使用する命令と、割付命令の対象となっている抽象レジスタを使用する命令との出現関係をビットベクトルで表わしたものであり、
前記インストーラにおける対象計算機向け最適化処理は、当該対象計算機で使う実レジスタの種類と数に合わせて前記抽象レジスタとの対応付けを行い、前記生成制御命令に含まれるレジスタ割付の優先度を利用して実レジスタレベルでの置き換えを行う実レジスタ割付の最適化処理であり、
前記インストーラは、抽象レジスタを使用する命令が出現することに応じて当該ビットベクトルを左へシフトし、レジスタ割付が競合した場合に割付の対象となる抽象レジスタのそれぞれのビットベクトルの大小を比較判定してレジスタの割付処理を実行する多機種対応型情報処理システム。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
電子計算機における、ソースプログラムから機械語プログラムへの翻訳方式であって、複数機種の計算機に共通の中間形式（オブジェクトプログラム）を用いる方式に関する。
【０００２】
【従来の技術】
高級言語で記述されたプログラムを計算機上で実行する方法を大別すると、一般に、コンパイラ方式、インタプリタ方式と呼ぶ、以下の２つに分けられる。
【０００３】
（コンパイラ方式）高級言語で記述されたプログラムを、実行すべき計算機の機械語プログラムに変換した上で、変換後の機械語プログラムを直接実行する。
【０００４】
（インタプリタ方式）実行する計算機の機械語とは別の言語（中間語）を設定し、    実行すべき計算機上で中間語を解釈実行する別のプログラム（インタプリタ）    を予め用意しておく。高級言語で記述されたプログラムを中間語プログラム    に変換し、変換後の中間語プログラムをインタプリタを用いて実行する。
【０００５】
インタプリタ方式に対するコンパイラ方式の利点は、以下の理由によるプログラム実行の高速性にある。
【０００６】
（１）インタプリタ方式では、中間語に相当する機械語の実行以外に、各中間語に対応する処理への振り分けやオペランドのアドレス計算等が必要である。
一方コンパイラ方式では直接に機械語を実行するので、これらが不要である。
【０００７】
（２）コンパイラ方式ではプログラムの文脈と実行する計算機の特性とを考慮した処理の省略（最適化）が可能である。一方、インタプリタ方式では、インタプリタ自身は中間語プログラムに対して汎用性を持つので、インタプリタは中間語プログラムをそのまま実行するのみで、プログラムの文脈を考慮した処理の省略ができない。また、中間語プログラムにも実行する計算機の特性が反映されていないので、例えば、高級言語で記述された特定の変数を目標計算機のレジスタにマッピングし、処理の高速化を図ることも不可能である。
【０００８】
一つのプログラムを繰返し実行する際のプログラムの運用形態という視点から見ると、従来の方法では、
（運用方法１）コンパイラ方式を採用し、変換後の機械語プログラムを保存し繰返し直接実行する。
【０００９】
（運用方法２）インタプリタ方式を採用し、中間語プログラムを保存しインタプリタによって繰返し実行する。
【００１０】
のいずれかであった。
【００１１】
一つのプログラムを繰返し実行する場合には、それぞれの実行時間の短縮という観点からコンパイラ方式を採用する場合が圧倒的に多いが、以下のようなデメリットも生じている。
【００１２】
（デメリット１）ソースプログラムを機械語プログラムに変換するコンパイラが機種ごとに必要であり、コンパイラの開発量が大きくなる他、保守や拡張をそれぞれの機種に対応のして行なう必要があり、保守・拡張のオーバヘッドが大きくなる。
【００１３】
（デメリット２）同一プログラムを複数機種で実行する場合、機種ごとにコンパイル（ソースプログラムから機械語プログラムへの変換）が必要であり、機械語プログラムの管理のオーバヘッドが大きい。
【００１４】
（デメリット３）複数機種がネットワークで接続されている環境において、同一のプログラムに対する機械語プログラムが機種対応に複数必要となり、バージョン管理やディスクスペースに問題があるほか、同一プログラムの分散実行が困難である。
【００１５】
（デメリット４）実際に運用されているシステムのなかには、ソースプログラムがなく、機械語プログラムのみで運用されている場合がある。このようなシステムでは、構成機種の移行・変更が困難である。また、ハードウェア技術の進歩により計算機アーキテクチャの高度化が容易となっているが、機械語プログラム財産の継承のため、アーキテクチャの変更に強い制限が課せられしまう。
【００１６】
上記でデメリットを解消するためには、保存運用の形態としては特定の計算機に依存しない中間語プログラムを採用し、中間語プログラムを実行するに際して高速化のために目標計算機の機械語プログラムに変換するという、コンパイラ方式とインタプリタ方式のそれぞれの利点のみを採った方式を採用すればよい。しかし、現在のところ、そのような方式を採用した具体的なシステムは見当らない。
【００１７】
なお、コンパイラ方式並びにインタプリタ方式に関しては、”  Ａ．Ａｈｏ，  Ｒ．Ｓｅｔｉ，  ａｎｄ  Ｊ．Ｕｌｌｍａｎ：  Ｃｏｍｐｉｌｅｒｓ．  ｐｒｏｎｃｉｐｌｅｓ，Ｔｅｃｈｎｉｑｕｅｓ  ａｎｄ  Ｔｏｏｌｓ，  Ａｄｄｉｓｏｎ−Ｗｅｓｌｙ  １９８６  ”に詳しい。
【００１８】
【発明が解決しようとする課題】
特定の計算機に依存しない中間語プログラムを、繰返し実行するプログラムの保存運用形態として採用するためには、実行速度が従来のコンパイル方式による機械語プログラムと同等のレベルになることが必要である。
【００１９】
即ち、上記を実現するためには、
（１）保存運用形態の中間語プログラムをインタプリタによって実行するのではなく、実行の直前において機械語プログラムに変換し実行すること
（２）上記機械語プログラムへの変換において、実行すべき計算機の特性を考慮した最適化を実施すること
が不可欠である。
【００２０】
本発明の課題は、上記を実現するシステム全体を与えること、即ち、保存運用のための中間語の具体的な形式を与え、それを実行開始時点で機械語プログラムに変換し最適化を実施する具体的な方法を設定することにある。
【００２１】
さて、インタプリタ方式用に設計された中間語は、以下の理由により上記を実現するための中間語として利用することができない。
【００２２】
（１）インタプリタ方式のための中間語形式には、インタプリタによる最適化を前提としていないので、機械語プログラムに変換する際に実施すべき最適化に必要な情報を含んでいない。
【００２３】
（２）計算機は、有限個のレジスタを備えレジスタ上での演算を主体としたレジスタマシンと、演算スタックを備えスタック上での演算を主体にしたスタックマシンに大別できる。現状では、世の中に実存する計算機の大半はレジスタマシンである。インタプリタ方式の中間語では、中間語およびインタプリタ設計の容易さから、スタック上の演算を想定したものが多い。スタック上の演算をレジスタ間の演算に変換することは不可能ではないが、スタック上の値は使い捨てを想定したものであり、一方レジスタを効率的に活用するためには、レジスタ上の値をできるだけ繰返し利用することが必要である。即ち、スタックマシン的な中間語プログラムからレジスタマシンの効率的な機械語プログラムに変換することは非常に困難な部分がある。
【００２４】
従って、特定の計算機に依存しない中間語プログラムを保存運用形態とし実行直前に機械語プログラムに変換する方式では、以下の要件を満たすことが必要である。
【００２５】
（１）目標計算機として、レジスタマシンに重点を置き、中間語プログラムレベルでレジスタの存在を意識したプログラムのシーケンスとなっていること。また、中間語プログラムまでの変換時点で、実施可能な最適化が実施されていること。
【００２６】
（２）機械語プログラムへの変換時にレジスタの利用方法の最適化が実施可能であること。即ち、レジスタへの値のロード、レジスタからの値のストアの各命令の発行回数を最小化するように、レジスタの利用を決定し、それら命令が不要ならば削除できること。また、それら最適化に必要な情報を中間語プログラムから得られること。
【００２７】
（３）目標計算機に特有の命令によって、中間語プログラムの特定のシーケンス（複数命令）を代替できることがある。このような場合、一般に、機械語１命令で実現した方が効率的である。中間語複数命令に対応する機械語命令が目標計算機に存在するならば、それを利用した機械語プログラムを生成できること。
【００２８】
なお、以下では、保存運用の形式の（中間語）プログラムを、従来のコンパイラ方式に習って、オブジェクトプログラムと呼ぶ。
【００２９】
【課題を解決するための手段】
１．システムの構成
本発明では、ソースプログラムを実行計算機の機械語プログラムに変換するシステムを、次の３つのサブシステムにより構成する。
【００３０】
（１）コンパイラ：ソースプログラムから、目標計算機の機種に依存しない形式のオブジェクトプログラム（抽象オブジェクトプログラム）を生成するサブシステム
（２）リンカ：コンパイラにより生成された複数の抽象オブジェクトプログラムを、一つの抽象オブジェクトプログラムに結合するサブシステム
（３）インストーラ：リンカにより結合された抽象オブジェクトプログラムを、実行計算機の機械語プログラムに変換するサブシステム。
【００３１】
２．オブジェクトプログラムの形式
オブジェクトプログラムを共通化するため、本発明では、複数のレジスタを持つ抽象計算機（Ａｂｓｔｒｕｃｔ  Ｒｅｇｉｓｔｅｒ  Ｍａｃｈｉｎｅ、以下ＡＲＭと呼ぶ）を設定し、その命令列を共通のオブジェクトプログラム（以下、抽象オブジェクトプログラムと呼ぶ）の基本部分として利用する。
【００３２】
ＡＲＭの特徴は以下の通りである。
【００３３】
（１）複数の抽象レジスタを持つ。（レジスタ数は、概念上無限であるが、実用上は抽象オブジェクトプログラムの形式により制限される）
（２）命令機能として、レジスタ−メモリ間のデータ転送、レジスタ上の演算  （四則演算、論理演算、シフト演算、比較）、実行制御（無条件分岐、条件分岐、副プログラム呼び出し／復帰）を持つ。
【００３４】
（３）メモリアドレスは、数値ではなく、記号名称で表現される。
【００３５】
ここで、レジスタを持つ抽象計算機の命令列をオブジェクトプログラムの基本部分とした理由は、以下の通りである。
【００３６】
（理由１）オブジェクトプログラムから個々の実行計算機の機械語プログラムへの変換を高速にするには、オブジェクトプログラムと機械語プログラムの意味的ギャップをできるだけ小さくすることが望ましい。現在広く用いられている計算機は、複数個のレジスタを持つレジスタマシンであり、一般のレジスタマシンの持つ命令セットの意味的な共通部分を命令セットとして持つＡＲＭを設定することで、意味変換のオーバヘッドをなくし機械語プログラムへの変換を高速にする。
【００３７】
（理由２）レジスタマシンにおいて、機械語プログラムの実行の高速化の鍵の一つは、レジスタの有効利用である。ＡＲＭをコンパイラの目標計算機とすることにより、コンパイラはレジスタを最大限に利用した命令列を生成することができる。
【００３８】
また、抽象オブジェクトプログラムは次のものにより構成する。
【００３９】
（ａ）ＡＲＭの命令語列
（ｂ）擬似コード（ラベル（分岐、入口、変数、定数）定義、最適化のための埋め込み情報、ソースレベルデバッグのための埋め込み情報）
（ｃ）生成制御指示子（抽象レジスタの割当て／解放の指示、抽象レジスタの割当て状態によるＡＲＭ命令語列の選択）
（ｄ）ソースレベルデバッグのための変数名、及び、手続き名の辞書
抽象レジスタに対しては、生成制御指示子によりレジスタの種別を指定するが、具体的な計算機でそれが何に対応するかまでは指定しない。このようにすることにより、抽象オブジェクトプログラムの中で、レジスタを機種に依存しない形で表面化する。
【００４０】
３．実行計算機仕様
抽象オブジェクトプログラムから実行計算機の機械語プログラムを生成するために次の２つをインストーラに設定する。
【００４１】
（ｉ）実行計算機のレジスタ用途指定（使用可能なレジスタの種別と数）
（ｉｉ）ＡＲＭの命令語列パターンから実行計算機命令語列パターンへの変換規則なお、上記において、ＡＲＭの命令語列パターンと実行計算機の命令語列パターンは、それぞれ、複数個の命令から構成される。
【００４２】
ここで、ＡＲＭ命令と実行計算機の命令とを１対１に対応させない理由は以下による。
【００４３】
（理由１）ＡＲＭの命令セットは、実際のマシンの命令セットの厳密な意味での共通部分ではない。従って、実行計算機の命令中にＡＲＭの対応命令が存在しないことがある。この場合、１ＡＲＭ命令を、実行計算機の数命令で実現する必要がある。
【００４４】
（理由２）上記とは逆に、ＡＲＭの数命令の命令列に対応する命令を実行計算機が備えている場合がある。（例：レジスタ−メモリ演算命令等）一般に、実行計算機の命令数を減らしたほうが実行速度が向上するため、このような場合は１命令で実現する。
【００４５】
４．抽象オブジェクトプログラムから実行計算機の機械語プログラムへの変換方法
インストーラは、ＡＲＭの抽象レジスタと実行計算機の実レジスタとの対応を管理するテーブル（以下、レジスタ管理テーブル）を持ち、以下の様に動作する。
【００４６】
（１）抽象オブジェクトプログラム中の抽象レジスタ割当て指示により、抽象レジスタと実レジスタの対応付けを試みる。実行計算機仕様のレジスタ用途指定に記述された範囲で、他の抽象レジスタと対応していない実レジスタ、即ち、空いていないレジスタが存在すれば、当該実レジスタと指示された抽象レジスタとを対応させる。
【００４７】
（２）抽象オブジェクトプログラム中のレジスタ解放の指示により、抽象レジスタと実レジスタとの対応付けを解除する。
【００４８】
（３）抽象オブジェクトプログラム中の生成制御指示子により、抽象レジスタが実レジスタと対応しているか否かを検査し、ＡＲＭ命令語列を選択する。
【００４９】
（４）（３）で選択されたＡＲＭ命令語列に対し、実行計算機仕様におけるＡＲＭの命令語列パターンから実行計算機命令語列パターンへの変換規則を適用し、実行計算機の命令語列の生成と、抽象レジスタ番号の実レジスタ番号への置換とを実施する。
【００５０】
（５）（４）で生成された実行計算機の命令語列において、メモリアドレスを記号名称から数値番地へ変換する。
【００５１】
【作用】
コンパイラは、従来のコンパイラ技術を応用し、ソースプログラムを抽象オブジェクトプログラムに翻訳する。また、この時に、ソースプログラムレベルの最適化、及び、レジスタの利用を前提としたＡＲＭ命令語レベルの最適化を行なう。
【００５２】
インストーラは、実行計算機仕様に基づき、上記の方法により抽象オブジェクトプログラムから実行計算機の機械語プログラムを生成する。
【００５３】
以上の結果、本システムが生成する実行計算機の機械語プログラムは、
（１）コンパイラによりソースプログラムレベルの最適化とレジスタの利用に関する最適化が実施される、
（２）インストーラの実レジスタ割当て機能により、実行計算機が備える実レジスタを最大限に利用することができる、
（３）インストーラの命令語列パターン置換機能により、例えば、連続するＡＲＭの複数命令語列を実行計算機の対応する１命令語に置き換えることができ、    実行計算機が備える高機能命令を生かすことができる、
ので、従来の（コンパイラ方式）によって生成される機械語プログラムと同等程度の実行速度性能を維持したまま、複数機種間でオブジェクトプログラムを共有することができる。
【００５４】
【実施例】
以下、本発明における実施例を図を用いて説明する。
【００５５】
図１は、本発明におけるソースプログラムから機械語プログラムへの翻訳システムの構成の一例を示している。
【００５６】
翻訳システムは、コンパイラ１００１、リンカ１００２、インストーラ１００３の各サブシステムからなる。
【００５７】
コンパイラ１００１は、ソースプログラム１００４を入力し、構文解析、意味解析、および後述するソースプログラムレベルでの最適化等を行ない、抽象オブジェクトプログラムである  ＡｒｍＣｏｄｅプログラム１００５を出力する。なお、  ＡｒｍＣｏｄｅは、本発明の特徴の一つであるので、  ＡｒｍＣｏｄｅの仕様については図４〜図１２を用いて後で詳細に説明する。また、これに関連して、コンパイラの構成については図２により、コンパイラにおける最適化処理については、図１３〜図２２により後述する。
【００５８】
リンカ１００２は、ソースプログラム１００４からコンパイラが生成した  ＡｒｍＣｏｄｅプログラム１００５、他のソースプログラム１００６から同様にコンパイラが生成した  ＡｒｍＣｏｄｅプログラム１００７、及び、  ＡｒｍＣｏｄｅプログラムライブラリ１００８を入力し、各プログラム間のルーチン参照関係の解決、変数・定数参照関係の解決、データ領域の統合、及び、命令領域の統合を行ない、結合済  ＡｒｍＣｏｄｅプログラム１００９を出力する。リンカ自身の機能は、  ＡｒｍＣｏｄｅを通常の機械語とみなした従来のオブジェクトプログラムのリンケージエディタの機能の一部と同等であり、以下では詳細に述べない。
【００５９】
インストーラ１００３は、結合済  ＡｒｍＣｏｄｅプログラム１００９を入力し、個別の目標計算機の仕様情報１０１０であるレジスタ用途指定１０１９および機械命令選択規則１０２０を用いて、実レジスタ割付、機械命令選択、機種依存最適化を行ない、機械語プログラム１０１１を計算機Ａ１０１２のメモリ上に展開する。インストーラにおける処理も本発明の特徴であり、これについては図２３〜図３０を用いて後で詳細に説明する。
【００６０】
計算機Ａ１０１２は、上記で生成された機械語プログラム１０１１を実行する。
【００６１】
コンパイラ１００１により、ソースプログラム１０１３から生成された  ＡｒｍＣｏｄｅプログラム１０１４が、他の  ＡｒｍＣｏｄｅプログラムや  ＡｒｍＣｏｄｅプログラムライブラリ１００８との結合を必要としない場合、インストーラ１００３は、  ＡｒｍＣｏｄｅプログラム１０１４を直接入力し、機械語プログラムに展開することができる。
【００６２】
インストーラ１００３は、計算機Ａ用の機械語プログラムを生成するが、インストーラ１０１５は、計算機Ｂの仕様情報１０１８を用いて計算機Ｂ１０１７用の機械語プログラムを生成する。従って、本システムでは、同一の結合済  ＡｒｍＣｏｄｅプログラム１００９から、複数の計算機（計算機Ａ１０１２、計算機Ｂ１０１７）の機械語プログラム（機械語プログラム１０１１、機械語プログラム１０１６）を生成し、それぞれの計算機で当該プログラムを実行することができる。
【００６３】
なお、同一の  ＡｒｍＣｏｄｅプログラムから、異なる仕様の複数の計算機の機械語プログラムを生成した例については、図３１〜図３５によって後述する。
【００６４】
図２は本発明における抽象レジスタマシンコンパイラの一つの実施例を示すものである。ソースプログラム３１０２は、まずコンパイラ３１００の構文・意味解析部３１０４によって構文解析、意味解析されて中間語３１０６に変換され、ソースプログラムで使われている各種の記号の情報が記号表３１０８に記載される。その中間語３１０６に対して、中間語最適化部３１１０によって制御フロー解析・データフロー解析して大域的最適化を行い、抽象レジスタマシン命令の列としての最適化前の  ＡｒｍＣｏｄｅ（Ａｂｓｔｒａｃｔ  ｒｅｇｉｓｔｅｒ  ｍａｃｈｉｎｅ  Ｃｏｄｅ）列３１１２を生成する。その後、抽象レジスタ命令の最適化処理３１１４を行って、最適化された抽象レジスタマシン命令列としての抽象オブジェクトプログラム３１１６を生成する。構文解析、意味解析、制御フロー解析、データフロー解析、大域的最適化の方法については、Ａ．  Ｖ．  Ａｈｏ，  Ｒ．  Ｓｅｔｈｉ，  Ｊ．  Ｄ．  Ｕｌｌｍａｎ  著、Ｃｏｍｐｉｌｅｒｓ  Ｐｒｉｎｃｉｐｌｅｓ，  Ｔｅｃｈｎｉｑｕｅｓ，  ａｎｄ  Ｔｏｏｌｓ  （Ａｄｄｉｓｏｎ−Ｗｅｓｌｅｙ  Ｐｕｂｌｉｓｈｉｎｇ  Ｃｏ．，  １９８６）  等で述べられている。抽象レジスタ命令の最適化処理については後で説明する。
【００６５】
本発明の特徴の一つは、抽象レジスタマシン命令  ＡｒｍＣｏｄｅ  の構成にある。ＡｒｍＣｏｄｅ  は、本発明で目的とする処理、すなわちオブジェクトプログラムをロード時に対象機種に合わせた機械命令に高速に変換する処理に適した構成と内容を有している。
【００６６】
この抽象レジスタマシン命令の体系は、多くの縮小命令セット計算機すなわちＲＩＳＣマシンに共通に適用できるものであり、ＡｒｍＣｏｄｅ−Ｒ（Ａｂｓｔｒａｃｔ  Ｒｅｇｉｓｔｅｒ  Ｍａｃｈｉｎｅ  Ｃｏｄｅ  ｆｏｒ  ＲＩＳＣ  ｍａｃｈｉｎｅｓ）と呼ぶ。
【００６７】
これは以下の特徴を持つ計算機に適している。
【００６８】
（１）演算はレジスタの間でのみ行う。
【００６９】
（２）メモリアクセスは  Ｌｏａｄ／Ｓｔｏｒｅ型命令でのみ行う。
【００７０】
（３）ベースレジスタを持つ。
【００７１】
（４）演算に使えるレジスタの数は少なくない（１６かそれ以上ある）。
【００７２】
（５）埋め込み定数（ｉｍｍｅｄｉａｔｅ  ｃｏｎｓｔａｎｔ）を持つ。
【００７３】
（６）すべての命令は１語（３２ビット）で表現される。
【００７４】
ＡｒｍＣｏｄｅ−Ｒ  の各命令は、特定の計算機の機械命令そのものではないが、それに容易に変換できるものであり、命令の表現形式には次の特徴がある。
【００７５】
（１）レジスタは、物理レジスタでなく、抽象レジスタとして表現される。
【００７６】
（２）メモリは、数値による番地でなく、記号名称によって表現される。
【００７７】
（３）メモリはバイト単位で番地付けされる。
【００７８】
（４）命令の長さは固定長である。
【００７９】
以下で単に  ＡｒｍＣｏｄｅ  という場合、それは  ＡｒｍＣｏｄｅ−Ｒ  を表す。
【００８０】
図３は、図１における  ＡｒｍＣｏｄｅプログラムと具体計算機の機械語プログラムとの対応関係を示したものである。ソ−スプログラム２９１０は、既に述べたように、コンパイラとリンカ２９１２で翻訳・結合されて、抽象オブジェクトプログラム２９２０に変換される。この抽象オブジェクトプログラムは、抽象レジスタマシンの命令である  ＡｒｍＣｏｄｅ  の列として表される。
【００８１】
抽象レジスタマシンの命令は、現在の多くの計算機に共通的なモデル計算機の命令であり、その個々の命令に含まれる代表的項目は、抽象オペレ−タ２９２１と抽象レジスタ指定２９２３、メモリ／定数指定２９２５である。抽象オペレ−タは、メモリとレジスタ間のデ−タ転送を指示するロ−ド、ストアや、算術演算としての加減算など、多くの計算機に普遍的に備わっている命令を表す。抽象レジスタ指定は、抽象レジスタマシンのレジスタを表すものであり、実在のレジスタにおけるような使用個数の制限はないものとする。メモリや定数の指定２９２４は、番地や値の大きさに制限のない点以外は、実在の計算機におけるメモリや定数と同様の扱いができるものとする。
【００８２】
抽象レジスタマシン命令列２９２０は、各々の機種に合わせて作られたインスト−ラによって、対象機種の機械語命令列に変換される。たとえば、図１００の抽象レジスタマシン命令列２９２０は、機種Ａ用インスト−ラ２９３０を使うと機種Ａ用の機械語命令列２９５０に変換され、機種Ｃ用インスト−ラ２９４０を使うと機種Ｃ用の機械語命令列２９６０に変換される。抽象レジスタマシンの命令と具体計算機の命令は、必ずしも１対１に対応するのではなく、一般には抽象レジスタマシンのｍ個の命令からなる命令列が具体計算機のｎ個の命令からなる命令列に変換される。各々の機械語命令に含まれるオペレ−タやレジスタ指定、メモリ／定数指定は、その機種固有のものである。例えば、機種Ａ用の機械語プログラム２９５０のオペレ−タ２９５１やレジスタ指定２９５３、メモリ／定数指定２９５５は、機種Ａ固有のものであり、機種Ｂ用の機械語プログラム２９６０のオペレ−タ２９６１やレジスタ指定２９６３、メモリ／定数指定２９６５は、機種Ｂ固有のものである。
【００８３】
抽象レジスタマシン命令ＡｒｍＣｏｄｅ  には、計算機が実際に実行する命令とその構造を記述する機械語生成命令と、機械語生成を制御する生成制御文が含まれる。例えば次のような形をとる。
【００８４】
0003602857.tif 000002
機械語生成命令には下記の種類のものがあり、抽象オブジェクトプログラムではそれらをセミコロンで区切って書き並べる。
【００８５】
（１）機械語対応命令
（Ｌｏａｄ４，  Ｓｔｏｒｅ４，  Ａｄｄ，  Ｓｕｂ，  他）
（２）プログラムの構造を表す疑似命令
（Ｓｔａｒｔ／Ｐｅｎｄ，  Ｂｌｏｃｋ／Ｅｎｄ，  Ｓｔｍｔ，  他）
（３）記号名称を指示する疑似命令
（Ｅｎｔｒｙ，  Ｅｘｔｅｒｎａｌ，  Ｌａｂｅｌ，  Ｎａｍｅ，  他）
（４）メモリを指定する疑似命令
（Ｄｗｏｒｄ，  Ｄｃｏｎｓｔ，  Ｄａｄｄｒ，  他）
（５）デバッガ等むけの記号情報を指定する疑似命令
（Ｓｉｎｆ，  他）
生成制御文は、図４に示すように、条件文３１２０と代入文３１２２、関数参照文３１２４からなり、その中では定数と単純変数を含む式が使える。生成制御関数としては、３１２４に示すように、次のものが使える。
【００８６】
（１）ａｌｌｏｃ（抽象レジスタ名，  レジスタ種別，  判定変数，  命令番号，  温存個数，  優先度）
第１引数で指定した抽象レジスタに対して、第２引数で指定した種別の物理レジスタの割付を要求する。命令番号は割付要求に先行するレジスタ使用命令の順序番号であり、温存個数は割付後も温存すべきレジスタの個数を表す。優先度はレジスタ割付の優先度である。第３引数の判定変数の値は、割要求時点で物理レジスタが割り付けできれば１となり、割り付けできなければ０となる。
【００８７】
（２）ｆｒｅｅ（抽象レジスタ名）
引数で指定した抽象レジスタに対する物理レジスタを解放する。
【００８８】
レジスタ割付の優先度はビットベクトルで表す。抽象レジスタ使用命令に一連番号をつけておき、現地点よりｐ個先で使われるものには  ｐー１個の０の後に１が一つあるベクトルを対応させる。優先度はビットベクトルを符号無しの整数値と見て大きいものの方が高いとする。従って、すぐ次で使われる抽象レジスタの優先度は、それより後ろで使われるものより高い。複数箇所で使われるときは、それらのビットベクトルをＯＲしたベクトルを対応させる。現地点が一つすすむとそのビットベクトルは一つ左へシフトされる。左シフトの際、左へあふれたビットは捨てられ，右端には０が補われる。従って、抽象レジスタの優先度は、使用位置の直前で最も高くなり使用位置を過ぎると下がる。
【００８９】
優先度を表すビットベクトルは、１命令に１ビットと限定しているのではない。抽象レジスタを使う命令の列、あるいは機械語対応命令の列を固定長の区間に区切り、その各々の区間ごとに一つのビットを対応させ、注目している抽象レジスタがその区間で使われていれば１とし、使われていなければ０とすることにしてもよい。このようにすれば、短いビットベクトルで長い命令列のレジスタ使用状況を表現できる。区間の長さを１とすれば上で述べた対応関係となる。
【００９０】
ループを通して使われるレジスタは、そのループの長さ（の数分の１）の距離でまた使われるとして、その長さ（の数分の１）の調整数だけ右へシフトしたビットベクトルを算術加算し、それを優先度を表すビットベクトルとする。
【００９１】
抽象レジスタに物理レジスタを割り付ける  ａｌｌｏｃ  関数ではこの優先度を指定し、その優先度が使用可能な物理レジスタの個数の内にあれば割付を行い、なければ割付しない。以前割り付けた抽象レジスタの優先度は、使用位置が近ずいていれば上がり、過ぎていれば下がるので、割付地点での他レジスタの優先度と比較して割り付けるか否かを決める。優先度が低くてあふれた抽象レジスタはメモリに割り付けされる。優先度については、後ほど図９でさらに詳しく説明する。
【００９２】
ＡｒｍＣｏｄｅ−Ｒの命令形式を図５に示す。ＡｒｍＣｏｄｅ−Ｒ  の各命令３１３０は、オペレ−タ３１３２、アドレスモ−ド３１３４、第１オペランド３１３６、第２オペランド３１３８、第３オペランド３１４０で構成される。それらは以下の内容を表す。
【００９３】
0003602857.tif 000003
【００９４】
0003602857.tif 000004
第１オペランド３１３６は、ロ−ド系や演算系の命令では結果の格納先を示し、ストア系の命令ではストアすべきデ−タを保持しているレジスタを示し、条件分岐命令では、条件判定の対象デ−タを保持しているレジスタを示す。
【００９５】
アドレスモ−ド３１３４は、有効なオペランドの個数とその役割を示す。
【００９６】
図６は、図５のアドレスモード３１３４と、第１オペランド（オペランド１）３１３６、第２オペランド（オペランド２）３１３８、第３オペランド（オペランド３）３１４０の可能な組み合わせを示すものであり、ＲｅｇＲｅｇ，  ＲｅｇＭＩ  等の各々のアドレスモード３１７０に対して、オペランド１（３１７２）、オペランド２（３１７４）、オペランド３（３１７６）がどんな役割を持つかを示している。空白の部分はそのオペランドが有効でないことを示す。オペランドが単なるレジスタなら、そのレジスタの値を利用ないし設定する。オペランドが定数なら、その値を利用する。オペランドがアドレスレジスタなら、そのアドレスレジスタの内容をメモリ番地とみなしてオペランドをアクセスする。オペランドがベ−スレジスタとディスプレ−スメントで指定されていれば、ベ−スレジスタの内容とディスプレ−スメントを加算した数をオペランドのメモリ番地としてアクセスする。アドレスモ−ド  ＲｅｇＲＣＣ  では、定数  ｃ３  と  ｃ４  は  ２５５  以下の正の整数であるとして、第３オペランドの中に詰合せていれる。
【００９７】
機械語生成命令の仕様を図７から図１２に示す。そこで使う記号の意味は下記の通りである。
【００９８】
0003602857.tif 000005
【００９９】
0003602857.tif 000006
【０１００】
0003602857.tif 000007
【０１０１】
0003602857.tif 000008
【０１０２】
0003602857.tif 000009
【０１０３】
0003602857.tif 000010
【０１０４】
0003602857.tif 000011
【０１０５】
0003602857.tif 000012
【０１０６】
0003602857.tif 000013
【０１０７】
0003602857.tif 000014
【０１０８】
0003602857.tif 000015
【０１０９】
0003602857.tif 000016
【０１１０】
0003602857.tif 000017
【０１１１】
0003602857.tif 000018
【０１１２】
0003602857.tif 000019
【０１１３】
0003602857.tif 000020
【０１１４】
0003602857.tif 000021
【０１１５】
0003602857.tif 000022
【０１１６】
0003602857.tif 000023
【０１１７】
0003602857.tif 000024
【０１１８】
0003602857.tif 000025
【０１１９】
0003602857.tif 000026
【０１２０】
0003602857.tif 000027
【０１２１】
0003602857.tif 000028
【０１２２】
0003602857.tif 000029
【０１２３】
0003602857.tif 000030
【０１２４】
0003602857.tif 000031
【０１２５】
0003602857.tif 000032
【０１２６】
0003602857.tif 000033
【０１２７】
0003602857.tif 000034
【０１２８】
0003602857.tif 000035
【０１２９】
0003602857.tif 000036
【０１３０】
0003602857.tif 000037
【０１３１】
0003602857.tif 000038
【０１３２】
0003602857.tif 000039
【０１３３】
0003602857.tif 000040
【０１３４】
0003602857.tif 000041
【０１３５】
0003602857.tif 000042
【０１３６】
0003602857.tif 000043
【０１３７】
0003602857.tif 000044
【０１３８】
0003602857.tif 000045
【０１３９】
0003602857.tif 000046
【０１４０】
0003602857.tif 000047
【０１４１】
0003602857.tif 000048
【０１４２】
0003602857.tif 000049
へ跳ぶ。
【０１４３】
0003602857.tif 000050
【０１４４】
0003602857.tif 000051
【０１４５】
0003602857.tif 000052
【０１４６】
0003602857.tif 000053
【０１４７】
0003602857.tif 000054
【０１４８】
0003602857.tif 000055
【０１４９】
0003602857.tif 000056
【０１５０】
0003602857.tif 000057
【０１５１】
0003602857.tif 000058
【０１５２】
0003602857.tif 000059
【０１５３】
0003602857.tif 000060
【０１５４】
0003602857.tif 000061
【０１５５】
0003602857.tif 000062
【０１５６】
0003602857.tif 000063
【０１５７】
0003602857.tif 000064
【０１５８】
0003602857.tif 000065
【０１５９】
0003602857.tif 000066
【０１６０】
0003602857.tif 000067
【０１６１】
0003602857.tif 000068
【０１６２】
0003602857.tif 000069
【０１６３】
0003602857.tif 000070
【０１６４】
0003602857.tif 000071
【０１６５】
ＤｔｏＩ    ＲｅｇＲｅｇ    Ｒ１  の内容を、長精度実数から整数に変換して  Ｒ２  にいれる。
【０１６６】
0003602857.tif 000072
【０１６７】
0003602857.tif 000073
【０１６８】
0003602857.tif 000074
【０１６９】
0003602857.tif 000075
【０１７０】
0003602857.tif 000076
【０１７１】
0003602857.tif 000077
【０１７２】
0003602857.tif 000078
【０１７３】
0003602857.tif 000079
【０１７４】
0003602857.tif 000080
【０１７５】
0003602857.tif 000081
【０１７６】
0003602857.tif 000082
【０１７７】
0003602857.tif 000083
【０１７８】
0003602857.tif 000084
【０１７９】
図１３は図２に示したコンパイラの入力となるソースプログラム３１０２の一つの例である。これは大域的変数を指定する宣言文３６１０や、関数名称の指定３６１４、関数内の局所的変数の宣言３６１６、及び、３６２０から始まる実行文の列等で構成されている。３６１０の文頭にある１や３６２０の文頭にある１０等の番号は、それぞれの文の文番号を表す。図１４から図１６は、このソースプログラムを  ＡｒｍＣｏｄｅ  の列に変換した例である。これではまだ最適化処理を行っていない。
【０１８０】
記号情報を指定する疑似命令３７００はソースプログラムの宣言文３６１０に対応するものであり、３７０２は同じく３６１６に対応するものである。３７１０から始まるＡｒｍＣｏｄｅの列は、ソースプログラムの３６２０から始まる実行文の列に対応するものである。
【０１８１】
図１４から図１８を用いてレジスタの優先度について具体的に説明する。この  ＡｒｍＣｏｄｅ  で抽象レジスタを使っている命令は、先頭に＊印をつけた３７２０、３７２２等の命令である。３７１０の  ａｌｌｏｃ  命令は  Ｖｂａｓｅ  という抽象レジスタに物理レジスタの割付要求をしているものであるが、その優先度として  ０ｘ６２４８９７００＋０ｘ００２２４８９７  を指定している。Ｖｂａｓｅ  というレジスタは  ３７２２，  ３７３４，  ３７５８，  ３７７０，  ３７９０，  ３８２８，  ３８４６，  ３８５０，  ３８５６，  ３８６０  の命令で使われているが、これらを  ａｌｌｏｃ  のある位置  ３７１０  からみて何番目の抽象レジスタ使用命令かと数え、使っているところを１、使っていないところを０としたビットベクトルを作ってみると、図１７の３９１０に示すように  ０１１０００１００１００１０００１００１０１１１００００００００  となる。これを１６進数で表現したものが３７１０の  ０ｘ６２４８９７００  である。図１４から図１６のプログラムでは、  ３８６８  の命令から  ３７２８  の命令へ戻るループがあり、その中には抽象レジスタを使う命令が２３個ある。この実施例では、ループ内の抽象レジスタ使用命令の個数を３で割って余りがあれば切り上げたものをループに対する優先度の調整数としている。ループ内で使われている  Ｖｂａｓｅ  のビットベクトルは３９１０の第２ビットを０にした  ００１０００１００１００１０００１００１０１１１００００００００  であり、これを２３を３で割って切り上げた数８だけ右へずらすと３９１２のように  ００００００００００１０００１００１００１０００１００１０１１１  となる。これを１６進数で表現したものが  ０ｘ００２２４８９７  である。従って、Ｖｂａｓｅ  の割付要求時の優先度は、図１４の３７１０に示すように、両者を符号無し整数として加算した数  ０ｘ６２４８９７００＋０ｘ００２２４８９７  となる。同様にして、３７１８  の  Ａｒ５  等に対する優先度が３９１８、３９２０で示すように算出されている。
【０１８２】
レジスタ割付の優先度は固定されたものではなく、既に述べたように、注目している命令の位置が進むとともに左へシフトされてゆく。従って、ループの先頭部の  ３７３２  の位置では、レジスタ使用命令をふたつ越ているので、Ｖｂａｓｅ  と  Ａｒ５のレジスタ優先度は図１７の３９１４と３９１８に示すように、２つ左へシフトされ、Ｖｂａｓｅ  の優先度は  ０ｘ８９２２５Ｃ００＋０ｘ００８９２２５Ｃ  となり、Ａｒ５  の優先度は３９２２と３９２４に示すように  ０ｘ４４１１００００＋０ｘ００４４１１００  となる。これが  ３７３２  で割付要求される  Ａｒ６  の優先度  ０ｘＥ０００００００  と比較されるのである。
【０１８３】
図１８は上記のレジスタ割り付けの優先度ビットベクトルを作成する手順を示すフロ−チャ−トである。レジスタｒの優先度ビットベクトルをＰｒで表すと、まずそれをリセットする（ステップ３９３０）。そして、次の  ＡｒｍＣｏｄｅ  を取りだし（ステップ３９３２）、それがル−プの開始でなければ（ステップ３９３４）、レジスタ使用命令か否かを調べ（ステップ３９３６）、レジスタ使用命令であればｒの優先度ビットベクトルを１ビット左へずらし（ステップ３９３８）、レジスタｒを使っていれば（ステップ３９４０）、Ｐｒの右端１ビットを１にし（ステップ３９４２）、レジスタｒを使っていなければＰｒの右端１ビットを０にする（ステップ３９４３）。次の  ＡｒｍＣｏｄｅ  命令がル−プの終了またはレジスタｒの開放命令であればｒに対する優先度ビットベクトルの算出を終了させ（ステップ３９４４）、そうでなければ次の  ＡｒｍＣｏｄｅ  命令の取りだしから繰り返す。
【０１８４】
取りだした  ＡｒｍＣｏｄｅ  がル−プ開始命令であれば（ステップ３９３４）、レジスタｒのそのル−プ内の優先度ビットベクトルをＬｒで表すことにして、Ｌｒをステップ３９３０からステップ３９４４までと同じ手順で算出する。このようにして求めたＬｒに対して、ル−プ内の抽象レジスタ使用命令数を３で割って余りがあれば切り上げた数だけＬｒを左へずらす等の調整を行い（ステップ３９４７）、その結果をそのル−プを含む命令列の優先度ビットベクトルＰｒに加算する（ステップ３９４８）。このようにして、一つの抽象レジスタｒに対する割り付け優先度ビットベクトルＰｒを算出する。この処理を各々の抽象レジスタに対して実行する。
【０１８５】
図１９は、抽象レジスタマシン命令  ＡｒｍＣｏｄｅ  の実行時の効率を向上させるオブジェクト最適化の一つの段階を示す実施例である。ＡｒｍＣｏｄｅ  の列をまず、制御の流入点や分岐点で区切り、多くの基本ブロックに分割する（ステップ３９５２）。各基本ブロックは、先頭の命令から最後の命令まで、常に一直線に実行されるという特徴を持つ。図１４から図１６では、３７１２から３７２２、３７２４から３７４８、３７５０から３７７８等がそれぞれ一つの基本ブロックであり、各々の先頭にはそれらの接続関係を示す生成制御命令  ｂｂｌｏｃｋ  がついている。ある基本ブロックｂが実行されるのは必ず他の基本ブロックａが実行された直後である場合、基本ブロックａの後ろにｂを接続してゆくことを繰り返してできる基本ブロックの列を拡張基本ブロックと呼ぶことにする。３７２４  から始まる基本ブロックと  ３７５０  から始まる基本ブロック、３７８０  から始まる基本ブロックでは、後ろのものは前のものが実行された直後に実行されるので、この３つの基本ブロックをつないだものは拡張基本ブロックである。３８４０  から始まる基本ブロックのように、先行する基本ブロックや後続する基本ブロックが一意に確定できないため拡張できない基本ブロックは、それ単独で一つの拡張基本ブロックとする。次に、この拡張基本ブロック内で共通式の削除を行う。そのため、第一の拡張基本ブロックからはじめて（ステップ３９５４）、その拡張基本ブロック内での共通式を摘出し（ステップ３９５６）、後続の共通式を既出の共通式の結果を表すレジスタや変数で置き換える（ステップ３９５８）。これを最後の拡張基本ブロックに到達するまで繰り返す（ステップ３９６０，３９６２）。この処理は、前掲の  Ａｈｏ，  Ｓｅｔｈｉ，  Ｕｌｌｍａｎ  の著書に述べられている方法を  ＡｒｍＣｏｄｅ  に適用することによって実現できる。
【０１８６】
図２０から図２１は、図１４から図１６の命令列をこのような処理や後で述べる最適化処理を行って変換した抽象レジスタ命令列である。図１４から図１６、および図２０、図２１を使って、上記の最適化処理を具体例で説明する。図１４から図１６の抽象レジスタ  Ａｒ８  の値の算出命令列３７５８，３７６０とＡｒ１２  の算出命令列３７９０，３７９２、Ａｒ１５  の算出命令列３８２８，３８３０は、  Ａｒ６  の算出命令列３７３４，３７３６と同じであり、Ａｒ９  を求める命令３７６４は  は  Ａｒ７  を求める命令３７４０と同じである。同様に、Ａｒ１３  は  Ａｒ１１、Ａｒ１５  と  Ａｒ１６  は  Ａｒ５  と同じである。従って、図２０、図２１では、４０９８でＡＲ６とＡＲ１１を再使用し、４０７６でＡＲ７を再使用し、４１０８と４１１０，４１１２でＡＲ５を再使用するというように、これらの抽象レジスタは同じ値を持つ抽象レジスタで置き換えており、ＡＲ８とＡＲ１２、ＡＲ１５、ＡＲ９、ＡＲ１３、ＡＲ１５、ＡＲ１６の値を求める命令列を削除している。この置き換えに伴い、抽象レジスタの使用頻度と使用位置が変わるので、各抽象レジスタの割付優先順位も変わる。図２０、図２１の４０２８等のａｌｌｏｃ命令はこれをも示している。
【０１８７】
図２０と図２１では、図１４から図１６の  ＡｒｍＣｏｄｅ  に対して、さらにループ内不変式をループ外に移動するとともに、分岐最適化を行っている。図２２は、その過程を示すフローチャートである。フロー解析によってループを検出したあと（ステップ４２０２）、内側のループからはじめて（ステップ４２０４）、ループ内不変式を検出し（ステップ４２０６）、それをループ開始直前に移動して（ステップ４２０８）、ループ内で同じ計算を何度も行うことを回避している。これを一番外側のループに至るまで繰り返す（ステップ４２１０，４２１２）。図１４から図１６の  Ａｒ１０  と  Ａｒ１１、Ａｒ１７  は３７２８で始まり３８７４で終わるループの中では値が変わらないので、それを算出する命令列３７７０と３７８６、３８６０をループの前に移動してある。それらが図２０から図２１の４０３８と４０４４、４０５０である。
【０１８８】
図１４から図１６では、３７７８にある  ＢｒＧｅ  での分岐先  Ｌ３（３８０６）には  Ｌ５  への無条件分岐命令（３８０８）があるので、この  ＢｒＧｅ  の分岐先を  Ｌ５  とすることにより、Ｌ３  での無条件分岐命令（３８０８）を削除できる。また、３８０２の  Ｊｕｍｐ  の跳び先  Ｌ４（３８１２）  にも  Ｌ５  への無条件分岐命令（３８１４）があるので、この  Ｊｕｍｐ  の分岐先を  Ｌ５  とすることにより、Ｌ４  での無条件分岐命令（３８１４）も削除できる。このようにして、実行効率を向上させるために抽象レジスタマシンでの命令列効率化を行った結果が図２０と図２１に示す  ＡｒｍＣｏｄｅ  である。
【０１８９】
次に、このようにして作った抽象レジスタ命令列（ＡｒｍＣｏｄｅ−Ｒ  の命令列）から実際の計算機の機械命令列を生成する方法について説明する。
【０１９０】
図２３は、ある機種Ａにおける物理レジスタの種別を示したものである。４２６０は算術演算の用途  ＲｃＡｒｉｔｈ  として使える物理レジスタが８番から２３番までのレジスタであることを示している。同様にして、４２６２の  ＲｃＡｄｄｒ  は番地計算用に使えるレジスタを示し、４２６４の  ＲｃＳｅｃｔ  はセクションの開始位置を示すのに使えるレジスタを示し、４２６６の  ＲｃＲｅｔｕｒｎ  は  副プログラムからの復帰に使うレジスタ、４２６８の  ＲｃＦｕｎｃｖａｌ  は関数値を入れるのに使えるレジスタ、４２７０の  ＲｃＰａｒｍ  は引数を入れるのに使えるレジスタ、４２７２の  ＲｃＮｏｓａｖｅ  は副プログラム参照時に待避・回復されないレジスタ、４２７４の  ＲｃＴｅｍｐ  は一時的に使うレジスタ、４２７６の  ＲｃＦｉｘｅｄ  は用途の固定されたレジスタ、４２７８の  ＲｃＡｎｙ  はレジスタ割付の対象となるすべてのレジスタを表す。
【０１９１】
図２４は、機種Ａの物理レジスタと抽象レジスタとの対応関係の一部を示したものである。抽象レジスタ４２８０は、任意個数使えるものとしているが、機種Ａの物理レジスタ４２８２の数は３２個に限定されている。関数値を入れる抽象レジスタ４２８４を  Ｆｕｎｃｖａｌ０，  Ｆｕｎｃｖａｌ１  で表すと、それを物理レジスタ２と３に対応付ける（４２９０、４２９１）。引数を入れる抽象レジスタ４２８５として  Ｐａｒａｍ０，  Ｐａｒａｍ１，  ．．．  Ｐａｒａｍ  ｐ  が使われているとすると、それらを物理レジスタ４から７に対応付ける（４２９１、４２９２）。算術演算の抽象レジスタ４２８６として  Ａｒ０，  Ａｒ１，  ．．．  Ａｒ  ｑ  が使われているすると、それらを物理レジスタ８から２３までに対応付ける（４２９２、４２９４）。番地計算用の抽象レジスタ４２８７として  Ａｄｄｒ０，  Ａｄｄｒ１，  ．．．  Ａｄｄｒ  ｒ  が使われているとすると、それらを物理レジスタ１６から２３に対応付ける（４２９３、４２９６）。セクション開始位置を示す抽象レジスタ４２８８として  Ｓｅｃｔ０，  Ｓｅｃｔ１，  ．．．  Ｓｅｃｔ  ｓ  が使われているとすると、それらを物理レジスタ２０から２３に割り付ける（４２９５、４２９７）。ここで、引数用抽象レジスタの数  ｐ＋１  や、算術演算用抽象レジスタの数  ｑ＋１  等は、物理レジスタの数に拘束されることなく、ソ−スプログラムで要求される数だけ使っている。この抽象レジスタをどのようにして対象機種の物理レジスタに割り付けるかは、後で図２６から図２９で説明する。
【０１９２】
図２５は、機械語生成をパタン照合で行う方式を示す図である。この方式では、パタン照合を行う部分４５５６と、機械命令選択規則の表４６３０を持ち、それに抽象レジスタマシン命令列４６４０を与えると、機械語プログラム４６５０を生成する。機械命令選択規則の表４６３０には、入力パタンとそれに対する出力パタンが対応付けて入れてある。抽象レジスタマシンの命令列４６４０から一つの命令４６０２を取り出したとすると、機械命令生成規則の入力パタンでそれに合致するものを探す。この例では、第ｉ番目の生成規則４６３２の入力パタンｉが合致するので、それに対応する生成パタンｉに従って置き換えを行い、機械命令４６５２を生成する。この際、抽象レジスタを物理レジスタに置き換えるとか、前後の状況に合わせて生成仕方を変える等の処理を行うが、それについては、後で図２９から図３５で説明する。
【０１９３】
図２６は、機種Ａ向けの機械命令選択規則の一部を示したものである。これは、４３００や４３１２等に示す抽象レジスタマシンの命令列の後ろに、｛｝で囲んで、それに対応する機械語命令の生成仕方をＣ言語に近い形で示す形態をとる。４３１２や４３１６等の先頭にある｜記号は、命令列の場合分けを示す記号である。抽象レジスタマシンのオペランド  Ｒｅｇ１  や  Ｃ，  Ｖ  等は｛｝の中では＄記号をつけて  ＄Ｒｅｇ１，  ＄Ｃ，  ＄Ｖ  等のように表されている。
【０１９４】
具体的に説明すると、先頭の４３００は、定数をロードする抽象レジスタマシン命令に対する機種Ａの機械命令の生成仕方を、４３０２で始まる｛｝内の文の列で示すものである。そこでは、定数が０かそれより大きく  ６５５３６  未満であれば４３０４の指定に従って機械命令を生成し、そうでなければ４３０８と４３１０の指定に従って機械命令を生成することを表している。この規則を図２０の命令４０３０に適用して生成されたのが図２８の機械命令４５００である。この例では、レジスタ割付の結果として、図２７の４４００に示すように、抽象レジスタ  Ａｒ５  には物理レジスタ  ＄０８，  Ａｒ６には  ＄１７  等と、それぞれの種別に対応する物理レジスタが割り付けられている。
【０１９５】
要求された数だけの物理レジスタがないときには、ａｌｌｏｃ  による要求時には物理レジスタを割り付けず、それが実際に使われる時に再度割付処理を行う。図２０の４０４６で抽象レジスタ  Ａｒ１７  に物理レジスタ割付要求を出しているが、ここでは割付後にも温存しておくべきレジスタの数を２と指定しており、優先度もあまり高くないので、この時点では割付ができなかったとすると、４０４８の条件が満たされないので、４０５０ではロード命令は生成されず、Ａｒ１７  が変数ｎの値を表すことが記録される。Ａｒ１７  を使う４１１２の比較命令のところでは、まだ物理レジスタが割り付けられていないので、この抽象レジスタ命令を処理する時にレジスタ割付処理が再度実行され、この時点では  Ａｒ１７  の優先度は最も高くなっているので割付が実行され、その値を設定するロード命令も生成される。この例で  Ａｒ１７  に物理レジスタ＄０９が割り付けられたとすると、４０４６での記録に従って、そこに変数ｎの値をロードする命令が生成される。その結果、４５２６の
ｓｕｂ  ＄２４，＄０８，＄１２
の命令の代わりに
ｌｗ  ＄０９，ｎ（＄１６）
ｓｕｂ  ＄２４，＄０８，＄０９
の２命令が生成される。このように物理レジスタが割り付けられていない抽象レジスタを使うときにそれに物理レジスタを割り付けてそこに値を設定するのは、図２６の機械命令選択規則の４３０４等で使われている関数ｇｅｎの中で行う。
【０１９６】
機種Ａ用のインストーラは、このようにして、抽象オブジェクトプログラムから機種Ａ用の機械語プログラムを生成する。その際、対象計算機に合わせて、最適な命令系列の選択や、物理レジスタの最適利用を図る。この例では、図２６の生成規則４３０２で定数の大きさに合わせて生成する命令系列を変えるとか、使える物理レジスタの種類と数に合わせて抽象レジスタとの対応付けを行い、一度値を設定した  ＄１１  等の物理レジスタはできるかぎり何度も利用するようにしている。機械語に変換したあと、機種固有の表現に伴って生ずる共通式があれば、その再計算を削除する等の最適化処理を行なうが、その処理内容は、図１９で述べたのと同様である。
【０１９７】
図２９は、機械語生成の処理過程を示すフローチャートである。初期設定（ステップ４５５２）のあと、抽象オブジェクトプログラムを構成するＡｒｍＣｏｄｅ命令を一つ取り出し（ステップ４５５４）、図２６に示すような機械語選択規則に書かれた  ＡｒｍＣｏｄｅ列のパタンのどれに適合するかを調べるパタン照合（ステップ４５５６）を行う。読んだ部分に適合するパタンがなければその時の照合状態を記録し（ステップ４５６０）、次のＡｒｍＣｏｄｅ命令取り出しへと進む。適合するパタンがあれば、そのパタンに対する機械語生成の記述に従って、生成処理の準備を行い（ステップ４５６２）、記述された内容がレジスタ割付を要求するものならばその処理を行い（ステップ４５６４）、メモリ割付を要求するものならばその処理を行い（ステップ４５６６）、具体的な機械命令の生成を要求するものならばその処理を行い（ステップ４５６８）、デバッグ情報等に関する制御情報の付加を要求するものならばそれらを機械語プログラムに付加し（ステップ４５７０）、レジスタ割付やメモリ割付、あるいは生成すべき命令の選択等に関する生成制御情報の設定を要求するものならばそれらの設定を行う（ステップ４５７２）。そして、機械語生成の記述に記された次の文へ進むことを繰り返し（ステップ４５７６）、そこに記された動作の終わりに達すれば（ステップ４５７４）、このパタンに対する生成処理の後始末を行い（ステップ４５７８）、照合状態を現状に合うよう変更して（ステップ４５８０）、パタン照合処理に戻る。抽象オブジェクトプログラムが全部処理されたことがわかれば機械語生成を終了させる（ステップ４５８２）。
【０１９８】
図３０は、ＡｒｍＣｏｄｅ  から上記のようにして機械語を生成するインスト−ラの内部構造を示す図である。インスト−ラ４５３０は、ＡｒｍＣｏｄｅ  の列４５３１とその機種の機械命令生成規則４５３２から機械語４５４９を生成する。照合は基本的には状態遷移表を利用する形をとる。そのため、状態遷移表作成プログラム４５３３によって、機械命令生成規則４５３２を一旦状態遷移表４５３５に変換する。この状態遷移表４５３５は、入力としての個々の  ＡｒｍＣｏｄｅと状態番号の組合せに対し、実行すべきアクションと次に遷移すべき状態番号を示す表である。状態遷移に基づくパタン照合を行う部分では、入力される  ＡｒｍＣｏｄｅ  とその時の状態から状態遷移表によってアクションル−チン４５３８の内の適切なル−チンを選択し実行する。そのときの状態遷移経歴を記録するのが状態スタック４５４４である。対象機種固有のレジスタ用途指定を記載しておくのがレジスタ用途指定表４５４６であり、処理中のプログラムにおける抽象レジスタと物理レジスタの対応関係を記録するのがレジスタ対応表４５４８である。
【０１９９】
図３１は、前述の機種Ａとは命令体系の異なるある機種Ｂにおける物理レジスタの種別を示したものである。４６００は算術演算の用途  ＲｃＡｒｉｔｈ  として使える物理レジスタが１番から７番までと１６番から２３番までのレジスタであることを示している。同様にして、４６０２の  ＲｃＡｄｄｒ  は番地計算用に使えるレジスタを示し、４６１４の  ＲｃＴｅｍｐ  は一時的に使うレジスタを示すというように、第２３図に示す機種Ａの場合とは異なった物理レジスタの使い方が指定されている。
【０２００】
図３２は、機種Ｂの物理レジスタと抽象レジスタとの対応関係の一部を図示したものである。機種Ａの場合と同様に、抽象レジスタ４６２０は、任意個数使えるものとしているが、機種Ｂの物理レジスタ４６２２の数は３２個に限定されている。関数値を入れる抽象レジスタ４６２４を  Ｆｕｎｃｖａｌ０，  Ｆｕｎｃｖａｌ１  で表すと、それを物理レジスタ８と９に対応付ける（４６３１、４６３２）。引数を入れる抽象レジスタ４６２５として  Ｐａｒａｍ０，  Ｐａｒａｍ１，  ．．．  Ｐａｒａｍ  ｐ  が使われているとすると、それらを物理レジスタ２４から２９に対応付ける（４６３３、４６３４）。算術演算の抽象レジスタ４６２６として  Ａｒ０，  Ａｒ１，  ．．．  Ａｒ  ｑ  が使われているすると、それらを物理レジスタ１から７までと１６から２３までに対応付ける（４６３５、４６３６、４６３７、４６３８）。番地計算用の抽象レジスタ４６２７としての  Ａｄｄｒ０，  Ａｄｄｒ１，  ．．．  Ａｄｄｒ  ｒ  も同様に、物理レジスタ１から７までと１６から２３までに対応付ける（４６３９、４６４０、４６４１、４６４２）。
【０２０１】
図３３は、機種Ｂ向けの機械命令選択規則の一部を示したものである。４７００は定数をロードするＡｒｍＣｏｄｅ命令に対する機械命令の生成仕方を示し、４７１２はメモリからのロードに対する機械命令、４７１６はレジスタＲｅｇ１とＲｅｇ２を加えた結果をＲｅｇ３に入れるＡｒｍＣｏｄｅ命令列に対する機械命令の生成仕方を示すというように、図２０から図２１の抽象オブジェクトプログラムの機械語プログラムへの変換に必要な機械命令選択規則を表している。図３４は、図２０から図２１のプログラムにおける抽象レジスタに対する機種Ｂの物理レジスタの対応関係を４７８０等で示したものであり、ａｌｌｏｃ、ｆｒｅｅ等の生成制御命令によってレジスタ割付を行った結果である。
【０２０２】
図３３の規則４７００を図２０の命令４０３０に適用して生成されたのが図３５の機械命令４８００であり、規則４７２２を図２０の４０３２に適用して得られたのが図３５の機械命令４８０２である。このようにして、機種Ｂ用のインストーラでは、図２０から図２１の抽象オブジェクトプログラムに図３３の規則を適用してゆくことにより、図３５の機種Ｂ用の機械語プログラムを生成する。
【０２０３】
上述のようにして、同一の抽象オブジェクトプログラムから、機種Ａ用のインストーラは機種Ａ用の機械語プログラムを生成し、機種Ｂ用のインストーラは機種Ｂ用の機械語プログラムを生成する。本実施例では、２つのインスト−ラの間では、機械命令選択規則と物理レジスタ用途指定は異なるが、図２９に示す処理内容は同じである。
【０２０４】
本実施例によれば、大域的最適化やレジスタ割付に関する最適化の処理の大部分が対象機種に依存しないコンパイラで行なわれ、かつ、コンパイラでのフロ−解析やレジスタ割付等に関する情報がインスト−ラに渡されるので、インスト−ラでは、あまり複雑な処理をしなくても、実行効率のよい機械語プログラムを生成できる。従って、プログラムを起動するたびに、インスト−ラによって、機種非依存な抽象オブジェクトプログラムから対象機種向けの機械語プログラムを生成しても、実行効率やインスト−ラによる処理時間が問題となることはない。
【０２０５】
本実施例の抽象オブジェクトプログラムの形式でソフトウェアを配布すれば、複数の機種に対して同一の抽象オブジェクトプログラムを配布すればよくなり、機種ごとにソフトウェアを調整またはコンパイルしなおす必要はないので、保守と管理が著しく容易となる。
【０２０６】
また、本実施例によれば、抽象オブジェクトプログラムは、ソ−スプログラムに比べて、処理操作が細かいレベルに分解されており、その構造と記述順序も異なるので、抽象オブジェクトプログラムからソ−スプログラムを復元することはほとんど不可能である。従って、抽象オブジェクトプログラムの形でソフトウェアを利用者に配布すれば、ソ−スプログラムに含まれるソフトウェアの実現方式やアルゴリズムを秘匿したまま、同一プログラムを複数の機種で実行することや、使用機種を変更することを利用者側で実現できる。
【０２０７】
本発明のインストーラを用いれば、複数機種システムで、同一のソースレベルデバッグシステムが利用可能となる。以下、その実施例について図３６から図４５を用いて説明する。
【０２０８】
図３６は、本発明のインストーラを適用したデバッグシステムのブロック図である。デバッガ５１００は、ソースプログラム５１０１をコンパイルしてできた抽象オブジェクトプログラム５１０２をデバッグするのに用いられる。インストーラ５１０３は、抽象オブジェクトプログラムを機械語プログラム５１０７に変換するのに用いられる。主記憶装置５１０４は、機械語プログラム５１０７およびデバッグ情報テーブル５１０８を格納するのに用いられる。表示装置５１０５は結果をユーザに表示するのに、入力装置５１０６はユーザからの入力を受け付けるのにそれぞれ使われる。
【０２０９】
図３７は、デバッガの動作を示すフローチャートである。まず、抽象オブジェクトプログラム５１０２を読み込む（ステップ５１２０）。抽象オブジェクトプログラムにはソースプログラム上での位置等を示すソース情報が含まれているので、次に、これに基づいてソース・抽象オブジェクト対応テーブルを作成する（ステップ５１２１）。次に、読み込んだ抽象オブジェクトプログラムを入力としてインストーラを実行し、機械語プログラムを主記憶装置上に作成する（ステップ５１２２）。その際、抽象オブジェクトプログラムと機械語プログラムの対応をとるための、抽象オブジェクト・機械語対応テーブルを作成する（ステップ５１２３）。なお、本実施例では、ソース・抽象オブジェクト対応テーブルと、抽象オブジェクト・機械語対応テーブルは合わせて１つのテーブル（ソース・抽象オブジェクト・機械語対応テーブル）として構成する。このテーブルはデバッグ情報テーブル５１０８に含まれる。次に、ユーザが、必要なデバッグ用コマンドを入力するので（ステップ５１２４）、そのコマンドの種類に従って分岐をする（ステップ５１２５）。表示コマンドの場合は表示処理を行い（ステップ５１２６）、ブレークポイント設定コマンドの場合はブレークポイント設定処理を行い（ステップ５１２７）、実行コマンドの場合は実行処理を行い（ステップ５１２８）、その処理が終了した後、ステップ５１２５から繰り返す。これらのコマンド処理については図３８から図４３を用いて詳しく説明する。入力コマンドが終了コマンドであった場合は終了する。
【０２１０】
図３８は表示コマンドの例である。この例は変数ｉの値を表示するコマンドであり、表示コマンド名５１３１と、変数名５１３２とからなる。
【０２１１】
図３９は、表示処理のフローチャートであり、図３７のステップ５１２６の処理を詳しくしたものである。まず、表示コマンド内の変数名を取りだす（ステップ５１３３）。次に、ソース・抽象オブジェクト・機械語対応テーブル（以降、単に対応テーブルと呼ぶこともある）を用いて、その変数の内容が格納されている主記憶上のアドレスに変換する（ステップ５１３４）。次に、ステップ５１３４で得られたアドレスの内容を主記憶から読み出し（ステップ５１３５）、読み出した内容を、変数のデータ型に従って変換し、表示装置上に表示する（ステップ５１３６）。
【０２１２】
図４０はブレークポイント設定コマンドの例である。この例はソースプログラムの文番号１０の文にブレイクポイントを設定するコマンドであり、コマンド名５１４１と、文番号５１４２とからなる。
【０２１３】
図４１は、ブレークポイント設定処理のフローチャートであり、図３７のステップ５１２７の処理を詳しくしたものである。まず、コマンド内の文番号を取り出す（ステップ５１４３）。そして、対応テーブル内の、その文番号にブレークポイントが設定されていることを示すフラグを、オンにする（ステップ５１４４）。
【０２１４】
図４２は実行コマンドの例である。これはプログラムの実行を行うコマンドであり、コマンド名５１５１だけからなる。
【０２１５】
図４３は、実行処理のフローチャートであり、図３７のステップ５１２８の処理を詳しくしたものである。まず、１命令だけを実行する（ステップ５１５２）。これは、命令を１つだけ実行するごとに、トラップがかかって制御がデバッガに戻るようなモードでＣＰＵを走らせることによって可能である。次に、命令のアドレスを取り出す（ステップ５１５３）。これはプログラムカウンタ等の内容を読み出すことによって可能である。最後に取りだしたアドレスにブレークポイントが設定されているかを、対応テーブルを使って調べ、設定されていなければステップ５１５２から繰り返し、設定されていれば終了する（ステップ５１５４）。
【０２１６】
図４４はデバッグの対象となるソースプログラム例である。ここでは、各文の文番号５１６０と、その文のソースプログラムの記述５１６１を示している。文番号は、実際のソースプログラムの中には含まれない。なお、本実施例の以降の説明では、このソースプログラムを例として用いる。
【０２１７】
図４５はソース・抽象オブジェクト・機械語対応テーブルの一例を示した図である。対応テーブルは、（ａ）文情報テーブルと（ｂ）変数情報テーブルとからなる。文情報テーブルは、ソースプログラム文番号５１７０と、抽象オブジェクトプログラム命令アドレス５１７１と、機械語プログラム命令アドレス５１７２およびブレークポイント設定フラグ５１７３の４つのフィールドを持つ。例えばエントリ５１７４は、ソースプログラムの文番号１０の文が、抽象オブジェクトプログラムでは、「００００６０」というアドレスに位置する命令となり、機械語プログラムでは「００００４０」というアドレスに位置する命令となり、さらにその文にはブレークポイントが設定されていることを示している。
【０２１８】
変数情報テーブルは、変数名５１７５と、変数種別５１７６と、型５１７７と、行番号５１７８、および機械語アドレス５１７９の５つのフィールドを持つ。変数名５１７５はソースプログラムにおける変数名、変数種別５１７６は局所変数／大域変数の区別、型５１７７はその変数のデータ型、文番号５１７８はその変数が宣言されたソースプログラム上の位置を表す。機械語アドレス５１７９はその変数の機械語プログラム上でのアドレス情報を示すもので、局所変数の場合はフレームポインタからのオフセットを、大域変数の場合は変数領域ベースアドレスからのオフセットを表す。例えばエントリ５１８０は、変数ｉが、局所変数であり、型はｉｎｔで、ソースプログラムの文番号４に位置し、機械語プログラム上ででフレームポインタからのオフセットが−４であることを示している。
【０２１９】
以上の説明からわかるように、本実施例のデバッグシステムは、機種に依存しない抽象オブジェクトプログラムを実行可能な機械語プログラムに変換するインストーラを備えているので、同一の抽象オブジェクトプログラムが複数機種システム上でデバッグできるという効果がある。
【０２２０】
本発明のインストーラを用いれば、ＩＣカードまたはＣＤ−ＲＯＭ等で抽象オブジェクトプログラムを供給し、マシンに依存せずに即実行可能なシステムが提供できる。例えば、ゲームプログラムをＩＣカードに内蔵し、インストーラを個々のマシンに内蔵することにより、同一のゲームを異なるマシン（ＩＣカード装置）で実行することができる。以下ではそのような実施例を図４６から図５０を用いて説明する。
【０２２１】
図４６は、本発明のインストーラを内蔵したＩＣカード装置のブロック図である。本ＩＣカード装置は、制御装置５０００、主記憶装置５００２、ＩＣカード読み取り／書き込み装置５００５、キーボード５００６、表示装置５００７よりなる。制御装置５０００はＣＰＵ５００１を内蔵している。また、主記憶装置５００２はインストーラ５００３を内蔵している。ＩＣカード５００８はＩＣカード読み取り／書き込み装置５００５を通じて、ＩＣカード装置と接続される。また、ＩＣカード内のプログラムは、インストーラによって、機械語プログラム５００４として主記憶装置内に格納される。
【０２２２】
図４７は、ＩＣカード装置の外観図である。ユーザからの入力は、キーボード５００６を通して行われ、また、ユーザへの応答は表示装置５００７に表示される。ＩＣカードはＩＣカード挿入口５００９から挿入される。
【０２２３】
図４８は、ＩＣカード５００８の平面図である。接点５０１０を通してＩＣカードとＩＣカード読み取り／書き込み装置とデータをやりとりする。記憶素子５０１１には、ＩＣカード装置で実行されるべき抽象オブジェクトプログラム５０１２と、データ５０１３が記憶されている。
【０２２４】
図４９は、ＩＣカードに内蔵された抽象オブジェクトプログラムを実行するフローチャートである。まず、ＩＣカード５００８をＩＣカード挿入口５００９に挿入し（ステップ５０２０）、ＩＣカードに内蔵されている抽象オブジェクトプログラムとデータを読み出す（ステップ５０２１）。次に制御部５０００が、読み込まれた抽象オブジェクトプログラムを入力としてインストーラを起動する（ステップ５０２２）。その結果、実行可能な機械語プログラム５００４が主記憶装置内にできるので、そのプログラムを実行する（ステップ５０２３）。実行の結果、必要ならば結果データをＩＣカードに書き込み（ステップ５０２４）、カードを返却し（ステップ５０２５）、終了する。
【０２２５】
図５０は、異なるＣＰＵを持つＩＣカード装置の間で、同一のＩＣカード内の抽象オブジェクトプログラムを実行する場合の様子を示した図である。ここでは、互いに異なる命令体系を持つＣＰＵ−Ａ５０３８とＣＰＵ−Ｂ５０３９をそれぞれ制御装置内に含む、ＩＣカード装置ＡとＩＣカード装置Ｂを例として用いる。ＩＣカード５００８内の抽象オブジェクトプログラムは、ＩＣカード装置Ａで使用する場合には、インストーラＡ５０３４によってＣＰＵ−Ａの機械語からなる機械語プログラムＡ５０３６に変換される。一方、ＩＣカード装置Ｂで使用される場合には、インストーラＢ５０３５によってＣＰＵ−Ｂの機械語からなる機械語プログラムＢ５０３７に変換される。
【０２２６】
本実施例では、抽象オブジェクトプログラムを記憶する媒体としてＩＣカードを用いたが、本発明はそれに限定されるものではなく、ＣＤ−ＲＯＭやフロッピーディスクを用いたシステムにも適用できる。
【０２２７】
図５１は、ネットワ−ク結合された異機種計算機上での  ＡｒｍＣｏｄｅプログラムの共有を示す実施例である。
【０２２８】
ネットワ−ク媒体１１０１には、ファイルサーバ１１０２、及び、実行計算機システム（ここでは、計算機システムＡ１１０３、及び、計算機システムＢ１１０４）が接続されている。
【０２２９】
ファイルサーバにはディスク装置１１０５が接続されており、ファイルサーバ１１０２は実行計算機に対してディスク装置１１０５上のファイルを提供する。
【０２３０】
各実行計算機システムは、それぞれ自分のリモートファイル管理プログラム（１１０６、１１０７）を用いてディスク装置１１０５上のファイルにアクセスする。また、それぞれの実行計算機システムは、  ＡｒｍＣｏｄｅプログラムをそれぞれの機種の機械語プログラムに変換するインストーラ（１１０８、１１０９）を備えている。
【０２３１】
ディスク装置１１０５上の  ＡｒｍＣｏｄｅプログラム１１１０を各実行計算機システムで実行する場合、計算機システムＡ１１０３では、リモートファイル管理プログラム１１０６を通じて得られる  ＡｒｍＣｏｄｅプログラム１１１０をインストーラ１１０８により機械語プログラム１１１１に変換し、これを実行する。計算機システムＢにおいても同様に機械語プログラム１１１２を生成し、これを実行する。
【０２３２】
以上の様にして、同一の  ＡｒｍＣｏｄｅプログラム１１１０をネットワ−ク上の複数機種の計算機で実行することができ、オブジェクトプログラムの共通化が実現される。
【０２３３】
従来のシステムでは、異機種間でオブジェクトプログラムの共通化ができず、同一機能を持つオブジェクトプログラムを機種毎に保持する必要があった。ある機能に関して、機種毎に必要であったオブジェクトプログラムファイルを上記の様に  ＡｒｍＣｏｄｅプログラムファイルに一本化することにより、以下のメリットが生じる。
【０２３４】
（１）ネットワ−ク全体としてのファイル容量が削減される。
【０２３５】
（２）バグ修正や機能拡張は  ＡｒｍＣｏｄｅプログラムに対してのみ実施すればよく、これを複数のオブジェクトプログラムに対して同時に実施する必要がないので、オブジェクトプログラムのバージョン管理の手間が大幅に軽減される。
【０２３６】
図５２は、  ＡｒｍＣｏｄｅプログラムにより運用していた計算機システムを、他の計算機システムにリプレースする実施例である。
【０２３７】
計算機システムＡ１２０１では、その上で稼働する機械語プログラムに対するディスク装置１２０２上の保存形式として  ＡｒｍＣｏｄｅを用いている。即ち、計算機システムＡ１２０１で、ある機能を実現する場合、その機能に対応するディスク装置１２０２上の  ＡｒｍＣｏｄｅプログラム１２０４を、インストーラ１２０３により機械語プログラム１２０５に変換し、実行している。
【０２３８】
このような計算機システムは、インストーラを備えた他の計算機システムに、容易にリプレースすることができる。
【０２３９】
計算機システムＢ１２０６はインストーラ１２０８を備えており、ディスク装置１２０７上の  ＡｒｍＣｏｄｅプログラムを機械語プログラムに変換して実行できる。計算機システムＡ１２０１を計算機システムＢ１２０６にリプレースするには、ディスク装置１２０２上の  ＡｒｍＣｏｄｅプログラム１２０４をディスク装置１２０７に複写するだけでよい。即ち、計算機システムＢ１２０６において、計算機システムＡ１２０１で実現されていたある機能を実現する場合には、その機能に対応するディスク装置１２０７上の複写された  ＡｒｍＣｏｄｅプログラム１２０４を、インストーラ１２０８により機械語プログラム１２０９に変換し、実行する。
【０２４０】
このように、ディスク上のプログラム保存形式として  ＡｒｍＣｏｄｅを用いることにより、以下のメリットが生じる。
【０２４１】
（１）ユーザにとり、ソースプログラムの再コンパイルやプログラムの再作成などの計算機の移行時の手間を削減でき、移行のための時間が短縮される。
【０２４２】
（２）メーカにとり、移行性を意識することなく機械語を設定することができ、システムとしての性能を最大化する方向で計算機システムの設計が可能となる。
【０２４３】
【発明の効果】
（１）コンパイラによる抽象レジスタ利用の最適化とインストーラの実レジスタ割当て機能により、実行計算機のレジスタを有効利用した機械語命令列を生成できる、（２）インストーラの命令語パターン置換機能により、実行計算機が備える高機能命令を利用できる。
【図面の簡単な説明】
【図１】本発明におけるソースプログラムから機械語プログラムへの翻訳システムの一実施例の構成を示す図である。
【図２】ソ−スプログラムから、抽象レジスタマシン命令の列としての抽象オブジェクトプログラムを生成するコンパイラの構成を示す図である。
【図３】抽象レジスタマシン命令と機械語の関係を表わす図である。
【図４】抽象レジスタマシン命令に含まれる生成制御文の種類を示す図である。
【図５】個々の抽象レジスタマシン命令の形式を示す図である。
【図６】抽象レジスタマシン命令のアドレスモ−ドとオペランドの関係を示す図である。
【図７】抽象レジスタマシン命令に含まれる機械語生成命令の仕様を示す図（その１）である。
【図８】抽象レジスタマシン命令に含まれる機械語生成命令の仕様を示す図（その２）である。
【図９】抽象レジスタマシン命令に含まれる機械語生成命令の仕様を示す図（その３）である。
【図１０】抽象レジスタマシン命令に含まれる機械語生成命令の仕様を示す図（その４）である。
【図１１】抽象レジスタマシン命令に含まれる機械語生成命令の仕様を示す図（その５）である。
【図１２】抽象レジスタマシン命令に含まれる機械語生成命令の仕様を示す図（その６）である。
【図１３】図２のコンパイラの入力となるソ−スプログラムの一つの例を示す図である。
【図１４】図１３のソ−スプログラムに対応する抽象オブジェクトプログラムの生成例であり、まだ最適化処理をしていないものを示す図（その１）である。
【図１５】図１３のソ−スプログラムに対応する抽象オブジェクトプログラムの生成例であり、まだ最適化処理をしていないものを示す図（その２）である。
【図１６】図１３のソ−スプログラムに対応する抽象オブジェクトプログラムの生成例であり、まだ最適化処理をしていないものを示す図（その３）である。
【図１７】図１４から図１６の抽象オブジェクトプログラムでのレジスタ割付の優先度の算出過程を例示する図である。
【図１８】図２のコンパイラにおける優先度ビットベクトル作成手順を示したフロ−チャ−トである。
【図１９】図２のコンパイラにおける最適化処理のうち、共通式削除の過程を示したフロ−チャ−トである。
【図２０】図１３のソ−スプログラムに対応する抽象オブジェクトプログラムの例であり、最適化処理を行なった後の抽象レジスタマシン命令列示す図（その１）である。
【図２１】図１３のソ−スプログラムに対応する抽象オブジェクトプログラムの例であり、最適化処理を行なった後の抽象レジスタマシン命令列示す図（その２）である。
【図２２】最適化処理のうち、ル−プ内不変式の移動を行なう処理のフロ−チャ−トである。
【図２３】機種Ａでの各々の物理レジスタの用途を表す図である。
【図２４】抽象レジスタと物理レジスタの対応付けを表す図である。
【図２５】パタン照合による機械語への変換を表す図である。
【図２６】機種Ａ向けの機械命令選択規則の一部を表す図である。
【図２７】図２０から図２１の抽象オブジェクトプログラムに対する機種Ａでの物理レジスタ割付状況を示す図である。
【図２８】図２０から図２１の抽象オブジェクトプログラムから機種Ａ用のインスト−ラによって生成された機械語プログラムの例を示す図である。
【図２９】インスト−ラの内部処理過程を表すフロ−チャ−トである。
【図３０】インスト−ラの構成と入出力を表す図である。
【図３１】図は機種Ｂでの各々の物理レジスタの用途を表す図である。
【図３２】図２０から図２１の抽象オブジェクトプログラムに対する機種Ｂでの物理レジスタ割付状況を示す図である。
【図３３】機種Ｂ向けの機械命令選択規則の一部を表す図である。
【図３４】図１９から図２０の抽象オブジェクトプログラムに対する機種Ｂでの物理レジスタ割付状況を示す図である。
【図３５】図１９から図２０の抽象オブジェクトプログラムから機種Ｂ用のインスト−ラによって生成された機械語プログラムの例を示す図である。
【図３６】本発明のインストーラを適用したデバックシステムのブロック図である。
【図３７】デバッガの動作を示すフローチャートである。
【図３８】表示コマンド例を示す図である。
【図３９】表示処理のフローチャートである。
【図４０】ブレークポイント設定コマンド例を示す図である。
【図４１】ブレークポイント設定処理のフローチャートである。
【図４２】実行コマンド例を示す図である。
【図４３】実行処理のフローチャートである。
【図４４】デバッグの対象となるソースプログラムの例を示す図である。
【図４５】ソース・抽象オブジェクト・機械語対応テーブルの一例を示す図である。
【図４６】本発明のインストーラを内蔵したＩＣカード装置のブロック図である。
【図４７】ＩＣカード装置の外観図である。
【図４８】ＩＣカードの平面図である。
【図４９】ＩＣカードに内蔵された抽象オブジェクトプログラムを実行するフローチャートである。
【図５０】異なるＣＰＵを持つＩＣカード装置の間で同一のＩＣカード内のプログラムを実行する場合の様子を示した図である。
【図５１】ネットワ−ク結合された異機種計算機上でのＡｒｍＣｏｄｅプログラムの共有を示す一例を示す図である。
【図５２】ＡｒｍＣｏｄｅプログラムにより運用していた計算機システムを、他の計算機システムにリプレースする一例を示す図である。
【符号の説明】
１００１  コンパイラ
１００２  リンカ
１００３  計算機Ａのインストーラ
１００４，１００６，１０１３  ソースプログラム
１００５，１００７，１０１４  ＡｒｍＣｏｄｅプログラム（抽象オブジェクトプログラム）
１００８  ＡｒｍＣｏｄｅプログラムライブラリ
１００９  結合済ＡｒｍＣｏｄｅプログラム
１０１０  計算機Ａの仕様情報
１０１１  計算機Ａの機械語プログラム
１０１２  計算機Ａ
１０１５  計算機Ｂのインストーラ
１０１６  計算機Ｂの機械語プログラム
１０１７  計算機Ｂ
１０１８  計算機Ｂの仕様情報
３１００  コンパイラ
３１０２  ソ−スプログラム
３１０４  構文・意味解析部
３１０６  中間語
３１０８  記号表
３１１０  中間語最適化部
３１１２  最適化前のＡｒｍＣｏｄｅ
３１１４  抽象レジスタ命令最適化部
３１１６  抽象レジスタマシン命令列としての抽象オブジェクトプログラム
【図１】
0003602857.tif 000085
【図２】
0003602857.tif 000086
【図３】
0003602857.tif 000087
【図４】
0003602857.tif 000088
【図５】
0003602857.tif 000089
【図６】
0003602857.tif 000090
【図７】
0003602857.tif 000091
【図８】
0003602857.tif 000092
【図９】
0003602857.tif 000093
【図１０】
0003602857.tif 000094
【図１１】
0003602857.tif 000095
【図１２】
0003602857.tif 000096
【図１３】
0003602857.tif 000097
【図１４】
0003602857.tif 000098
【図１５】
0003602857.tif 000099
【図１６】
0003602857.tif 000100
【図１７】
0003602857.tif 000101
【図１８】
0003602857.tif 000102
【図１９】
0003602857.tif 000103
【図２０】
0003602857.tif 000104
【図２１】
0003602857.tif 000105
【図２２】
0003602857.tif 000106
【図２３】
0003602857.tif 000107
【図２４】
0003602857.tif 000108
【図２５】
0003602857.tif 000109
【図２６】
0003602857.tif 000110
【図２７】
0003602857.tif 000111
【図２８】
0003602857.tif 000112
【図２９】
0003602857.tif 000113
【図３０】
0003602857.tif 000114
【図３１】
0003602857.tif 000115
【図３２】
0003602857.tif 000116
【図３３】
0003602857.tif 000117
【図３４】
0003602857.tif 000118
【図３５】
0003602857.tif 000119
【図３６】
0003602857.tif 000120
【図３７】
0003602857.tif 000121
【図３８】
0003602857.tif 000122
【図３９】
0003602857.tif 000123
【図４０】
0003602857.tif 000124
【図４１】
0003602857.tif 000125
【図４２】
0003602857.tif 000126
【図４３】
0003602857.tif 000127
【図４４】
0003602857.tif 000128
【図４５】
0003602857.tif 000129
【図４６】
0003602857.tif 000130
【図４７】
0003602857.tif 000131
【図４８】
0003602857.tif 000132
【図４９】
0003602857.tif 000133
【図５０】
0003602857.tif 000134
【図５１】
0003602857.tif 000135
【図５２】
0003602857.tif 000136