JPH06501582A - コード生成方法及び装置 - Google Patents

コード生成方法及び装置

Info

Publication number
JPH06501582A
JPH06501582A JP4507067A JP50706792A JPH06501582A JP H06501582 A JPH06501582 A JP H06501582A JP 4507067 A JP4507067 A JP 4507067A JP 50706792 A JP50706792 A JP 50706792A JP H06501582 A JPH06501582 A JP H06501582A
Authority
JP
Japan
Prior art keywords
code
tuple
value
operand
tuples
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP4507067A
Other languages
English (en)
Other versions
JPH0762825B2 (ja
Inventor
ブリックシュタイン デイビッド スコット
デイビッドソン キャロライン スウィーニー
フェイマン ロバート ネイル ジュニア
グラブ リチャード バリー
ホブス スティーブン オー
マーフィー デニス ジョセフ
Original Assignee
ディジタル イクイップメント コーポレイション
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by ディジタル イクイップメント コーポレイション filed Critical ディジタル イクイップメント コーポレイション
Publication of JPH06501582A publication Critical patent/JPH06501582A/ja
Publication of JPH0762825B2 publication Critical patent/JPH0762825B2/ja
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Classifications

    • 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/433Dependency analysis; Data or control flow analysis
    • 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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/447Target code generation

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computational Linguistics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)
  • Debugging And Monitoring (AREA)
  • Measuring Magnetic Variables (AREA)

Abstract

(57)【要約】本公報は電子出願前の出願データであるため要約のデータは記録されません。

Description

【発明の詳細な説明】 マルチパス コード生成に当りテンプレートを用いるマルチ言語最適化コンパイ ラ 発明の背景 本発明はディジタル コンピュータ プログラム用のコンパイラ(翻訳編集装置 )に関し、とくに複数の異なるコンピュータ プログラムによって使用されるの に適しており、複数の異なる目標機器(ターゲット マシン)用のコードを発生 するコンパイラ フレームワーク(フレーム構造)に関するものである。
コンパイラは一般に特定の原言語(ソース ランゲージ)を、特定の動作方式を 有する特定の目標機器を動作させるに用いるターゲット コードに翻訳するよう に構成する。例えばフォートラン(Fortran)コンパイラは、VMS動作 システムを使用するVAXアーキテクチュア(構造)を有す盃コンピュータ用コ ードの発生に利用でき、あるいはMS/DO3を実行する80386コンピユー タ用のCコンパイラとして利用できる。これらのランゲージ・アンド・ターゲッ ト・スペシフィック・コンパイラの中間部分は、大部分か共通の構造及び機能を それぞれ分担して持っている。このため、新規なコンパイラ構造は、既存のコン パイラの構成要素のいくつかを使用し、他のものを変形することによって構成で きる。それにも係わらず、ソースランゲージ及びターゲット マシンの各組合せ 用に新しいコンパイラを構成するのか従来のプラクティスてあり、新規な高性能 コンピュータ アーキテクチュア(構造)を設計するとき、一般に使用されるソ ース ランゲージ(原言語)のそれぞれに対する再書込みコンパイラの任務(タ スク)か主要のタスクとなる。
コンピュータ エイデツド ソフトウェア エンジニャ(CASE)の分野は、 コンパイラ技術に大きく依存している。CASEツール及びプログラミング環境 は、コア コンパイラによって構成される。これに加えてコンピュータ ハード ウェアのパーフォーマンス仕様は、多くの場合、コンパイラ技術と一体に包含さ れる。プロセッサの速度は、一般に高レベルのランケージ へンチマークによっ て測定され、従ってコンパイラを最適化すると、新規なコンピュータ機器の価格 のパーフォーマンス係数に影響する。
種々の異なる高レベル ランゲージ及び異なるコンピュータアーキテクチュアに 対し、コンパイラの機能を適合させるためには、コンパイラ フレームワークの コア構成素子の共通性を高めることが望ましい。コンパイラのフロント エンド (前置コンピュータ)はソースのコード モジュールに直接アクセスするので、 パスカル(Pascal)を通訳するように構成されたコンパイラのフロント  エンドはC方式を通訳することはできない。同様にコンパイラの後側端(バック  エンド)内のコード発生器は、ターゲット コンピュータ アーキテクチュア のインストラクション セットを使用する必要があるので、特殊マシンとなる。
従ってより一般的に構成できるのは、コンパイラの中間構成素子である。コンパ イラのフロント エンドは、第1にソース コードを中間ランゲージに翻訳する のが一般である。従って高レベル ソース ランゲージにより初め書込れたプロ グラムは、コンパイラの内部操作用のより要素的なランゲージとして現れる。こ のフロント エンドは、プログラムまたはルーチンのレプレゼンテーション(表 示)を、中間ランゲージで、いわゆるグラフとして、ノンポル テーブルと共に 形成するのか普通である。これら2つのデータ構造、すなわち中間ランゲージ  グラフ及びシンボル テーブルかコンパイラによって内部的に使用されるプログ ラムを表わす。従って、ユニバーサルまたは一般特性の中間ランゲージ及びノン ポル テーブル構造を形成すると、フロント エンドに後続する構成素子がより 一般的に構成できる。
コンパイラのフロント エンドが中間ランゲージ グラフ及びシンボル テーブ ルを形成した後、種々の最適化技術を一般に導入する。フロー チャートを再配 置する。すなわちプログラムの書直しを行い、ターゲット マシンの実行速度を 最適化する。これらの最適化のいくつかは、ターゲットに応じた特定のもの(t arget−specific)であるが、多くは一般的(generic)な ものである。共通的に使用される最適化(optimization)は、コー ド モーション、強度減少等である。コンパイラの次の内部構造は、レジスタ及 びメモリ配置である。この点迄は、データ基準は何れの場所に記憶されるかに関 係な(、ネームにより、またはアブストラクト内で可変及び一定である。しかし その後は、データ基準(レファレンス)はより固定した位置、例えば特定のレジ スタ及びメモリ ディスプレースメント(未だメモリ アドレスなし)の如くよ り固定した位置に割当てられる。
この点て、レジスタの配置形態で、レジスタ内のデータをより少ないレジスタ  レファレンスで維持するための一層の最適化か可能である。このためプログラム を再度再配置し、レジスタの利用性を最適化させる。レジスタの配置もある程度 はターゲットのマシンにより定まり、このためコンパイラの一般特性は:ターゲ ツトCPUのレジスタ セットの数、サイズ、特定の割当てを規定するものを有 する必要かある。レジスタ及びメモリ割当ての次にコンパイラは、コード発生フ ェースを行い、これにおいて、オブジェクト(目的)コード イメージを形成す る。
これらのコースはターゲット マシンのランゲージ、またはインストラクション  セット、すなわち特定の機械のインストラクション セットによること当然で ある。次で目的コード イメージにリンクさせて実行可能なパッケージを形成し 、各種ラン・タイム モジュールの加算等を行い、これらすへてはマシンにより 特定のものである。
典型的なコンパイラ構造ては、中間ランゲージ グラフの構造、及びレジスタ及 びメモリ配置の最適化は、−膜化をもっとも行い易いものである。しかし乍ら現 在もっとも一般的に使用されている高レベル ランゲージの大幅な相違、及びタ ーゲット マシン構造(アーキテクチュア)の相違が一般的なコンパイラ コア 構造の実現を妨げる障害となっている。
発明の概要 本発明の1実施例においては、コンパイラ フレームワークにジェネリック(全 体的)°°シェル”または制御及びシーケンシング メカニズムを設け、さらに ジェネリック(全体)ハック エンドを設ける(ここでコード発生器はターゲッ ト・スペシフィックとすること当然である)。ジェネリック バックエンドはオ ブティマイセーション、レジスタ及びメモリ割当て。
ならびにコード発生の機能を有する。シェルは種々のホストコンピュータで実行 され、バック エンドのコード発生機能は任意の数のコンピュータ アーキテク チュアのターゲットとなる。フロント エンドはそれぞれの異なるソース ラン ゲージ用にテーラ−(顧客化)される。これらは例えばCobol。
Fortran、 Pa5ca1.C,C十十、 Ada等である。フロント  エンドはソース コード モジュールを走査し、バーズ(分析)を行い、これら よりソース コード内に表わされているプログラムの中間ランゲージを発生する 。この中間ランケージは、ユニバーサルな方法で、任意のソース コード ラン ゲージを表わすように構成され、このためフロント エンドとバック エンド間 のインタフェイスは標準フォルマットとなり各ランゲージに特定のフロント エ ンドに対し書直しを必要としない。
フロント エンドによって形成された中間ランゲージ レプレゼンテーションは 、構成素子ユニットとしてタプル(tuple’−−81)を基礎としている。
ここでは各タプルは、例えはロード(負荷)、ストア(蓄積)、加算(アット) 、ラベル、ブランチ等の遂行すべき単一演算を表わす。各タプルに対しフロント エンドにより、種々の必要1n乾のフィールドにデータ構造が形成される。タプ ルの順番のシリーズに沿って、フロント エンドは、普通のプラクティスにより 変数(variable)、ルーチン、ラベル等のすべてのレファレンスに対す るシンボル テーブル(記号表)を生成する。タプルはブロック内に順番付けら れたシーケンス(順番)に並んでおり、ブロックは、ルーチンまたはラベルによ って開始され、ブランチ内に終わるコードの一部であり、例えばブロックの出発 点と終了点の間ではエントリー(入) またはエキジット(出)は許されないよ うになっている。各ブロックはさらにデータ構造またはノードとなっており、そ の後位及び前位のブロックへのポインタを有している(これらはシンボル表内の シンボルである)。互いにリンクされたブロックにより、中間ランゲージ グラ フと称されるフローグラフか形成され、これはブロック エンドにより用いられ 、最適化、レジスタ及びメモリ割当て、等を行なうプログラムを代表する。
本発明の特徴の1つは、フロント エンドとバック エンド間のインタフェイス 内のエフェクト(効果effect)及び従属性(dependencies) を表わすメカニズムである。タプルはメモリに書込むときはエフェクトを有し、 何れか他のノードが書込みを行なった位置より読出しを行なったときはディベン ゾンシイ(従属性)を有する。種々の高レベル ランゲージは演算の表示に異な った方法があり、1つのランゲージ内の同じシーケンスはある結果と従属性(デ ィベンゾンシイ)を許し、他のランゲージではこれを許さない。従って、ソース  ランゲージより独立したあるいは関係のないメカニズムを設け、プログラム遂 行の効果を記載する。このメカニズムは、コンパイラ フロント エンドに詳細 なランゲージ特定情報を形成する手段を具え、コンパイラ バック エンド内の マル゛チ・ランゲージ オプテイマイザ(最適化装置)にこれを送る。このメカ ニズムをグローバル オプテイマイザによって用い、共通のサブエクスプレッシ ョン(副表示)認識及びコード モーションを含むリーガルで有効な最適化を決 定する。タプルの中間ランゲージ及び機構は、バック エンド(オプテイマイザ )がフロント エンドに質問(中間ランゲージ グラフより情報を得る)しうる ような情報を有しており、これによってバック エンドはターゲット マシンの 1つのタプルに発生したコードの遂行の際、他のタプルに対しコードによって計 算された値か悪影響を及はすかとうかを決定することができる。この点に関し、 バック エンドとフロント エンド間のインタフェイスはランゲージ独立性を有 する。(language 1ndependent)ハック エンドはその服 従しているランゲージを知る必要かない。この利点は、種々のハック エンド( 及びシェル)は、各ソース ランゲージで書込まれる必要がないことであり、そ の代り、最適化コンパイラか各ソース ランゲージに対し指定され、各ソース  ランゲージに対してフロント エンドに異なるランゲージ毎にティラー(仕立化 )を行なうのみで良い。
本発明の1実施例の他の特徴は、コンパイラの最適化部分内でインダクション変 数(variable)を解析する方法を使用することである。変数がループを 通じ毎時1回づつインクレメントまたはデクレメントされ、毎回ループを通じ最 大で1回連行されるときはこれをインダクション変数と称する。最適化にはこの インダクション変数の検出に加えて、インダクティブ エクスプレッション(e xpression−−一式9表示)を検出する。これはインダクション変数の 直線関数として計算しうる式である。一般にいってこの最適化の目的は、倍算を 加算で置換することであり、これはより安くかつ高速であり、(はとんどの機構 で)強度減少として知られているものである。インダクション変数の検出には、 ポテンシャル インダクション変数の“セット(組)”を用いる必要があり、各 ループに対しこれをダイナミック(動的)に行なうのは高価かつ複雑となるので 、IDEFセットの構成に用いられるサイド エフェクト セットを用いること により改良を行なっている。
本発明の1実施例の付加的特徴は、最適化の1つに“フォールディング常数(f olding constant)” (K倍またはKFOLDルーチンと称さ れる)を行なう機構である。この機構は、式をある一定数に減少させ、ルーチン 中のより多く時間を必要とする計算を行なう代わりに、コンパイル(翻訳編集) 時間に計算しうるようにするものである。重要な特徴は、ユーザにより符号化ま たは計算を行なう代わりに、コンパイラのフレームワーク自体によってKFOL Dコードを形成することである。KFOLDビルダはフロント エンドの如く機 能し、丁度他のランゲージ・スペシフィック フロント エンドの如く機能する か、ソース コード入力は無く、その代わり入力は中間ランゲージ内であり、オ ペレータのすへてのリストとデータ タイプのすべてのリストよりなるのみであ る。その利点は、より多くKFOLDパッケージ通過が形成され、これはより安 価に行いうろことである。
さらに他の実施例の特徴は、TDモジュールと称される型式規定(type d efinition)機構である。このモジュールは、フロン1〜 エンドによ り使用されるメカニズム並びにハック エンドのコンパイラを提供し、リンカ− またはデバガーにより用いられるオブジェクト モジュールと協同させるプログ ラム タイプ情報の構成に用いられる。゛タイプ情報(型式情報)”の創生は、 シンボル テーブル クリエーションの文脈に入り、フロント エンドをしてバ ック エンドの特定及びプログラムタイプ情報のアブストラクト表現を許容する 。TDモジュールは、フロント エンドに基本タイプ(型式)及びアブストラク ト タイプを記述するサービス ルーチンを許容する。
これに加えて、さらにある実施例は、コード テンプレート(型板)を用いて、 複式バス方式でコードの形成を行なう方法を特徴とする。コンパイル(翻訳編集 )工程中、コード テンプレートの選択及び適用は4つの異なる時に生ずる。
(1)パターン選択またはPATSELECTフェーズはC0NTEXT内のパ ターン マツチを行い、最良のコード テンプレートの選択にバスする。
(2)TNASS IGN及びTNLIFEはC0NTEXTの任務を行い、選 択したタンプレートのコンチクスト(文脈)アクションの使用を用い、式の順序 の評価を解析し、テンポラリ−ネーム(TNs )をノンローカルなライフタイ ムをもってコード テンプレートに割当てる。
(3)TNB INDは選択したテンプレートのパインディングアクションの使 用をバスし、コード テンプレートにローカルなライフタイムを有するTNsを 割当てる。
(4)最後にC0DEは選択されたテンプレートのユース コード発生アクショ ンをバスし、オブジェクト コードの発生に本発明の新規と信じられる特徴は添 付の請求の範囲に記載されている。しかし本発明の他の特徴及び利点は、添付図 面と共に、以下の特定の実施例の記載を参照すればより良く理解されよう。
第1図は、本発明の特徴を用いたコンパイラの概略図:第2図は、本発明の各種 特徴の方法が実行されるホスト コンピュータのブロック図による電気回路図: 第3図は、第1図のコンパイラによって、ソース コードフオーム、中間ランゲ ージ フオーム、トリー フオーム及びアッセンブリ ランゲージ フオームに 翻訳編集(コンパイル)されるべきコードを示す図: 第4図は、第1図のコンパイラで使用されるタプル(tuple)のデータ構造 を示す図: 第5図は、第1図のシェルの演算の論理的フロー チャート:第6図は、常数を 含む符号の例のりスト:第7図は、本発明の1つの特徴によるタイプ(型式)の 規定を説明するためのデータ フィールドと関係(ポインタ)の同第1図におい て、本発明の1実施例によるコンパイラ フレームワーク10は、ポータプルな 、再ターゲット可能なコンパイラ用のランゲージに無関係なフレームワークであ る。このコンパイラ フレームワーク10は、シェル11と称されるポータプル 動作システム インタフェイス11と、再ターゲット可能なオプテイマイザ(最 適化装置)並びにコード発生器(バック エンド)12よりなる。シェルl’l はポータプル(機械語のプログラム生成デバイスの普遍性)であり、すなわち数 個演算システム、例えばVAX/VMS、V、、、等ホスト コンピュータで実 行する任意のものに適合できる。このシェルは第2図に示す如く、ホスト コン ピユーテイング(計算)システムで演算を行なうホスト演算システム13によっ て動作し、このシステムは主として、システム バス16によって主メモリ15 に結合され、かつI10コントローラ18によってディスクメモリ17に結合さ れたCPU14を含んでいる。シェル11及びコンパイラ12はフロント エン ド20と組合わされて、特定のソース ランゲージに対するポータプルは、再タ ーゲット可能なコンパイラを創出する。従って本発明のフレームワーク10に基 づくコンパイラは3つの基本部分より成る。
これらはシェル11、特定のホスト演算システム14にテーラ−されている。こ れはコンパイラのホスト エンバイロメント(システム環境)を決定する; 特定のソース ランゲージ(C,C++、パスカル、フォルトラン、 Ada、  obol、等)に対するフロント エンド20.−−これはコンパイラのソー ス ランゲージを決定する;特定のターゲット マシン(VAX、RISC等の 特定の構造)に対するバック エンド12.−m−これはコンパイラのターゲッ ト マシンを決定する。 − シェル11、フロント エンド20及びバック エンド12間の各インタフェイ スは固定されているので、本発明によるコンパイラの各個別構成素子は自由に交 換することができる。すなわちフロント エンド20を複数の交換可能なフロン ト エンド、例えば1つかFortram用、1つかCobol用、1つがPa 5cal用、1つかC用等で構成することかできる。同様にVAXコンピュータ のVMSで動作するように作製されたシェル11を、RISCワークステーショ ンのU n i xのオペレーティング システムで動作するシェル11て置換 することができ、この間フロント エンド20とバック エンド12は何等変更 を加えないようにすることかできる。
シェル11は、ホスト オペレーティング システム13とその他のコンパイラ 間の固定インタフェイスとなる。本発明のシェルはいくつかの利点を有する。第 1にシェルllは、演算システム13の基本的特徴に対するポータプルなインタ フェイスを提供する。例えば、フロント エンド20は、ホスト演算システム1 3のファイル システム、コマンド パージング、あるいはテープ記憶配置等の 詳細を知る必要かない。これはこれらすべてのサービスは、シェル ルーチンに よりアクセスされ、シェルは使用する演算システム13に合うように形成(テー ラ−)されているからである。第2にシェル11は、いくつかのコンパイラ素子 、例えばコマンド ライン パージング(構文解析)、ファイル組み込みプロセ シング、ダイアグツステイク(診断)ファイル形成素子を単一で行う素子を設け るような重複設備を排除しうる。第3に、これらの共通の素子を使用することに よって、フレームワーク10を用いて創設されたコンパイラ間に一貫性あるいは 両立性(consistensy)が保証されることである。このフレームワー クlOを用いるよう形成されたすべてのコンパイラは、同じフォルマットてリス ト ファイルに書き込みを行い、コマンド ライン りオリファイヤに同し処理 を行い、同形のニラ−メツセージを発行する等を行う。第4に、シェルll内に 共通のシェル装置を持つことによりコンパイラの内部積分か改良される。これは 、フロント エンド20とハック エンド12が同じシェル機能を存するからで ある。例えばシェル ロケータ パッケージの使用は、ソース ファイル位置が ソース リスティング、フロント エンド発生ダイアグツステイク、バック エ ンド発生ダイアゴノスティク、オブジェクト リステイイング、デバ・ンガー情 報に両立性が得られるからである。
フロント エンド20はフレームワークlOによって構成されるコンパイラの構 成素子中、翻訳すべきソース ランゲージを理解する唯一の素子である。このソ ース ランゲージは、コンパイラの入力を規定するソース コード ファイル( モジュール)21のテキストを創出するのに用いられるソース ランゲージであ る。フロント エンド20は第1にシェル11を呼出し、コマンド ライン情報 を得て、ソース ファイル21よりテキスト ラインを得る。第2に、フロント  エンド20はシェル11を呼出し、ファイルのりスティング、ダイアゴノステ ィック メツセージの書込み、並びに場合によって特殊ランゲージ用の他のファ イルへの書込みを行う。第3にフロントエンド20は、語案、構文、意味の解析 を行い、ファイル20内のソース テキストを、フロント エンド20とバック  エンド12間のインタフェイス22によって使用されるランケージに無関係な インターナル レプレゼンテーション(内部表現)に翻訳する。第4に、フロン ト エンド20は、ノ1ツク エンド12を呼出し、インターナル レプレゼン テーション内の情報よりターゲット システム オブジェクト コード23を形 成する。第5にフロント エンド20は、ルーチンを行い、こ−li号を二いっ て−フロント エンド20は−′ソース コードをれによってバック エンド1 2はコール バス24を介して、バック エンド処理中、バック エンドはラン ゲージ特定情報を呼出す。第1図のコンパイラ フレームワークには含まれてい ないが、遂行可能でターゲット マシーン25を駆動するイメージを形成するオ ブジェクト モジ゛ニールまたはイメージ23をリンクさせるリンカ−を含んで いる。
コンパイラのバック エンド12がコードを創造するターゲット マシン25は ある特殊構造のコンピュータである。すなわち例えば、これはある特定の番号の セットとデータ幅を有するレジスタであって、そのロジックは特定のインストラ クションは特殊のインストラクション セットを遂行し、特殊なアドレス モー ドか得られる等である。これらの例は、(1)既述のVAXアーキテクチュアで あり、(2)はMIPS Inc、より得られる部品番号R2000またはR3 000の32ビツトRISCチツプに基づ<RISC型のアーキテクチュアで、 プリンティスホール(Printice Hall) 1987に、“M I  P S R2000RISCアーキテクチユア”として記述されたものであり、 (3)は1990年6月29日出願の係属中出願番号第547589号に記載さ れた64ビツト レジスタによるアドバンストRISCアーキテクチュアである 。その他種々のアーキテクチュアも同様に収容することができる。
ノ ルー壬゛ノ庵今んて松り−7ねらばフロント エンド20よインタフェイス 22の内部表現に翻訳する際、オブジェクトコード25か実行されるターゲット  マシンのアーキテクチュアを考慮する必要がない。これは、この中間表現はタ ーゲットマシン25のアーキテクチュアより独立しているからである。
フロント エンド20の特徴のいくつかはターゲット システムに適合するよう に特別仕様とする必要な場合かある。しかし、データ表現の一部の特徴、例えは 割当て(アロケーション)及び整合(アライメント)は、ターゲット マシン2 5のアーキテクチュアに適するように特別仕様とする方か好都合であり、またル ーチン呼出しの仮数メカニズムは、ターゲット システムの呼出標準により定ま り、さらにルーチン ライブラリ インタフェイスは、各ターゲット システム それぞれに対しおそらく異なったものとなる。
ハック エンド12は、フロント エンド20によって形成された内部表現22 を、ターゲット システムのオブジェクトコード23に翻訳するように機能する 。バック エンド12は、最適化26、コート発生27、蓄積およびレジスタ割 当て28、およびオブジェクト ファイル排出29の基本機能を遂行する。最適 化機能は、コードか内部表現のとき、このコートに対し遂行される。バック エ ンド20はさらにユーティリテり呼出されて、シンボン テーブル30および中 間ランゲージデータ構造を創出する。
ユーザ(すなわち第2図のコンピュータ システムのユーザで、コンピュータ  システムは演算システム13を遂行している)が第1図のコンパイラを呼出す( 呼出し可能なインタフェイスを通ずるか、あるいは他の機構を通じて)と、シェ ル11はその制御を受ける。シェル11はフロント エンド20を呼出し、ソー ス ファイル15よりの入力ストリームをオブジェクト ファイル23に翻訳す る。フロント エンド20はバック エンド12を呼出し、オブジェクト ファ イル23内に各オブジェクト モジュールを生成する。フロント エンド20は 、オブジェクト モジュール23内の各個別ルーチンに対するコードの創出のた めバック エンド12を呼圧すこともあり、またこれは全モジュールに対し一度 にコードを形成するバックエンド ドライバーを呼出すこともある。
フロント エンド20はソース コード21のオペランド解析(parse)を 行い、ソース コードで表わされたプログラムの中間ランゲージ版を形成する。
タプルはソース ランゲージか1つの演算を行った表現(式)である。例えば第 3図を参照するとき、ソース ランゲージで表わされた式、1=J+1 は、中間ランゲージで表わされた4つの式に分解され、これらは$1. $2.  $3および$4である。IL(中間ランゲージ)によるこのようなコートの表 現方法は、フェッチ(取出し)オブジェクトを表わすシンボルJを付したアイテ ム31て表わされる第1タプル$1を含む。次のタプルはリテラル、アイテム3 2であり、シンボル1で参照される。次のタプルはアト(ADD)、アイテム3 3てあり、これはタプル$1および$2の結果を参照する。最後のタプルはスト ア、アイテム34てあり、タプル$3の結果を参照し、この結果をシンボル テ ーブル内にチンポルIで記入する。この表現は第3図の論理ツリーによっても表 わされ、タプルは同じ参照番号で識別表示される。これと同じソース コードの ラインはRISCタイプのターゲット マシンにおいて、第3図に見られるよう な一般形でレジスタ ファイル内にREG4の如きレジスタを用いて3つのイン ストラクション、LOAD : ADD整数、および5TOREの集合で表わす ことかできる。あるいはCl5Cマシンで、導出されるコードは、図示の如くの 単なるインストラクションADD、#1、J、1てもありうる。
この場合タプルはコンピュータ プログラムの基本的語句であり、本発明におい て使用される形態では、データ構造35てあって、これは少なくとも第4図に示 される要素を含む。これらは (1)オペレータ(演算子)およびタイプ フィールド36で、例えばフェッチ 、ストア、アト(Fetch、 5tore、 Add)等、(2)ロケータ3 7、ソース モジュール21内の何処にこのタプルに対するソース等価が位置す るかを規定、(3)他のダブル、リテラル ノードまたはシンボル ノードに対 するオペランド ポインタ38、 例えば第3図のIおよび#lに対するポインタ、タプル$1および#2等である 。さらにタプルはアトリビュート(属性)フィールド39を有し、これらは、例 えばラベル(Label)、条件ブランチ(Conditional Bran ch)、アーギュメント(Argument)(コールに対する)、またはSy m Ref (シンボル テーブル内のシンボル)を含む。このタプルは、この タプルのブロック内の順番を表わす番号フィールド40を有している。
フロント エンド20はソース コードを解析してタプルを識別し、次いでコー ドの基本ブロックを識別する。コードのブロックは一連のタプルとして規定され 、第1タプルと最終タプルの間に入口または出口は存しない。一般に1つのブロ ックはラベルまたはルーチン エントリーによって初まり、他のラベルへのブラ ンチにより終わる。フロント エンド20の任務は、ソース コード21を解析 し、タプルおよびブロックを識別することであり、これはフロント エンドはそ のランゲージに対し特定(スペシフィック)であることか要求される。このため タプルは、フィールド41を有し、これは当該タプルがブロックの初めであるか 、ブロックの終わりであるか否かを教える。
以下に詳細に説明するように、本発明の特徴の1つは、エフェクトの表現方法に ある。タプルは、メモリ位置(TLレベルにおいて、シンボルで表わされる。) に記憶または書込みを行ったとき、または他のタプルかある位置に書込みを行っ たことに従属することによりエフェクトを有する。従って第3図の例で、タプル $4はエフェクト(Iのストア)を有し、$1は、従属性(内容J)を有する。
このため第4図に示されるデータ構造は、このタプルのこれらのエフェクトおよ び従属性を記憶するフィールド42および43を有する。
第1図のコンパイラの単一エクセキューノヨンは、第5図のフロー チャートに 示されるようにしてシェル11によって行われる。オペし−ティング システム 13を介してユーザにより、第1図のコンパイラか呼出されるとシェル11は第 5図のアイテム(項目)45て示されるような制御を受ける。コマンド ライン 内のユーザは、動作させるべきモジュール21内のリストまたは゛プラス リス ト”を特定する。次のステップは、シェル11によるフロント・エンド ルーチ ンGEM$XXINTの呼出しであり、これはアイテム46で示すようにフロン ト エンドのすべての必要な初期化を行う。このフロント エンド ルーチンG EM$XX INTは付属書に説明されている。次いでシェル11はグローバル (大域)コマンド クオリファイヤ(修飾子)を解析し、アイテム47に示され るようにフロント エンド ルーチンGEM$XX PROCESSGLOBA LSを呼圧す。次にこのコンパイラを含むオペレーティング システム13のレ ベルで使用されているコマンドライン内の各“プラス・リスト”に対し、シェル は一連の動作を遂行する。これはプラス・リストをチェックする決定点(デシジ ョン ポイント)48を用いるループによって実行される。
プラス・リスト内にアイテムが残っている限り、アイテム49−52に示される 動作か行われる。これらの動作は、アイテム49て示される如く、コマンド ラ インによって特定されるソース ファイル21の評価およびこれらに対する入力 ストリームの形成と、これに次いてアイテム50で示される如く、このローカル  クオリファイヤ(このプラス・リストに特定の)を解析し、GEM$XX P ROCESS LOCALSを呼出し、すべてのフロント エンド決定プロセス を行い、これらのクオリファイヤにより規定された出力ファイルを開く。このル −ブの動作は、さらにアイテム51に示される如く、フロント エンド ルーチ ンGEM$XX COMPILEを呼出し、入力ストリームを翻訳し、次いでア イテム52で出力ファイルをクローズする。ループが完結すると、プラス・リス トで示されたすべてのプロセスか行われたことを表示し、次いでアイテム53で フロント エンド ルーチンGEM$XX FINIを呼出しフロント エンド  クリーンアップのすへての動作を行う。
次いて実行が終了し、アイテム54でのインポーカ制胛に戻る。
シェル11はGEM$XX COMPILEを呼出し、単一人力ストリームを翻 訳する。入力ストリームは、コンパイラコマンド ライン内の単一の“プラス  リスト”で規定されるモジュール21またはソース ファイルおよびこれに含ま れるすへてのファイルまたはライブラリ テキストの連鎖を表わす。
コンパイラはフロント エンド20が入カス1ヘリームの翻訳中、複数のオブジ ェクト ファイル23を特定することを許さないか、該動作によって、単一人力 ストリームの翻訳より単に1つのオブジェクト ファイル23が形成されること かある。
GEM$XX COMPILEを呼出す前に、シェル11は入力ストリームを創 造し、ローカル クオリファイヤを解析し、出力ファイルを開く。GEM$XX  COMFILEの呼出後、シェル11はすへての入力および出力ファイルをク ロースする。
(GEM$XX COMPILEおよびこれにより呼出されるフロント エンド  ルーチン)フロント エンド20は、入力ストリームよりソース レコード2 1を読出し、これらをインタフェイス22(タプル、ブロック等の中間ランゲー ジ グラフおよびシンボル テーブルを含む)の中間レプレゼンテーションに翻 訳し、バック エンド12を呼出し、この中間レプレゼンテーションをオブジェ クト ファイル23内のオブジェクト コードに翻訳する。
オブジェクト ファイル23は任意の数のオブジェクト モジュールを具えて良 い。パスカル(PASCAL)は全入カストリームに対し1つのオブジェクト  モジュール(MODULEまたはPROGRAM)を創り出す。(1例として) ORTRANは入力ストリーム内の各ENDステートメントに対し別個のオブジ ェクト モジュールを創造する。BLISSは各MODULEに対し1つのオブ ジェクト モジュールを創造する。
オブジェクト モジュール23を創造するため、フロントエンドは入力ストリー ムおよびいくつかの後続ストリーム(ソース モジュール21と呼び得る)をイ ンタフェイス22の内部レプレゼンテーションに翻訳する。この内部レプレゼン テーションは、モジュールに対するシンボル テーブル3oと各ルーチンに対す る中間ランゲージ グラフ55よりなる。次いでフロント エンド20はバック  エンド ルーチンを呼出し、オブジェクト モジュール23を初期化し、メモ リ(ストレージ)アロケーション28を介してシンボル テーブル30内のシン ボルに対しメモリの割当てを行い、このメモリを初期化し、エミッタ29を介し ルーチン用のコートを形成し、オブジェクト モジュール23を完成させる。
コンパイラはパッケージの集合によって構成され、これらパッケージのおのおの は、翻訳プロセスのいくつかのアスペクトに関するルーチンまたはデータ構造の 集合を規定する。各パッケージは、一般にパッケージ機能の略記号である2文字 コードで識別される。パッケージへのインタフェイスはスペシフィケーション( 仕様書)ファイルで規定される。パッケージがZZの名前を付されているときは 、スペシフィケーション ファイルはGEM!l;ZZ、SDLとなる。
パッケージのスペシフィケーション ファイルに付されているすべてのシンボル は、このパッケージより輸出(エクスポート)されたと称される。一般にいって パッケージZZより輸出された特定のプレフィックス記号は、OEM$ZZて始 まる名称を有する。グローバルおよびエクスポーテッド(輸出)ネームに対する 特定の前置記号(プレフィックス)の変換は表1に示しである。
シェル11は共通のコンパイラ機能を支持するルーチンの集合である。これらの シェルの各成分は互いに相関しているので、何れかのシェル成分を使用するプロ グラムは全シェルに到達する。しかし、プログラムがシェル11゛を使用し、バ ック エンド12を使用しないようにすることもできる。これは利用度の少ない プログラムを生産性上の特徴(入力ファイル連鎖および包含、すなわちコマンド  ライン解析、診断ファイル形成、品物リスト ファイル、等)をもって書込む のに便利な方法である。シェル11はこれを使用する何れものプログラムにとっ ての実際上の“主プログラム”であり、アプリケーションの本体は以下に述べる 条約によってシェル11より呼出されるものであることに留意され度い。BLI SSプログラムより、シェルパッケージZZを使用するには、ユーザはL IB RARYGEM$ZZを行う。他のランゲージよりシェルを使用するには、ユー ザはまず第1にシェル スペシフィケーション ファイルを実行ランゲージに翻 訳するを要する。
シェル パッケージは次の記述に要約できる。すなわちこれらは附属書(アラペ ンディクス)内の仕様書ファイルに文書化されている。多くのシェル ルーチン  アーギュメント(例えば、整数、ストリング等)は表2に述へるカテゴリーの 1つに属する。
シェル11よりフロント エンド20に至る間のインタフェイスにはいくつかの 要求か加えられる。第1図のコンパイラが呼出されると、シェル11は制御を受 けるので、フロント エンド20はエントリ ポイントを宣言し、シェル11が これを呼出しうるようにし、かつグローバル変数を宣言しフロントエンド スベ シフィケーションをシェル11に通過させる。フロント エンド20は1例とし て表3に記載されたグローバルルーチンを行う。これらのルーチンはパラメータ を持っておらず、結果なしくno result)に戻る。
バーチュアル メモリ パッケージ(Virtual Memory Pack age)(OEM$VM) ・ このバーチュアル メモリ パッケージは、仮想(バーチュアル)メモリの割当 てを行う標準インタフェイスを提供する。
これはVMS LIB’$VN機能のゾーン化したメモリ概念を支持する。実際 上VMS、GEM$VM(7)下には、LIBsVM上にほとんど透明な層か存 する。しかしGEM$VMインタフェイスは如何なるホスト システム上ても変 化なく支持されることか保証されている。
ロケータ パッケージ(OEM$LO) ・ロケータ パッケージは、ソース  テキス]・21のレンジ長を記述する。(レンジ長はニスタートおよびエンド  ファイル、行および列番号)。テキスト入力パッケージはロケータを読出すべき ソース行(ライン)に戻す。ロケータは、シンボル テーブル30および中間ラ ンゲージ ノード43にも用いられ、メツセージおよびデバガー テーブル形成 を行い、かつリストファイルの何れの個所に遂行すべきリスティング パッケー ジが存するかを規定する。ロケータは長ワードにより表わされる。ロケータ パ ッケージはロケータ データベースを維持し、ロケータを創成し通訳するための ルーチンを作成する。さらにユーザ作成ロケータも設けられており、これはフロ ント エンドをして、自身のロケータを作成し、非標準ソースより到来するプロ グラム エレメント(例えばBLISSマクロまたはAda一般例一“インスタ ンティゼーション”)を記述する。
テキスト入力パッケージ(OEM$TI):テキスト入力パッケージは、ソース  ファイル21、ネステッド(インクルーデッド)ソース ファイル21及び障 害及び関連ファイル スペシフィケーションの連続をなし、一方でフロント エ ンド20を下側の演算システム13のI10機構より絶縁する。ソース ファイ ルのテキストは同時に1ラインを読比される。テキスト入力パッケージGEM$ TIは、ロケータ パッケージOEM$L○と協動し、読出す各ソース ライン を記述するロケータを形成する。
テキスト出力パッケージ(GEM$TX):テキスト出力パッケージは、任意の 数の出力ファイル44への出力を同時に形成する。テキスト入力パッケージと同 様に、その呼出側を演算システム13より絶縁する。参照記号または記述子(デ スクリプタ)によって通過するストリングに書込みを行なう。自動ライン ラッ ピングおよびインデンテーション(行末の字揃え)、ページ ラッピングを行い 、ユーザにより設定されたページ開始ルーチンを呼戻す。
リスティング パッケージ(OEM$LS)リスティング パッケージは、ソー ス ファイル21 (テキスト入力パッケージOEM$TIにより読出された) のコピーを有する標準型式のリスト ファイルを書き、これにロケータによって 特定される位置にフロント エンド11により設けられた注釈を付す。リスト  ファイルはGEM$TX出カフアイル44として創設され、これにはフロント  エンド20は、GEM$TX出カル−チンを用いて直接書込みを行なう。
内部表現(インターナル レプレゼンテーション)モジュール21のインターナ ル レプレゼンテーションは、ソース モジュール21の各ルーチンに対し、コ ンパクト中間ランゲージ グラフ55またはCILGおよびモジュールに対する シンボル テーブル30を有する。これら両者は、ノードにより構成されている ポインター リンクド データ構造である。
第1図のフレームワークによりノードを説明する。フロントエンド20とバック  エンド12閲で用いられるほとんどすべてのデータ構造(並びにバック エン ド12によってプライベートに使用されるデータ構造)はノードである。本明細 書でいうノードなる語は、メモリの自己識別ブロックであり、一般にの集合形を 有する。カインド(Kind)は、ノードの一般形を識別するGEM$N0DE  KINDSの列挙より得られる値である。サブ力インドは、カントによって特 定されるノードの一般的クラス内の特定の種類のイードを識別するGEM$N0 DESUBKINDSの列挙型よりの値である。すべての特殊ノードは、そのカ インド フィールドによって決定される集合型DEを有する。ノードに付随する 型式(タイプ)は上述の命名規約に従う必要かないことを記憶されたい。インタ フェイスのノード型式およびこれらに付随する列挙型式常数は表4のファイル内 に記載されている。
第1図のコンパイラ フレームワークは簡単なツリー構造シンボル テーブル3 0をもっており、この内で各シンボル ノードは、ブロック ノードより離れだ チェイン内で互いにリンクされており、これらかツリー状に配置されている。コ ンパイラによって使用されるべきすべてのシンボル情報は、このシンボル テー ブル30に含まれなければならない。さらに翻訳されたプログラムのリテラル値 を表わすリテラル ノード:変数を割当てるメモリ エリア(PSECTおよび スタック フレーム)を表わすフレーム ノード:およびルーチン エントリー  ポイントのパラメータ リスト内のエレメントを表わすパラメータ ノードも 設けられている。シンボル テーブル構造およびシンボル テーブル ノードの 内容について以下に説明する。
中間ランゲージは、すへてのソース コード21の内部表現に対して用いられる ランゲージである。フロント エンド20は、コンパクト中間ランゲージ グラ フ55またはCILGとして翻訳されるべきルーチンのコートを記述する。これ は、単に第4図のCILタプル ノート(単にタプル ノート、あるいは略して タプルとも称される)のリンクしたリストであり、これらのおのおのは、演算を 代表し、オペランドを表わすタプルノードへのポインタ38を有している。ノー ドはシンボルテーブル ノードへのポインタ38をも有しうる。中間ランゲージ の詳細については以下に述へる。
フロント エンド20は、モジュール21の中間レプレゼンテーション22を同 時1ノードで形成する必要があり、またノードを互いにリンクさせてシンボル  テーブル30とILデータ構造55とするを要する。このルーチンおよび表5の マクロについても付属書に記載してあり、これらは内部レプレゼンテーション2 2のデータ構造の形成および実行に用いられる。
バック エンド12は、フロント エンド20がブロックおよびシンボル ネー ムをどのようにして表わすかについての推定を行なわない。その代り、フロント  エンド20は、バックエンド12がこれらのネームを得るために用いうる標準 コール バック インタフェイスを形成するを要する。
各シンボル ノードは、フラッグGEM$SYM HASNAMEを有し、各ブ ロック ノードはフラッグGEM$BLK HAS NAMEを有する。フロン ト エンド20かシンボルまたはブロック ノードを初期化するとき、そのネー ムフラッグをセットして、これに対しネーム ストリングか存するか否かを表示 する必要がある。(シンボルおよびブロックのいくつか、例えはグローバルおよ び外部シンボルおよびト・ノブレベル モジュール ブロックはネームを有する を要する。)これはSTパッケージ内のグローバル変数GEM$ST GGET  NAMEである。フロント エンドはバック エンドの呼出し前にこの変数を セットして、表5の記載に適合するコールバック ルーチンをアドレスしうるよ うにするを要する。
GEM$COCOMPILE MODULEインタフェイスを用いてソース モ ジュールを呼出すため、フロント エンド(すなわち、ルーチンGEM$XX  COMPILE)は法部に述べる各操作を(順次)行なう。
1、内部レプレゼンテーションの創設 フロント エンド20の第1の任務は、ソース モジュールの内部レプレゼンテ ーション22を創設することにある。次いて、これはOEM$TI パッケージ を用いて、入力ストリームよりソース モジュール21を読出し、ソース モジ ュール21の字句、構文、意味上の解析を行い:付属書に記載するOEM$ST およびGEM$ILルーチンを用いて、上述のモジュールに対するシンボル テ ーブル30および中間ランケーシダラフ55を作成する。
これに加えて、モジュールのソース リストは、OEM$LSシェル パッケー ジへの呼出しをもって注釈され、モジュール内のエラーはOEM$MSパッケー ジへの呼で報告される。
ソース モジュール21がコードを形成し得ない程度の重大なエラーを含んでい るときは、フロント エンド20はGEM$LS WRITE 5OURCEを 呼出してリスト ファイルを書き、かっGEM$ST FTNIを呼出して中間 レプレゼンテーション22に対し割当てられたすべてのスペースを釈放するを要 する。さもないと、これは次のステップに進んでしまう。
2、コールバッグ ルーチンの特定 フロント エンド20は、バック エンド12を呼出してモジュール21を翻訳 する前に、ルーチンのアドレスを有する次の如きグローバル変数て、バック エ ンド12より呼出される変数を初期化するを要する。
(1)GEM$ST G GET NAME:上述の如くシンボル テーブル3 0内でシンボル名およびブロック ノード名を付されるルーチンをアドレスする ため初期化するを要するソース ランゲージで規定されるサイト(側)効果解析 を行なうルーチンのアドレスのため初期化するを要する。コンパイラは、前もっ て定められているサイド効果ルーチンで、GEM$SE DEFAULT IM PLEMENTATION を呼出すことによって選択され、フロント エンド 20の初期の発達中に用いるに適したルーチンの所定の収集をツタ エンド12 の検出エラーを報知するフロント エンド20のアドレスを有しており、これに ついては以下に説明する。
3、翻訳(コンパイレーション)の実行内部レプレゼンテーションが完全な場合 には、フロント エンド20はGEM$COCOMPILE MODULE(後 述)を呼出すことかでき、これをターゲット マシン オブジェクト レブレセ ンテーション23に翻訳する。次いで、フロント エンドはGEM$LS WR ITE 5OURCEを呼出す必要かあり、これによって入力ストリームをリス ト ファッセンブリ コード リストを作成する。
要し、これによってソース リスト21は、ハック エンドの処理中に生ずるす べてのエラー メツセージに注釈付けをすることができるようにする。しかし、 フロント エンド20に、る。かくすることによって、バグ(プログラムの誤り )がコンパイラをしてバック エンド処理中にアボート(流産)をさせてもソー ス リストに到達しうるようにすることができる。
ロセスに使用されていたスペースを釈放し、次いでGEM$ST FINIを呼 出して内部レプレゼンテーションに使用されたスペースを釈放しなければならな い。
バック エンド12は、例えば初期化されない変数、到着しない符号、あるいは スタティック メモリ初期化のコンフリクトの如き、ユーザに告知しなければな らないソース プログラム内の状態を表わすと思われる条件を翻訳中に検出する ことができる。しかし特定のフロント エンド20は、これらの条件のうちの何 れを報告するか、または発行されるべき詳細なメツセージについて、顧客仕様と するを要する。
これを可能とするため、バック エンド12は、アドレスがグローバルな変数で あり、以下に説明するようなアーギュメントの並び(リスト)をもつGEM$3 4 G REPORT−ROUTINEを呼出し、検出したすべての異例な状態 を報告するようにする。
付属書中に、GEM$ REPOR’T ROUTINEという名て、フロント  エンドかその内に自分自身のルーチン報告アドレスを記憶していない限り、そ のアドレスはGEM$ERG REPORT ROUTINEである欠陥エラー 報告ルーチンかある。この欠陥ルーチンは次の3つの用途かある。
(1) 欠陥ルーチンは適正妥当なメツセージを生ずるので、フロント エンド の開発者は、特別に顧客要求で設ける必要かなけれは、フロント エンドにそれ 自体のルーチンを設けることを考えなくて良い。
(2)フロン1− エンドの開発者か、報告ルーチンを作成する道を選んだ場合 、この欠陥ルーチンを見本(モデル)とすることかできる。
(3)フロント エン)−ルーチンはフィルタ作用をもって構成でき、これは特 定のエラーのみをプロセス(あるいは無視)し、他のすべてに対し先の欠陥ルー チンを呼出す。
エフエフ!・を表わすインタフェイス 共通のサブエクスプレッンヨン(C3Es)、不変数エクスプレッション(式) 、並びにコード モーションの機会を検出する重要なステップとして、バック  エンド12内のオプテイマイザ(最適化装置)26は、2つのエクスプレッショ ン タプルか同じ値を計算することを保証されているとき、これを決定しうるを 要する。この基本的判定基準は、次の場合に、エクスプレッションBがエクスプ レッションAと同じ値を計算することである。
1、AおよびBは同じ値のリテラル(直定数または数字定数)に対し、リテラル 参照を行い、C3Eは同じC3Eを参照し、またはシンボルは同じシンボルを参 照する場合、または、2、a、Bへのルーチンの開始時より、各開園フロー パ ス毎にAを評価し、かつ す、AおよびBは同じ演算とデータ タイプを有し、かつc、Bのオペランドか 対応のAのオペランドと同じ値の計算を行い(明らかに再帰的定義である)、か つd、Aの評価よりBの評価に至る何れもの通路に生ずるタプルか、Bの計算値 に影響を及ぼさないこと。
第1図のオプテイマイザ26はそれ自身で基準(criteria)1.2a、 2bおよび2Cを評価てきる。しかし基準2dは、翻訳すべき言語(ランゲージ )の意味によって定まる。すなわち、ソース コート モジュール21のランゲ ージによって定まる。しかしバック エンド内のコンパイラ12はランゲージ独 立性である必要があるため、フロント エンド20に必要な情報を伝達する一般 的インタフェイスを設ける。1つのタプルの実行が、他のタプルによって計算さ れた値に何時影響するか?インタフェイス22は、オプテイマイザ26をしてこ の質問を発せしめ、フロント エンド20のコンパイラはこれに答えなければな らない。
このインタフェイス22の下側のモデルはいくつかのタプルがエフェクトを持っ ており、他のタプルはデペンデンシイ(従属性)を有するものである。タプルは その1つ又は1つ以上のメモリ位置の内容を変化するときエフェクトを有する。
タプルはこのタプルにより計算された値がメモリ位置の内容に従属して定まる時 はこれをメモリ位置についての従属性を有する。従って1つのタプルの実行は、 他のタプルが従属しているメモリ位置をも変更するエフェクトを有しているとき 他のタプルによって計算された値に影響を及はす。
アドレス アリスメティックが分岐をしている場合および間接アドレスの場合に は、一般にタプルによって評価した特定のメモリ位置を決定するたとか不可能で ある。従って評価し得る可能性のあるメモリ位置のセットに対してはヒユーリス ティック(発展的)近似によってこれを行なわなければならない。
エフェクト クラス インタフェイスに対し一オブティマイ実際のインタフェイ ス22はフロント エンドに対し2つの機構を形成し、これによってオプテイマ イザ−26に従属性情報を通信する。これらは直線的従属性インタフェイスおよ びエフェクト クラス インタフェイスである。
直線従属性インタフェイスにおいて直線コードの従属性を決定するためオプテイ マイザ−26はフロント エンド20に次を質問する、(1)タプルをエフェク ト スタック上に押上げこれを再び押し下げる。(2)実行がおそらく特定のタ プルによって計算された値に影響を及はすであろうエフェクト スタック上の一 番上のタプルを発見する。
オプテイマイザ−26が任意のフロー バスのリセットを通じてプログラム流の 結果生じたエフェクトを計算するを要する場合、上述の直線機構は適当でない。
このような状態では、フロント エンド20は特定の番号(初期には128)の エフェクト クラスで各々がメモリ位置のいくつかのセット(おそらく決定的で はない)の表わす特定番号を決定する。エフェクトクラスのセットはビット ベ クトルによって代表される。例えはあるエフェクト クラスは特定の変数の名前 を付され、手続コールによって変更されるメモリ位置、又は間接に参照番号(ポ インタ デリファレンス)によって評価されるメモリ位置のセットによってエフ ェクト クラスは代表される。
百ト・!ナイ、 、、、 /7 rj:+I−nJ−+−I M’−÷且ム)− r4 − J−+ IJ TFFF“At)スが存在してはならない。オプテイ マイザ−はこのことをエフェクト クラス メカニズムによりXiよりXi+1 までのすべてのフロー パスについて生ずる全部の基本ブロックのセットにつき LDEFの統合を計算することにより試験し、これによってこのセットの交差が Bか従属するであろうメモリ位置を含むエフェクト クラスのセットとの交差を 計算し、これによりこの交差か空であるか否かを試験する。
以下にはこのインタフェイスの構造について説明する。インタフェイス ルーチ ンはハック エンド12によって呼出される。フロント エンド20はこれかバ ック エンド12を呼出す前に利用可能なインタフェイスの具体化を行なう必要 がある。
フロント エンド20は標準グローバル変数のインタフェイスルーチン エント リー ポイントのアドレスを示すことによりこれを行なう。この場合オプテイマ イザ−26はこれらのルーチンの1つよりこれらのルーチンの1つを呼出した場 合適当なグローバル変数よりルーチン アドレスをロートする。以下においてイ ンタフェイス ルーチンはGEM SE xxxて始まる名前を付けて表される 。フロント エンドは各対応のインクレメンテーション ルーチンのエントリー  アドレスをグローバルな変数てGEM SE G xxxの名前を記されたr ニーP−I−hL斗−・トT籠1絆小玉キ尤古すzbゴ11.カゴlしものとし て記憶しなければならない。
エフェクトおよび従属性を有しているタプルがこのインタフェイスに関係する。
ILタプルのうち極く僅かなものがこのようなエフェクトおよび従属性を用いる 。(大雑把に言ってメモリーを行なうタプルがエフェクトをもつことがてきる。
エフエッチをタプルか従属性を持つことができ、ルーチンを行なうタプルはこれ らの両者をもつことができる。)さらに細かく言うと各タプルは次の如きカテゴ リーの1つの範晴に入る。
1、 何等エフェクトを持たず、又何れのエフェクトにも従属しないタプル(例 :ADD)。このクラスに属するタプルはエフェクト スタック上に押し上げら れることはない。
さらにこのようなタプルはGEM SE EFFECTSを通過したこともない 。
2、エフェクトを有し、しかし従属性を持たないタプル。
(例: 5TORE)。
3、従属性を有しているか、何等エフェクト(影響)を生じないタプル(例:  FETCH)。
4、エフェクト(アウト エフェクト)および従属性の個別のセット(イン エ フェクト)の両方を有するタプル(例:プロセデュア コール)。
b、エフェクトどよひ[V%狂り阿百を月]るタプル。タプルが従属するエフェ クトは、タプルが生ずるエフェクトと同この構造のうちのつくつかのフィールド はフロント エンドおエンド スタック上に押し上げる。
タックより一番上のEILタプルをポツプ(打ち抜く)する。
これはアドレスがEIL TUPLEパラメータにあるタプルであるとを保証す る。これはこのパラメータか冗長性をもっていることを意味すること当然である 。しかしなから、フロントエンドがエフェクト スタックに対し単一のスタック 動作を行なわないポツプ手続では記号を簡単化することができる(以下のインク レメンテーション参照)。
最も最近に押されたタプルに戻る。スタック上の何れのタプルもかEIL TU PLEに影響を及はさない時は零(0)に戻る。さらにこのパラメータ内で特定 された同じタプルに戻ることもあり得る。
GEM TUPLE N0DE)= ある最も最近に押されたタプルに戻る。スタック上のいずれものタプルがEIL  TUPLEに影響を及ぼさない時は0(零)に戻る。同じパラメータで特定さ れた同じタプルに戻ることちるダブルによってのみ呼出すことかできる。
このフィールドは、EILGのウオーク内にタプルのインデックスを有しており 、この内の基本的ブロックは、ドミネータツリーの深度を第1にした予め定めた 順番で訪問される。バック エンド12かGEM SE PUSHEFFECT をタプル八によって呼出し、これに次いてタプル已によってOEMSE PUS HEFFECTまたはGEM SE FINブロック内でタプルAかタプルBよ りも前にあるか、またはタプルAをもつ基本ブロックかタプルBを持つ基本ブロ ックよりも正しく優位にあることが保証される。従ってエフェクト スタック上 のEXPRC0UNTタプルの値が、スタック深度の増加に従って減少する(す なわちより最近に押出されたタブTより少ないかこれに等しいタプルTに遭遇す ると同時にエフェクト スタックのサーチをショート カットしうろことを意味 する。これはTより深くスタックされているすへてのタプルエフェクト スタッ クの実現あるいは具体化に実際に用いられるメカニズムは完全にフロント エン ド2oによって定まり、1つのタプルの実行か、他のタプルによって計算された 値に影響するかしないかの)0ント エンドの決定には、通例の如くのルール( 法則)か用いられる。繊細なスタックの実現化も可能である。但しこれは非能率 であることか多い。より具体性のある実現化は、ハツシュ(寄せ集め)テーブル を囲んで構成することてあり、これによって多数の小スタック(それぞれが1つ または僅かの変数のみに関連する)を単一の大スタックの代わりに用いることが できる。
次にエフェクト クラス インタフェイスについて説明する。
すへてのエフェクト セットは、エフェクト クラスのセットを表わすビット  ベクトルであり、1つのエフェクト クラスは、メモリ位置のいくつかの任意の セットを表わすことを想起されたい。典型的にエフェクト クラスは次のものの 1つを代表する。
■、 単一のネームの変数。有効な最適化(例えば非アグレゲートの)のために 、ルーチンにおいて頻繁に用いられるローカル変数は、これに専用とされたエフ ェクト クラスを持たせる。
2、 いくつかの共通の特性をもったネームのセット、例えば、FORTRAN では、特殊のネームの共通ブロック内のすべての変数。
3、 ルーチンの際迄決定されないが、いくつかの共通特性を有しているメモリ 位置のセット、例えば、当該ルーチンの外側では見られるすべてのメモリ位置、 (従ってルーチンコールによって変化しうるちの):あるいはパスカル(Pas cal)においては、特定のタイプを有し、NEWコールにダイナミックに割当 てられるすべてのメモリ位置。
これはフロント エンド20か規定する明確なりラスの最大数である。初期具体 化(インブレメーション)においては、これCTS)に展開するのはマクロであ る。従って宣言(デクラレーション)X:GEM SE EFFECTS SE Tでは次の各構成はすへて自然数となる。(たたし0≦N≦GEM SE K  MAX EFFECTS−1):X (N) =真、セットXにエフェクト ク ラスNを加算!X (N:l =誤り、セントXよりエフェクト クラスNを除 去!仮にX (N)であると−−−セソトX内にクラスNをエフエント!エフェ クト クラス インタフェイスに対するインタフェイス ルーチンについて以下 に説明する。フロント エンド20は次のルーチンの実行を要する。
EIL TUPLE :インGEM TUPLE N0DEEFFECTS B V : −1’ ン7’)トGEM SE EFFECTS 5ET)フエント の結合を次に書込む EFFECTS BV GEM SE DEPENDENCIES(エンド クラスのセットを次に書込 む。
GEM SE VARIABIE DEPENDENc■Es(SYMBOL  : インGEM SYMBOL N0DEEFFECTS BV ニアウドGE M SE EFFECTS 5ET)EFFECTS BV内im変数SYMB OLに従属スルメモリを含むと思われるエフェクト クラスのセットを書込む。
GEM SE EFFECTSftエフ エンドを有するタプルのみにより呼出 される。
コンパイラは上述の如きインタフェイス ルーチンに対する具体化を行なうを要 する。しかしこれらのルーチンは生産(本番)コンパイラ用のものではない。こ れらは効率が悪く、1つのタプルが他のタプルを無効にするときのルールは如何 なる特殊ランゲージの文意とも正確には一致しない。しかしこれらは生ずへき、 欠陥の有効な最適化を可能とし、しかもフロントエンド20の他の素子を具体化 する。
各シンボル ノードのEFFECTSフィールドは、32とGEM SE K  MAX EFFECTSの間てエフェクトクラス番号として処理される。フェッ チまたはストア タプルのアドレス式がベース シンボルを有するときは、この シンボルのEFFECTSフィールドをチェックする。もしこれが上述のエフェ クト クラス具体化を用いるエフェクト セラASSを呼出す。
このインプレメンテ−ジョン(具体化)は、エフェクトに対し単一のモデルを規 定することによってエフェクトに関する情報を提供する。
■、 多数かオーバーレイされていない。
2、 データ アクセス演算か正規様式(CT、006て規定された)でなく、 (メモリに対し)またはエフェクト0(フェッチに対し)に従属する。
3、 コール(呼)がエフェクト32よりGEM SE Kりは、呼がそのアド レス オペランド内に書込みを行なったときのように処理される。
GEM SE K MAX EFFECTSを通じるエフェクト クラス0およ び32かリザーブされるエフェクト0は参照された変数か識別できない(ポイン タ デレファレンス、パラメータ等)ときのメモリを表わす。
正規型式のデータ アクセスを用いて変数か第1に表われるときは、この変数は 32よりGEM SE K MAX EFFECTSまての範囲において、エフ ェクト クラス番号nを割当てられる。この番号はシンボル ノードのEFFE CTSフールド内に記録される。このレファレンスの変数およびこれの後続のす へてのレファレンス変数はエフェクトまたはディベンゾンシイnを有する。
この具体化は実験、試験(テスト)等に対し、いくつかのフックを含んでいる。
1、 エフェクトまたはディベンゾンシイを有するであろうタプルは、フロント  エンドにリザーブされており、このタプルのエフェクトおよびディベンゾンシ イを記録する1つ以上の”エフェクト フィールド” (EFFECTS。
DEPENDENCIES、エフェクト−2等)を有する。
コンパイラ・サブライド エフェクト クラスはエフエフベクトルとする。すな わち、仮にこのフィールドのビットnが真であると、ルーチンはタプルによって 計算されたエフェクトにエフェクト クラスnを加算する。
2、 フロント エンドは、変数のシンボル ノードのエフェクト フィールド 内に1とGEM SE K MAX EFFECTS間のエフェクト クラス番 号を書込むことによって、この変数に対するエフェクト クラスを選択すること かできる。EFFECTS フィールドがゼロでない場合には、エフェクト ク ラス ルーチンはエフェクトクラスを割当てない。
3、 エフェクト クラス1ないし32はフロント エンドの使用のためにリザ ーブされる。フロント エンドはこれらのエフェクト クラスに任意の解釈を割 当てることかできる。
上述の直線ディベンゾンシイ具体化に用いるため、フロントを呼出す必要がある 。このインプレメンテ−ジョン(具体化)は、GEM SE EFFECTSお よびGEM SE DEPENDENCIESにより形成される情報を使用し、 無効の交差点が非ゼロである如くする。
誘導変数 本発明の一特徴として、コンパイラの中における誘導変数の改良した処理方法が ある。第一に、誘導変数の定義及び検出について説明する。
整数の変数Vは次のような場合、即ちループL内に生ずるVの各メモリーか次の 条件の場合にループLの誘導変数と称する=1、実行される各時間においてイン クレメント(又はディクレメント)■か同じ量の場合。
2、ループを通じて各”完全トリップ”内で最大で1口実行される時、トリップ はこれがループのトップにフローハックするときに”完全(コンプリート)と称 する。
例えば、次のコートは、誘導変数Vを表すものである。
ラベルL V=1 1F V>10 GOTOLABEL M LSE PRINT X END rF コンパイル(翻訳)機能において誘導変数の発見に加えて我々は、誘導式(エク スプレッション)にも関心をもっている。
誘導エクスプレッションとは、誘導変数の直線関数として計算できるエクスプレ ッションを称する。
次のプログラムについて考えてみる。
DOI=1,100 エクスブレノノヨン゛°I*8”、”I−4” ”T”及び“T*4”は、いず れもIの誘導関数として再計算できるので全てか誘導エクスプレッションである 。
誘導変数に基ついて最適化の例として次のごとくの例を考える。
■=1 。
L : X=X十(4°■) 1=1+ま ただし I <=1000OTOL これはDOループのそれ自体であり、■はループ制画変数である。誘導エクスプ レッション■*4はループを通ずる各1回のトリップごとに4だけ増加すること に留意されたい。新しい変数12を導入することにより、倍算を加算によって置 き換えることができ、これはより安価な演算である。これは、長い間にわたりコ ンパイラを最適化するのに用いられた強度減少として知られた最適化である。
たたし I <=1000OTOL ここにおいて我々は、2つの変数(■及び12)を有しているが、このうち1つ のみを使用していた。■2の代わりに1の使用に再注目することによって、オリ ジナルのループ制画変数を完全に消去することができる。
12=4゜ L: X=X+1ま ただし I <=400 GOTOL この最適化は誘導変数消去として知られている。
この最適化(強度減少及び誘導変数消去)は、誘導変数に直接動作する。これら の最適化に加えて誘導変数検出は、他の最適化、例えば、自動インク/デック( inc/dec)、ベクトル化、ループ反ローリング等に対し、情報を形成する 。
第1図のコンパイラに使用されるモデルにおいて誘導変数は、ループ中に1回以 上インクレメントされる。更に、変化の数は、各繰り返しに対し、異なるように することさえもてきる。実際上も、特種な繰り返しに対しては変化の数をセロと するこもできる。ループの不変量のインクレメント値は、各個別メモリーにより 異なることもあるか、各個別メモリーは、実行されるごとに必ず同し量たけ変化 をインクレメントする必要かある。
誘導変数にはいくつかの異なるカテゴリーか存し、これらは異なった特性をもっ ており、基本的誘導変数、誘導エクスプレッション、疑似誘導変数を含んでいる 。
基本的誘導変数は、誘導変数の最も簡単な形部である。これらは、ループ全体を 通じて適用される既知の特性を有している。
他の総ての誘導変数及びエクスプレッションは、基本的誘導変数の直線関数とし て常に構成される。基本的誘導関数は、一般に1=I+q又はI=I−CIの形 態で変形され、ここにおいて“q”はループ不変量である。しかしより一般的な 要求は、I=f (I)の形を当てはめることである。ここで、f(I)は係数 1をもった■の直線関数である。
付属書内に示されたアルゴリズムにおいて特定のループの基本的誘導変数は、ル ープ トップ内のセットして表されている。このセットに加えてループを通ずる 各トリップごとには実行されないこともある条件付メモリである基本的誘導変数 をも存在している。これはベクトル化を禁止し、より“好ましく”強度減少を行 い得る。
誘導エクスプレッションとは、誘導変数又は他の誘導エクスプレッションの直線 関数を意味する。誘導エクスプレッションは、次の形態のいずれかである。
−f (1) f (1) 十g (I) f (1) −g (Df (I) 十E E+f  (1) f (1) −E E−f (1) f(+)°E E” f (I) ここでf(J)及びg(1)は、ループLに関する基本的誘導変数より導かれ、 またEはループL内の不変量である。f(I)とこれかオペランドであるアリス メティック オペレータ(算術的演算子)の間にメモリかない場合は、このアリ スマティックオペレータはループLに関する基本的誘導変数■より導かれる誘導 エクスプレッションである。
他のカテゴリーは疑似誘導変数である。ある特定の条件においては、変数は、ル ープを通ずる第1トリツプ以外の総てにおいて誘導変数のごとき特徴を呈する。
これらは、ループの第1繰り返しをビール(はかす)することにより誘導変数( したがって、ベクトル化)に変形できる。このような変形を”疑似誘導変数′° と称する。これは、2つのみのメモリによってループ内でフェッチに到達し、こ れら2つのメモリのうちの1つは導出誘導変数を規定するものであり、他のメモ リは、ループ トップを通じて値か通過するものであるときに生ずる。追加的に ループ内の総てのメモリ・−は、トリップ当たりに1回ずつ実行されることを保 証しなけれはならない。
ループを通ずる第1トリツプにおいて、DはIに割り当てた値として50を有す る。次のトリップにおいてDは、値5.6.7を有する。このループを10アン ロールすることにより次のトリップをベクトル化することかできる。ここにおい て得られるアルゴリズムは疑似誘導変数である誘導変数を見いたせない。
基本的誘導変数を識別するため、コンパイラはこれに対する総てのメモリを認識 し得る必要かある。“エイリアス(別名)メモリを有する”の欠如はこれの保証 に貢献し、したがって、°゛エイリアスメモリ有”のない基本的誘導変数のみを 識別すればよい。
基本的誘導変数の検出は、ポテンシャル誘導変数の“セット”の使用を必要とす る。各ループに対し、これをダイナミック的に行うのは高価でありかつ複雑な演 算となる。これに代えてIDEFセットの構成に用いられているサイド エフェ クト セットを使用する。
Xのフェッチがこれに応じて定まる総てのエフェクトかS内にある場合、変数“ X”はIDEFセットS゛内”と称する。
即ち、GET VARIABLE DEPENDENCIES(X)がSのサブ セットである場合のみ、Xは、IDEFセット内である。
基本的誘導セット内におけるXの存在は、次の場合にのみあてはまる。
a) Xか基本的誘導変数である。
b) Xかループ不変数であり、基本的誘導変数である少なくとも1つの変数を もったIDEFビットをシェアするとき。
付属書内に記載したアルゴリズムの説明は、その説明を簡単にするため、次のご とく(あるいはこれより多くの省略を設けた) (1)直線関数の定数部分の集合はオーバーフローを生じ得ない。(2)総ての メモリは、変数を完全に再規定し得ること。
付属書内に説明されているアルゴリズムはループ内で変形される総ての変数は基 本的誘導変数とみなしている。各ループトップは基本的誘導変数を有する。基本 的誘導変数に対する要求を満足しないメモリも有り得るので、ループ トップの 基本的Iv上セツトり変数を消去する。
誘導エクスプレッション及び導出された誘導変数は、常に基本的IVの関数であ るため、基本的IV(誘導変数)のフェッチは誘導エクスプレッションの原子的 形態であるといい得る。
即ち、誘導特性をもつへきエクスプレッションに対しては、これは誘導オペラン ドであるか或は基本的誘導変数のフェッチである。前に述へたルールを用いて、 基本的IVに関する推定に基つき、簡単な誘導エクスプレッションより誘導エク スプレッションを構成する。誘導エクスプレッションの基本的IVは、常にこの エクスプレッション(式中)に保持されている。従って、アルゴリズムか経過し た後、我々は、エクスプレッションが実際に誘導的であったか否かをこれを導出 した基本的IVかループの基本的IVセット内に依然として存するか否かをチェ ックすることにより真の誘導的であるか否かを決定できる。
付属書内に述へたFIND IVアルゴリズムは、DATAFLOWフェーズの 一部となりこれは第1ドミネータのスリーウオ一りの深部となる。
これて行われるタプル プロセスの全体の要約を示す。
TUPLE [0PCODE] [’FETCH] ベースシンボルか依然としてIVベペー キャンディデートの場合 このタプルをインダクティブ(誘導性)としてマークする。
[5TORE] ■をメモリのベースシンボルとする。
蓄積される値か誘導性でないか或は、 蓄積される誘導値の基本的IVかVてないか又は蓄積値の係数がlでない場合、 ループ トップの基本的IVよりVを除去次いて、 ループ トップの基本的IVより■を除去、次いて、 メモリを誘導的とマークする。
[ADD、SUB、MUL、なと] 1つのオペランドかインダクテイプであり、他のオペランドかループ不変性であ る場合には、このタプルを誘導的とマークする。
このフィールドをタプルデータ構造に加算し、更に、このフィールドをフロー  ノートに加算し、誘導変数検出をこれによって表6aに述へるごとくして行う。
K F OL D (K倍)ROUTINEの自動形成前述のごとく、第1図の プログラミング ランケージ コンパイラはソース ランゲージ内に書き込まれ ているプログラムヲターケノト マシン25のマシン ランゲージに翻訳する。
このコンパイラは、フロント エンド20を有し、これは、ソース ランゲージ の知識を翻訳すべきモジュール2I内に導入し、更にハック エンド12を有し 、これは、ダーケノト マシン25のマシン ランゲージの知識を内蔵する。フ ロントエンドは、ソース ランゲージのプログラムをILG 55の中間ランケ ージに翻訳し、バック エンドは、中間ランケージよりのプログラムをターゲッ ト マシン ランケージのプログラムに翻訳する。
中間ランゲージは一般にオペレータ(“演算子”例えは、add、5hift、 compare、fetch、5tore又はtangent)の収集を行い、 またデータ タイプ(゛サイン付き32ヒツト整数′”、“IEEE S−fo rmatfloating point”又は”characterstrin g”なと)の収集を行い、かつ、これらデータタイプの値のりプレゼンテーショ ン(表示)を行う。
オプ÷イマイサ(最適化装置)26に含まれる最適化の1つは評価ルーチンのコ ンスタントの表示である。コンスタント表示(エクスプレッション)に関するソ ース コード リスティング(表)の1例は第6図に示してあり、ここにおいて A及びBは定数てあり、したかって、A十Bも定数であり、またI及びJは両方 とも同し定数に等しい。コンパイラは計算A+Bを行うことかでき、また、ラン  タイム(運転時間)においてA及びBのフェッチを個別に制証し、更に、AD D演算のセーブもこれと同時に行う。第6図の符号のI=A+B及びJ=A+B の式は、上の理由により両方とも単に5TOP#9、I又は5TORE#9、J て代表される。これは″゛コンスタントホールディングとして知られており、そ れは、コンスタント即ち定数か検出され、翻訳時間中に計算され、かつ、オブソ エント コード イメージ中に”ホールディト(折り込み)”されるからである 。これを行う機構は、Kホルト ルーチンと称されるオプテイマイザ26の一部 である。
第1図のコンパイラは、これらの定数表示を発見するため、中間ランゲージのエ クスプレッションを評価するにホルト ルーチンを有している。一般に、中間ラ ンゲージの演算子か与えられ、かつそのオペランド値か与えられると、このルー チンは、これらの値に対し、割り当てられた演算子によって計算される同じ値に 対し、劣勢(弱い値−m−イールド)となる。このような定数式評価ルーチンは 、コンパイラ内で多くの用途を有する。
例えば次のごとくである。
(a)プログラムに対し発生されたマシン コードの実行速度は、プログラムの ある式かコンパイラ自体で評価し得るときは、そのプログラムか実行されるとき よりも改良される。
(b)いくつかのソース ランゲージは、一定値を表すのに一定のオペランドを もった式を使用することを可能とする。このようなランゲージの翻訳には、コン パイラによりこのような式を評価するを要する。
(C)中間ランゲージ内に設けられた1寅算のレパートリ−かプログラム ラン ゲージによって設けられた演算のセ・ノドよりもリッチであるか又はコンパイラ か使用される環境に比してリッチである場合には、このコンノくイラ内て幾つか の計算を遂行する最も便利な途は、これを中間ランゲージ内て表し、かつこれを 定数エクスブレソソヨン評価ルーチンに提出することである。
定常エクスプレッション評価ルーティンの実行はかなり困難な仕事かも知れない 。[Lには、10以上の演算(例えはADD、 5UBT。
C03INE、等々)かあり得ようし、異なるデータ タイプを考えるときには (例えはINT32. NINT64. FLOATA、等々)、中間言語は数 百ないし数千の演算子を持つこともあろう。評価器は、コンパイラかその機能を 完全に若しくは正確に実行するのを失敗しないように、各演算を各データ タイ プに正確に適用できるようになっていなければならない。特に、浮動少数点タイ プか係わっているときには、中間言語で表すことのできるすへての演算かコンパ イラの実行するプログラム用言語に直接通用するとは必ずしも云えないであろう 。その結果、定常エクスブレ・ンション評価ルーティンは、数百に及ぶ異なった 場合を含み極端に長くなりがちで、高度に誤り易い傾向かある。
本発明の1つの実施例の重要な性質に従えば、中間言語の演算子の正確な意味か 常に簡潔且つ正確に特定できる言語はその中間言語それ自身であるという難点か ある。換言すれは、コンパイラのバック エンドそれ自身か中間言語の任意の演 算子を正確に実行する符号を生成する能力を持たなけれはならない。
更に別の云い方をすれば、これは、コンパイラのバック エンドか各中間言語の 効果を実現するのに必要な一連の機械語の命令の知識を既に具現しており、定常 エクスプレッション評価ルーティン中てこの同じ知識を再び異なる形で符号化し なけれはならないのは冗長であろう、というのである。
この概念に基づき本発明に従えは、定常エクスプレッション評価ルーティンの機 械的な生成は簡明なものとなる・最初のステップは、正常のコンパイラとして同 じバック エンド12を使うか、そのフロント エンド20は下記の特殊なフロ ント エンドと置き換える図1の新しいコンパイラを創生することである。
(下記のように演算するコンパイラ用の特殊モードを具える、と云うのと等価で ある。) 2番目には、特殊のフロント エンド20又は特殊の演算モートは、ソース プ ログラム21を読み出し且つ翻訳することはしない。その代わりに、それは定常 エクスブレッンヨン評価ルーティン用の中間言語を次のように生成する(a)こ のルーティンは仮数リスト中て特定される中間言語演算子に基つき場合を選択す る条件付分枝を実行する。
(b)各場合は単一演算子用の符号を含む。それは被演算値をルーティンの仮数 リストからフェッチし、演算子をそれらに適用し、結果を返す。
(C)ルーティンは中間言語中て直接に生成されているから、各場合用の符号は 単に、被演算子を仮数リストからフェッチする中間言語演算子と、その次のこの 特定の場合用の中間言語演算子と、さらにその次の結果を返すための中間言語演 算子とから成る。
3番目には、この中間言語のグラフかコンノくイラのノ<・ツクエンドに服従し 、定常エクスプレッション評価ルーティンのための機械符号を生成するであろう 。
いよ述へた特殊のフロント エンドでは、それに対して場合が生成されなければ ならず、各場合用に中間言語を機械的に生成できるすべての演算子のリストを、 フロント エンドか含むことかできる。
しかし、しはしは生起するように、もしコンパイラのバ・ツクエンドか演算子情 報のテーブルを含むならば、処理は更に簡単化することかできる。(例えば、そ のようなテーブルは、フロント エンドにより生成された中間言語のグラフの正 確さをチェックするのに用いることかできる。)すると、特殊のフロント エン ドにとって、との場合か生成されるへきかを定めるために既にバック エンドに より設けられているこのテーブルを使うことか可能になる。
れるオブジェクト モジュールに入っているプログラム タイプ型の情報を構築 するのにフロント エンド20及び)<ツク エンド12により使用されるメカ ニズムを具えている。このタイプ1m化サービスは、プログラム シンボル及び それに付随するタイプ情報を、ターゲット オブジェクト ファイル要求とは独 立のやり方で、オブジェクト モジュール ビルダー29に記述することをフロ ント エンド20に許容することか意図されている。このタイプ特定化サービス は、手続き的な「タイプの文法」として行動し、それによりコンパイラは抽象タ イプ特定化及びプログラム シンボルに関連させることかできる。タイプ特定化 インタフェースか以下に定義され、GEltl TDササ−スの使用の多数の実 例か引用される。
タイプ情報の創生はシンボル テーブル30との関係で生じ、フロント エンド 20にプログラム タイプ情報の抽象表現を特定することを許容する。オブジェ クト モジュール ヒルダー29は後にこの情報をデバッグ シンボル テーブ ル情報を構築するのに用いるであろう。
GEλl TDモジュールはフロント エンド20に基礎タイプ及び派生タイプ を記述することを許容するサービス ルーティンを具える。これらのルーティン は特定化されたタイプ情報を記述する内部データ構造を典型的に構築する。新し いコンパイラノード タイプGEM TDIは、このタイプ情報を管理するため に定義されよう。タイプ ノート データ構造はコンパイラ12に対して非公開 であり、フロント エンド20によって変えたり検討したりされることはできな い。タイプを定義するときフロント エンド20はタイプを定義するGEM T Dシル−ィンによって「ハンドル」かタイプ ノードに戻される。ノλンドルは フロント エンドにプログラム シンボルを持つタイプと連携することを許容す るが、データ構造のフィールドを変えたり検討したりすることは禁止する。
タイプ ノードはスコープにより創生され、管理されるであろう、すなわちタイ プ情報を送るときにフロント エンド20はタイプかその内部で宣言されるべき ブロック ノートを特定するであろう、またシェルは該スコープの内部における タイプノードの管理に対し責任を持つであろう。シェルは、その中でタイプが定 義されているブロック ノードに根ざすリスト中のタイプ ノートを管理するで あろう。ブロック ノード データ構造は、フィールドTYPE L[ST H EAD及びTYPE LIST TAILを定義するために拡張されよう。
)0ント エンド20は、タイプ特定サーヒス ルーティンにオン サ フライ 呼を発することを選択してもよいし又はタイプ情報を生成するために全シンボル  テーブルをバスオーツ八−することを選択してもよい。
タイプを定義した後、フロント エンドはこのタイプ情報をそのタイプのシンボ ルに連携させなければならない。シンボルノートは、シンボルをそのタイプに連 携させるのに使われたされたタイプ ノード ハンドルのアドレスを含むであろ う。
DST TYPE INFO値がOのシンボル ノードは、タイプ情報を持たな いシンボルのためのターゲット特定行動様式を持ってあろう。
図7を見れは、関数・ int toy procl) float b、c; に対するデータ フィールド及び相互関係か説明されている。
toy−proc用のブロック ノート60は、シンボル テーブル30中の、 エントリー63.64及び65を指し示すフィールド61及び62(declリ スト ポインター)を含む。またそれはintとfloat用にタイプ リスト のエントリー68及び69を指し示すタイプリスト ポインターとして機能する フィールド66及び67を含む。
エントリー63.64及び65はまた、それか成り立つ場合はintとfloa t用のエントリー68及び69を指し示すポインター70.71及び72をも持 っている。
GEM TDタイプ特特定サビヒス、フロント エンド20に標準及び派生タイ プを定義することを許容し、これらのタイプをプログラム シンボルに連携させ るルーティンから成る。コンパイラのバック エンド12はこの結果であるタイ プの定義とそれらのシンボル ノードとの連携を用いてターゲットを特定したデ バッグ シンボル テーブルを生成する。プール代数の記法は基礎タイプとは考 えられていないことに注意されたい。パスカル(Pascal)のような言語用 のコンパイラは真及び偽のエレメントを含む列挙としてプール代数の記法を定義 しなければならバック エンド12中て符号生成器29による符号テンプレート を用いる符号生成を為す方法が以下に記述される。符号テンプレートの選択及び 適用はコンパイラ過程中で4回生しる。
1、PATSELECT相は最良の符号テンプレートを選択するためにC0NT EXTバス中にパターン整合をとる。(ツクターン整合中にCI COMP及び DELAY最適化タスクかパターン整合過程の一部として平行して為される。) 2、C0NTEXTパス中のTNASS+GN及びTNLIFEタスクは、選択 されたテンプレートのコンテキスト行動を用いてエクスブレ号テンプレートに割 り当てる。
3、 TNB[NDババス、選択されたテンプレートのパインディング行動を用 いて局所生涯を持つTNを符号テンプレートに割り当てる。
4、 最後に、C0DEバスは、選択されたテンプレートの符号生成行動を用い てオブジェクト符号語の生成を誘導する。
テンプレートはコンパイラ過程中で様々な回数に亙り用いられる。これは3つの 主要なコンポネントから成る:1、ILGパターン−テンプレートに整合するテ ンプレート選択過程を適用可能な[LG構造に誘導する。
2、遅延しない行動−整合したILG構造の処理をC0NTEXTノクス、TN BINDバス及びC0DEパス中に決定する。遅延しない行動はテンプレートが 各バス中で最初に処理されるとき実行される。その結果、各[LGノードに対す るテンプレート行動は、各パスで1回宛計3回処理される。行動のうちのあるも のは、1つのパスに対してのみ意味を持ち、その他のパスでは無視される。その 他の行動は1つより多いパスで意味を持つが、各パスでて要求される処理はそれ ぞれ異なる。
3、遅延する行動−この場合にも整合したILG構造の処理をC0NTEXTパ ス、TNB INDバス及びC0DEパス中に決定する。遅延する行動は、テン プレートにより計算された結果か他のテンプレートの葉(leaf)として最初 に処理されるとき各パスを実行する。遅延する行動は、アドレス モードを持つ VAXのようなターゲット機械上ては有益である。RISCのような単純なレジ スタ機械は恐らく遅延する行動を重く用いないであろう。
コード発生テンプレートのTLGパターンは次の4つの情報から成る。
■、テンプレート発生コードにより計算された値の表現をエンコードする結果値 モード(後記の付録に記載した種々の実施例参照)。
2、このテンプレートにより符号化し得るILGノードの配列を記述するパター ンツリー。パターン フリーの内部ノードはILオペレータであり、パターン  フリーの枝葉は値モードセットか、オペランドを持たないILオペレータの何れ かである。
3 ブール テストのシーケンス。これらテストの全では適用し得るパターンに ついて順序正しく評価する必要かある。
4、このテンプレートで発声されたコードの゛°コスト”を表わす整数。
パターン又はPATSELECTフェーズはテンプレートのパターンを有するI LGサブツリーを照合する。2以上のテンプレートパターンを一つのILGノー ドて適用し得る場合は、パターン照合器はどのパターンか最低推定コード コス トになるか知るまで択一的テンプレート間の選択を遅らせる。
3つの異なるアクション インタブリート、即ち、C0NTEXTインタプリー タ、TNBINDインタブリータ及びC0DEインタブリータかある。各テンプ レータのアクションは適正なインタブリートによりコンパイラの3つの異なるバ ス内で実行される。同一のテンプレートがこれら3つの全バス内で使用されるか 、アクションの意味はフェーズ依存であって各パスで異なることか行われる。多 くのアクションは3つのパスのうちの一つのみに意義かあり、他の2つのパスに は関係ない。他のアクションは2つ以上のパスに意義かあるが、一つのパスにお けるアクションの意味は、しはしは異なるパスにおける同一のアクションの意味 と著しく相違する。しかし、テンプレート内に1つのアクション シーケンスを 有するだけにすると種々のパス間の従属性を理解し維持することか極めて容易に なる。
各テンプレートに対するアクション シーケンスは2部分、即ち非遅延アクショ ン及び遅延アクションから成る。選択されたILGノードのパターンが最初に処 理されるときは非遅延アクションがインタブリートされる。ILGパターンか別 のILGパターンの枝葉として後に使用されるときは遅延アクションかインタブ リートされる。
非遅延アクションのインタブリートの開始時に、オペランド変数のテーブルが生 起される。オペランド変数はテンポラリネーム(TN) 、リテラル又はターゲ ット スペシフィック アドレス モートを含むことかできる。
各テンポラリネームは3つのクラス、即ち(1)永久TN、(2)遅延TN及び (3)ローカルTNはその寿命及び使用法により決まる。
各TNは割当寿命を有する必要がある。割当寿命は適正なテンプレート アクシ ョンにより開始され、TNの最終使用に至る全フローバスに沿って及ぶ。永久ク ラスのTNはそのTNの生起後の将来において任意多量のコードを終了させる寿 命を有することができる。遅延クラスの寿命は、そのTNか枝葉として使用され るときその短時間後にテンプレートの遅延アクションを開始させ終了させる必要 かある。ローカルTNの寿命は決して単一パターンのインタブリチージョンを越 えない。
TNのクラスはそれがどのように処理されるかを決定する。
永久クラスTNはC0NTEXTパスにおいて1回生起され、全3個のパスに亘 って同一のTNデータ構造か維持され、これかTNの複雑な寿命記述をストアす るのに使用される。遅延クラスTN及びローカル クラスTNは極めて制限され た持続時間の寿命を有するため、これらTNはこの情報を追跡するのに永久デー タ構造を必要としない。この結果、遅延クラスTN及びローカルクラスTN用の TNデータ構造はアクションをインタブリートする際に各パスごとに構成され、 各パスにおけるそれらの最終使用直後に消去される。各パスにおける同一のアク ション シーケンスをインタブリートすることにより、これらクラスのTNに対 し各パスごとに同一のTNデータ構造を構成することか保証される。
種々のテンプレート アクションの大きなリストかある。これらアクションのい くつかはターゲット マシーン従属である。
後記の付録には提案の又は−例のテンプレート アクションリストを含めである ので、ユーザはこれらのコード テンプレート例を用いて特定の実施例に対し必 要な事項を決定することが図1のコンパイラ フレーム ワーク10に使用する 内部表現はシンボル テーブル30及び中間言語グラフ55を具え、これらはソ ース モジュール21の構造データ及びコードを表わすために、フロントエンド 20により発生されるデータ構造である。以下に、シンボル テーブル30及び ILグラフ55に使用する中間言語の仕様を含むこれらデータ構造の基本要素で あるノートについて説明する。図1につき説明するコンパイラでは、フロント  エンド20が、ソース モジュール21に含まれるプログラムのブロック、ルー チン、変数リテラル値等を記述するためにシンボル テーブル30を発生すると 共に、実行可能コードを記述するために1以上の中間言語グラフ55を発生する 。これらの内部データ構造について以下に説明する。
一般に図1のコンパイラ、特にその中間言語及びシンボルテーブルの設計はVA Xのような「コンプレックス インストラクション セット コンピュータ(C ISC)JからPRISM、MIPS (32ビツト マシーン)のような[レ デューストインストラクション セット コンピュータ(RISC)J又はアド バンスト64ビツトRISCアーキテクチヤまでの種々のアーキテクチャをアド レスするようにする。この設計はターゲット マシーン25のアーキテクチャか 所定の基本特徴を有するものと仮定する。最初に、ハイド構成及びアトレサビリ ティを仮定すると共に“リトル インディアン”ピット オーダリングを用いる 2の補数2進演算を仮定する。更に°゛正当′。
アドルス表現、即ちレジスタにフィツトするアドレスも仮定する。
一般に、フロント エンド20はブロク゛ラムの中間表現を生成する際にターゲ ット アーキテクチャの詳細について知らなくてよい。中間表現の殆との構成は ターゲット アーキテクチャ25と無関係の明確な意味を有する。しかし、フロ ント エンド20を実現するには解決しなければならないいくつかの問題かある 。第1に、以下に説明するように全てのデータ タイプか全てのアーキテクチャ に使用できるわけてはない。第2に、以下に説明するように演算オーバフロー動 作及び゛小整数”演算の表現か異なるアーキテクチャごとに変化することかある 。
第3にいくつかのオペレータ(例えは演算ソフト オペレータ)の動作かオペラ ンド値のサブ レンジに対し決められ、これらサブ レンジに対し基本マシーン 命令か個々のアーキテクチャごとに決められている。この指定されたレンジ外の オペランド値に対してはこのようなオペレータは任意の特定のマシーンに対し良 好に動作するか、異なるマシーンには異なる動作をすることかある。最後に呼出 し規定がターゲット システム25ごとに異なり、フロント エンド20か場合 により同一のソース言語構成に対し異なる中間表現を発生することが要求される 。
ここで、「中間言語」とは実行可能コードを指定するアブストラクト(抽象)言 語を意味する。「中間言語グラフJ (LEG)55はこの言語で記述された特 定のプログラムである。
グラフ55内の中間言語は実際はメモリ内のデータ構造の言語であり、構文構造 を与えるポインタを有する。しかし、デバッグ援助としてコンパイラにより書か れるILダンプに対し使用されるILGのための近似テキスト表現もある。
ILの基本コンセットは図4につき上述したタプルにあり、T L G 55は 実行すべきオペレーションを表わすタプル35から成る。これらタプルは種々の 関係を表わすポインタ(例えばオペランド ポインタ38)により互いに結はれ る。最も重要な関係はオペレーターオペランド関係(オペレータからそのオペラ ンドの各々へのポインタ38)及びILGの各基本ブロック内の全てのタプルの 線形順序であり、この線形順序は公称実行順序を与える。この線形順序はブロッ ク内のタプル番号40及びルーチン又はモジュールの全てのブロックをリンクす るポインタにより表わされる。
ILG55により定義される計算は次の通りである。
(1)ILGのBEG TNタプルにおいてスタートする。
(2)各タプルを線形順序で評価する。即ち、そのオペランドの保管結果をフェ ッチし、その結果を計算及び保管し、この結果に対し定義し得る任意の二次アク ションを実行する。(この簡単な評価規則には“フロー ブーリアン”及び”条 件付き選択”オペレータに対し例外がある。)(3)分岐タプルの評価後にこの 分岐タプルにより選択されたラベルタプルにおいて評価を続ける。
これらの規則はILGグラフ55の[意味Jを定めるものと理解されたい。コー ド発生器29はILGにより支持されるアクションを、それらの従属性を保存す る限り、次の規則に従って再配列することが許される。
(1)lG55がエクスプレッション(式)を含むと共にステートメントを含み 、その実行かこのエクスプレッションを評価することにより計算された値に影響 を与えるかもしれない場合には、このエクスプレッションに対する発生コード及 びこのステートメントに対する発生コードはこのステートメントとエクスプレッ ションかILGに発生した順序と同一の順序で実行しなければならない。
(2)II、C;55か、2つのステートメントを含み、それらの実行かある共 通のエクスプレッションを評価することにより計算される値に影響を与えるかも しれない場合には、この2つのステートメントに対する発生コードをこの2つの ステートメントがILGに発生した順序と同一の順序で実行しなければならない 。
ステートメントの実行かエクスプレッションの評価により計算される値に影響を 与えるかもしれない場合の問題は以下に記載するサイド エフェクト ヌカニズ ムを参照して解決される。
フロント エンド20により構成されるILG55はバックエンド12により処 理されるILGと同一でない。フロントエンド20はコンパクトILグラフ(C ILG)を発生するか、バック エンド12は拡張ILグラフ(EILG)を処 理する0バツク エンド12がルーチン用コードを発生するときは、これが最初 にすることはこのルーチンのCILGをEILGに拡張することである。両形態 のグラフの間にはいくつかの差異かある。第1に、CILは“速記”タプルを提 供し、これらタプルはEILの低レベル タプルのシーケンスに拡張される。
第2に、EILタプルを表わすノートはCILタプルを表わす・ノートより多く のフィールドを有する。追加のフィールドは、バック エンド12により使用さ れる情報を含むが、この情報はCILノード内のフィールドからIL拡張器によ り計算することかできる。第3に、CILGとEILGとには異なる構造的制約 かある。この記載はコンパクトILに向けられているか、この情報は一般にCI L及びEILの両方にあてはまる。
シンボル テーブル30の構造はコンパイル中のモジュール21の構造を表わす 。テーブル30の中心はブロックを表わすブロック ノードのツリー、及びモジ ュール21の語い範囲であり、ツリー構造はそれらのネスティング関1系を表わ す。各ブロック内に宣言されているシンボル ノードのリストは各ブロック ノ ードと関連する。シンボルノードは変数、ラベル又はエントリ ポイントのよう なモジュール内のシンボリック エンティティを表わす。コンパイル中の定数値 はリテラル ノードで表わされる。リテラル ノートはシンボル テーブル30 及びILG55の双方から参照することかできる。タームリテラル テーブルは コンパイル中に生起した全てのリテラル ノー1・の集合体を参照するのにも用 いられる。フレーム ノードはコード及びデータを割当てることかできる記憶区 域を表わす。
一般に、これらノードはルーチンのスタック フレーム又はPSECTの何れか である。パラメータ ノードはパラメータリストを作成するのに使用され、これ らリストはエントリ ポイント シンボルと関連する。各パラメータ ノードは ルーチン内のパラメータ シンボルをエントリ ポイントのアーキテクチャ内の 位置と関連させる。
データタイプ グラフ55て使用される中間表現はアブストラクト マシーン25に対するプロ グラムを記述し、このプログラムは下記のリストに記述する小セットのデータ  タイプを有するのみである。これらデータタイプはフロント エンド20にのみ 関連するモジュール21のソース言語のデータ タイプと相違する。
各ターゲット マシーン25に対し、各ソース言語データ タイプを表わすのに 使用するデータ タイプを決定するのはフロント エンド20の応答性である。
データタイプ ヌ ル 符号付き整数 無符号整数 不動小数点 複素数 プール値 ヌルデータ タイプは特殊データ タイプで、値を計算しないタプルのタイプで ある。リブレゼンテーショナル データタイプは、その値がターゲット マシー ン アーキテクチャに固有の表現を有するタイプである。スカラデータ タイプ は、少数の固定数のメモリ位置又はレジスタで表わすことができる値を有するも のである。スカラデータ タイプはアドレス データ タイプ及び演算データ  タイプに細分される。演算タイプは適当数のビットにフィツトし得るもの以外の 他の任意の種類のデータを表わすのに使用することもてきる点に注意されたい。
特に、ソース言語キャラクタ(文字)及び論理データタイプは整数データ タイ プで表わす必要かある。単一アドレスデータ タイプADDRかある。タイプA DDRの値は32又は64ビツトの2進整数として表わされる。
符号付きデータ タイプTNT8.rNT16.INT32及びINT64かあ り、ここてタイプINTゞ−1の値はx−1ピツ1への符号付き2進整数として 表わされ、従ってこの値は−(2”−’)−−一−(2°−’−1)の範囲にな る。タイプINT8はI BYTEと称することもてきる。タイプlNT16は IW○RDと称すこともてきる。INT32はILONGと称すこともてきる。
タイプTNT64はIQUADと称すこともてきる。アドレスとして同数のビッ トを有する整数タイプはTADDRと称すこともてきる。ターゲット アーキテ クチャに対しサポートされる最大符号付き整数タイプ(INT32又はINT6 4)はIMAXと称すこともてきる。任意の2進スケーリング(PL/Iにおけ るような)をフロント エンドにより提供する必要があり、スケールド バイナ リ データ タイプに対するTL規定はない。
無符号整数データ タイプUINT8.UINT16.UINT32及びUIN T64があり、ココテタイブUINTx−’の値はx−1ビツトの無符号2進整 数として表わされ、従って、: のmは0−−−−(2”−’ )(Dm囲ニナ ル。タイプUINT81tUBYTE又はCHAR8と称すこともできる。タイ プUJNT16はUWORD又はCHARI 6と称すこともてきる。タイプU rNT32はULONGと称すこともできる。タイプUINT64はUQUAD と称すこともできる。アドレスとして同数のビットを有する無符号整数タイプは UADDRと称すこともてきる。ターゲット アーキテクチャに対しサポートさ れる最大無符号整数タイプ(UINT32又はUINT64)はUMAXと称す こともてきる。
浮動小数点データ タイプはVAX浮動小数点タイプREALF、REALD、 REALG及びREALHと、TEEE浮動小数点タイプREALS、REAL T、REALQ及びREALEとである。任意の特定のターゲットアーキテクチ ャに対しこれらの全てをサポートする必要かあるわけてはない。
複素数データ タイプはCMPLXF、CMPLXD、CMPLXG、CMPL XS及びCMPLXTである。複素値は複素値の実数部及び虚数部を表わす対応 する実数タイプの一対の値として表わされる。サポートされた浮動小数点タイプ に対応集合体データ タイプの値は連続要素のシーケンスから成る。
集合体値はその本体、シーケンス内の要素の実際の順番、長さ及び要素の数によ り特徴つけられる。集合体タイプは次のとおりである。
(a)タイプCHAR8の要素を有するキャラクタ ストリング、タイプ5TR 8; (b)タイプCHARl 6の要素を有する拡張キャラクタ ストリンク、タイ プ5TR16: (C)できるだけ緊密にバックされた単ヒツトの要素を有するビット ス1へリ ング、タイプBITS。
(d)デシマル ディジット(頭に符号ディジットを有するパイ1へごとに2デ イジツトつつバックされた4ビツトBCDデイジツトとして表される)の要素を 有するPL/I及びC0BOLデシマル ス1−リング、タイプDEClN4A L ; (DECIMAL値はその精度、これか含むディジットの数(先頭の符 号ディジットは数えない)及びそのスケール、10進小数点後に到来するディジ ットの数により特徴つけられる)。
集合体値の要素は零から出発する番号かつけられる。(これは多くのフロント  エンドに、ソース プログラム ストリンク インデックスをILストリング  インデックスに変換する際に1を減算することを要求する点に注意されたい。) ストリング演算において処理し得る要素の数に制限はない。
将来においてフラグを導入してフロント エンドが、その長さ65535キヤラ クタを越えないことを保証されたキャラクタストリング エクスプレッションを 指示し、このエクスプレッションをVAXキャラクタ ストリング命令で効率よ く計算することかできるよにすることができる。メモリ内の長さが変化するスト リングの長さワードは以前として16ビツトのみである。デシマル ストリング は全てのターゲットマシーンに対し31デイジツト(符号ディジットが加わる) に制限される。
種々のタードツト マシーンに対するリプレセンテーショナル タイプ システ ムの詳細の一例を後記の表6に示す。
単一ブール データ タイプBOOLがある。これはプログラムの実行中に計算 される論理値のタイプであり、指定された物理的表現を持たない。例えば、プー ル値は2進整数の値、ブロセッサ条件コードの値又はプロセッサ プログラム  カウンタの値で表わされ得る。特に、タイプBOOLはソース言語内に存在し得 る任意の論理又はブール データ タイプに対応しない。これらはINT又はU INT値として表わし、必要に応し、タイプB○OLへ及びタイプB00Lから 変換する必要がある。
中間言語内の全てのタプルに共通の一般的特徴及びILG55の構造的性@(中 間言語内のり−チン)について説明する。
I L G 55はILタプル ノτド(通常単にタプルと言われている)から 成る。全てのタプルは表7に示すフィールドを含んでいる。アトリビュートとし て知られる他のフィールドは特定の種類のタプルにのみ生ずる。
フロント エンド20の仕様のために予約された任意の量のスペースを用いて割 当てることかできるシンボル テーブルノー1−と異なり、CILタプル ノー ドはここで指定されたフィールドを含むだけである。EILタプル ノードはタ プルノード アドレスから負方向にオフセットした位置にある追加のフィールド を含み、これらフィールドはバック エンド12に専用である。
ILGの構造 ILG内の1つのタプルを他のタプルに2つの方法で、オペランドとして又はア トリビュートとして参照させることができる。オペレーターオペランド関係のみ を考察すると、CILGは非周期グラフ(DAC)であるか、EILGはフォレ スト(森)(即ちツリーの集合体)である。
アトリビュート ポインタ39はILGの追加の構造を生起すると共に、ILG からシンボルテーブル30への参照も許可する。最も重要な構造関係は次のタプ ル及び前のタプルのアトリビュート ポインタにより決まるILGの線形順序で ある。
CILG内のタプルの全ては線形順序で決められた単一リスト内に生じる。EI LGのタプルは各ブロックにつき1つの円形リストの集合体内に生ずる。
下記の規則をILGの構造に適用する。フロント エンド20がこれらの規則に 違反するCILGを生成する場合には、バック エンドか違反を検出しコイパイ ルを終わらせるよう試みるか、結果は予測不能になる。
(a)(の結果タイプがNULしてあるタプルはステートメントタプルと称し、 その結果がNULしてないタプルをエクスプレッション タプルと称す。
(b)CILにおいて、 (i)スカシ又はプール エクスプレッション タプルは1以上の他のタプルの オペランドとすることかできる。集合体エクスプレッション タプルは正確に1 つの他のタプルのオペランドとじて使用しなければならず、この他のタプルは同 一の基本ブロック内にあるものでなけれはならない(下記参照)。
(1i)オペランドはエクスプレッション タプル、ノンポルノード又はリテラ ル ノートとすることができる。
(iii)オペランドとして用いるシンボル ノートは常にタイプADDRを有 する。オペランドとして用いるリテラル ノードはリテラルのデータ タイプを 有する。
(iv )レジスタに割当てられる変数を表わすシンボルは通常の意味ではアド レスをもたない。しかし、このようなシンボルはメモリから読出す又は書込むタ プル(FETCH又はST○RE)のアドレス オペランドとして使用すること かでき、この場合にはこのタプルは指示されたレジスタをアクセスする。
(V)ノンポルがスタック フレーム内の変数を表わす場合には、このスタック  フレームは現ルーチン又はシンボル テーブル ブロック ツリー内のその祖 先の一つと関連していなけれはならず、さもなければ実行時にスタック フレー ムを見つける方法かなくなる。
(c) E I してはオペランドはエクスプレッション タプルてなければな らず、且つどのエクスプレッション タプルも正確に1つの他のタプルのオペラ ンドでなければならない。
(d)ステートメント タプルは任意の他のタプルのオペランドにすることはで きない。
(e)別のタプルのオペランドであるタプルはILGの線形順序内のこのタプル の前に置かなければならない。(このことはEILGてはオペランド及びオペレ ータを同一基本ブロック内に生しさせる必要かあることを意味する。)(f)エ クスプレッション タプルはオペランドである全てのタプルを支配しなければな らない。即ち、ルーチンのエントリポイントからあるタプルへ途中てこのタプル の全てのオペランドに出会うことなくたとつつくことかできないようにしなけれ はならない。
このセクションの次のバラグラフは中間言語で使用し得るオペレーション及びこ れを表わすのに使用されるオペレータの種類を記載する。個々のオペレータは全 て<REFERENCE〉(バートータブルーディクショナリ)タプル辞書と称 されるデータ構造内に集められる。辞書内の各オペレータは構造フォーマットを 用いて文書化される。表8はこのフォーマットにおける王カテゴリ、各カテゴリ の下て与えられる情報及びこの情報を与えるのに使用されるフォーマットを示し ている。
ダブルのフォーマット セクションはオペランドの数及び許容し得るオペレータ 、オペランド及び結果タイプを次の形態の単−行で指定する。
Op” tYpe (tYI)e−1,−−−−tYI)e −n ’) :  resultここで、opはタプル オペレータの名前であり、typefよ許 容し得るオペレータ タイプを指定する。type”か省略される場合には、オ ペレータ タイプはNULLにする必要がある。そうでなければ、typeは次 のうちの1つとする必要かある。
(a)固有タイプ名(ADDR,BOOL、BITS、LADDR等)は指定さ れたタイプのみが許されることを示す。
(b)INT、UINT、REAL、CMPLX又はSTRは指定されたファミ リーに属する任意のタイプか正当であることを示す。例えば、CMPLXはCM PLXF、CMPLXD、CMPLXG、CMPLXS及びCMPLXTが全て 許されることを意味し、STRは5TR8及び5TR16か許されることを意味 する。
(c)ALLはNULL以外の任意の他のタイプか正当であることを示す。
(d)文字1. U、 R,C,A、S及びBのストリングはこれら文字の−っ て表されるファミリーに属する任意のタイプか許されることを示し、次の通りで ある。
1 1NT A ADDR U UINT S 5TR RREAL B BITS CCMPLX “Type−1−−−−Type−n”はタプルのオペランドの許容し得るタイ プを指定する。括弧内のリストかない場合には、オペレータは何のオペランドも 取らない。そうてない場合にはタプルは括弧内のリストの各タイプごとに1つの オペランドを有する必要がある。各Type−iは次のうちの1つとする必要が ある。
(a) Tは、このオペランド タイプがオペレータ タイプと同一である必要 があることを意味する。
(b)固有タイプ名(ADDR,BOOL、BITS、IADDR等)はオペラ ンドか指定されたタイプを有する必要かあることを意味する。
(c)タイプ コード文字T、 U、 R,C,A、 S及びBのストリングは タイプ指定子と同一の意味を有する。“任意の整数”を意味するタイプ指定子I Uを有するオペランドは一般に発生コードのタイプTMAXに変換される点に注 意されたい。
これがため、プログラム動作はこのようなオペランドの実際値をタイプIMAX に交換し得ない場合には定義されない。
(d)オペレータ及びオペランド タイプ指定子がREAL及びCMPLX又は STR及びCHARである場合には、実際のオペレータ及びオペランド タイプ か一致しなげれはならない。例えば、タイプ指定“CADD、CMPLX (T 、REAL):T”は、オペレータ タイプかCLPLXFである場合には第2 オペランドかタイプREALFを、オペレータタイプかCMPLXTである場合 には第2オペランドかタイプREALSを持たなけれはならないことを示す。オ ペレータ タイプかSB、即ちキャラクタ ストリング又はピ・スト ストリン グである場合にはオペランド タイプ指定子はCHARてあり、オペレータ タ イプが5TR8である場合にはCHAR8、オペレータ タイプかSTR16で ある場合にはCHAR] 6、オペレータ タイプがB TTSである場合には IMAXでなければならない。即ち、IMAXはストリング タイプB ITS に対応するキャラクタ タイプとして処理される。
タプルの実際のオペランドは、その結果タイプかオペランドタイプ リストによ り指定されたタイプと一致するタプルノートでなけれはならない。CTLでは、 実際のオペランドはタイプADDRを有するものとして常に処理されるシンポル ノするものとして処理されるリテラル ノードとすることもてきる。
エクスプレッション゛’RESULT″゛は許容し得る結果タイプを指定する。
これかない場合には、オペレータはステートメント オペレータであり、タプル の結果タイプはNULしてなければならない。そうでない場合には、オペレータ はオペランド タイプ指定子と同一の方法で正確にインタブリートされる。
アドレス及びメモリ レファレンス アドレス エクスプレッションは中間言語内のレファレンス(参照)の−っであ る。アドレス エクスプレッションの最小フオームはシンボルである。即ち、タ プル ノ′−ドのオペランド フィールドはシンボル ノードのアドレスを含み 、このシンボルと関連するメモリ アドレス(又はレジスタ)を表わすことがで きる。アドレス値はこれをメモリ(“ポインタ変数”)からフェッチすることに より、演算値をキャスティングすること蚤こより、又はブレインクリメント タ プル、ポストインクリメントタプル又はつぎのりストのタプルのうちの1つを評 価することにより得ることもてきる。
AMINUS アドレスから整数を減算して新アドレスを発生せよ。
APLUS アドレスに整数を加えて新アドレスを発生せよ。
BASEPREF アドレスを評価して新アドレスを発生せよ。
L TTAPDR指定されたリテラル値を含むリード オンリ メモリ位置のア ドレスを発生せよ。
UPLINK 現ルーチン又は現ルーチンを含むルーチンに対するスタック フ レームのアドレスを発生せよ。
データ アクセス タプルは値をメモリから又はメモリにロード又は記憶させる タプルである。(ここで、“メモリ”なる語はターゲットCPU25のレジスタ  セットのレジスタを含む。CPU25のレジスタとノーマル メモリ位置との 唯一の差異はレジスタの“アドレス”はデータ アクセス タプルで使用し得る のみである点にある。)データ アクセス オペレータは表9にリスト アップ しである。
全てのデータ アクセス タプルにおいて、第1オペランドはアドレス エクス プレッションである。全てのデータ アクセス タプルはロング ワード整数を 含むオフセット アトリビュートも有する。アドレスすべきメモリ位置のアドレ スはランタイム アドレス オペランドとコンパイル タイム コンスタント  オフセット アトリビュートとの和である。
全てのデータ アクセス タプルは表10にリスト アップされているアトリビ ュートのいくつか又は全てを有する。エフェクト、エフェクト2及びベースシン ボル アトリビュートの使用については表現エフェクトのためのセクション イ ンタフェースにおいて後に詳細に論じる。
レファレンスの他のタイプはアレー レファレンスである。
APLUS及びAMINUSタプルは全てのアドレス計算に対し充分である。し かし、これらタプルはアドレス計算の意味について何の情報も与えない。特に、 これらタプルはアレー レファレンス及びソース コードに存在しているかもし れないサブスクリプト エクスプレッションについての情報を何も与えない。こ の情報はベクトル化に必要である。これがため、ILはアレー レファレンスを 詳細に記述するタプルを有する。
例えば、1ocal Xとして宣言されたBLISSベクトル:vecror  : (20,1ong)が与えられると、X (I)に対するレファレンスは、 $1 :FETCH,INT32 (I);$2:5UBSCR,IADDR( $1. (4)、(0);PO3IT TON= 1): $3 :FETCH,INT32 (X、$2)と表わすことかできる。
VarYとしてとして宣言されたパスカル アレー;packed array  (1−−10,l−−10)of 0−−−−255゜か与えられると、 ascignment Y (1,J) =Zは、$1 :FETCH,INT 32 (j);$2:5UBSCR,IADDR($1. 〔l)、(0);P O3lTl○N=1); $3 :FETCH,INT32 (1):$4:5UBSCR,IADDR( $3. (10)、$2;PO3ITION=2); $5 :FETCH,UINT8 (Z):$6 :5TORE、UTNT8  ($4−11.$5);と表わすことができる。
基本アレー レファレンス オペレータはAREF及び5UBSCRである。A REFはアレー内の指定要素のアドレスを発生する。5UBSCRはアレー要素 のオフセットを計算する。
第1オペランド又はAREFタプルはアレーのベース アドレスを表わすアドレ ス エクスプレッションであり、その第2オペランドはベース アドレスからア レーの要素までのバイトオフセットを計算する5UBSCRである。AREFタ プルは5UBSCRタプルの値をベース アドレスに加えてインデックスされた 要素のアドレスを計算する。実際には、AREF(オリジン、サブスクリプト) に対するコードはAPLUS(オリジン、サブスクリプト)に対するコードと同 一である。
5UBSCRタプルはアレー内の要素の一次元オフセットを計算する。そのオペ ランドは、 (a)要素インデックス:サブスクリプト エクスプレッション内の個々のイン デックスはゼロ オリジンに対し正規化されない。その代わりに、アレー宣言内 の非ゼロ下限を考慮したオリジン オフセットをAREFタプルのアドレス オ ペランド又は要素アドレスを用いるタプルのオフセット フィールドに加える必 要がある。
(b)ストライド:これは連続する要素のアドレス間の一次元の差である。ロン グ ワードの簡単なベクトルではストライドはリテラル4であるが、多次元アレ ーてはアレーの高次元行(又は大面積)の“要素”間の差である。
(C)サブスクリプト エクスプレッションの残部(即ち、サブ スクリプト  エクスプレッション内の残りのインデックスラに対するエクスプレッション:こ れは別の5UBSCRエクスプレツシヨンか、整数定数ゼロを表わすリテラル  ノードの何れかである。
−ドはADD (MUL (インデックス、スライド)残部)に対するコードと 同一である。
5UBSCRり;’ルはアレー レファレンスのサブスクリプト リスト内のイ ンデックスの位置を示すポジョン アトリビュートも有する。ポジション ナン バーにより所定のアレーに対する全てのレファレンス内の同一のサブ スクリプ ト位置を識別する必要がある。最も有効なベクトル化においては、ポジションl を最も急速に変化するサブ スクリプトにし、ポジション2を次に速く変化する サブ スクリプトにするのか好ましい。
他のとのセクションにも実際に適合しないいくつかのタプルオペレータがある。
これらの種々のオペレータは次の通りである。
オペレータ 意味 ADTFF 2つのアドレス間の整数差を計算せよ。
DEFINES ILG内のサイト エフェクト又は従属性を、何のコートも発 生させることなくエンコードせよ。
VOID エクスプレッションを評価するかその値を捨て捨てよ。
演算タプル 演算タプルは“演算値”−整数、実数及び複素数−を処理するのに使用される。
これはフェッチ、記憶及び変換、並びに加算及び乗算のような伝統的演算を含む 。
VAX及びRISCアーキテクチャ内のシフト命令は互いに相違し、フルアブス トラクトILシフト オペレータは一方及び双方のアーキテクチャに無効なコー ドを発生する。他方、ILはシフティングをサポートする必要がある。その理由 は多くのソース言語がある種のシフト オペレータを有するためである。妥協案 として、ILは次のオペレータを与える(これらシフトオペレータのどれも演算 オーバフロー例外を生じない)。
(a)SHL、5HR1及びSHAはそれぞれ左シフト、論理右シフト、及び演 算右シフトを生じさせて、正シフト カウントを必要とする(即ちそれらの動作 はシフト カウントが負の場合には不確定である)。これらはCシフト オペレ ータをサポートし、RISCアーキテクチャ シフト命令に直接マツプする。
(b)SHはそのオペランドが正である場合に左シフトを行い、そのオペランド か負の場合に演算右シフトを行う。これはBLISSシフト オペレータをサポ ートし、VAXシフト命令に直接マツプする。
(C)ROTは回転オペレータである。これはVAX及びRISCアーキテクチ ャにおいて異なる形で記述されるか、何れの場合にも実際の動作は左回転とする ことかでき、その回転カウント値はカウント オペランドの下位のnビ・ストで 指定され、ここてnはレジスタ サイズの2を底とする対数値である。(例えは 、VAX及びMIPSでは回転カウント(よりラント オペランドの下位5ビツ トである。)整数オーバ フローは考察すべき別の事項である。Iしての整数演 算のためのサイズを指定する試みにおいて問題力へあるjこめ、全てのターゲッ ト マシーンに対し、ソース言語のセマンティクスを満足するコードを発生する と共にこれらセマンテイクスにより課される制約をできるたけ効率良く受けるよ う(こする。特に、いくつかのマシーン(例えばVAX)は幸運(こも)くイト 及びワード演算を行うか、RISCマシーンは代表的(こ1よロング ワード演 算のみを行う。全てのサイズ変換を行うことはV A Xにはむだであるか、真 )<イト又はワード演算をエミュレ−1・することはRISCマソーンにはむだ である。
コード発生器が全てのターゲット マシーンに対し正当なコートを充分フレキシ ブルに発生し得るように次の規制を適用する(INTタイプについての以下の説 明は全てUINTタイプに等しく適用される)。
(a)エクスプレッションの結果タイプかINT”−’である場合には、コンパ イラは指示された計算をyビット演算(ここでy≧X)で実際に実行することか できる。これは、原Xビット計算かオーバ フローする場合にはX桁ビットより 多いピッrを有するyビット結果を生ずるかもしれないためである。
例えは、ADD、lNT16を32ビツト加算で実行する。
20000+30000は16ビツト加算ではオーバ フローを生ずるか、32 ビツト加算では正当な32ビツト数50000が生ずる。
(b)全ての演算オペレータはオーバ フロー抑制フラグを有する(このフラグ はタプル結果タイプがINT又はUINTであるときにのみ有意になる)。この フラグがセットである場合、タプルに対し発生されたコードは計算の結果と無関 係にいかなる種類のオーバ フロー状態もレポートする必要がなく、結果内に外 部高位ヒツトが存在する可能性を無視することができる(結果をXCVTタプル のオペランドとして使用する場合を除く)。オーバ フロー抑制フラグはオーバ  フローが決して起こり得ないタプル(例えばIANDにおいても定められる点 に注意されたい。これらタプルに対するオーバ )ローの抑制は特に容易である 。オーバ フロー抑制フラグは演算かオーバ フローするのは意味的に正しくな い状態に対し予定される。いくつかのアーキテクチャに対しコードが一層高コス トになり得る。(例えばVAXアーキテクチャに対してはオーバ フロー抑制検 出のために余分のコードが必要とされる。これがため、演算かオーバ フローす るか否かは重要でない場合、又はフロント エンドか特定の演算は決してオーバ  フローし得ないことを知っている場合にはこのフラグはクリアしてコンパイラ か最も有効なコードを発生し得るようにすべきである。
(C)ルーチン ブロック ノードは検出オーバ フロー フラグを有する。こ のフラグかクリアされている場合には、バック エンドは整数演算におけるオー バ フローを検出するコードを発生させる必要はない。しかし、オーバ フロー を検出するフードを発生させることは、これが一層有効である場合には自由であ り、オーバ フロー検出の強制的抑圧は特定のタプル内にオーバ フロー抑制フ ラグをセットするだけで達成することができる。
(d)検出オーバ フローフラグかルーチン ブロック ノートにセットされて いる場合には、このとき発生されるコードは各エクスプレッション ツリーに対 し、このエクスプレッションに対し計算された結果が妥当であることを保証する か、整数オーバ フロー例外のシグナリングを保証しなければならない。これは 、オーバ フローをエクスプレッションの全てのサブ エクスプレッションにお いて検出することを要件としない。例えば、A、B、C及びXカ月6ビツト変数 であり、且っAが32767、B及びCが1であるものとする。
アザイメントX=A十B−Cにおいて、発生コードは32ビツト演算を用いてA 十B−Cを計算し、次いでストアする前にその結果か16ビツト結果であるが否 かチェックする。この場合には正しい答え32769がストアされるが、16ビ ツト演算で計算する場合には同一のエクスプレッションでも整数オーバ フロー  エラーが生ずる。他方、アサイメントX=A十Bは値32768を正しく計算 するが、これをXにストアしようとするときオーバ フロー例外を生ずる。オー バ フローを検出しなければならない場所の集合体は明らかでないが、ストアの 右側及びルーチン コール内のアーキテクチャを必ず含む。
(e)XCVT変換オペレータはそのオペランドの値をリターンし、表現の外部 高位ビットを実オペランドの符号と一致させる。例えば、Eか32ビツト演算を 用いて評価されたUINT8エクスプレッションである場合、XCVT−UIN T8(E : lNTl 6)はその高位の8ビツトが0である16ビツト整数 になる。一般に、EがタイプTのエクスプレッションである場合には、XCVT −T (E : T)を用いて値の表現をその公称サイズと一致させることかで きる。
(f)あるエクスプレッション内の整数オペランドの表現かオペランドの公称サ イズを越える高位ビットを含む場合には、発生コードはフル表現値又は公称サイ ズの値の何れの使用も自由である。これか受け入れられないときは、フロント  エンドはXCVTタプルを発生して表現から不所望な高位ビットを切り捨てる必 要かある。
ILには浮動小数点(フローティング ポイント)オーバフロー例外の検出をデ ィセーブルするメカニズムは何もない。
フローティング ポイント オーバ フローは常に例外のシグナリングを生ずる 。フローティング ポイント アンダー フローのシグナリングはルーチン レ ベルでのみ制画される。ルーチン ブロック ノードは検出アンダ フローフラ グを有する。このフラグがセットされている場合、コンパイラはこのルーチン内 に生ずるフローティング ポイント アンダー フローを検出しレポートするコ ードを発生するよう要求される。さもなければ発生コードはフローティング ポ イント アンダーフローを無視しなければならない。
変換オペレータは別の演算タイプの値に関連する一つの演算タイプの値を計算す る。実数−整数変換用のROUND及びTRUNCオペレータ、実数−複素数変 換用のCMPLXオペレータ、及び複素数−実数変換用のREAL及びIMAG オペレータは全く普通のものである。(ROUND及びTRUNCも実数結果タ イプで定義される)。
CTVは汎用変換オペレータである。これは任意の2つの演算タイプ間の変換を 行う。しかし、直接行われる変換はUNIT−INT、INT−REAL及びR EAL−CMPLX (及び当然のことなからlNT16− INT32のよう なタイプ内の変換)のみであることを承知していることが重要である。このこと は、例えば、CMPLXG−U TNTl 6変換は実際にはCMPLXG−R EALG、REALG−INT32、INT32−UINT16の一連の変換と して行われることを意味する。これは直接実数−無符号整数変換を有するVAX パスカルの動作ではない。
XCVTは整数タイプのみを処理する特別オペレータである。
CVTと同様に、このオペレータは算術的にそのオペランドに等しいその結果タ イプの値を発生する。しかし、このオペレータは最初にオペランドの表現の高位 ビットを変化させてオペランドの表現か算術的にその値に等しくなるようにする 特別の特徴を有する。
例えば、次のエクスプレッション(式)について考察する。
XCVT (ADD、U INT8 ((U INT8=2553 。
(UINT=2)): lNTl6) この式を32ビツト演算で計算すると、ADDの結果は%X00000101  (257)を含むレジスタになるかもしれない。この場合、XCVTは高位ビッ トを捨て、正当な16ピツト符号付き整数である %X0OOOOOOI (1)を残存させる。
CASTは実際には変換オペレータではない。その理由は値ではなくビット パ ターンを処理するためである。CASTタプルはそのオペランドとして同一のビ ット パターンを有するその結果タイプの値を発生する(必要に応じゼロ ビッ トを切捨て又は連結する)。
もう工つのタイプは変数変更オペレータである。フオームOPMOD (ここて OPはADD、IAND等)の名を有するこれらオペレータは全てアドレス オ ペランド及び値オペランドを有する。これらオペレータは指定されたアドレスか ら演算値をフェッチし、この演算値と値オペランドとの間の指示された演算を実 行し、その結果を同一のアドレスにストアさせる。これらオペレータは計算され た値も発生する。これらのオペレータはC言語op(=オペレータ)を実行する のに予定される。
例えば、コード シーケンス $1 :AODMOD、REALF (X、C%F0.1));$2 :5TO RE、REALF (Y、$ 1);は次のシーケンス $ 1 :FETCH,REALF (X);$2 :ADD、REALF ( $ 1. C%FO,l));$3 :5TORE、REALF (X、$2) :$4 :5TORE、REALF (Y、$2);と同一の効果を有する。こ れらのオペレータはOPMODA及びOPMODXフオームも有し、これらはパ ックド アレー要素又はビット フィールド内の値をフェッチし、更新し、置換 する。
PRE INCR,PRE INCRA、及びPRE INCRXオペレータは 、値オペランドの代わりにコンパイル タイムコンスタント インクリメント値 を含むアトリビュート フィールドを有する点を除いて、ADDMOD、ADD MODA及びA D D M OD Xと本質的に同一である。これらオペレー タはアドレス(ポインタ変数)並びに演算値に適用することができる。これらオ ペレータはC言語ブレインクリメント及びプレデクリメント オペレータを実行 するのに予定される。
PO3TINCR,PO3TINCRA及びPO3TINCRXオペレータは、 タプルの値がメモリ位置に戻されて記憶された値となるというよりもむしろ、そ の値か更新される前にメモリ位置に保持されていた値となると云うことを除けは PREINCR及びPRE INCRXNC外と同じである。上記オペレータは Cのポスト インクリメント及びポスト デクリメント オペレータを実行させ るものである。
ストリング長 コンパイラのストリング(又は集合体)のタイプは、値か基本タイプからのシー ケンスの値となるタイプであり、これらのタイプには次のようなものかある。
5TR8,8ビツト キャラクタのシーケンス(タイプCHAR8)。
STR16,16ビツト キャラクタのシーケンス(タイプCHAR16)。
BITS、単一ビットのシーケンス。
DECI〜iAL、10進デイジツト及び関連精度のシーケンス。
キャラクタ、即ちビット ストリングにおけるエレメントには0からn−1まで の番号を付ける。なお、nはストリング長である。8ビツトのキャラクタ スト リングをメモリにア1〜レスAにて表現させる場合、アドレスAのバイトがスト リングの第1キヤラクタを包含し、アドレスA+1のバイトかストリングの第2 キヤラクタを包含し、以下に同様にアドレスA+n −1のバイトがストリング の最終文字を包含する。16ビツトのキャラクタ ストリングをアドレスAにて メモリに表現させる場合、アドレス八におけるワードがストリングの第1キヤラ クタを包含し、アドレスA+2におけるワードかストリングの第2キヤラクタを 包含し、以下同様にしてアドレスA+2(n−1)におけるワードかストリング の最終キャラクタを包含する。
ビット ストリングをアドレスAにてメモリに表現させる場合、ストリングの最 初の8ビツトはアドレスA+1等におけるバイトの下位から上位までのビットで ある。
一般に集合値はレジスタ内に発生し得るスカラー値とは別に、又は機械語命令に おけるリテラル オペランドとしてメモリのどこかに表現させる必要がある。し かし、中間言語のセマンティック(意味論)モデルとはストリングをまさにスカ シのようにフェッチし、処理して、記憶させることである。コンパイラは一般的 なものを割当てて、中間ストリング値を保持する責任がある。
なお、ストリング オペレーションように生成するコードは、オペランド間にオ ーバラップかある場合でも斯かるモデルと調和させる必要かある。たとえばIL ステートメント(命令文)STOREF、5TR8(A+t、(20))、FE TCHF。
5TR8(A、(20))は20個のキャラクタのストリングをメモリの1つの 位置の上に動かす。そうするだけでアドレスAのキャラクタを20回コピーする 必要がなくなる。
ストリングはその長さが0である場合にはエンプティ(empty)(空)であ ると称する。ストリングのヘッド(head)はノン エンプティ ストリング の第1エレメント(要素)を戻す機能をし、テイル(tail)はノン エンプ ティ ストリングの第1エレメント以外の全てのエレメントを包含しているスト リングを戻す機能をし、エンプティ ストリングは成るストリングかエンプティ であり、さもなければ誤りであるかどうかを確かめる機能をする。この場合に標 準の比較オペレータ(EQL、NEQ。
LSS、LEQ、GTR,GEQ)によってテストされるような2つのストリン グXとYとの関係は次のように表される。
empty (X) △empty (Y)の場合、X=Y。
empty (X) △mempty (Y)の場合、XくY0コempty  (X) △empty (Y)の場合、X>Y。
コempty (X)△]empty (Y) Ahead (X) <hea d (Y)の場合、X<Y。
コeml)tY (X) Amempty (Y) Ahead (X) >h ead (Y)の場合、x>y。
mempty (X) Ajempty (Y) Ahead (X) =he ad (Y)の場合、rel (X、Y) =tel (tail) (X)  、 (tail) (Y)。
パスカルの如き幾つかの言語におけるストリング比較オペレータは、長目のスト リングの長さに比べて短め目のストリングをパディングすることにより等しい長 さのストリングとする作用だけをする。従って、ILもパッド ストリング比較 オペレータEQLP、NEQP、LSSP、LEQP、GTRP及びGEQPを 有している。
全てのストリング オペレータを表12にリストしである。
プール(Booleans) : 表現データ タイプとは異なり、プール データ タイプはユニークな表現を有 していない。プログラムの実行中のプール値は2進整数の成るビット値により明 白に表すか、又はとられる特性のコード バス(path)によって絶対的に表 現することができる。プール データにはユニークな表現がないから、ILにプ ール変数を持つことは有り得ない。しかし、殆どのソース言語は表現値を論理的 に解釈し、しかも多くの言語が論理変数又はプール変数を宣言する。従って、オ ペレータをプール値と、それらのソース言語の2進表現との間で変えなければな らない。
LBSETオペレータは整数をその下位ビットをテストすることによりプール値 として解釈し、又N0NZEROオペレータは整数をその整数全体がゼロである か、否かをテストすることによりプール値として解釈する。LSBITオペレー タはプール値をビット パターンが< o o−−−−o o >か、又は<0 0−−−−01 >の整数として表し、又ALLB ITSオペレータはプール 値をビットパターンが< o o−−−−o o >か、< I l −−−− 11>の整数として表す。これらのオペレータは様々なソース言語におけるプー ル値を次のように2進表現する。
Ada LBSET LSBIT BLLSS LBSET LSBIT CN0NZEROLSBIT FORTRAN LBSET ALLBITSPascal LBSET LB SETプール値はユニークな表現を持たず、従って普通のリテラルノードで表現 することはできなくても、全ての規則的なIL変換をプール式に当てはめること のできるようにすることは極めて望ましいことである。従って、バックエンド1 2か2つの特殊なリテラル ノードを提供し、これらノードのアドレスをグロー バル変換GEM$ST G TRUE及びGEM$STG FALSEに包含さ せる。これらのリテラル ノードはスタティック ストレージ イニシャリゼー ション用には使用てきないが、TLGにおけるオペランドとして使用することが できる。
AND及び○Rオペレータを伴うプール式は全評価及びフロー又は短絡評価の2 通りの異なる方法で評価することかできる。
全評価では双方のオペランドか十分に評価されて、実際のモード値を発生し、こ れらの値をAND又はOR命令にオペランドとして用いて、実モード結果を得る 。フロー又は短絡評価では第1オペランドを評価する。式の値を第1オペランド の値によって決定する場合には、第2オペランドをスキップさせる。そうしない と、第2オペランドが評価されて、式の値が第2オペランドの値となる。
ソース言語にはAND及びOR式の全評価を必要とするものかあり、ソース言語 には短絡評価を必要とするか、又はこの短絡評価用の特殊なオペレータを有する ものがあり、さらに他のソース言語には評価の種類を特定せず、コンパイラに選 択をまかせるものかある。これらのケースに対して次の3組のオペレータを準備 する。
(a)LANDC及びL ORC(”Logical AND Conditi onal”及び”Logical ORConditional”)はフロー  プール オペレータである。これらのオペレータはそれらの第1オペランドを評 価し、且つそれらの第2オペランドの評価をバイパスさせることかできる。
Cb)LANDU及びLORU (“Logical AND Uncondi tional”及び“Logical ORUnconditional”)は 全評価プール オペレータである。これらのオペレータは普通の2進オペレータ のように作用し、2つの全評価オペランド式から得られる値を計算する。
(c)LANDU及びLOR(”Logical AND及びLogical  OR” )はCILオペレータであり、これらのオペレータは評価の種類もオペ ランドの順序も特定しない。上記すベレータはILの拡張中にLANDC及びL ORCか、LANDU及びLORUタプルのいずれかと置き換えることができる 。さらに上記オペレータをLANDC及びLORCタプルと置き換える際に、そ れらの第1オペランドを評価するコストがそれらの第2オペランドを評価するコ ストよりも高くなると思われる場合には、上記オペレータのオペランドを入れ替 えることかできる。
バック エンド12はLAND、LOR,LANDC又はLORCタプルの各オ ペランドに属するタプルを識別できるようにする必要かある。CIしてはFLO WMARKタプルをこの目的のために用いる。これらダブルの内の1つのタプル の第1オペランドに関連する全てのタプルは第2オペランドに関連する全タプル の直前に置く必要があり、又第2オペランドに関連する全タプルはプール オペ レータそのものの直前に置く必要ハ 早土愉 ; 1ユ柄 ス、 がある。これらのタプルの内の1つのタプルのいずれかのオペランドに関連する 第1タプルの直前にはFLOWMARKタプルを置く必要がある。
例。
$ 1 : FLOWMARK ; !第1オペランドの開始$2 : FET CH(X); $3:GTR($2. (0)); $4 : FLOWMARK; !第2オペランドの開始$5 :FETCH( X); $6:LSS($5. (10)); $7 :LAND ($3.$6)!オペレータ タプル選択オペレータはプー ル オペランドの値に応じて2つの任意タイプの値の一方の値を選択する。論理 ○R及びANDタプルと同様に次の3つの選択タプルかある。
(a)SELCは、その第1オペランドが真であるか、偽であるかに応じてその 第2又は第3オペランドを評価する。
(b)SELUはそのオペランドの内の3個のオペランドを全て評価してから、 その第2か又は第3オペランドの値を選択する。
(c)SELは評価の種類を特定しないCILオペレータである。
このオペレータはTLの拡張中に5ELCか、5ELUによす置さ侠んや不りり 。
又、論理AND及びORタプルと同様に、SEL及び5ELCは、それらのオペ ランドに関連するタプルのオペランドの順序か連続し、しかもFLOWMARK タプルが前に置かれるようにする必要がある。
FLOWMARKタプル。
例 $ l : FLOWMARK ; j第1オペランドの開始$2・FETCH (X); $3:GEQ(2,(0)); $4・FLOWMARK 、!第2オペランドの開始$5 : FETCH(X ): $ 6 : F L OWMA RK ; j第3オペランドの開始$7 :F ETCH(X): $8 :NEG ($7); $9 SEL ($3. $5.$8)!オペレータ タプル又は 3; I : FLOWMARK ; j第1オペランドの開始$ 2 : F ETCH(X); $3:C;EQ($2. (0)): $4 : FLOWMARK; j第2オペランド用のコードかな$ 5 :  FLOWMARK ; !第3オペランドの開始$ 6 : FETCH(X) ; $7:5EL($3. (0)、$6)!オペレータ タプルー−一一第2オペ ランドに注意する プール オペレータの全てを表13にリストしである。
実行時間のチェック: チェック オペレータはプログラムの実行中に成る条件が真であるか、どうかを チェックし、その条件が真でない場合には例外として除外する。ASSERT以 外のチェック オペレータの全てはそれらの第1オペランドの値を戻す。各チェ ックタプルは条件のフィールドを有しており、これは条件が真でなければ例外で ある旨を知らせるべく特定化し、その例外の除外を知らせた後に制御を戻すべき か、どうかを指示するフィールドを続行させることかできる。制御か例外の除外 後にチェックタプルに戻れは、このチェック タプルは除外か起こらなかった場 合に戻ることになる値と同し値に戻る。これらのチェック オペレータを表14 にリストしである。
フロー制御 ILG55は基本ブロックを構成する。基本ブロックは、ブランチ ターゲット  タプルで始まり、ブランチ タプル又はフロー終了タプルで終る一連のダブル である。基本ブロックはその冒頭部だけを入力させ、原則として前記冒頭部の全 てのコードは、制御が基本ブロックの終りまで進む前に実行させる(前記条件付 き評価についての説明参照)CILGでは基本ブロックをエンド ツー エンド に連結する。基本ブロックの終りのブランチ タプルは、制御かその基本ブロッ クからLABELタプルて開始させなけれはならない次の基本ブロックに流れる 場合に省くことかできる。同様に、基本ブロックの冒頭におけるLABELタプ ルは、それへのブランチかない場合に省くこかできる。(即ち、バック エンド ブランチ タプルにより先行されないLABELタプルを見つける場合には、そ れにBRANCHを挿入し、又ハック エンドかブランチ ターゲット タプル により後続されないブランチ タプルを見つける場合には、同期ラベル シンホ ル付のL A B E Lタプルを挿入する。)IL拡張フェーズは各基本ブロ ックに対して、それらの相互関係を表現する別のフ0− グラフ データ構造を 有する円形のタプル リストを発生する。
基本ブロック内のフローは暗黙的にタプルの線形順序付けに準する。基本ブロッ ク間の全てのフローは明示フロー制御タプルで表現されるため、ILGの基本ブ ロックはルーチンの意味合いに影響を及はすことなく任意の順序で配列させるこ とかてきる。
各基本ブロックの冒頭におけるブランチ ターゲット タプルはシンボル表にお けるラベル シンボル又はエントリ シンボル ノードへのポインタを包含して いる。基本ブロック間の制御フローはブランチ タプルの属性である宛先リスト によって表現される。宛先リストにおける各ノードはラベル シンボル又はエン トリ シンボル ノードを示し、これは同じルーチンにおける成るブランチ タ ーゲット タプルによっても示され、制御を基本ブロックで始める基本ブロック に転送すべきことを指示する。
ブランチ ターゲット タプルは基本ブロックの開始をマークする。全ブランチ  ターゲット タプルは次のような属性をブロック エントリ これがそのスコ ープ(有効範囲)のエントリ基本ブロックであるか、どうか を示すフラグ。
このタプルに関連するラベル又はエントリ シンボル ノードへのラベル シン ボル A ポインタ。
スコープ ブロック シンボル表におけるブロック ノードへのポインタ 揮発性 制画かこのルーチン用のILGにて表現されない(非ローカルGo T oの +1111 VJノノノフ 7ノルlこりU/J\9−ご7)1(ざΦ。Zワリ ノフノチの宛先か同じても、これらのブランチは別々の同じ宛先リス○ Toに 指定されたFORTRAN又はラベル変数へのPL/1に用いられるオペレータ である。
バック エンドはさらに、間接ブランチ タプルの可能な宛先を確かめてからル ーチン フロー グラフを正しく組立てることのできるようにする必要かある。
従って、間接ブランチタプルは定型ブランチ オペレータと同じような宛先リス トを有する。しかし、これらの宛先リストは(JUMPタプル用のオプションで ある)単一宛先を包含しているだけである。この宛先のルーチン1〜 ラベルは VBRANCHタプルか直ぐ後に後続するVLABELを識別する。この場合、 VBRANCHタプルの宛先リストは、間接ブランチのこのルーチンにおける実 際に有り得る宛先の全てをリストする。
VLABELタプルとVBRANCHタプルとの斯かる組合わせのことを仮想基 本ブロックと称する。このブロック用のコードは発生させることはなく、これは VLABELとVBRANCHとの間には他のタプルを設ける必要かないからで ある。
従って間接ブランチからの制御を後続する仮想ブロックのいずれかに通すことか できる。このようにすれは、多数の間接ブランチか同し宛先を有する場合に、単 一の仮想基本ブロックでそれら全ての宛先を表現することかてきるのて有利であ る。
各ルーチンには他にもう1つの仮想、基本ブロックかある。このブロックはBE GIN及びBNTRYPTRタプルから成るブロックがある。このブロック用の コードは、このブロックの実行を常にENTRYにて開始させるから発生させな いが、そのブロックはバック エンド用ルーチンのエントリ点を全て識別する。
基本ブロックはブランチ タプル又はフロー終了タプルで終わらせることができ る。制御がフロー終了タプルに達すると、その制御は現行ルーチンから完全に離 れる。フロー終了タプルは制御を現行ルーチンにおける宛先には転送しないから 、それらのタプルは宛先リスト及びターゲット シンボルの属性を持たない。
なお、JUMPオペレータは、それか宛先リストを持たない場合、このことは現 行ルーチンに可能な宛先がないことを意味することからして、実際上はフロー終 了オペレータである。JUMPSYMBOLはフロー終了オペレータであり、こ れはCILにおける既知のラベルへのノン(非)ローカル GOTOを表現する のに用いられ、EILでは上記オペレータはノンローカルJUMPと置き換えら れる。
フロー制御オペレータの全てを表15にリストしである。
ルーチンの呼出し及びパラメータの受渡しニリンケージには制御、パラメータ、 復帰値に関する3種類の規約かある。゛°リンケージ規約”とは、呼出しルーチ ンと被呼ルーチンを適切に「互いに通信」させるジェネレーテツド コードにつ いての全ての規則のことを称する。これらの親日IIの内の幾つかはコード ジ ェネレータ29に組込む。他の場合には呼出し及び被呼ルーチンを一致させなけ れはならない選択性かある。これらの選択性の内の幾つかは(双方のルーチンに アクセスする必要かある場合)シェルによって成され、他の選択はフロント エ ンド20により成されて、シンボル表30及びILG55にてコート化される。
制御リンケージ規約は命令を規定し、これらの命令は呼出しルーチンから被呼ル ーチンへと制御を通して、被呼ルーチンの実行文脈を確立させて、制御を呼出し ルーチンへと戻すへく実行させる必要かある。制御リンケージ規約は呼出しルー チンにおけるINITCALL及びCALLタプルと、被呼ルーチン用のエンI ・リ シンボル ノー1へとにより決定される。
オペランl’か外部レファレンスであるCALLタプルは識別したコール(呼) であり、ライン内の被呼ルーチンをコンパイルしたり、又は被呼ルーチンの個別 化したコピーを発生する範囲かとんなてあれ、識別した呼に対するリンケーンを 選択するのは全く自由である。識別されない呼に対しては、INITCALLタ プルの呼出し規約フィールドか、その呼に使用すべき制御リンケージ規約を特定 化しなければならない。このフィールドの値は列挙したタイプGEM$CALL ING C0NVENTI○Nからのものとする必要かあり、これらの定数を次 のリストに定義する。
定数 意味 標準(Standard) ターゲット システムには標準の外部呼出し規約を 用いる。(これはMIPS履行用に規定した呼出し規約に過ぎない。) 呼(Coil) CA L Lリンケージ(VAXたけ)を用いる。
Jsb J S Bリンケージ(VAXだけ)を用いる。
ルーチン ブ0ツク ノードは標準のエントリ フィールドを有しており、これ はこのルーチンへの非識別呼によって呼出される斯かるルーチンをコピーするの にとの制御リンケージ規約を用いるのかを指定する。このフィールドの値は列挙 したタイプGEM$ENTR¥ C0NVENTIONから来るものとする必要 かあり、その定数を次のリストに定義する。
定数 意味 None ルーチンへの全ての呼は現行コンパイルで識別された呼であるため、 非識別呼から呼出すべきルーチンの例を生成する必要はな5tandard 標 準エントリ規約を用いて呼出すことのできるルーチンを生成する。(これはMI PSa行用に規定した単なる呼出し規約である。) Call CALLリンケージ(VAXだけ)を用いる。
Jsb J S B ’) ン’r −’) (VAXタケ) ヲ用L’6゜パ ラメータ リンケージ規約は他のタイプのものである。ルーチン呼出しは被呼ル ーチンに利用できるアーギュメント リストを作る。アーギュメント リストは 一致により呼出し及び被呼ルーチンの双方に知られる位置(レジスタ又はアドレ スが成る標準レジスタに包含されるメモリ ブロックの位置)におけるスカラ値 (アドレス)を収集したものである。
被呼ルーチンの仮パラメータはパラメータ フラグ セントである可変シンボル  ノー1−により表現される。パラメータシンボルに関連するアドレスは、呼出 しルーチンによって指定される記憶位置か、呼出しルーチンか通過させたデータ のコピーを包含するローカル記憶位置のことである。(”アドレス”とは実際に はレジスタのことである。)上記仮パラメータはアーギュメント リストから及 び下記に述へるようにパラメータシンボルのメカニズム及びセマンティク フラ グから取り出される。
パラメータは、そのパラメータの変数に関連するアドレスが呼出しルーチンによ って渡された記憶位置(実際の記憶位fit)のアドレスである場合にバインド  セマンティクを有する。上記パラメータは、コンパイラかそのパラメータ用の 記憶位置を被呼ルーチン(ローカル記憶位置)に割当て、必要に応じ実際の記憶 位置とローカル記憶位置との間にコピーを生成する場合にコピー セマンティク を有する。(バインド セマンティクを有するパラメータのローカル記憶位置は その実際の記憶位置と同じである。) コンパイラは、1ルーチン内のパラメータの使用パターン及び表10−3にリス トしたフラグに基づくパラメータに対してバインド セマンティクを用いるのか 、コピー セマンティクを用いるのかを選定する。(“エイリアス効果”につい てはCTo、70におけるData Access Modelに記述されてい る。)要するにエイリアス効果とは実際の記憶位置をパラメータ シンボルを介 することなくアクセスする方法である。これは実際の記憶位置となり得る非ロー カル変数、即ち別の効果に対する直接レファレンスを含み、しかも実際の記憶位 置をアクセスすることのある他のルーチンを呼出す。
表17は様々なソース言語をセットする際に用いるパラメータ セマンティク  フラグを示す。
パラメータ メカニズムは、呼出しルーチンか被呼ルーチンへの引き渡しを希望 することと、アーギュメント リストに実際上回を記憶させるのかとの関係を特 定化する。パラメータシンボルは、このパラメータに対する値を渡すのに用いら れるメカニズムを指定するメカニズム フィールドを有しており、アーギュメン ト タプルは、このアーギュメントを渡すべきメカニズムを指定するメカニズム  フィールドを有している。これらの各フィールドの値は列挙したタイプGEM $MECHANISMから来るものとする必要かあり、これらのフィールドの定 数を表18にリストしである。
パラメータ変数の未知のサイズ フラグが偽である場合には、そのパラメータの サイズをコンパイル時に確認して、そのサイズ フィールドによりパラメータ  サイズを指定する。パラメータ サイズの未知サイズ フラグが真である場合に は、そのパラメータのサイズはコンパイル時に確認しなくて済む。未知サイズ  パラメータのサイズは、それかアレイ ストリング又はアドレス及び長さく長さ パラメータに関連するレファレンス)メカニズムを有する場合には、実行時に決 定することかできる。
別個の長さワードをアドレス及び長さメカニズムで渡し、且つパラメータが集合 データ タイプのものである場合には、長さアーギュメントをバイト単位でなく 、エレメント(ビット又は文字(キャラクタ))のパラメータ サイズとして解 釈する。
さらに、パラメータが文字ストリングであり、このストリングの表現が変化する 場合には、パラメータ サイズはストリングの現行サイズでなく、最大サイズと なり、そのストリングのテスト部分にのみ適用され、これはストリング長ワード 又はヌルターミネータに必要とされるベースには当てはまらない。なお、パラメ ータは、コンパイラがとの程度コピーするのか判らなければ、コピー セマンテ ィクを有することはできない。実際のパラメータ サイズがコンパイル時に判ら ず、実行時にコンパイラによっても計算できない場合には、フロント エンドか パラメータの必須バインド フラグをセットして、バインドセマンティクの使用 を余儀なくさせる必要かある。
他のタイプはリターン バリュー リンケージ規約である。
被呼ルーチンは2通りの方法で情報を呼出しルーチンに戻すことかできる。その 第1の方法は出力パラメータを用いる方法である。このパラメータは値以外のメ カニズムで渡される変数であるため、被呼ルーチンは値をそれに記憶させること かできる。
第2の方法は復帰値を用いる方法である。復帰値とは被呼ルーチンにより計算さ れて、呼出しルーチンに「戻されるJ値のことであり、この値は特定の結果タプ ルにより表現式の値として利用可能となる。
スカラ値はレジスタに戻すことかできる。たとえば、我々の殆と全て言語は算術 関数値を標準レジスタに戻し、BUISS“出力パラメータ”の特徴は、成るル ーチンか任意のレジスタ値を戻すことにある。
ストリングを戻すルーチンの場合には、アーギュメント リストにおけるタプル か復帰値を一時バッファに割当て、そのアドレスを被呼ルーチンに渡し、この被 呼ルーチンのタプルが復帰値をバッファに記憶させ、呼出しルーチンのタプルか バッファからその値を検索するようにする必要かある。
復帰ストリングのサイズを被呼ルーチンにより決定する場合には、呼出しルーチ ンがその結果に対するスペースを割り当てることはできない。その理由は、呼出 しルーチンは結果がどの程度の大きさになるのかを前もって知らないからである 。この場合の可能性に対するメカニズムは特定のタプルに対するものである。し かし、これらの可用性はターケラト環境についての呼出し標準規格に依存する。
呼出しルーチンは (a)被呼ルーチンか固定バッファによる値を戻すことを要 求したり: (b)被呼ルーチンかスタックの値を戻すことを要求したり、(C )被呼ルーチンかダイナミック ストリングによる値を戻すも、被呼ルーチンが そのような選定をする場合にはスタックに戻されたストリングを受け取ることを 要求したりすることができる。被呼ルーチンは固定バッファによるダイナミック  サイズの結果か、又は呼出しルーチンがそのダイナミック サイズの結果を必 要とする場合に、スタックのダイナミック サイズの結果を戻すべく常に用意し ておく必要かある。被呼ルーチンはダイナミック ストリングによる結果、呼出 しルーチンがダイナミック ストリングによる結果を要求する場合にスタックの 結果を戻すへく用意しておく必要もある。
そこで、CILでのルーチン呼出しの表現につき考察する。
プロシャージャ又は機能を呼出すのに多数の個別の操作が行なわれる。それには 次の幾つかのステップが必要である。
(a)アーギュメント リスト用のスペースを割当てる。
(b)バスーバイーバリュ(pass−by−value)オペランド式用のス ペースを割当てる。
(C)記述子用スペースを割当てる。
(d)アーギュメント記述子を作製する。
(e)アーギュメント記述子を作製する。
(f)結果値に対するスペースを割当てる。(結果値、即ち出力アーギュメント は、呼出し後まで存在しないアーギュメントである。Itにおける機能は結果値 でプロシージャとして処理される。
(g)アーギュメント リストを作製する。
(h)ルーチンを呼出す。
(i)アーギュメント、記述子及びアーギュメント リスト用に割当てられたス ペースを削除する。
(j)呼出しによる結果値を得る。
(k ’)結果値に対して割当てられたスペースを解除する。
ILでとった汎用戦略は、呼出しをするのに伴われる様々な操作に対して別々の オペレータを与えることにあるか、これらのオペレータは特殊な形態てひとまと めにする必要かある。ILのルーチン呼出しは次のようなしので構成する。即ち 、1 呼出しを行なう連続操作の冒頭にフラグを立てるINITCALLステー トメント。
2、アーギュメント リス1〜を構成する一連のアーギュメント及び一時割当て ステートメント。
3、制矧を被呼ルーチンに実際に転送する呼出しステートメン1−(CALL又 はBPCALL)。
4、呼出しの復帰値をアクセス可能にする一連の結果タプル。
INTTCALL及びステートメントは必須のものであるか、アーギュメント  リスト及び結果タプルは随意選択できるものである。呼出しに伴われるタプルは 全て同じ基本ブロック内に発生させる必要かあり、どの結果タプルも介在タプル なしで呼出しタプルを直ぐ後ろに後続させる必要かある。INITCALLと呼 出しとの間にとんなタプルかあろうとも、他の制約は何もない。それでも、ルー チン呼出し用のILは他の呼出し用アーギュメント リストIL内に含めること かできる。
アーギュメント リストの構成は、このアーギュメント リストそのものに対す るアドレス及び記述子用及び引き渡す値を一時的に保持するため並びに出力アー ギュメント用のスペースを割当てる操作を伴う。これらの活動状態をアーギュメ ントタプルと一緒にILに特定化する。全てのアーギュメント タプルはARG で始まる名前を有しており、これらのタプルは表20にリストした属性を有して いる。
呼出しルーチンか引き渡す値を有する場合、このルーチンは名前かARGVAL で始まるアーギュメント タプルの1つを用いる。実際のアーギュメント値はこ れらのタプルでアーギュメント タプルのオペランドとして特定化される。なお 、このことは必ずしもアーギュメントを値メカニズムを用いて引き渡すことを意 味するのではない。メカニズムが値メカニズムである場合には、オペランド値を アーギュメント リストに直接記憶させるか、さもなければテンポラリを割当て て、オペランド値をテンポラリに記憶させ、このテンポラリをレファレンス又は 記述子により引き渡すようにする。(これはBLISSにおける%REFに似て いる)。値メカニズムはスカラタイプのARGVALタプル及びコンパイル時間 の大きさか一定のARGVALAタプルでサポートされるだけである。
呼出しルーチンか既存の記憶位置に渡すアトトスを有する場合、このルーチンは 名前かARGADRで始まるアーギュメント タプルの1つを用いる。実際の記 憶位置のアドレスはこれらのタプルてアーギュメント タプルのオペランドとし て特定化される。従って、値メカニズムはこれらのタプルと一緒に用いることは できない。アーギュメント リストにこれらタプルの1つか発生すると、被呼ル ーチンを現行ルーチンに対する既知の記憶位置から呼出したり、その記憶位置に 書き込ませることかできるから、これらのタプルは依存性及び副作用を有するこ とかできるため、オフセット効果及び基本シンボル フィールドを有し、これら のフィールドは全てのメモリ レファレンス タプルに用いられ、又特殊なフラ グのパルム(parm)が読み取られたり、書き込まれたりし、これは被呼ルー チンが記憶位置からの読み取り及び/又は記憶位置への書き込みをするようにコ ンパイラをし向けるか、どうかを指示する。
アーギュメン1〜 タプルが汎用メカニズムを指定する場合には、コードを発生 させて記述子用スペースを割当てて、その基本アトトス フィールド内にそのコ ードを入れる。フロントエンドは記述子内に初期化すべき他のいずれものフィー ルドを明確に指定させる必要かある。これはDSCF ILDタプルを用いて行 なわれ、これらのタプルは汎用メカニズムで以前のアーギュメント タプルに差 し戻され、そのアーギュメントに割当てられた記述子のフィールドに記憶させる 値を指定する。アーギュメント ブロックの構成: 幾つかのRTLリンケージはアーギュメントのコレクションをアーギュメント  ブロックに渡す必要かあり、このブロックのアトトスは普通のレファレンス パ ラメータのようにRTLルーチンに受け渡す。これは次の3つの特殊なタプルを 用いて行なう。
(a)ARGBLOCKは特殊サイズのブロックをスタックに割当てて、そのア トトスを被呼ルーチンに渡すアーギュメント タプルである。上記ブロックはB LKF IELDタプルを用いて初期化することかできる。
(b)ABLKF IELDタプルは、任意のタプルの代わりに以前のARGB LOCKタプルを汎用メカニズムで差し戻すことを除けば、DSCF IELD と同じである。このタプルは値をアーギュメント ブロックのフィールドに記憶 させる。
(c)ARGDEF INESタプルは、それかコードを発生しないことを除け は、アーギュメント タプルと同しである。
このタプルはフロント エンドを正規のアーギュメントタプルに関連しないアー ギュメント的な副作用を特定化させる。特に上記タプルはアーギュメント ブロ ックに通過させたアーギュメントに関連する作用を指示するのに用いることかで きる。
ルーチンを集合値に戻すには、呼出しルーチンか割当てた位置にその値を記憶さ せる必要かある。名前かARGTMPで始まるタプルは特定サイズの記憶ブロッ クを割当て、そのアドレスを被呼ルーチンに受け渡す。これらのタプルは、AR GADRタプルか既存の記憶ブロックのアドレスを渡し、又ARGTMPタプル か呼出しに対して特別に割当てたテンポラリのアトトスを受け渡すことを除けば ARGADRと同しである。
ARGBUF、ARGSTK及びARGDYNタプルはテンポラリを割当て、ダ イナミック ストリング復帰値を得るのに必要な特殊な記述子を受け渡す。これ らのタプルは、いずれも通常のアーギュメント タプルの属性を有しているか、 それらのメカニズムの属性は、そのメカニズムがダイナミック復帰値のメカニズ ムの使用により暗示されることからして無視される。
名前かRESULTて始まるタプルは呼出しルーチンでアクセス可能なルーチン 呼出しからの復帰値を作製する。これらのタプルの作用は、これらが被呼ルーチ ンにより戻されたテンポラリ位置、即ちレジスタからの出力パラメータをさらに 長持ちするテンポラリ位置に動かすことにある。結果タプルの値はそれか検索し た復帰値の値に過ぎない。呼出しに対する結果タプルには全て呼出しタプルを直 ぐ後続させる必要がある。
バウンド プロシージャ 呼出し: バウンド プロシージャ値、即ちBPVは未知のルーチンを呼出すのに必要とさ れる状態を表す。ルーチンはアップ レベルのレファレンスを含み、割当て変数 を他のルーチンにスタックすることかできるため、バウンド プロシージャ値に は呼出すべきルーチンのコード アトトスだけでなく、そのためのスタテック  リンクを構成するのに十分な情報も組込む必要がある。
不都合なことに、BPVはそれらをどのように創成し、それらをどのように表現 し、それらをとのようにして呼出し、又それらがどんなに大きくても、それぞれ 異なるソフトウェア アーキテクチュアで極めて異なる方法にて処理される。従 って、コンパイラは首尾一貫した表現を提供しようとはしない。その代わり、フ ロント エンドはターゲット ソフトウェア ア−キテクチュアに応して異なる コードを生成しようとする。
(a)VAX及びMIPSソフトウェア アーキテクチュアにおけるBPVは単 にコード アドレス及びコンテキスト(文脈)値であり、バウンド プロシージ ャ呼出しは、コンテキス)・値を特定のレジスタにロートさせてからフードアド レスへの呼出しをして行なう。従って、フロントエンドはBPVを一対のアドル ス値として表現する責任かある。コード アドレスはBPLINKタプルで得ら れる。
BPVへの呼出しは、アドレス オペランドをコード アドレス値とするCAL Lとして表現すべきてあり、この場合、コンテキスト値は、その値をアーキテク チュアのスタチック リンク レジスタに特殊なレジスタ アーギュメントとし て受け渡すようにする。
(b)RTSCマシンては全てのプロシージャを成る追加の情報と一緒にコート  アドレスを包含している記述子により表現し、BPVは実行時に構成される特 殊な記述子(これはコンテキスト ポインタを包含している)のアドレス及びコ ンテキスト ポインタにロードして、実ルーチンを呼出すRTLルーチンのアド レスに過ぎない。フロント エンドは斯様な記述子そのものに対するスペースを 割当てなければならず、そのスペースに記述子を入れるのにBPVALタプルを 用いる。この場合、BPVは記述子のアドレスにより表現し、このBPVへの呼 出しは上記アドレスへの呼出しにより表現すべきである。
バック エンド12にとって必要なことは、ルーチンの各入口点に対するパラメ ータが何であるかを知ることである。フロント エンド20は入口点のパラメー タ リストを表すパラメータ ノード(次のフィールドによりリンクされる)の リストにおける最初と最後のノードに対する点に各エントリ シンボル ノード のバラム リスト及びバラム リスト テイル フィールドをセットすることに よりルーチンの各入口のパラメータを知るようにする。
各パラメータ ノードは、それらか アーギュメント タプル(表20参照)で 行なうのと同じ意味を有しているレジスタ及び特定のレジスタ フィールドか受 け渡す入口点及びアーギュメント位置を含むルーチンのパラメータ シンボル  ノードを指すシンボル フィールドを有する。従って、パラメータノードのリス トは入口点のパラメータを全て識別すると共に、これらのパラメータか、その入 口点のアーギュメント リストのとこに生ずるのかを識別する。
なお、パラメータ シンボルは1つ以上のパラメータ リストにて発生し、それ らは各々異なるアーギュメント位置にて発生する。しかし、メカニズムは特定ア ーギュメント リストにそれか発生するというよりも、むしろパラメータ シン ボルの属性と見なせるから、パラメータ ノートはメカニズム フィールドを有 していない。
RETURNRGタプルは特定レジスタにおけるスカラ値を戻し、RETURN STK及びRETURNDYNとはPRISM呼出しスタンダードで与えられる ダイナミック ストリング戻しメカニズムの1つを用いてストリング値を戻す。
なお、値をアーギュメント テンポラリを経て戻すことと、値を普通の出力パラ メータに記憶させることは相違しないため、アーギュメント テンポラリを経て 値を戻すのに呼出しルーチン用の特殊なタプルは必要でない。
パラメータ シンボルに関連するアドレスはパラメータのローカル記憶位置のア ドレスである。被呼ルーチンはDESCADDRタプルを用いて汎用記述子のメ カニズムでパラメータ用記述子のアドレスを得ることかできる。実際のサイズを (記述子又は別個のサイズ パラメータの)アーギュメント リストで1醪るこ とかできれば、未知のパラメータの実際のサイズを5IZEタプルを用いて得る ことかできる。
ルーチン呼出しに伴われるオペレータの全てを表21にリストしである。
記憶配分及び範囲付け・ 字句ブロックは一組の宣言か、例えばルーチン、サブルーチン、機能又は開始− 終了ブロックに有効であるソース プログラムの範囲であり、ルーチンの字句構 造は、ルートかルーチンブロック ノードとなるスコープ ブロック ノードの トリーにより表現される。ILGの各基本ブロックは単一字句ブロックに属する コードを包含する。基本ブロックの開始点におけるブランチ ターゲット タプ ルはシンボル表における対応するブロック ノードを指すスコープ ブロック  フィールドを有している。ルーチンの各字句ブロックはユニークなスコープエン トリ基本ブロックを持たなければならず、このブロックは字句ブロックの内で、 この字句ブロック以外のいずれかの基本ブロックから開園を受け渡すことのでき る基本ブロックである。斯かるスコープ エントリ基本ブロックはブランチ タ ーゲット タプルのブロック エントリ フラグにより識別される。
CILにおける可変シンボルに対するレファレンスは常に記憶位置のアドレス( 即ち、レジスタの名前)をもたらす・即ち、1、スタティック変数は記憶域クラ スかスタティックか、グローバル レフか、又は予約したものである。スタティ ック変数はコンパイル時に成るPSECTに位置付けられるため、このような変 数に対する各レファレンスは同じ位置に照合させる。
2、ローカル変数は、記憶域クラスかオートマチックか、スタック ローカルか 、レジスタか、登用されたレジスタであって、しかも未知サイズ フラグが偽で ある変数である。ローカル変数はそれらの字句単位有効範囲の単一実行中にしか 存在せず、それらの字句単位有効範囲の多数の実例を同時に実行する場合には多 数の実例を持つことかできる。ローカル変数はコンパイル時に割当てられて、そ れらのルーチンのスタック フレームにおける位置を登録したり、又は知ったり する。
3、ダイナミック変数はローカル変数と同じ記憶域クラスのものであるか、未知 サイズ フラグは真である。ローカル変数と同様に、ダイナミック変数は、それ らの字句単位有効範囲の単一実行中にしか存在せず、それらの字句単位有効範囲 の多数の実例を同時に実行する場合には多数の実例を持つことかできる。ダイナ ミック変数は実行時にCRETEタプルによりスタックに割当てられ、しかもバ ック エンドにより創成される関連するポインタ変数によりアクセスされる。
4、コピー セマンティクスを有するパラメータは、それらの未知サイズ フラ グのセツティングに応じてローカル又はダイナミック変数として作用する。
5、バインド セマンティクスを有するパラメータは被呼ルーチンには全く割当 てられない。これらパラメータは、実際の記憶位置アドレスを保持するためにバ ック エンドにより創作される関連するポインタ変数を経てアクセスされる。
字句ブロックにおけるタプルは、その字句ブロック又はシンボル テーブル ブ ロック トリーにおけるいずれかのアンセスタにて宣言される任意の変数を参照 することかできる。現行のルーチンの変数を参照することに勿論何等問題はない 。他のルーチンのスタティック変数は直接参照することかできる。他のルーチン のローカル及びダイナミック変数は、変数を宣言するスタック フレームを位置 付ける“スタティック チェーン”を必要とする。しかし、フロント エンドか ルーチン ブロック及び変数を正しく注釈付ければ、バック エンド12はスタ ティック チェーンを創成して、それを用いてコードを生成すべく応答すること ができる。
ダイナミック スタックの割当てには次のような幾つかの種類かある。
■、ダイナミック変数用のスタック記憶域をCREATEタプルにより割当てる 。これはCREATEタプルと同じ字句ブロック内にない基本ブロックに制御を 受け渡すまではCREATEタプルの実行により存在する。(このことはダイナ ミック変数用のCREATEタプルを基本ブロックに割当てる必要かあることを 意味し、この基本ブロックの有効範囲ブロックは変数を宣言するブロックであり 、さもなけれは、そのダイナミック記憶域は変数か有効範囲内にまた字句的にあ る間釈放される。) 2、未知サイズ コピー パラメータ用のスタック記憶域を割当てるコードをE NTRYタプルの直ぐ後に生成する。ENTRYタプルは主ルーチン ブロック に必須であるため、この記憶域はルーチンが戻るまで存在する。
3、ダイナミック テンポラリは集合式の値を保持するためにバック エンドに より創成することかできる。このテンポラリは少なくとも集合式の値を用いるタ プルを実行するまでその値を創成するタプルの実行により存在する。
4、集合ARGVAL、タプル用のアーギュメント値を保持するためにスタック  スペースを割当てる。このスペースはCALLタプルを実行するまてARGV AL、タプルの実行により存在する。
5、スタック スペースをARGTMP、タプル用の戻り値を保持するために割 当てる。このスペースは戻り値をフェッチするRESULT、の実行により存在 する。
本発明は上述した例のみに限定されるものではなく、幾多の変更を加え得ること 勿論である。
テーブル1 (ただし、以下の全角英文字及び記号は実際は半角入力のものとし、全角アンダ ーライン2文字分は、実際は半角アンダーパー2個分とする。) パッケージからエクスポートされた名前式である。
・グローバル変数名は、GEM$ZZ nameの形式である。
・リテラル名(グローバル又はエクスポーテッドのいずれてあ列挙データ型式 ・すへての列挙データ型式は、固有の「型式名」を有する。
の形式の名前を有する。
集合データ型式 ・各集合データ型式は、固有の「型式名」を有する。
・集合型式の特定の変数のサイズは、 ・集合型式の全体としてのサイズ(即ち、最大変数のサイズ)はGEM$XYZ  5IZEである。
・名前G E M $ X Y Zは、型式宣言マクロを参照し、その拡張は、 テーブル2 整数(Integer’) 32ビツト(ロングワード)の符号付き整数。値( value)によって渡される(パスされる)。
ストリング(Stri口g) 可変ストリング(16ビツトの長さの符号のない ワード+テキスト)。レファ レンス(reference)によって渡される(パスされる)。
ハンドル(Handle) シェルルーチン(シェル内部データ構造のアドレス であることか多い)によ って割り込まれるかフロントエンドに 対しては意味をもたない32ビツト(ロングワード)値。値(value)によ って渡される。
ブロック(Block) シェルパッケージの仕様で構造か規定され、その内容 がフロントエンドとシ エルとの間の通信に使用される若干の データブロック。レファレンスによっ て渡される。
カウントテッドベクトル(Counted vector)32ビツト構成要素 の特定数か付随す る32ビツトの符号のないカウントワード。ベクトルの構成要素は、整数、変 化するストリングのアドレス、ハンド ル又はブロックのアドレス。レファレ ンスによって渡される。
テーブル3 (ただし、以下の全角英文字及び記号は実際は半角入力のものとし、全角アンダ ーライン2文字分は、実際は半角アンダーパー2個分とする。) GEM$XX INIT これは、最初のアクションとしてシェル11により呼び出される。
(GEM$XX INITを呼び出す前にシェルが行うことは、m)参照)をス タートし、デバッギングパッケージ(〈REFERENCE> の(sect  5hell db)参照)を初期化し、“5tandarderror” のア ウトプットファイルノ1ンドGEM$XX INITからの戻る際に、以下に列 挙する全てのOEM$XXグローバル変数は、適正に初期化される。他われ、又 はGEM$XX PROCESS GLOBALS(以下を参照のこと)まで延 期される。
GEM$XX INITの呼び出しを完了するまではシェル11はいかなるコマ ンドライン処理を行わないため、VAX/Eを呼び出してシェルか処理するコマ ンドストリングをセットさせることによってDCLコマンドの代わりに外部コマ ンドでGEM$XX INITによりGEMコンパイラを実行させる。
GEM$XX PROCESS GLOBALSこれは、コマンドラインからの グローバル修飾子(globalqualifier)を処理した後であって何 からのコマンドラインパラメータ又はローカル修飾子を処理する前にシェルによ って呼び出される。このルーチンは、グローバル修飾子ブロックを検討し、アク ションか適正である限りこのアクションをとることができる。
GEM$XX PROCESS LOCALSこれは、コマンドラインからのロ ーカル修飾子を処理した後であって、ローカル修飾子によって特定されたファイ ル21をオープンする前にシェル11によって呼び出される。このルーチンは、 ローカル修飾子ブロックを検討し、所望の内容を変化させることかできる。この ことにより、個別の修飾子ブロックでは表すことかできない修飾子間の依存性を 可能にする。
GEM$XX COMPILE これは、ローカル修飾子ブロックに充填されたパラメータプラスリスト及びその 修飾子を解析し、プラスリストによって特定された入力ストリームでGEM$T Iを初期化した後にシェル11によって呼び出される。このルーチンは、その入 力ストリームをコンパイルするよう応答することかできる。
GEM$XX FINI これは、最終アクションとして抜は出るまえにシェルによって呼び出される。こ のルーチンは、フロントエンドの特定クリーンアップを行う。
フロントエンドは、以下のグローバル変数を宣言しなければならない。グローバ ル変数は、GEM$XX INITが制御をシェル11に戻す時間によって規定 されねばならない(グローバル変数はリンク時間で規定されるか、イメージ起動 時間でアドレスフィックスアップを必要とする)。
GEM$XX G GLOBAL QUALSこれは、コンパイラのグローバル 修飾子のための修飾子ブロックに対するポインタのカランテッドベクトルのアド レスを含む(<REFERENCE>の (sect 5hell cp)参照)。これらグローバル修飾子ブロックは、 シェルによって充填されてからGEM$XX PROCESS GLOBALS を呼び出す。
GEM$XX G LOCAL QUALSこれは、コンパイラのローカル修飾 子のための修飾子ブロックに対するポインタのカランテッドベクトルのアドレス を含む(<REFERENCE>の (sect 5hell cp)参照)。
これらグローバル修飾子ブロックはシェルによって充填されFILEを呼び出す 。
GEM$XX G FACPREFIXこれは、コンパイラメツセージを構成す るのに使用される機能ストリングを含む可変ストリングのアドレスを含む。
GEM$XX G FACNUMBERこれは、コンパイラメツセージコードを 構成するのに使用する整数機能(integer facility)コードを 含む。
GEM$XX G IN DEFAULTSこれは、コマンドラインパラメータ で特定されるソースファイルを開くときに使用するデフォルトファイル仕様を含 む可変ストリングに対するポインタのカランテッドベクトルのアドレスを含む。
GEM$XX G LIB DEFAULTSこれは、/L I BRARY修 飾子でコマンドラインパラメータとして特定されたテキストライブラリーを開く ときに仕様するデフォルトファイル仕様を含む可変ストリングに対するカランテ ッドベクトルのアドレスを含む。
GEM$XX G PRODUCT IDこれは、作表(listing)ファ イルのヘッダラインに仕様されるプロダクト識別ストリングを含む可変ストリン グのアドレスを含む。
GEM$XX G PREFIX LEN作表ファイルのソースラインに添付さ れるプレフィックスストリングのために確保されるコラム数を特定する整数を含 む。
ビジュアル メモリ パッケージ(GEM$VM)ビジュアル メモリ パッケ ージは、ビジュアルメモリを割り当てるための標準インターフェースを提供する 。
VMS LIB$VMファシリティのゾーンメモリコンセプトを支援する。実際 VMSの下では、 GEM$VMはLIB$VM上のほとんどトランスペアレントなレイヤである。
しかし、 OEM$VMインターフェースはいかなるホストシステム上でも変更されずに支 援されるよう保証される。
ロケータ パッケージ(GEM$LO)ロケータは、ソーステキスト15の範囲 (起動ファイル及び終了ファイル、ライン、及びコラムナンバー)を記述する。
テキスト入カバッケージは、ロケータをソースラインに戻してこのソースライン を読み取る。ロケータは、シンボルテーブル16及び中間言語ノードにも使用さ れ、メツセージ及びデバッガテーブル生成を容易にし、また作表ファイルのとこ で作表パッケージをアクションをとるかを特定するのに使用される。ロケータは ロングワードとして表される。ロケータパッケージは、ロケータデータベースを 維持し、ロケータを生成し、ロケータに割り込むルーチンを提供する。
テーブル4 これは、幾つかの一般型式の定義を含み、以下に列挙するSDLファイルの全て を含む。これはまた、ジェネリック(全体的な)OEM$N0DE集合体の型式 を含む。
GEM C0N5TANTS、DAT これは、ノートの種類及びノードの副種類(subkind)の列挙された型式 並びに種々の他の列挙された型式の定義を含む。
GEM C0N5TANTS、SDL GEM C0N5”I’ANTS、DATのSDL翻訳である。
翻訳を行うC0N5TANTSプログラムを記述するための付録(アヘンディッ クス)Dを参照されたい。
BLK N0DE、SDL これは、ノート種類フィールドにおけるGEM$N0DE K BLOCK(7 )値ニよッテ識別されるブロワ’)/−ド(GEM$BLOCK N0DE)( D定義を含む。
SYM N0DE、SDL これは、ノード種類フィールドにおけるGEM$N0DE K SYMBOL( 7)値ニよッテ識別すれるシンボルノード(GEM$sYMBoL−NoDE) の定義を含む。
FRM N0DE、SDL これは、ノード種類フィールドにおけるGEM$N0DE K FRAMEの値 によって識別されるフL、−ムノーF(GEM$FRAME N0DE)の定a を含む。
LIT N0DE、SDL これは、ノート種類フィールドでの 義を含む。
PRM N0DE、SDL これは、ノート種類フィールドでの GEM$N0DE K PARAMETERの値によって識別されるパラメータ ノード これは、ノート種類フィールドでの GEM$N0DE K CTL TUPLEの値によって識別される組(タプル Tuple)ノート DES N0DE、SDL これは、ノード種類フィールドでの GEM$N0DE K DESTINATIONの値によって識別される組(タ プル)ノード (GEM$DES工INATION N0DE)の定義を含む。
GEM$ND、L32 BLISSでコード化されたフロントエンドにより使用されるライブラリファイ ルである。これは、上に列挙したファイルのBLISS翻訳を含む。
テーブル5 シンボルテーブル及びILルーチン (モジュールのための中間表現を初期化する)OEM$ST FINI (モジュールの中間表現用に割当てられた全てのスペースを解除する。) (CIL組ノードを割り当てる) GEM$IL FREE DES N0DE(宛先ノートの割り当てを解除する ) GEM$IL lN5ERT (一つの組又は組リストを組リストに挿入する)(組リストから一つの組を取り 外す) (ブロックノードを割り当てる) (記憶フレームノードを割り当てる) GEM$ST ALLOCATE MUTABLE SYMBOL (副種類を変更できるシンボルノードを割り当てる)GEM$ST ALLOC ATE PARAMETERN。
E (パラメータリストノードを割り当てる)GEM$ST ALLOCATE S YMBOL N0DE(副種類を変更できないシンボルノードを割り当てる)( 特定リテラル値のためのリテラルノードを得る)(特定名を有するPSECSE C前記−フレームノード)(ミュータプルシンポルノードの副種類を変更する) (変数又はPSECTの初期値としてシンボル又はPSECTアドレスを指定す る) GEM$ST 5TORE BUFFER(変数又はPSECTの初期値として バイトの任意ブロックを指定する) GEM$ST 5TORE LITERAL(変数又はPSECTの初期値とし てリテラルノードの値を指定する) テーブル6 [NT8 Yes Yes Yes INT16 Yes Yes Yes INT32 Yes Yes Yes INT64 No Yes N。
U[NT8 Yes Yes Yes LIINT16 Yes Yes YestlINT32 Yes Yes Y esUINT64 No Yes N。
REALF No Yes Yes REALD No Yes Yes REALG No Yes Yes REAL No No Yes REALS Yes Yes N。
REALT Yes Yes N。
REALQ No Yes N。
REALE No Yes N。
CMPLXF No Yes Yes CMPLXD No Yes Yes CMPLXG No Yes Yes CMPLXS Yes Yes N。
CMPLXT Yes Yes N。
型式サイズ ADDR326432 堅式同義語 [ADDRINT32 [NT64 [NT32tJADDRLIINT32  LIINT64 tllNT32IMAX [NT32 [NT64 [NT3 2[JMAX UINT32 UINT64 UINT32テーブル6a より指定されるループに関して帰納表現であることを示すフラ基本帰納変数セッ トにない場合、この組(ダブル)は帰納的でない。
IV LOOP TUPLEかループ内で帰納的である最も内側ループのループトップ。
各帰納表現Eは基本帰納変数Iのリニア関数を定義する。即ち、Eは次式によっ て■の項において再計算される。即ち、E= (a* I)+b ただし、「a」はリニア関数の「係数」であり、「b」は「オフセット」である 。IV C0EFFICIENTフイールドは、係数の定数部分を含む整数フィ ールドである。
IV NON C0N5TANTTフイールドは、係数が不定部分を有すること を示すフラグである。
「この(This)」ループトップにより表されるループのための基本帰納変数 候補セットである。初めは、これはループにおいて変更されるすべての変数セッ トである。
アルゴリズムFIND IVは基本帰納変数のルールに従わない変数を排除する 。ループトップに対してのみ有効である。
C0NDITIONAL 5ET− 「この(This)Jループトップにより表されるループにより、各完全トリッ プ毎に正確に実行されない記憶を有する変数セット。このセットに存在すること は、変数か帰納変数であることを意味しない。ループトップに対してのみ有効で ある。
Cテーブル7 共通組(コモンタプル:Common Tuple )フィールドField  意味 種類(Kind) すべてのノードで生ずる総称ノード種 類フィード。
全体演算子(Generic operator)組(タプル)によって行われ る一般的 演算(オペレーション)。これはすべ てのノートで生ずる全体的側種類フィ ールドの他の名前である。
演算子型式(Operator type)全体演算子に関連して組により 実行される特定演算を決定するデータ 型式。
演算子型式は、常にてはないか、組 における1個又はそれ以上のオペラン ド(特に第1番目のオペランド)のデ ータ型式と同一であるのが一般的であ る。組によって計算される値のデータ 型式とは必ずしも同じてはない。例え ば、ADD、lNT16は2個のオペ ランドlN716を加算し、 結果lNT16を生ずるか、 LSS、lNT16は2個のオペラン ドlNT16を比較し、 結果BOOLを生じ、 5TORE、lNT16は 値lNT16をメモリ位置に記憶し、 結果を持たない。
結果型式(Result type) この組により計算される値の型式。
たいていの演算子に関しては、結果型 式は演算子型式によって決定されるか、幾つかの演算子に関しては、結果型式 は演算子型式とは独立しており、組に より実行される特定演算は双方の型式 に左右される。
オペランド(Operands) この組のオペランドに対するポイン タのアレイ。オペランドの数は全体演 算子により決定される。各オペランド ポインタは他のIL組ノード又は CILにおいてのみシンボル又はリテ ラルノードを指し示す。個別のすペラ 次組(Next tuple) 組の2重リンク組リストにおける次 の及び直前の組に対するポインタであ る。つぎの組オーダーは、評価の暗黙 オーダーである。CILにおいて、 ILGのすへての組はともにリンクす るとともに、EILにおいて各基本ブ ロックの組は個別のリストを形成する。
ロケータ(Locator:) この組にコンパイルされたトークン 又は1・−クン群のプログラムソースにおけるテキスト的な位置である。エラ ーメツセージ、ソース相関テーブル等 を構成するのに使用する。(ロケータ はOEM$LOパッケージ仕様に記載 されている。) Exprカウント(Expr count)バックエンドによりセット れれたEIしてのみ使用される。
Exprカウントフィールドは、CT、029の効果表現インターフェースにお いて 記載されている。
テーブル8 組辞書入口(タブルディクショナリエントリ)における見出しくヘッディング) 見出し 説明 演算子(Operator) 演算子の名前は、辞書の頁のトップに現れる。こ の名前は、 OEM$TPL K が前置され、 OEMコードで使用される実際の定 数を生成する。
オーバービュー(Overview) 組オーバービューは演算子の名前の直ぐ 下に現れる。これは、1個又 は2個のセンテンスにおいて、この 演算子を有する組か何をするかを説 明する。
フォーマット(Format) 組フォーマットは組オーバービューに続く。こ れは、演算子がとるオ ペランドの数、容認できる演算子型 式、オペランド型式及び結果型式を 特定する。
属性(Attributes) 属性は、テーブル7に列挙した共通フィールド 以外の組フィールドで ある。属性セクションは、フォーマ ットセクションに続き、組に使用さ れる属性の全てを列挙する。属性の 意味は、制限及び説明部分にほぼ要 約されている。
値(Value) 値セクションは属性セクションに続く。これはオペランドの 関数とし て組によって戻る値の詳細な説明を 与える。
制限(Restrictions’) 値セクションに続くこれは、組の使用に 関する制限事項を説明する。
制限事項は以下のカテゴリーのう ちの一つに当てはまる。
(a)組はCIL又はEILでのみ使 用できる。
(b)組はILGの特定の文脈におい て生じなければならない、又は特 定の種類の組のオペランドでなけ ればならない。
(C)組の所定のオペランドは特定の 演算子を有する組でなければなら ない。
(d)組の所定の属性フィールドは特 定の種類ノードに対する所定のポ インタでなければならない。
ILGの形式の構造(構文)上の 制限は、このセクションに文書化 されている。ルーチン制限例えば、 サブストリング組の長さオペラン ドはネガティブであってはならな いという必要条件は、説明部分で 示されている。
説明(Description) 説明部分は、制限部分に続き、組の効果を説 明する。更に、組に関す る雑多な情報例えば、オペランド値 に対するランタイム条件、起こりう るエラー条件、組を支援する特定の ソース言語構造を与える。
− テーブル9 「 5 データアクセス演算子(Data Access 0perator))  演算子(Operator) 意味フェッチ演算子(Fetch 0perat ors)FETCH表現的値をフェッチする。
FGTCHA パックドアレイ(packed array)素子から符号表現 を存する符号付き整数又 はゼロ拡張を有するアドレス整数又は 符号なし整数をフェッチする。
FETCHF 特定の長さを有する文字ストリング、又はビットストリングをフ ェッチする。
FETCH3文字サブストリング又はビットサブストリング即ち、基本アドレス からオ フセットした特定の長さの特定の文字 又はビットを有するストリングをフェ ッチする。
FETCHV 可変長文字ストリング即ち、長さかストリングのテキストに先行 するワー ドにある文字ストリングをフェッチす る。
FETCHX ビットフィールドから符号拡張を有する符号付き整数又はゼロ拡 張を有す るアドレス整数又は符号なし整数をフ ェッチする。
FETCHz 空白終了(null−terminating)文字ストリング をフェッチする。
FETCH2X パックドアレイ素子からゼロ拡張を有する符号付き整数をフェ ッチする。
FETCH2X ビットフィールドからゼロ拡張を存する符号付き整数をフェッ チする。
記憶演算子(Store 0petators)STORE 表現的値を記憶す る。
S T ORE A パックドアレイ素子の整数値又はアドレス値を記憶する。
5TOREF 文字ストリング又はビットストリングを記憶する。
5TORES 文字サブストリング又はビットサブストリング即ち、基本アドレ スからオ フセットした特定の長さの特定の文字 又はビットを存するストリングを記憶 する。
5TOREV 可変長文字ストリング即ち、ストリングの長さを含むワードに付 随するス トリングのテキストを記憶する。
5TOREX ビットフィールドの整数値又はアドレス値を記憶する。
5TOREZ 空白終了文字ストリング即ち、空白文字(全てのゼロピット)が 後に付随 するストリングのテキストを記憶する。
VSTORE 算術値又はアドレス値を記憶し、記憶した値を生成する。
VSTOREA パックドアレイ素子の整数値又はアドレス値を記憶し、記憶し た値を生成 する。
VTOREX ピットフィールドの整数値又はアドレス値を記憶し、記憶した値 を生成す PO3T INCR変数から表現的値をフェッチし、コンパイル時定数増分をそ れに加算し、 この結果をメモリに戻して記憶し、初 期(非増分の)値を生成する。
PO3TINCRA パックドアレイ素子から表現的値をフェッチし、コンパイ ル時定数増分を それに加算し、この結果をメモリに戻 して記憶し、初期(非増分の)値を生 成する。
PO8TINCRX ビットフィールドから表現的値をフェッチし、コンパイル 時定数増分をそ れに加算し、この結果をメモリに戻し て記憶し、初期(非増分の)値を生成 する。
PRE INCR変数から表現的値をフェッチし、コンパイル時定数増分をそれ に加算し、 この結果をメモリに戻して記憶し、初 期(増分の)値を生成する。
PRE INCRA パックドアレイ素子から表現的値をフェッチし、コンパイ ル時定数増分を それに加算し、この結果をメモリに戻 して記憶し、初期(増分の)値を生成 する。
PRE INCRX ピットフィールドから表現的値をフェッチし、コンパイル 時定数増分をそ れに加算し、この結果をメモリに戻し て記憶し、初期(増分の)値を生成す る。
可変変更演算子(Variable Modification 0perat ors)これら演算子は、変数、パックドア レイ素子又はピットフィールドから値 をフェッチし、フェッチした値と他の オペランド値との間の算術的演算を行 い、算術演算の結果をオリジナルのメ モリに戻して記憶し、更新した値を生 成する。
DDMOD ADDMODA ADDMODX (上の3つは成る値をメモリ位置の算 術的値に加算する。) D I VMOD DIVMODA DIVMODX (上の3つはメモリ位置の算術的値を 成る値で減算する。) IANDMOD IANDMODA IANDMODX (上の3つは成る値でメモリ位置の整 数値の「論理積(And) Jをとる。)ORMOD 10RMODA IORMODX (上の3つは成る値でメモリ位置の整 数値の「論理和(叶)」をとる。) IXORMOD IXORMODA IXORMODX (上の3つは成る値でメモリ位置の整 数値の「排他的論理和(Or)Jをとる。)ULMOD MULMODA MULMODX (上の3つは成る値でメモリ位置の整 数値を乗算する。) EMMOD REMMODA REMMODX (上の3つは成る値によりメモリ位置 の整数値を除算した剰余をとる。) HRMOD SHRMODA SHRMODX (上の3つは成る値だけメモリ位置の 整数値を右側にシフトする。) UBMOD SUBMODA SUBMODX (上の3つはメモリ位置の整数値から 成る値を減算する。) テーブル10 データアクセス組(タプル)の属性 属性 意味 オフセット(Offset) (フェッチ動作又は記憶動作のためのアドレスオ ペランドに加算すべきバイ トにおける)一定オフセット。
エフェクツ(Effects) フロントエンドによって使用されるのに保存さ れるロングワードGEMは、このフィールドは(IL拡張中にプロ グラミングするときを除いては)決し て検査しない。フロントエンドの場所 として、組によって影響された又はア クセスされたメモリに関する情報をセ ーブすることを意図する。詳細につい てはCT、029を参照されたい。
エフエフ’/ (Effects’)2 F E T CH及び5TOREの組 には使用されない。PRE INCR。
PO3TTNCRP、opMODの組 に対してエフェクツは、組の[リード エフエクツ(read effects)J (依存性)に付随するとともに、 エフェクッ2は 「ライトエフエクツ(write effects) Jに付随する。
基本シンボル(Base symbol)基本シンボルはCT、070のデータ アクセスモデルに説明されている。
マスト リードQlust read)STORE組には使用されない。
ILでは他の方法では検出されない幾 つかのメカニズムにより先行のフェッ チ又は記憶に続いてフェッチされる変 数が書き込まれたこと、従って、先行 のフェッチ又は記憶のときの値と同一 の値をとってはならないことをオプテ イマイザに表示する。IL拡張は基本 シンボルか揮発性の書き込み属性を有 するフェッチのマストリードフラッグ を自動的にセットする。
マスト ライト(Must write)FETCHの組には使用されない。
Iしては他の方法では検出されない幾 つかのメカニズムによりその後の記憶 の前にフェッチされる変数か読まれた こと、従って、その後の記憶の前にフ ェッチか検出されない場合でもこの記 憶が実行されなければならないことを オプテイマイザに表示する。IL拡張 は基本シンボルが揮発性の読み出し属 性を有する記憶のマストライトフラッ グを自動的にセットする。
テーブル11 算術演算子(Arithmetic 0perators)FETCHA パッ クドアレイ素子から符号拡張を有する符号付き整数又はゼロ拡張を有するアドレ ス又は符号のない整数をフェッチする。
FETCHX ビットフィールドからパックドアレイ素子から符号拡張を有する 符号付き整数又はゼロ拡張を有するアドレス又は符号のない整数をフェッチする 。
FETCH2X パックドアレイ素子からゼロ拡張を存する符号付き整数をフェ ッチする。
FETCH2X ビットフィールドからゼロ拡張を存する符号付き整数をフェッ チする。
記憶演算子(Store 0perator)STOREA パックドアレイ素 子の整数又はアドレス値5TOREX ビットフィールドの整数又はアドレス値 を記憶する。
VSTORE 算術的値又はアドレス値を記憶し、記憶した値を生成する。
VSTOREA パックドアレイ素子の整数又はアト゛レス値を記憶し、記憶し た値を生成する。
VSTOREX ビットフィールドの整数又はアドレス値を記憶し、記憶した値 を生成する。
算術的計算(Arithmetic Computation)ABS オペラ ンドの絶対値を計算する。
ADD オペランドの合計を計算する。
CADD 複素数オペランドと実数オペランドの合計を計算する。
CDIV 複素数オペランドと実数オペランドの商を計算する。
CEIL 実数オペランドの値以上の最小整数を計算する。
CMUL 複素数オペランドと実数オペランドの積を計算する。
C0NJG オペランドの共役複素数を計算する。
CREVSUB 複素数オペランドと実数オペランドの差を計算する。
C3UB 複素数オペランドと実数オペランドの差を計算する。
DIV 2個のオペランドの商を計算する。
FLOOR実数オペランドの値以下の最大整数値を計算する。
I PWR第1オペランドを整数の第2オペランドの累乗に計算し、双方のオペ ランドかゼロの場合にエラーの信号を発生する。
IPWRO第1オペランドを整数の第2オペランドの累乗に計算し、双方のオペ ランドかセロの場合に一方を生成する。
IPWRZ 第1オペランドを整数の第2オペランドの累乗に計算し、双方のオ ペランドかゼロの場合にゼロを生成する。
MAX オペランドの最大を計算する。
MIN オペランドの最小を計算する。
MOD オペランドの数学的係数を計算する(Ada及びPL/IMOD演算子 )。
MUL オペランドの積を計算する。
NECオペランドの負の補数又は2の補数を計算する。
PMOD 除数か正でなければならないオペランドの数学的係数を計算する(P ascal M OD演算子)。
PWR第1オペランドを第2オペランドの累乗に計算し、双方のオペランドがゼ ロの場合にエラーの信号を発生する。
PWR○ 第1オペランドを第2オペランドの累乗に計算し、双方のオペランド かゼロの場合に一方を生成する。
PWRZ 第1オペランドを第2オペランドの累乗に計算し、双方のオペランド かゼロの場合にゼロを生成する。
REM オペランドの剰余を計算する (FORTRAN MOD関数、BLISSMOD演算子、0%演算子、及びP a5cal及びAda REM演算子)。
ROUND 実数の小数部分を近似整数値に丸める。
SUB オペランドの差を計算する。
TRUNC実数の小数部分をゼロに切り捨てる。
桁送り(Shifting)及びマスキングIAND 2個の整数のビット論理 積を計算する。
IEQV 2個の整数のビット等価を計算する。
lN0T 整数のビット補数を計算する。
10R2個の整数のビット論理和を計算する。
lXOR2個の整数のビット排他的論理和を計算する。
ROT 整数値を回転させる。
SHL 正の桁送り数(シフトカウント)によって整数値を左に桁送り(シフト )する。
SHR正の桁送り数(シフトカウント)によって整数値を右に桁送り(シフト) する。
SH桁送り数(シフトカウント)の符号に基づいて整数の値を左又は右に桁送り (シフト)する。
数学的計算(Mathematical Computations)ACO3 オペランドのラジアンのアークコサインを計算する。
ACO3D オペランドの度数(degrees)のアークコサインを計算する 。
AS IN オペランドのラジアンのアークサインを計算する。
ASIND オペランドの度数のアークサインを計算する。
ATAN オペランドのラジアンのアークタンジェントを計算する。
ATAND オペランドの度数のアークタンジェントを計算する。
ATAN2 2個のオペランドの比のラジアンでのアークタンジェントを計算す る。
ATAN2D 2個のオペランドの比の度数でのアークタンジェントを計算する 。
CO8ラジアンで特定されるオペランドの余弦を計算する。
C03D 度数で特定されるオペランドの余弦を計算する。
C03Hオペランドの双曲線余弦を計算する。
EXP オペランドの指数(eの累乗)を計算する。
LOG オペランドのeを底とする対数を計算する。
LOG2 オペランドの2を底とする対数を計算する。
LOGIOオペランドの10を底とする対数を計算する。
SIN ラジアンで特定されるオペランドの正弦を計算する。
5IND 度数で特定されるオペランドの正弦を計算する。
5INHオペランドの双曲線正弦を計算する。
5QRT オペランドの平方根を計算する。
TAN ラジアンで特定されるオペランドの正接を計算する。
TAND 度数で特定されるオペランドの正接を計算する。
TANHオペランドの双曲線正接を計算する。
変換(Conversion) CAST 若干の他の型式の幾つかの値として同一のビットパターンを有する算 術的型式の値を生成する。
CMPLX 2個の実数オペランドから複素数を構成する。
CVT 1個の算術的型式の値を他の算術的型式の値に翻訳する。
IMAG 複素数の虚数部分をとる。
REAL 虚数の実数部分をとる。
ROUND 小数部分を丸めることにより実数を整数値に変換する。
TRUNC小数部分をゼロに切り捨てることにより実数を整数値に変換する。
XCVT 変換した値の表現における過剰に大きいビットを切り捨てることによ り1個の整数型式の値を他の整数型式に変換する。
比較(Comparisons) EQL 1個の算術的値が他の値に等しい場合にテストする。
GEQ 1個の算術的値が他の値より大きいか、又は等しい場合にテストする。
GTR1個の算術的値が他の値より大きい場合にテストする。
LSS 1個の算術的値か他の値より小さい場合にテストする。
LEQ 1個の算術的値か他の値より小さいか、又は等しい場合にテストする。
NEQ 1個の算術的値か他の値とは異なる場合にテストする。
変数変更演算子(Variable Modification 0perat or)DDMOD ADDMODA ADDMODX (上記3つは、メモリ位置における算術的値に成る値を加算する。) IVMOD DIVMODA DIVMODX (上記3つは、メモリ位置における算術的値を成る値で除算する。) TANDMOD IANDMODA IANDMODX (上記3つは、メモリ位置における整数値を成る値で「論理積」をとる。) 0RMOD IORMODA IORMODX (上記3つは、メモリ位置における整数値を成る値で「論理和」をとる。) IXORMOD IXORMODA IXORMODX (上記3つは、メモリ位置における整数値を成る値で「排他的論理和」をとる。
) ULMOD MULMODA MULMODX (上記3つは、メモリ位置における算術的値を成る値で乗算する。) EMMOD REMMODA REMMODX (上記3つは、メモリ位置における算術的値の成る値に対する剰余をとる。) S HL M OD SHLMODA SHLMODX (上記3つは、メモリ位置における整数を成る値だけ左に桁送りする。) HRMOD SHRMODA SHRMODX (上記3つは、メモリ位置における整数を成る値だけ右に桁送りする。) UBMOD SUBMODA SUBMODX (上記3つは、メモリ位置における算術的値から成る値を減算する。) 増分演算子(Increment 0perators)POSTINCR PO3T[NCRA PO3T INCRX (上記3つは、それぞれ変数、パックドアレイ素子又はビットフィールドから表 現的値をフェッチし、フェッチしたものにコンiくイル時定数増分だけ加算し、 この結果をメモリ内に戻して記憶し、初期値(非増分値)を生成する。) PRE INCR PRE INCRA PRE INCRX (上記3つは、それぞれ変数、パックドアレイ素子又はビットフィールドから表 現的値をフェッチし、フェッチしたものにコンパイル時定数増分たけ加算し、こ の結果をメモリ内に戻して記憶し、増分値を生成する。)テーブル12 FETCHF 特定長さの文字ストリング又はビットストリングをフェッチする 。
FETCH3特定長さ及び特定文字を存するストリングがベースアドレスからオ フセットする文字サブストリング又はビットサブストリングをフェッチする。
FETCHV 長さがストリングのテキストに先行するワークにある可変長さ文 字ストリングをフェッチする。
FETCH2空白終了文字ストリングをフェッチする。
記憶演算子(Store 0perators)STORES 特定長さ及び特 定文字を有するストリングかベースアドレスからオフセットする文字サブストリ ング又はビットサブストリングを記憶する。
5TOREV 可変長さ文字ストリングを記憶する即ち、ストリングかストリン グの長さを含むワードに後続する場合にテキストを記憶する。
5TOREZ 空白終了文字ストリングを記憶する即ち、空白文字(全てのゼロ ビット)か後続するストリングのテキストを記憶する。
ストリング操作(String Mamipulations)CONCAT  他のストリングの全ての素子か後続する1個のストリングの全ての素子よりなる ストリングを計算する。
FILL 特定文字の複写(copy)を有する特定長さに埋め込んだ文字スト リングの複写を生成する。
REPLECATE 他のストリングの特定数の複写連結であるストリングを生 成する。
5UBSTR特定開始位置及び長さを存する特定ストリングからサブストリング を抜き出す。
TRANSLSTE 翻訳テーブルとして他の文字ストリングを使用して1個の 文字ストリングの複写を生成する。
BAND 2個のビットストリングのビット論理積(“set 1nterse ction”)を計算する。
BDIFF 2個のビットストリングのビット差(”set 5ubtract ion” )を計算する。
BEQV 2個のビットストリングのビット等価(equivalence’) を計算する。
BNOT ビットストリングのビット否定じset complemenじ)を 計算する。
BOR2個のビットストリングのビット論理和(“set union”)を計 算する。
BXOR2個のビットストリングのビット排他的論理和(“set diffe rence”)を計算する。
変換(Conversions) ELEMENT 文字ストリング又はビットストリングから1個の素子を抜き出 し、CHAR又はIMAXゼロ又はlとして生成する。
5CAST 成る他の値と同一のビットパターンを有するストリングを生成する 。
USTRING 単独の文字よりなるストリングを生成する。
INDEX 他のストリング内の1文字ストリングの第1出現位置を計算する。
LENGTHストリングの長さを計算する。
PTNDEX 他のストリング内の1個のストリングの第1出現位置を計算する が、双方のストリングか空の場合、lを生成する。
PSEARCH他の文字ストリング内にも見られる1文字ストリングの第1文字 の位置を計算するが、双方のストリングが空の場合、1を生成する。
PVERI FY 他の文字ストリング内にも見られない1文字ストリングの第 1文字の位置を計算するか、双方のストリングか空の場合、1を生成する。
5EARCH他の文字ストリング内にも見られる1文字ストリングの第1文字の 位置を計算する。
VERI FY 他の文字ストリング内にも見られない1文字ストリングの第1 文字の位置を計算する。
非理込み比較(Llnpadded Comparisons)EQL 1個の ストリングか他のストリングに等しい場合にテストする。
GEQ 1個のストリングか他のストリングよりも大きいか、又は等しい場合に テストする。
GTR1個のストリングか他のストリングよりも大きい場合にテストする。
LEo 1個のストリングか他のストリングよりも小さいか、又は等しい場合に テストする。
LS3 1個のストリングが他のストリングよりも小さい場合にテストする。
NEQ 1個のストリングか他のストリングとは異なる場合にテストする。
埋込比較(Padded Comparisons)EQLP 1個の埋め込み ストリングか他のストリングに等しい場合にテストする。
GEQP 1個の埋め込みストリングか他のストリングよりも大きいか、又は等 しい場合にテストする。
GTRP 1個の埋め込みストリングか他のストリングよりも大きい場合にテス トする。
LEQP 1個の埋め込みストリングが他のストリングよりも小さいか、又は等 しい場合にテストする。
LSSP 1個の埋め込みストリングか他のストリングよりも小さい場合にテス トする。
NEQP 1個の埋め込みストリングか他のストリングとは異なる場合にテスト する。
セット構造子(Set Con5tructors)BRANGE ビットの連 続シーケンスを既存のビットストリングの一つにセットすることにより新規なビ ットストリングを生成する。
BS lN0LE 単独のビットを既存のビットストリングのうちの一つにセッ トすることにより新規なビットストリングを生成する。
ZEROB ITS 特定数のセロビットのビットストリングを生成する。
セット叙述(Set Predicates)MEMBERビットストリングか 特定インデックスでの1ビツトを有するか否かをテストする。
5UPER3ET ビットストリング内の全ての1ビツトが他のビットストリン グの1ビツトでもあるか否かをテストする。
5UBSET ビットストリング内の全ての1ビツトが他のビットストリングの 1ビツトでもあるか否かをテストする。
テーブル13 プール演算子 LBSET 整数値の最下位ビ・ストかセ・ストされてし)るか否かをテストす る。
N0NZERO整数値か非ゼロであるか否かをテストする。
表現(Representat 1on)ALLB ITS 真に対して整数− 1(又は符号なしの等価値)を生成し、偽に対して0を生成する。
LSBIT 真に対して整数lを生成し、偽に対して0を生成する。
関係(Relstions) EQL 1個のスカラー値又はストリング値が他のものに等しい場合にテストす る。
EQLBLK メモリ内のバイトの2個のブロックか同一である場合にテストす る。
EQLP 1個の埋込みストリングが他のものに等しい場合にテストする。
GEQ 1個のスカラー値又はストリング値が他のものよりも大きいか、又は等 しい場合にテストする。
GEQP 1個の埋込みストリングか他のものよりも大きいか、又は等しい場合 にテストする。
GTR1個のスカラー値又はストリング値か他のものよりも大きい場合にテスト する。
GTRP 1個の埋込みストリングが他のものよりも大きい場合にテストする。
LEQ 1個のスカラー値又はストリング値か他のものよりも小さいか、又は等 しい場合にテストする。
LEQP 1個の埋込みストリングか他のものよりも小さいか、又は等しい場合 にテストする。
LS3 1個のスカラー値又はストリング値が他のものよりも小さい場合にテス トする。
LSSP 1個の埋込みストリングが他のものよりも小さい場合にテストする。
MEMBERビットストリングか特定インチ・7クスでの1ビツトを有するか否 かをテストする。
NEQ 1個のスカラー値又はストリング値か他のものと異なる場合にテストす る。
NEQBLK メモリ内のバイトの2個のプロ・ツクか他のものと異なる場合に テストする。
NEQP 1個の埋込みストリングか他のものと異なる場合にテストする。
5UPER3ET ビットストリング内の全ての1ビツトか他のビットストリン グの1ビツトでもあるか否かをテストする。
5UBSET ビットストリング内の全ての1ビツトか他のビットストリングの 1ビツトでもあるか否かをテストする。
論理関数(Logical Functions)LAND 2個のプール値の 論理積を計算する。
LANDC第1オペランドが偽である場合に、第2オペランドを「短絡(sho rt−circuiting)」評価して2個のプール値の論理積を計算する。
LANDU 第1オペランド及び第2オペランドの双方が評価されることを保証 して2個のプール値の論理積を計算する。
LEQV 2個のプール値の論理等価を計算する。
LNO72個のプール値の論理補数を計算する。
LOR2個のプール値の論理和を計算する。
LORC第1オペランドか真である場合に、第2オペランドをF短絡(shor t−circuj ting)J評価して2個のプール値の論理和を計算する。
LORU 第1オペランド及び第2オペランドの双方か評価されることを保証し て2個のプール値の論理和を計算する。
LXOR2個のプール値の排他的論理和を計算する。
条件式(Conditional Expressions)SEL ブールセ レクタに基ついて2個の値の一方を選択する。
5ELCブールセレクタに基ついて2個の式の一方を評価(evaluate) する。
5ELU ブールセレクタに基づいて2個の値の一方を選択するが、双方のオペ ランドか評価されることを保証する。
オペランドブリミタ(Operand Delimiter)FLWMARK  LAND、LOR,SEL、LANDC。
LORC,又は5ELCの組(Tuple)のオペランドのための組シーケンス の始まりをマークする。
7 ロー ) ントロール(Flow Control)ASSERT プール 値が偽である場合に、例外条件の信号を発生する。
BRCOND プール値に基づいて2個の宛先のうちの一方に分岐する。
テーブル14 チェック演算子(Checking 0perators)演算子 意味 ASSERT プール値が偽である場合、例外の信号を発生する。
CHKEQL 2個の値か等しくない場合、例外の信号を発生する。
CHK G E Q 1個の値か他の値よりも小さい場合、例外の信号を発生す る。
CHKGTR1個の値か他の値よりも小さいか又は等しい場合、例外の信号を発 生する。
CHK L E N E Q L ストリングの長さか特定整数に等しくない場 合、例外の信号を発生する。
いか、又は等しい場合、例外の信号を発生する。
CHKLENLSS ストリングの長さが特定整数よりも大きいか、又は等しい 場合、例外の信号を発生する。
CHKLEQ 1個の値が他の値よりも大きい場合、例外の信号を発生する。
CHKNEQ 1個の値が他の値に等しい場合、例外の信号を発生する。
CHKRANGE 1個の値が、他の2個の値で区切られる包含範囲にない場合 、例外の信号を発生する。
5IGNALS 例外の信号を無条件に発生する。
テーブル15 70−:+:/トロール演算子(Flow Control 0perator s’)演算子 意味 分岐目標(Branch Targets)BEG IN ルーチンのためのI LGの始めのマーク付けをする。
ENTRY ルーチンの入口ポイントを表示する。
L A B E L ブランチ目標を表示する。
VLABEL 仮想基本ブロックを表示する。
HANDLERTBS BRARITH算術的値か負か、ゼロか、圧力\(二基づし)で3個の宛先のう ちの一つに分岐する。
BRCOND ブール値が真か偽かに基づいて、2個の宛先のうちの一方に分岐 する。
BRSEL 下位テスト定数及び高位テスト定数力1整数セレクタの値を囲む宛 先を選択する。
ENTRYPTRルーチンのBEGINの組(tuple)をENTRYの組に 関連させる。
ESTLABEL TBS ESTENTRY TBS vBRANCHVLABELを仮想基本プロ、り(7)実存しつる宛先のセット に関連させる。
間接ブランチ(Indirect Branches)JUMP 外部ルーチン のコンテキストの復元又はリストアを含む[バウンドラベル変数 (bound 1abel variable)Jを経て制御を転送する。
JUMPLOCAL カレントルーチンのラベルのアドレスとなる。
フロー終了(Flow Termination”)JUMPSYMBOL カ レントルーチンを含むルーチンにおける特定ラベルシンボルに非局所的goto を行う。
RETURN カレントルーチンを終了し、コールの直後にコールしたリターン に制御を戻す。
5TOP カレントルーチンを終了し、コールしたリターンに制御を戻す。更に 、このルーチンか再びコールされないこと(このリターンかプログラム実行を終 了すること)をOEMに知らせる。
テーブル16 複写又はコピー(copy)セマンティクスとバインドセマンティクス(Bin d Semantics)との間の選択に影響を与えるパラメータシMust  bind パラメータをバインドセマンティクスで実施することを要求する。M ust bindが特定された場合、以後に列挙される他のフラグを無視する。
Conceal alias effectsエイリアスエフェクトが起こって はならないことを指示する。基本的に、このことは、パラメータを複写セマンテ ィクスて実施することを要求する。
Expose alias effectsエイリアスエフェクトか見えるよう にしなければならないことを指示する。基本的に、このことは、パラメータをバ インドセマンティクスて実施することを要求する。
Conceal alias effects又はExpose alias  effectsのいずれも特定されない場合、GEMはalias effeC tSについて心配する必要はない(恐らく、スカラーパラメータのだめの複写セ マンティクス及び集合パラメータのためのバインドセマンティクスを使用する) 。フロントエンドかこれらフラグの双方をセットするのはエラーである。
Input 呼出しくコール)に先立って、呼出しルーチンか実記憶位置を初期 化することを指示する。複写セマンティクスをこのルーチンに使用する場合、実 記憶位置はルーチン入口の局所記憶領域に複写されなけれはならない。
0utput このフラグかセットされる場合、呼出しルーチンは実記憶位置か 呼出しから復帰した際にパラメータの最終値を含むことを予期する。
このフラグかセットされない場合、呼出しルーチンは、実記憶位置かこの呼出し によって影響を受けないことを予期する。
テーブル17 種々のソース言語のためのパラメータセマンティックフラグの設定(セツティン グ) BL[SS parameters Don’ t care InputCp arameters Don’ t care InputStandard  FORTRAN parameters Don’t care Inputl output(Old)VAX FORTRAN parameters Ex pose InputloutputPascal value parame ters Conceal InputPascal vARparamete rs Expose InputloutputAda atomic par ameters Conceal see NoteAda aggregat e parameters Don’t care see NotePL/I  parameters Expose InputloutputNote: Adaルーチン宣言におけるパラメータ仕様のIN変更子、 OUT変更子、又 はIN OUT変更子によって特定される。
テーブル18 GEM$MECHANI SM列挙型式%式% 値(Value) :l−ラー(cal 1er)は引き数の値を渡す。実記憶 位置はパラメータリストの入口である。
リファレンス(Reference) コーラ−は成る記憶位置のアドレスを渡す。
実記憶位置は、アドレスがパラメータリストに渡される記憶位置である。
リファレンス(Reference)パラメータは長さパラメータフィールドを 有し、同一ルーチンにおける他のパラメータシンボルを指すよう定義される。こ の他のパラメータ(データ型式IMAXと値メカニズムを有していなければなら ない)は、未知のサイズのフラグがセットされると思われるリファレンス(Re ference)パラメータの実際の長さを受け取ると仮定される。(リファレ ンス(Ref erence)によって渡される記憶位置と値(Value)に よって渡される関連の長さとのこの組み合わせは、[アドレス及び長さくadd ress and lenght)」と称される。
ストリング(String) コーラ−は文字ストリング又はビットストリングのアドレス及び長さく可変文字 ストリングに対しては最大長さ)を含むデータ構造のアドレスを渡す。パラメー タシンボルに関連する記憶位置は、記述子データ構造における基底(ベース)ア ドレスフィールドの内容である。
アレイ(Array) コーラ−は文字ストリング又はヒツトストリングを一次 元アレイ又はビットアレイを記述するデータ構造のアドレスを渡す。パラメータ シンボルに関連する記憶位置は、記述子データ構造におけるベースアドレスフィ ールドの内容である。
ジェネラル(General) コーラ−は成る記憶位置のアドレスを含むデータ構造のアドレスを渡す。パラメ ータシンボルに関連する記憶位置は、記述子データ構造におけるベースアドレス フィールドの内容である。
フロントエンドはコーラ−にコードを発生し、記述子データ構造のベースアドレ スフィールド以外の全てのフィールドを満たすこと及び被呼ルーチンにコードを 発生してこれらフィールドに割り込むことの責任を負う。被呼ルーチンはDES CADDRを使用して記述子のアドレスを得る。
テーブル19 動的ストリングリターンメカニズム メカニズム 記述 固定バッファ コーラ−は、固定サイズのバッファを割当(Fixed Buf fer) て、そのための記述子を渡す。被呼ルーチンは、バッファに入ったの と同じたけの集合を複写し、集合のオリジナルの長さを戻す。コーラ−はオリジ ナル長さをバッファ長さに比較し、リターン値かはしょられたか否かを判定する 。(このことは、長さに対するエキストラリターン値では、上述の固定サイズメ カニズムと等価である。) スタック コーラ−は、記述子のアドレスを渡す。被(Stack) 呼ルーチ ンはスタックに集合を放置し、スタックポインタを集合を指し示すままにし、集 合のアドレス及び長さを特定する記述子を満たす。
動的ストリング コーラ−は、ヒープ割当てストリングの(Dynamic S tring) ための記述子(動的ストリング記述子)を渡す。被呼ルーチンは 、記述子によって指し示されるストリングをオーバーライドするか、又はこのス トリングの割当てを解除し、他のストリングを割当て、また記述子を更新する。
bpeclal regtster どaSS by reglster か具 −C′あル燭台(このみ真であるとし、この場合、OEMは(メカニズムが値で ない場合のみ意味かある。) Desc 5ize メカニズムがジェネラルである場合即ち、引き数を渡すよ う割当てる記述子のサイズである場合のみ意味かある。
0ffset 実引き数アドレスを組のアドレスオペランドからオフセットする ことを特定する種々のARGADRの組においてのみ使用される。
Effects 引き数を渡すことにより生ずるrread」サイドエフェクト を特徴付ける種々のARGADRの組においてのみ使用される。
Effects2 引き数を渡すことにより生ずるrwrite 」サイドエフ ェクトを特徴付ける種々のARGADRの組においてのみ使用される。
Ba5e Symbol 既知であるアドレスが渡されている変数のシンボルノ ードを指し示すポインタである種々のARGADRの組においてのみ使用される 。
テーブル21 ルーチンコール、引き数渡し及び値戻し演算子(Routine Ca1l。
Argument Passing、and Value Return 0p erators)演算子 意味 コール初期化(Call In1tialization)INITCALL  ルーチンコールのためのILの始めにマークを付け、引き数リストの割当てを行 う。
値の引き渡しくPassing a Value)ARGVAL 引き数として 表現的値を渡す。
ARGVALA 特定長さの文字ストリング又はビットストリングを渡す。
アドレスの引き渡しくPassing an Address)ARGADR表 現的値を含む記憶位置のアドレスを渡す。
ARGADRA 特定長さの文字ストリング又はビットストリングを含む記憶位 置のアドレスを渡す。
ARGADR8特定アドレスの記憶位置のビットストリング又は文字ストリング のサブストリングを渡す。
テンポラリの割当て及び引き渡し くAllocating and Passing a Temporary) ARGTMP スカラー値のための空間を割当て、そのアドレスを渡す。
ARGTMPA 特定サイズの文字ストリング又はビットストリングのための空 間を割当て、そのアドレスを渡す。
動的リターン値記述子の生成 (Creating a Dynamic Return Value Des criptor)ARGBUF 特定サイズのビットストリング又は文字ストリ ングの空間を割当て、固定バッファ動的リターンメカニズムで値を戻すことを必 要とする記述子を渡す。
ARGDYN スタック動的リターンメカニズムで値を戻すことを必要とする記 述子を渡す。
ARGSTK 動的ストリングメカニズム又はスタック動的リターンメカニズム てビットストリング又は文字ストリングを戻すことを必要とする動的ストリング 記述子を渡す。
ARGBLOCK 特定サイズのブロックのための空間を割当て、そのアドレス を渡す。
BLKF IELD スカラー値を先に割り当てられた引き数ブロックのフィー ルドに記憶する。
ARGDEF TNES 引き数ブロックに引き数を渡す属性のサイドエフェク トを記述する。
汎用記述子の充填 (Filling in a General Descripter)DSC F IELD 先に割り当てられた汎用記述子のフィールドにアドレス値又は整 数値を記憶する。
ルーチンの呼出しくCalling a Routine)CALL 特定アド レスでルーチンを呼び出す。
リターン値の検索 (Retrieving a Return Value)RESULTBUF  ARGBUFの組で割り当てられたテンポラリに戻され、長さが特定のレジス タに戻された若しストリング又はビットストリングを検索する。
RESULTDYN ARGDYNの組(Tuple)に応答して戻された文字 ストリング又はビットストリングのための動的ストリング記述子を生成する。
RESULTREG 特定レジスタからスカラー結果値を検索する。
RESULTSTK ARGSTKの組(Tuple)に応答してスタック上に 戻された文字ストリング又はヒツトストリングを検索する。
付 録 以下のアクションはアクション翻訳機の実行フローを制御する。
アクション(く結果 パル リスト〉:<一時 パル リスト〉)はテンプレー トのアクションシーケンスの開始をマークする。これはそれかオペランド変数を 割り付けるから、テンプレートの第1アクシヨンでなければならない。
双方のパル リスト(var−1ist)の内容はテンプレートの残りの期間に オペランド変数の命名に使用された識別子のコンマで区切られたシーケンスであ る。もしテンプレートがいずれの結果オペランド(result operan d)もしくは一時オペランド(temporary operand )を使用 しないなら、これらのパル リストのいずれかは空である。
結果 パル リザルト中の識別子は結果オペランドの名前である。ボイド コン テキストのILGノードは0結果オペランドを有し、一方、他のたいていの表現 は1結果オペランドを存している。例外は、2もしくは3オペランド(1つはス トリング本体をアドレスし、1つはストリング長に対するものであり、そして他 の1つはストリング本体を保持する)を要求するストリング結果と、2オペラン ド(1つは実成分に対するもの、他は虚成分に対するもの)を要求する複合結果 とを含んでいる。
遅延(DELAY)は遅延しないアクションの終了と遅延されたアクションの開 始をマークする。遅延アクションか翻訳されると、現行テンプレートの処理は、 対応ILGサブツリーが親サブツリーのリーフとして使用されるまで一時停止さ れる。親サブツリーのテンプレートか対応リーフを遅延しないなら、翻訳は遅延 アクションに続くアクションを継続しよう。
イグジット(出口)はアクションシーケンスの翻訳を終了する。
イグジットアクションの翻訳は結果オペランドを戻し、残りのオペランド変数と 局部TNを解放し、かっこのアクションシーケンスを遅延しないテンプレートに より翻訳を再開する。
終了−アクションはアクションシーケンスの終了をマークする。
それは翻訳されないから真のアクションではない。終了アクションオペレーショ ンはアクションシーケンスの字句的に最終の成分でなければならない。このオペ レーションはアクションオペレーションで宣言されたオペランド識別子の範囲の 終端をマークする。
非遅延(リーフ、oprl、opr2. 、、、、)は特定パターン「リーフ」 の遅延コンテキクスト アクションを処理する。リーフの結果オペランドはro prl’J、ropr2」等のオペランド変数にコピーされる。コピーされたオ ペランドの数はリーフのテンプレートの結果オペランドの数と整合しなければな らない。
ラベル(名前)はアクションシーケンス中の現行位置に[名前」を標識(lab el)する。
ゴーツー(名前)は翻訳機を分岐し、かつ「名前」により特定されたラベルに続 くアクションで処理を継続する。
TN割り付けと寿命アクション 増分−LON()はTNの寿命の決定に使用された線形次数ナンバ(Linea r 0rder Number)クロック変数を増分する。
使用(オペランド)は特定オペランド変数を参照する。このアクションはオペラ ンドが使用されるテンプレートの最後の場所をマークするのに使用され、かつ寿 命を適当に延長する。
割り付は一永久(オペランド、サイズ)は「サイズ」バイトの永久クラスTN  (permanent class TN)を創生し、かつ特定「オペランド」 変数により参照する。もし「サイズ」パラメータか喪失されると、TNのサイズ は現行テンプレートの結果データタイプにより決定される。このアクションはコ ンテキストか通過する間にTNを創生するのみである。TNバインド(TNB  IND)およびコードが通過する間にいかにしてこのTNがアクセスされイトの 遅延クラスTNを創生し、かつ特定「オペランド」変数により参照される。もし 「サイズ」パラメータが喪失すると、TNのサイズは現行テンプレートの結果デ ータ タイプにより決定される。このアクションはコンテキスト、TNバインド およびコードの各々か通過する間にTNを創生する。このアクションは実行され ないが、一方、遅延されないアクションを翻訳する。このTNの寿命はこのTN を使用する結果か使用される場合に終了局部クラスTNを創生し、かつ特定「オ ペランド」変数により参照される。もしrサイズ」パラメータか喪失すると、T Nのサイズは現行テンプレートの結果データタイプにより決定される。このアク ションはコンテキスト、TNバインドおよびコードの各々が通過する間にTNを 創生する。このTNの寿命はその創生と同じテンプレートで終了しなければなら ない。
フォース レジスタ(オペランド)は「オペランド」変数で特定されたTNをメ モリにあってはならないようにマークする。このことはどのレジスタもTNか割 り付けられない場合に利用可能でない限りレジスタへの割り付けを一般に意味し ている。
フォース メモリ(オペランド)は「オペランド」変数で特定されたTNをレジ スタにあってはならないようにマークする。このことはスタック位置への割り付 けを一般に保変数で特定されたTNを割り付けなくてはならぬようマリ付けのす べての3つが、これら3つの条件と同じTN上で矛盾し、かつすべて満足できな いようにすることは誤りである。
優先(oprl、opr2) もし「オペランド」かレジスタに割り付けられる なら、「オペランド2」は同じレジスタに割り付けられ、さもなければ、「オペ ランド2」は「オペランドl」とは独立に割り付けられる。「オペランド2」を 「オペランドNと同じレジスタに強制することは、たとえ「オペランド1」と「 オペランド2」が競合する寿命を有していても生起する。(優先アクションに優 先する「委任(mandatoru) Jに対抗して優先す「オペランド」によ り特定されたTNの非割り付けのコストを増大する。
リザーブ RO(ナンバー)は連続レジスタの「ナンバー」がレジスタ0による 開始を維持するようにする。
テスト メモリ(オペランド、ラベル)は特定「オペランド」変数により参照さ れたTNをテストする。もしTNがメモリなら、アクション翻訳機は特定「ラベ ル」に分岐する。コンテキストとTNバインドか通過する間に、このアクション は、フォース メモリか行われない限り、割り付けられないTNかメモリに存在 しないことを仮定する。
テスト レジスタ(オペランド、ラベル)は特定の「オペランド」変数により参 照されたTNをテストする。もしTNがレジスタなら、アクション翻訳機は特定 「ラベル」に分岐する。コンテキストとTNバインドが通過する間に、このアク ションは、フォース メモリかTNで行われない限り、割り付けられないTNが レジスタにあることを仮定する。
−ンにより整合された特定「ノード」のリテラル値を特定「オペランド」変数に 負荷する。もし「ノード」がリテラルでないなら、それは誤りである。
セーブ−TN(オペランド、ノード、フィールド)は「オペランド」変数により 特定された永久クラスTNへの参照をセーブする。コンテキストが通過する間に 、TNポインターはテンプレートの特定「ノード」により整合されたILGタペ ル(I L G tuple)の成分「フィールド」てセーブされる。TNバイ ンドとコードが通過する間に、この情報は特定「ノード」の特定の「フィールド 」からフェッチされる。各永久クラスTNは、TNバインドとコードが通過する 間に同じTNが位置できるように、コンテキストか適当なILGフィールドを通 過する間にセーブされなけれはならない。遅延クラスと局部クラスTNはそれら が決してセーブされるべきてないように各通過を再創生ずる。
スタ、フィールド ベース)は特定「オペランド」変数の位置をセーブする。こ の情報はテンプレートの特定「ノード」により整合されたILGタペルでセーブ される。レジスタ値は成分「フィールドルジスタ」でセーブされる。ある種のレ ジスタ値は生起しなかった割り付けを符号化するか、あるいはオペランドがレジ スタの代わりにスタックに割り付けられる。もしオペランドかスタックに割り付 けられるなら、スタックオフセットは「フプレートパターンにより整合された特 定FノードJの特定「フィールド」の特定「オペランド」のレジスタナンバーを セーブする。このレジスタナンバーの組はどんなレジスタも割り付けられなかっ たということの符号化を含んでいる。もし特定のオペランドがメモリ位置に割り 付けられるなら誤りか生起する。
コード放出アクション 移動−値(opr src、 opr dst )はropr src Jオペ ランドからr oprdStJオペランドの値を移動するコードを発生する。も しopr srcとopr dstが同一であり、かつこのアクションがそれら を同一にする割り付はルーチン(allocator)の指示(hint)であ るなら、どのコードも発生されない。
放出(オプコード、オペランド11オペランド2.、、、、)は特定「オブコー ド」からなり、かつ命令のアドレスモードとして特定オペランド変数を使用する 目的命令を出力する。
メーク−アドレス−モード(opr offset、 opr base、 o pr 1ndex、 opr result)は変数ropr resultJ に新しいオペランドを作る。これはVAXアドレスモードを創生すVAX特定ア クションである。もしropr offsetJか喪失するなら、零が仮定され る。もしropr offset」かメモリ位置を特定するなら、ropr o ffset」は零を特定しなければならず、かつropr 1ndexJは喪失 されなければならない。
−」を表す「オペランド」に新しいアドレスを作る。
「ナンバー」かパターンにより整合されたノードでないリテラル値であることに 注意。その代わり、L ITREF ILGノートの値を含むアドレスモードを 創生ずる非常に簡単な付加テンプレートと非常に複雑なアドレシングテンプレー トを含むいくつかの実例か存在する。これらはテンプレートを書くのに容易なも のと困難なもの双方の実例を与えるへきである。
テンプレートの結果値モードとパターン整合リーフの値モードの組は目標アーキ テクチャ−のデータタイプ特性を使用する。
これらの値モードは値が符号化される種々のやり方の列挙(enumerat  1on)である。この列挙は表現値が仮想計算機で符号化できる種々のやり方を 命名する。
VAXの実例 RV(レジスタ値) MV(インダイレクションとインデキシングの無いメモリ値) MVIND(インダイレクションはあるかインデキシングは無いメモリ値) MVI(バイトコンテキストのあるメモリ値)MV2(ワードコンテキストのあ るメモリ値)MV4(長いコンテキストのあるメモリ値)MV8(カッドコンテ キストのあるメモリ値)MVI6(オクトコンテキストのあるメモリ値)AM( インダイレクションとインデキシングの無いアドレスモード) AMIND(インダイレクションは無いかインデキシングも無いアドレスモード ) AMINXI (バイトインデキシングのあるアドレスモード) AMINX2 (ワードインデキシングのあるアドレスモード) AMINX4 (長いインデキシングのあるアドレスモード)AMINX8 ( カッドインデキシングのあるアドレスモード) AMINXI6(オクトインデキシングのあるアドレスモード) PCFLOW(偽ラベルあるいは真ラベルへのジャンプにより表されたフローブ ール) ストリングGV(長さおよびメモリのアドレスとして符号化されたストリング値 ) VA、RYV(長さワードのアドレスとして符号化された変動ストリング値) ボイド(サイド効果のみを持つ動作で使用されたとんな値も存在しない) VAX上の単純ADDL3 結果値モー)”:RV パターンツリー 0 :ADD、INT32 1,2 1 : LEAF (RV、MV、MVIND、MV412 :LEAF (R V、MV、MVIND、MV41アクション(結果、リーフl、リーフ2);!  「結果」は一時結果である ! 「リーフl」はLEAFI : (左オペランド)! [リーフ2JはLE AF2 : (右オペランド)非遅延(1,リーフ1); 非遅延(2,リーフ2): 使用(リーフl): 使用(リーフ2): 増分 LON。
放出(ADDL3. リーフl、リーフ2.結果):註:レジスタ割り付はルー チンで使用されたヒューリスティクトは、結果オペランドがオペランド1あるい はオペランド2の1つに同等に割り付けられる高い確率を保証する。そのような 割り付けはADDL3命令の代わりにADDL2命令となろう。
VAX上の単純5UBL3 結果値モード:Rv パターンツリー: 0 :SUB、INT32 1,2 1 : LEAF (RV、MV、MVIND、MV4)2 : LEAF ( RV、MV、MVIND、MV4)パターンテスト: ノン コスト:2 アクション・ アクション(結果;リーフl、リーフ2):! 「結果」は一時結果である ! 「リーフ1」はLEAFI:(左オペランド)! 「リーフ2」はLEAF 2:(右オペランド)非遅延(1,リーフ1); 非遅延(2,リーフ2); 使用(リーフ2); 放出(SUBL3. リーフ2.リーフ1.結果):遅延: 註:オペランド2を使用する後ではあるが、しかしオペランド1を使用する前の LONの増分は、レジスタ割り付はルーチンのヒユーリスティクスかオペランド lと結果オペランドと、5UBL3の代わりに5UBL2命令となる同じ割り付 けを与える確率を増大する。
VAX上のバイトインデクスされたアドレスモードこのテンプレートは付加すべ きk(ペース レジスタ)[インデクス レジスタコアドレスモードを発生する 。テンプレートは2つのオペランドを保持するためにレジスタか使用されること をこのテンプレートの選択か保証するVAX フォルトラン規則に続く。
結果値モード:AMINXl パターンツリー。
0 :ADD、INT32 1.2 1 :LITREF、INT32 2:ADD、INT32 3,4 3 : LEAF (RV) 4 : LEAF (RV) スタ、リーフ4.リーフ3,1it);!「結果jは結果アドレスモードlit  (ペース レジスジスタである ある ! 「リーフ4」はLEAF4である: (インデクス リーフ) ! 「リーフ3JはLEAF3である: (ペース リーフ)! 「目t」はL ITREFIである:遅延: ! フォース LEAF4 :レジスタの中に! 非遅延(4,リーフ4): 優先(リーフ4.インデクスーレジスタ)。
使用(リーフ4); ! フォース LEAF3:レジスタの中に非遅延(3,リーフ3): 割り付け 遅延(ペース レジスタ);優先(リーフ3、ペース レジスタ): 使用(リーフ3): ! アドレスモードrlit (リーフ3)[リーフ4コJの発生 レジスタにLEAFを強制する7アクシヨンは多分VAXの共通オペレーション であることに注意。その結果、これらの7アクシヨンを結合する効果を有する「 マクロ」アクションか存在しよう。
結果値モード:Rv パターンツリー: 0 :ADD、INT64 1,2 1 : L ITREF、INT64 2 : LEAF [RVI するなら続く 果、 lit ) ; ! 「結果」は一時結果である ! 「リーフ2」はリーフ2を記述する:! 「レジスタ2」はリーフ2を保持 するスクラッチレジj rlitJはリテラル1である: 非遅延(2,リーフ2)二 使用(リーフ2); 使用(レジスタ2): 移動 値(レジスタ 結果、結果)。
遅延。
註:レジスタ割り付はルーチンのヒユーリスティックスは、リーフ2とレジスタ 2か同じレジスタを得る高い確率を有することを保証する。また、結果とレジス タ 結果は同じレジスタをつかまえるように見える。
VAXの長いコンテキストインデキシングこのテンプレートは、付加を後続する 4の乗算をk(リーフ3)[リーフ6]アドレスモードが行うことを保証する。
レジスタか2つのオペランドの保持に利用可能であることをこのテンプレートの 選択か保証しないVAXパスカル規約にこのテンブレー1・は従う。もしレジス タ利用可能でないなら、アドレスモードは一時メモリを使用してシミュレートさ れる。
結果値モード:AMINX4 パターンツリー: 0 :ADD、INT32 1.2 1 : L ITREF< lNR322:ADD、INT32 3,4 3 : LEAF (RVI 4 :MUL、INT32 5. 6 5 : L IT、INT32 6 : LEAF (RV) リテラル 4(5);! もしリテラル値が4であるなスタ、リーフ6、リーフ 3.1it、一時):! 「結果」は結果アドレスモードである! 「インデク スーレジスタ」はインデクススクラッチレジスタである ! 「ベース−レジスタJはベーススクラッチレジスタである ! 「リーフ6」はLEAF6である= (インデクス リーフ) ! 「リーフ3」はLEAF3である= (ベース リーフ)! rlit4は リテラルlである: ! 「一時」はリテラル#2(ノー インデクス ケース)であるか ! (リーフ3)[インデクス レジスタコである 遅延: 負荷 リテラル(1,lit ) ; 非遅延(6,リーフ6): 非遅延(3,リーフ3): 優先(リーフ6、インデクス レジスタ);割り付け 遅延(ペース レジスタ );優先(リーフ6、ペース レジスタ);! レジスタでインデクスを確実に するテスト メモリ(ペース レジスタ、ノー ペース):移動 値(リーフ3 .ペース レジスタ)。
! レジスタでペースを確実にする !1it5(ペース2)[インデクスl]! 一時レジスタインデクスなし 負荷 定数(2,一時): 放出(ASHL、一時、リーフ6、インデクス レジスタ):! 一時レジスタ ペースなし 時); ! インデクスは一時にない 放出(ADDL3.lit 、リーフ3.ペース レジスタ)。
# lit ! @ベース メモリ「インデクス レジスタ]放出ニ ラベル(インデクス バズ レジスタ 一時);! ベースレジスタはないか、 一時インデクスはある放出(MOVAL、一時、インデクス レジスタ):j  MOVAL @リーフ3 [インデクス レジスタコ。
インデクス レジスタ 放出(ADDL 2.1+t 、インデクス レジスタ);イグジットエ 付 録 以下のルーチンはGEM ILにより規定された代表的タイプに対応する基本タ イプを規定する。
GEM TD DEF BASICTYPEはタイプ ニル、アドレス、符号付 きおよび非符号付き整数、浮動数および複素数を規定する。GEM TD DE F CHARTYPEは多数の基本タイプにわたって規定された文字の定義を許 容する。
ブーリアンは基本タイプと考えられないことに注意。パスカルのような言語のコ ンパイラ−は真要素と偽要素を含む列挙としてのブーリアンを規定することが提 案されている。
LOCATOR: v a I u e。
整数あるいは実数のような基本タイプを規定する。DEる。LOCATORはG EMあるいは異種のロケータ−である。LOCATORはヌルロケータ−であっ てもよい。
要素でなければならない。特に除外されるのはBOOL。
LOCATOR: va lue。
基本タイプとして文字(charater)を規定する。例えば、文字はUIN T8.UINT16.UINT32等であってもよい。
DECL BLKはタイプか規定されるブロックノードである。
LOCATORはGEMあるいは異種のロケータ−である。LOCATORはヌ ルロケータ−であってもよい。TYPE NAMEはタイプを記述する変動スト リングであり、かっヌルであってもよい。BASTCTYPEは規定されている タイプであり、かつ文字セットのサイズと表現を決定する。それはGEM TY P列挙の要素でなけれはならず、かつサイズ8.16および32ビツトの符号付 きおよび非符号付き整数に制限され集合を規定する。
LOCATOR: va ] ue。
タイプの文字であり、かつストリングは下側オペランドとである。LOCATO RはGEMあるいは異種のロケータ−である。LOCATORはヌルロケータ− であってもよ出しにより戻されたストリングの文字タイプに対して創生されたタ イプノードのあだ名(handle)である。ヌル。5TRING UBと5T RING LBはストリングの上限と下限である。
GEM BLOCK N0DE。
LOCATOR: v a 1 u e。
+1要素からなるビットストリングを規定する。未知のサイズのビットストリン グはBITSTRING LB値より小さいBITSTRING UB値により 示される。
DECL BLKはタイプか規定されるブロックノートである。LOCATOR はGEMあるいは異種のロケータ−である。LOCATORはヌルロケータ−で ありもよい。
TYPE NAMEはタイプを記述する変動ストリングであり、かつヌルてあっ てもよい。BITSTRING UBとBTTSTRING LBはヒツトスト リングの上限と下限である。
い名前あるいは同義語の定義を支持する。GEM TD SET POTNTE RTYPEはタイプ化されたポインターあるいはタイプ化されないポインターの 定義を許容する。OEM関連するタイプかGEMタイプ定義サービスで特定され たそのタイプ情報を有した後で以前に特定されたポインターのタイプを設定する 。
TYPE NODE= GEM TD DEF BASICTYPE(LOCATOR: v a I  u e。
新しいタイプ名を規定し、かつそれをタイプノードDELOCATORはGEM あるいは異種のロケータ−である。
LOCATORはヌルロケータ−であってもよい。TYPブ定義で創生されたタ イプノードである。
TYPE NODE= GEM TD DEF POINTER(LOCATOR: va 1 u e 。
ポインタータイプを規定する。POINTERTYPEは既存タイプ定義のタイ プノードであってもよく、あるいはタイプ化されないポインターを示すヌルであ ってもよい。TYPE NAMEはタイプを記述する変動ストリングであり、か つヌルであってもよい。LOCATORはGEMあるいは異種のロケータ−であ る。LOCATORはヌルロケータ−であってもよい。DECL BLKはタイ プか規定されるブロックノードである。
GEM〜TD SET POINTERTYPE(れた既存のポインタ一定義に 対して、ポインターに関連するタイプを再規定する。POINTERTYPEは ポインターを規定する既存のタイプノードのあだ名である。NEW TYPEは 既存のタイプ定義を創生じたタイプノードのあだ名である。
ENUM、GEM TD SET ENUM ELEMENTおよびGEM T D SETは規定されたタイプにわたるレンジ、列挙、列挙要素およびセットを 規定する。
LOCATOR: va I ue。
レンジタイプを規定する。レンジはその基礎となるタイLOW VALとRAN GE HIGHVALにより示されたレンジの低い値と高い値により規定される 。DECL BLKはタイプが規定されるブロックノードである。LOCATO RはGEMあるいは異種のロケータ−である。LOCATORはヌルロケータ− であってもよい。TYPE NAMEはタイプを記述する変動ストリングであり 、ヌルであってもよい。RLOCATOR: va I ue。
ET ENUM ELEMENTの呼び出しにより規定される。DECL BL Kはタイプか規定されるブロックノードである。LOCATORはG E Mあ るいは異種のロケータ−である。LOCATORはヌルロケータ−であってもよ い。ENUM TYPEは既存の基本タイプ定義を創生ずるタイプノードのあだ 名である。
前端はまず最終順序の列挙定義に列挙要素を印加しなければならない。
LOCATOR: va l ue。
ENUM ELEMENT VALUEによりENUMELEMENT NAM Eと命名された要素であるタイプノードあだ名ENUM TYPEにより示され た列挙を規定する。ENUM TYPEは列挙の既存のタイプノードのあだ名で ある。LOCATORはGEMあるいは異種のロケータ−である。LOCATO Rはヌルロケータ−でEMENT VALUEは要素の値を規定するリテラルノ LOCATOR: va I ue。
ねるブロックノートである。LOCATORはGEMあるいは異種のロケータ− である。LOCATORはヌルロケータ−では以下のものにより戻されたあだ名 であってもよい。
OGEM TD TYPEDEF 限界の規定に使用てきる。アレイ次元の限界は固定され、調整可能であるかある いは仮定的なものとして規定てきる。
LOCATOR: va ] ue。
ツクノードである。LOCATORはGEMあるいは異種のロケータ−である。
LOCATORはヌルロケータ−であってもよい。TYPE NAMEはタイプ を記述する変動ストリングであり、かつヌルであってもよい。ARRA定するタ イプノードのである。ARRAY DIM C0UNTはアレイの次元数である 。
次元カウントはリテラルノード以外の値の次元として伝送される。
アレイの次元の限界はGEM TD SET ARRAY BOUNDSルーチ ン手段により特定される。
GEM TD SET ARRAY BOUNDS(ARRAY TYPE : value。
LOCATOR: v a l u e。
イブ定義に対して、ARRAY DIMにより示された次元の限界を設定する。
LOCATORはGEMあるいは異種のロケータ−である。LOCATORはヌ ルロケータ−であってもよい。DIM INDEX LOWとDIMるのに使用 されたタイプを規定するタイプノードのあだ名である。DIM 5TRIDEは 規定されている次元の続いて起こる要素間のバイトで表したサイズを規定する。
ブランクA定数の上限あるいは下限はリテラルノードにより特定される。非一定 限界は限界値の位置を規定するシンボルノードにより示される。
構造、バリアントおよびユニオンの定義以下のルーチンはバリアントとユニオン を含む構造を規定するのに使用される。バリアント成分を有する構造は以下のル ーチンを呼び出すことにより規定される。
OGEM TD DEF 5TRUCTOGEM TD SET 5TRUCT  ELEMENT OGEM TD 5TRUCT 5ELECTOROGEM TD DEF 5 TRUCT VARIAT OGEM TD SET 5ELECTORRANE 0 GEM TD SET 5ELECTORDEFULT OGEM TD DEF UNION OGEM TD SET UNTON MEMBERLOCATOR: v a  I u e。
構造あるいは記録を規定する。DECL BLKは構造か宣言されるブロックノ ートである。LOCATORはOEMあるいは異種のロケータ−である。LOC ATORはヌルロケータ−であってもよい。TYPE NAMEはタイプを記述 する変動ストリングであり、かっヌルてあってGEM TD SET 5TRU CT ELEMENT(LOCATOR: va lue。
ELEMENT NAME :in VS SR た構造の要素を規定する。この要素はELEMENT NAMEと命名されかつ タイプノードあだ名ELEMENT−を規定しないなら要素の直接の親バリアン トあるいはヌルである。LOCATORはGEMあるいは異種のロケータ−であ る。LOCATORはヌルロケータ−であってもよい。その位置は定義されてい る構造のルートに関連し、構造要素のサイズはELEMENT 5IZEにより ビプログラム断片の構造要素clと02の定義を支持するよう特定されている。
typedef 5truct ml (char cl : 4; char c2 : 4; ) : TYPE NODE= GEM TD SET 5TRUCT 5ELECTOR(STRUCT TY PE :value。
VARIANT PARENT :value。
LOCATOR: va 1 ue。
ELEMENT NAME 二 in VS STRELEMENT TYPE  :value。
記録のバリアント成分のセレクターを規定する。セレクターは構造のバリアント を決定する構造要素である。セレクター要素はELEMENT NAMEと命名 され、かつタイプノードあだ名ELEMENT TYPEにより規定されたタイ プを有している。VARIANT PARENTはセレクター要素の直接の親バ リアントであるか、あるいはもしもこの要素かバリアントのメンバーでないなら ヌルである。LOCATORはGEMあるいは異種のロケータ−である。LOC ATORはヌルロケータ−であってもよい。その位置は規定されている構造のル ートに相対的であり、かつELEMENT LOCBYTEとELEMENT  LOCBITにより特定される。構造要素のサイズはELEMENT 5IZE によりビットで特定される。
TYPE NODE= GEM TD DEF 5TRUCT VARIANT(STRUCT TYP E :value。
LOCATOR: va 1 u e)構造のバリアントを規定する。5ELE CTORTYPEはバリアントを選択するタイプノードである。LOCATOR はGEMあるいは異種のロケータ−である。LOCATORはヌルロケータ−で あってもよい。バリアントを選択するセレクターの値は次のものによって特定さ れる。
LOCATOR: va 1 ue。
バリアントVARIANT TYPEのセレクターレンジを規定する。LOCA TORはGEMあるいは異種のロケータ−である。LOCATORはヌルロケー タ−であってもよい。単一セレクター値を規定する場合にRANGEUPPER BOUNDはRANGE LOWERBOUNDと同し値を有すべきである。単 一セレクターとレンジセレクターの結合はバリアントに印加してもよい。
GEM TD SET 5ELECTORDEFAULT( VARIANT TYPE :value。
・ LOCATOR:value) そのセレクターのすへての値が列挙されない場合にノくリアントタイプVARI ANT TYPEを省略バリアント(default variant)である と規定する。LOCATORはGEMあるいは異種のロケータ−である。LOC ATORはヌルロケータ−であってもよい。スカラーセレクターきである。スカ ラーセレクターとレンジの結合はバリアントに印加してもよい。
LOCATOR: va lue。
を記述する変動ストリングであり、かつヌルてあってもよい。LOCATORは GEMあるいは異種のロケータ−である。LOCATORはヌルロケータ−であ ってもよい。
UNTON 5IZEはバイトで表した構造のサイズである。ユニオンのメンバ ーはルーチンGEM TD 5ETUrlON MEMBERの呼び出しにより 規定される。
GEM TD SET UNION MEMBER(UNION TYPE : value。
LOCATOR: v a 1 u e。
オンのメンバーを規定する。UNION TYPEはメンバーを含むユニオンの タイプノードである。LOCATORはGEMあるいは異種のロケータ−である 。LOCATORはヌルロケータ−であってもよい。MEMBERNAMEはメ ンバーの名前を規定する変動ストリングである。
関数とルーチンパラメータの定義 GEM TD DEF FUNCTION TYPE(LOCATOR: v  a 1 u e。
れたタイプである手順パラメータのタイプを規定する。これはエントリーシンボ ルのタイプの規定に使用されず、むしろそれはルーチンのパラメータを記述する ことに注意。
DECL BLKはタイプが規定されるブロックノードである。LOCATOR はGEMあるいは異種のロケータ−である。LOCATORはヌルロケータ−で あってもよい。
TYPE NAMEはタイプを記述する変動ストリングであり、かつヌルてあっ てもよい。
実例 以下の実例は多数のタイプとシンボルおよびOEMにそれらを記述するのに使用 される機構を記述している。パスカルタイプのブーリアンはGEMタイプユニッ ト32にわたる列挙として規定されることに注意。
主要()( int a; 符号なしint ua; フロート X; 二重 xx: 文字ストリング()=[ヘロー、ワールド\n」 :TYP INT32=GE M TD DEF BAS ICTYPTYPUINT32=GEM TD D EF BASICTYTYPREALF=GEM TD DEF BASICT YTYPREALG=GEM TD DEF BASICTYTYPCHAR8 =GEM TD DEF BASICTYTYPSTRING=GEM TD  DEF 5TRING(TYPCHAR8゜ litノード(len (str )) ) ;ロック、ロケータ−1“ ブー リアン’ TYPUINT32);GEM TD SET ENUM ELEM ENT (TYPBOOL、ロケータ−1′偽’ 、litノード(val=o )) :GEM TD SET ENUM ELEMENT(TYPBOOL、 ロケータ−1′真’ 、 litノード(val=1)) :文字およびビット 集合の実例 ルーチン testit (parml、、、、、 ) =開始 自己ステータス 二ビットベクトル[15] 。
フラグビット:ビットベクトル[8] ;バインドdビットベクトル=、par ml :ビットベクトル[]:lit ノード(val= 0 )、lit ノ ード(val = 14)) ;lit ノード(val= 0 )、lit  ノード(val=7)) ;lit ノード(val=0)、lit ノート( val= 1 )) ;構造 tノード ( タイプdefs 構造 tノー下 5sval:tノード *tp; Zノード *zp ; 構造 Zノード ( TYPSTRUCT1=構造tノードの定義! tノードのアライアスとして5 svalを規定するTRTJCTI); ■) : ! 「同義語」ポインターを規定し、次に構造Zノードを規定する。最後に ! ポインタータイプ を修正する TYPSTRUCT2=構造Zノードの定義PTR2,TYPSTRUCT2)  ;レンジ列挙とセラ)・の実例 ボイド myproc() ( d n 2 =100 、、 I(15;d n 3 =66000 、、66 001 ;ウィークデー=(月曜、火曜、水曜、木曜、金曜):ノ\ル sl :dnlのセット。
! レンジdnlを規定する TYPUINT8=GEM TD DEF BASICTTYPRANGE1= GEM TD DEF RANGE(myproc ブロック、ロケータ−、’ dnl’。
TYPUINT8.lit ノード(val=0)、litノート(val=  6 ) ; ! レンジdn2を規定する TYPUINT8.Ht ノード(val=100)、litノード(vaI= 105) : ! レンジdn3を規定する lit ノード(val=66000)、lit /−ド(val=66001 ) ;UNIT8); GEM TD SET ENUM ELEMENT(TYPENUMl、ロケー タ−2′月曜’ 、 litノード(val= O));GEM TD SET  ENUM ELEMENT(TYPENUMI、ロケータ−1′火曜’ 、  litノード(val= 1 ));GEM TD SET ENUM ELE MENT(TYPENUMI、ロケータ−2′水曜’ 、Htノード(yal= 2));GEM TD SET ENUM ELEMENT(TYPENUMl 、 ロケータ−9′木曜’ 、 litノード(val= 3 )):GEM  TD SET ENUM ELEMENT(TYPENUMl、ロケータ−2′ 金曜’ 、 litノード(val= 4 )):TYPENUM2=GEM  TD DEF ENUM (myprocGEM TD SET ENUM E LEMENT(TYPENUM2. ロケータ−、’ int’ 、litノー ド(val=0)): GEM TD SET ENUM ELEMENT(TYPENUM2. ロケ ータ−、’ re’ 、litノード(val= 1 ));GEM TD S ET ENUM ELEMENT (TYPENUM2.0ケータ−、’ bo o’ 、litノード(val=2)) ; ! パルsl、s2およびs3のセットを規定する。
TYPSET1=GEM TD SET(myproc ブロック。
ロケータ−1°セツト’ 、TYPRANGE 1):TYPSET2=GEM  TD SET Cmyproc ブロック。
ロケータ−9′セツト’ 、TYPENUMI);TYPSET3=GEM T D SET (myproc−ブロック。
ロケータ−2°セット°、TYPENUM2);nd=記録90.。
パル aryl:整数のアレイ[1、、101ary2:整数のアレイ[1、、10, 100、、110コ ;ary3 :ndのアレイ[900、、1700コar y4 :ndのアレイ[’ a’ 、、’ z’]TYPSTRUCTI=記録 タイプndの定義! アレイ1raryl」を規定する TYPINT32=GEM TD DEF BASICTYPTYPARRAY =GEM TD DEF ARRAY TYGEM TD DEF ARRAY  BOUNDS(TYPARRAY、ロケータ−、I、 litノード(val = 1 ) 、 litノード(val=10) 、 TYP INT32.  litノード(val= 4 ));! アレイ’ary2ノを規定する TYPARRAY=GEM TD DEF ARRAY(ディマー ブロック、 ロケータ−、ヌル、TYPINT32,2);GEM TD SET ARRA Y BOUNDS (T¥PARRAY、ロケータ−、1,litノード(va l= 1) 、 litノート(val=10) 、 TYP INT32.  lit ノード(val= 4 ’)):GEM TD SET ARRAY  BOUNDS(TYPARRAY、ロケータ−、2,1itノート(val=1 00) 、 litノード(val=110)、TYP INT32. lit ノート(value= 40)) :! 代案として、ary2のアレイ規格を 次のように規定してもよい。
TYPARRAYI=GEM TD SET ARRAY(ディマー ブロック 、ロケータ−、ヌル、TYPINT32.1):GEM TD SET ARR AY BOUNDS(TYPARRAYl、ロケータ−、1,litノード(v al=100) 、 litノード(val=110) 、 TYP INT3 2. litノード(value=40)); TYPARRAY2=GEM TD SET ARRAY(ディマー ブロック 、ロケータ−、ヌル、TYPARRAYI。
1): GEM TD SET ARRAY BOUNDS(TYPARRAY2. ロ ケータ−、l、litノード(val= 1 ) 、 litノード(val= 10) 、TYP I NT32. Htノード(value=40)); ! アレイra r y 3Jを規定するTYPARRAY=GEM TD D EF ARRAY(ディマー ブロック、ロケータ−、ヌル、TYPARRAY I、1);GEM TD DEF ARRAY BOUNDS(TYPARRA Y、ロケータ−、1,litノード(val=900) 、litノード(va l=1700)、TYP INT32. s i z e o f (n d’ ));調整可能なアレイ定義の実例 サブルーチン x (cv、aryl、ary2.a、b)文字*(*) cv 次元 aryl (1:10. l :b)次元 ary2 (a : b、1  :*)TYPINT32=GEM TD DEF BASICTYPTYPC HAR=GEM TD DEF CHARTYPE! アレイ「cv」を規定す る TYP INT=GEM TD DEF ARRAY (x ブロック、ロケー タ−、ヌル、TYPCHAR,I)。
GEM TD SET ARRAY BOUNDS (TYPARRAYl、ロ ケータ−、1,litノード(val= 1 ) 、 litノード(val=  1)、TYP INT32.litノード(value=1)): i アレイrary Nを規定する TYPREALF=GEM TD DEF BASICTYPE (x ブロッ ク、ロケータ−、ヌル、GEM TYP KREALF) ; TYPARRAY=GEM TD DEF ARRAY(x−ブロック、ロケー タ−、TYPREALF、2);2、1itノード(val=4) ) ;GE M TD SET ARRAY BOUNDS(TYPARRAY、1. ロケ ータ−、litノード(val= 1) 、 litノー l” (val=4 0)、TYP INT32.lit ノード(vaLue= 4 )) ;GE M TD SET ARRAY BOUNDS(TYPARRAY、2. ロケ ータ−、litノード(vat:= 1) 、b−シンボル、TYP INT3 2.litノード(value=4) ) ;********** ! アレイrary2Jを規定する TYPARRAY=GEM TD DEF ARRAY(xブロック、ロケータ −、ヌル、TYPREALF、TYPINT32. 2. 1itノード(va l=4) ) ;GEM TD SET ARRAY BOUNDS (TYP ARRAY、ロケータ−1■、a シンボル、b シンボル、TYP INT3 2. litノード(val=4) ) ;GEM TD SET ARRAY  BOUNDS(TYPARRAY、ロケータ−、2,litノード(val=  1 ) 、 litノード(val=1)、TYP INT32.litノー ド(value= 4 )) ;を−タイプ=(it、re・ ptr・ vl ・ v2・ v3):ndp =@nd nd=記録 it : (iv:整数); re : (rv:実数); ptr : (pv:ndp;和:整数);さもなければ:(il:整数:12 :実数):終了; ! 実例に使用された基本タイプを規定するTYPINT32=GEM TD  DEF BASICTYPTYPREALF=GEM TD DEF BASI CTY! ndにndpボシンターを規定するTYPENUM=GEM TD  DEF ENUM (myproc−PENUM、ロケータ−、’ it” 、 litノー)” (val= 0 ));GEM TD SET ENUM E LEMENT (TYPENUM、ロケータ−、’ re’ 、litノード( val= 1 )):PENUM、ロケータ−、’ boo’ 、litノード (val=2));GEM TD SET ENUM ELEMENT(TYP ENUM、ロケータ−、’ vl’ 、litノード(val= 3 )):G EM TD SET ENUM ELEMENT(TYPENUM、ロケータ− 、’ v2’ 、 litノード(val= 4 )):GEM TD SET  ENUM ELEMENT(TYPENUM、oケータ−、’ v3’ 、l itノード(val= 5 )):! 構造定義ndを規定する (TYPSTRUCT、、ヌル、ロケータ−2°次ぎ°、 TYPPTR: litノード(1バイト(次ぎ))、Iitノード(1ビット(次ぎ) ) 、  litノード(ピット サイズ(次ぎ));! バリアントパートのセレクタ を規定するTYPSEL=GEM TD DEF 5TRUCT 5ELECT OR(TYPSTRUCT、ヌル、’ tt“、TYPE(t t) ) 、  litノード(ビット サイズ(11));! 省略(default)を含む 構造のバリアントを規定するV1=GEM TD DEF 5TRUCT VA RIANT(TYPSEL、ロケータ−); GEM TD SET 5TRUCT RANGE (Vl、ロケータ−111 tノード(val=0) 、 litノード(val=0); GEM TD SET 5TRUCT ELEMENT(TYPSTRUCT、 Vl、ロケータ−、’ iv’ 、TYPピット(iv))、litノード(ビ ット サイズ(iv));V2=GEM TD DEF 5TRUCT VAR IANT(TYPSEL、ロケータ−)。
GEM TD SET 5TRUCT RANGE (V2、ロケータ−、li tノード(val= 1 ) 、 litノード(val=1)。
GEM TD SET 5TRUCT ELEMENT(TYPSTRUCT、 V2.ロケータ−、’ rv’ 、TYPREALF。
ビット(r v) ) 、 litノード(ビット−サイズ(rv));(TY PSEL、 ロケータ−); GEM TD SET 5TRUCT RANGE(V3、ロケータ−、lit ノード(val=2) 、 litノード(val=(TYPSTRUCT、V 3. ロケータ−、’ pv’ 、TYPPTR。
litノート(1−バイト(pV))、litノード(1(TYPSTRUCT 、V3. 口’r−タ+、’ 和’ 、TYPPTR。
(TYPSEL、ロケータ−): (TYPSTRUCT、V4. ロケータ−、’il’、TYPビット(i l ) ) 、 litノード(ビット サイズ(il));GEM TD SET  5TRUCT ELEMENT(TYPSTRUCT、V4. ロケータ−、 ’ i 2’ 、TYPビット(i 2) ) 、 litノード(ビット サ イズ(i2));GEM TD SET POINTERTYPE(TYPPT R,TYPSTRUCT); 構造およびユニオン定義の実例 主 ()( 構造 ディマー3 ( ) ; ユニオン anon ( int 1val; フロー) fval; 文字 *pva 1 構造 ディマー3 1oc: ); 構造 nl ( ユニオン anona: ユニオン anonb; ユニオン anOnc; ) ; 構造 n L n11. n12. n13:UNIT8); TYPPTR=GEM TD DEF POINTER(主−ブロック、ロケー タ−、ヌル、TYPCHAR);! 構造「ディマー3ノを規定する TYPSTRUCT=GEM TD DEF 5TRUCT(TYPSTRUC T、ヌル、ロケータ−、’ x’ 、TYPINT32゜ 1ocバイト(x)、locビット(x)、Htノード(TYPSTRUCT、 ヌル、ロケータ−、’ y’ 、TYPINT32゜ 1ocバイト(y)、toeビット(y)、litノード(TYPSTRUCT 、ヌル、ロケータ−、’ z’ 、TYPINT32゜ 1ocバイト(z)、locビット(z)、1itノード(Z サイズ)); ! ユニオンrano旧を規定する ズ)): Nl0N、ロケータ−、’ i va 1’ 、TRP INT32);GEM  TD SET UNION MEMBER(TYPUNION、ロケータ−、 ’ fval’ 、TRPREALF);GEM TD SET UNION  MEMBER(TYPUNION、ロケータ−、’ pva!’ 、TRPPT R);GEM TD SET UNION MEMBER(TYPUNION、 ロケータ−、’ 1 oc ’ 、TRPSTRUCT);! 構造rnNを規 定する PSTRUCT、ヌル、ロケータ−、’ a’ 、TYPUNION。
1ocバイト(a)、locビット(a)、litノードPSTRUCT、ヌル 、ロケータ−、’ b’ 、TYPUNION。
1ocバイト(b)、locピット(b)、litノードPSTRUCT、ヌル 、ロケータ−、’ c’ 、TYPUNION。
1ocバイト(c)、locビット(c)、Htノード5QLIRCE CODE: l■J+1 R F■(J フロントページの続き (31)優先権主張番号 662,477(32)優先日 1991年2月27 日(33)優先権主張国 米国(US) (31)優先権主張番号 662,483(32)優先日 1991年2月27 日(33)優先権主張国 米国(U S )(31)優先権主張番号 662, 464(32)優先日 1991年2月27日(33)優先権主張国 米国(U S) (81)指定図 EP(AT、BE、CH,DE。
DK、ES、FR,GB、GR,IT、LU、MC,NL、SE)、0A(BF 、BJ、CF、CG、CI、CM、GA、GN、ML、MR,SN、TD、TG )、AT、 AU、 BB、 BG、 BR,CA、 CH,CS、 DE。
DK、 ES、 FI、 GB、 HU、JP、 KP、 KR,LK、LU、 MG、MN、MW、NL、No、PL、RO、RU、 SD、 5E (72)発明者 デイピッドソン キャロライン ステイーブン アメリカ合衆国 ニューハンプシャー州03049 ホーリス ライドアウト  ロード(72)発明者 フェイマン ロバート ネイル ジュニアアメリカ合衆 国 ニューハンプシャー州03806 ウィルトン プットナム ヒルロード  (番地なし) (72)発明者 グラブ リチャード バリーアメリカ合衆国 マサチューセッ ツ州 01886 ウェストフォード キャリエイジウェイ 5 (72)発明者 ホブス ステイーブン オーアメリカ合衆国 マサチューセッ ツ州 01886 ウェストフォード バターナツトロード 10 (72)発明者 マーフィー デニス ジョセフアメリカ合衆国 マサチューセ ッツ州 01886 ウェストフォード ディポットロード 86

Claims (14)

    【特許請求の範囲】
  1. 1.多数の異なる高レベルプログラミング言語の1つにソースコードを含むソー スコードモジュールを言語特有のコンパイラフロントエンドを用いてアクセスす る工程と、前記のコンパイラフロントエンドにより中間言語中に中間言語グラフ 及び記号テーブルを発生させ、この中間言語グラフを、各要素が前記のソースコ ードモジュール中の1つのエクスプレッションを表わしている複数の要素を以っ て構成する工程と、 前記の中間言語グラフを再構成することにより前記のプログラムを最適化するよ うにこの中間言語グラフをアクセスする工程と、 種々の異なる目的コンピュータアーキテクチャの1つに対しコード発生器により 前記の中間言語グラフから目的コードを発生させる工程と、 目的コードを発生させる前に、前記のコード発生器において、前記の中間言語グ ラフと一組のコードテンプレートとを比較する工程であって、この工程は、パタ ーン選択パスを行なってテンプレートを選択することと、生存期間のある一時ネ ームをコードテンプレートに非局所的に割当てることと、バインディングパスを 行なって生存期間のある一時ネームをコードテンプレートに局所的に割当てるこ とを含む当該工程と を有することを特徴とするコードコンパイリング方法。
  2. 2.請求項1に記載のコードコンパイリング方法において、前記の要素の各々を タプルとし、各タプルはオペレータ、データの種類及びオペランドに対する領域 を有するデータ構造とすることを特徴とするコードコンパイリング方法。
  3. 3.請求項2に記載のコードコンパイリング方法において、前記中間言語グラフ は前記のタプルの順序化列を含むブロックを以って構成することを特徴とするコ ードコンパイリング方法。
  4. 4.請求項3に記載のコードコンパイリング方法において、他のタプルヘの影響 を有するエクスプレッションを表わす前記の各タプルに対し、当該タプルに前記 の影響の表示を含め、他のタプルヘの依存性を有するエクスプレッションを表わ す各タプルに対し、当該タプルにこの依存性の表示を含めることを特徴とするコ ードコンパイリング方法。
  5. 5.多数の異なる高レベルプログラミング言語の1つにソースコードを含むソー スコードモジュールを言語特有のコンパイラフロントエンドを用いてアクセスす る手段と、中間言語中に中間言語グラフを発生させ、この中間言語グラフを、各 タプルが前記のソースコードモジュール中の1つのエクスプレッションを表わし ている複数のタプルを以って構成する前記のコンパイラフロントエンド中の手段 と、 前記の中間言語グラフを再構成することにより前記のプログラムを最適化するよ うにこの中間言語グラフをアクセスする手段と、 種々の異なる目的コンピュータアーキテクチャの1つに対しコード発生器により 前記の中間言語グラフから目的コードを発生させる手段と、 目的コードを発生させる前に、前記のコード発生器において、前記の中間言語グ ラフと一組のコードテンプレートとを比較する手段であって、この比較には、パ ターン選択パスを行なってテンプレートを選択することと、生存期間のある一時 ネームをコードテンプレートに非局所的に割当てることと、バインディングパス を行なって生存期間のある一時ネームをコードテンプレートに局所的に割当てる ことを含むようにする当該手段と を有することを特徴とするコードコンパイリング装置。
  6. 6.請求項5に記載のコードコンパイリング装置において、前記のタプルの各々 をオペレータ、データの種類及びオペランドに対する領域を有するデータ構造と したことを特徴とするコードコンパイリング装置。
  7. 7.請求項6に記載のコードコンパイリング装置において、前記中間言語グラフ は前記のタプルの順序化列を含むブロックを以って構成したことを特徴とするコ ードコンパイリング装置。
  8. 8.請求項6に記載のコードコンパイリング装置において、前記のブロックの各 々をエントリで開始させ、中間エントリのないブランチ中で終了させるようにし たことを特徴とするコードコンパイリング装置。
  9. 9.請求項7に記載のコードコンパイリング装置において、他のタプルヘの影響 を有するエクスプレッションを表わす前記の各タプルに対し、当該タプルに前記 の影響の表示を含め、他のタプルヘの依存性を有するエクスプレッションを表わ す各タプルに対し、当該タプルにこの依存性の表示を含めたことを特徴とするコ ードコンパイリング装置。
  10. 10.言語特有のコンパイラフロントエンドを用いて中間言語中に中間言語グラ フを発生させ、この中間言語グラフをタプルを以って構成し、各タプルが多数の 異なるソースコード言語の1つに1つのエクスプレッションを表わすようにする 工程と、 種々の異なる目的コンピュータアーキテクチュアの1つに対しコード発生器によ り前記の中間言語グラフから目的コードを発生させる工程と、 目的コードを発生させる前に、前記のコード発生器において、前記の中間言語グ ラフと一組のコードテンプレートとを比較する工程であって、この工程は、パタ ーン選択パスを行なってテンプレートを選択することと、生存期間のある一時ネ ームをコードテンプレートに非局所的に割当てることと、バインディングパスを 行なって生存期間のある一時ネームをコードテンプレートに局所的に割当てるこ とを含む当該工程と を有することを特徴とするコードコンパイラ中にコードを発生させる方法。
  11. 11.請求項10に記載のコードコンパイラ中にコードを発生させる方法におい て、前記のタプルの各々をオペレータ、データの種類及びオペランドに対する領 域を有するデータ構造とすることを特徴とするコードコンパイラ中にコードを発 生させる方法。
  12. 12.請求項11に記載のコードコンパイラ中にコードを発生させる方法におい て、前記中間言語グラフは前記のタプルの順序化列を含むブロックを以って構成 することを特徴とするコードコンパイラ中にコードを発生させる方法。
  13. 13.請求項12に記載のコードコンパイラ中にコードを発生させる方法におい て、他のタプルヘの影響を有するエクスプレッションを表わす前記の各タプルに 対し、当該タプルに前記の影響の表示を含め、 他のタプルヘの依存性を有するエクスプレッションを表わす各タプルに対し、当 該タプルにこの依存性の表示を含めることを特徴とするコードコンパイラ中にコ ードを発生させる方法。
  14. 14.請求項12に記載のコードコンパイラ中にコードを発生させる方法におい て、前記のブロックの各々をエントリで開始させ、中間エントリのないブランチ 中で終了させることを特徴とするコードコンパイラ中にコードを発生させる方法 。
JP4507067A 1991-02-27 1992-02-18 コード生成方法及び装置 Expired - Lifetime JPH0762825B2 (ja)

Applications Claiming Priority (11)

Application Number Priority Date Filing Date Title
US66247791A 1991-02-27 1991-02-27
US66246191A 1991-02-27 1991-02-27
US66246491A 1991-02-27 1991-02-27
US66272591A 1991-02-27 1991-02-27
US66248391A 1991-02-27 1991-02-27
US662477 1991-02-27
US662483 1991-02-27
US662464 1991-02-27
US662461 1991-02-27
US662725 1991-02-27
PCT/US1992/001284 WO1992015943A1 (en) 1991-02-27 1992-02-18 Multilanguage optimizing compiler using templates in multiple pass code generation

Publications (2)

Publication Number Publication Date
JPH06501582A true JPH06501582A (ja) 1994-02-17
JPH0762825B2 JPH0762825B2 (ja) 1995-07-05

Family

ID=27542049

Family Applications (5)

Application Number Title Priority Date Filing Date
JP4507814A Expired - Lifetime JPH0762826B2 (ja) 1991-02-27 1992-02-18 多言語最適化コンパイラ内のフォールディングメカニズムを構成する方法
JP4506687A Expired - Lifetime JPH0769832B2 (ja) 1991-02-27 1992-02-18 プログラミング演算の効果と従属性とを表現する方法及び装置
JP4506773A Expired - Lifetime JPH0769834B2 (ja) 1991-02-27 1992-02-18 ソース・プログラムをコンパイルする方法及び装置
JP4507067A Expired - Lifetime JPH0762825B2 (ja) 1991-02-27 1992-02-18 コード生成方法及び装置
JP4506690A Expired - Lifetime JPH0769833B2 (ja) 1991-02-27 1992-02-18 多言語最適化コンパイラ内のシンボル テーブル構成用インタフェイス

Family Applications Before (3)

Application Number Title Priority Date Filing Date
JP4507814A Expired - Lifetime JPH0762826B2 (ja) 1991-02-27 1992-02-18 多言語最適化コンパイラ内のフォールディングメカニズムを構成する方法
JP4506687A Expired - Lifetime JPH0769832B2 (ja) 1991-02-27 1992-02-18 プログラミング演算の効果と従属性とを表現する方法及び装置
JP4506773A Expired - Lifetime JPH0769834B2 (ja) 1991-02-27 1992-02-18 ソース・プログラムをコンパイルする方法及び装置

Family Applications After (1)

Application Number Title Priority Date Filing Date
JP4506690A Expired - Lifetime JPH0769833B2 (ja) 1991-02-27 1992-02-18 多言語最適化コンパイラ内のシンボル テーブル構成用インタフェイス

Country Status (9)

Country Link
EP (5) EP0526621A1 (ja)
JP (5) JPH0762826B2 (ja)
KR (5) KR950006608B1 (ja)
AU (5) AU653799B2 (ja)
CA (5) CA2081475C (ja)
DE (1) DE69225281T2 (ja)
FI (2) FI924846A (ja)
NO (2) NO924115L (ja)
WO (5) WO1992015945A1 (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH07234790A (ja) * 1994-02-23 1995-09-05 Nec Corp プログラム変換処理装置およびプログラム変換処理方法

Families Citing this family (20)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP1229440B1 (en) * 1993-05-27 2007-05-02 Matsushita Electric Industrial Co., Ltd. Program converting unit and processor improved in address management
JP2847688B2 (ja) 1993-05-27 1999-01-20 松下電器産業株式会社 プログラム変換装置およびプロセッサ
US5740469A (en) * 1995-04-24 1998-04-14 Motorola Inc. Apparatus for dynamically reading/writing multiple object file formats through use of object code readers/writers interfacing with generalized object file format interface and applications programmers' interface
CA2251369A1 (en) * 1998-10-26 2000-04-26 International Business Machines Corporation System and method for analyzing dependencies in a computer program
US7000222B1 (en) 1999-08-19 2006-02-14 International Business Machines Corporation Method, system, and program for accessing variables from an operating system for use by an application program
US7966609B2 (en) 2006-03-30 2011-06-21 Intel Corporation Optimal floating-point expression translation method based on pattern matching
KR101314247B1 (ko) * 2009-09-03 2013-10-02 한국전자통신연구원 위성 관제 시스템에서 위성 관제 운용 자동화를 위한 언어변환장치 및 방법
US20130167144A1 (en) * 2009-09-04 2013-06-27 Bernd Mathiske Virtual Machine Persisted Within Itself
US8832672B2 (en) 2011-01-28 2014-09-09 International Business Machines Corporation Ensuring register availability for dynamic binary optimization
EP2687981B1 (en) * 2012-07-18 2017-12-27 MStar Semiconductor, Inc. Automated compiler specialisation for global optimisation
US20160019037A1 (en) * 2014-07-21 2016-01-21 Xamarin Inc. Managing parameter types for generic functions
US9183020B1 (en) 2014-11-10 2015-11-10 Xamarin Inc. Multi-sized data types for managed code
US9213638B1 (en) 2015-03-24 2015-12-15 Xamarin Inc. Runtime memory management using multiple memory managers
JP6481515B2 (ja) 2015-05-29 2019-03-13 富士通株式会社 情報処理装置、コンパイル方法、及びコンパイラプログラム
KR102041772B1 (ko) * 2016-08-30 2019-11-07 미쓰비시덴키 가부시키가이샤 프로그램 편집 장치, 프로그램 편집 방법 및 기억 매체에 기억된 프로그램 편집 프로그램
CN108108169B (zh) * 2017-12-27 2020-11-03 广东小天才科技有限公司 一种基于Jenkins的多分支的构建方法及系统
JP7015207B2 (ja) * 2018-04-27 2022-02-02 株式会社日立製作所 ビジュアルプログラミングツールを用いてフローを作成することを支援する装置および方法
JP7163697B2 (ja) * 2018-09-28 2022-11-01 富士通株式会社 生成プログラム,情報処理装置及び生成方法
KR102165928B1 (ko) * 2019-12-04 2020-10-14 서울대학교 산학협력단 전자 장치, 전자 장치의 컴파일링 방법 및 전자 장치의 동작 방법
CN116360788A (zh) * 2023-02-17 2023-06-30 深圳市亿维自动化技术有限公司 结构化文本编程语言的编译方法、编译器及电子设备

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4667290A (en) * 1984-09-10 1987-05-19 501 Philon, Inc. Compilers using a universal intermediate language

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH07234790A (ja) * 1994-02-23 1995-09-05 Nec Corp プログラム変換処理装置およびプログラム変換処理方法

Also Published As

Publication number Publication date
JPH0769832B2 (ja) 1995-07-31
KR950006609B1 (ko) 1995-06-19
DE69225281D1 (de) 1998-06-04
CA2081449C (en) 1999-04-13
AU663310B2 (en) 1995-10-05
JPH0762825B2 (ja) 1995-07-05
NO924115D0 (no) 1992-10-23
WO1992015945A1 (en) 1992-09-17
DE69225281T2 (de) 1999-01-07
FI924846A0 (fi) 1992-10-26
JPH06501583A (ja) 1994-02-17
EP0526621A1 (en) 1993-02-10
CA2081473A1 (en) 1992-08-28
AU1439792A (en) 1992-10-06
CA2081475A1 (en) 1992-08-28
CA2081477A1 (en) 1992-08-28
EP0528008A1 (en) 1993-02-24
FI924846A (fi) 1992-10-26
CA2081475C (en) 1998-05-05
CA2081476A1 (en) 1992-08-28
EP0526622A1 (en) 1993-02-10
FI924845A (fi) 1992-10-26
AU1420492A (en) 1992-10-06
KR960003138B1 (ko) 1996-03-05
WO1992015941A1 (en) 1992-09-17
CA2081449A1 (en) 1992-08-28
AU1442292A (en) 1992-10-06
AU663311B2 (en) 1995-10-05
NO924114D0 (no) 1992-10-23
CA2081473C (en) 1999-04-06
JPH06501580A (ja) 1994-02-17
NO924115L (no) 1992-12-18
JPH06501579A (ja) 1994-02-17
AU1429292A (en) 1992-10-06
WO1992015942A1 (en) 1992-09-17
CA2081477C (en) 1992-08-28
KR950006607B1 (ko) 1995-06-19
WO1992015943A1 (en) 1992-09-17
EP0532731A1 (en) 1993-03-24
EP0529049A1 (en) 1993-03-03
WO1992015944A1 (en) 1992-09-17
JPH0769833B2 (ja) 1995-07-31
AU653799B2 (en) 1994-10-13
AU663493B2 (en) 1995-10-12
EP0529049B1 (en) 1998-04-29
NO924114L (no) 1992-12-18
JPH06501581A (ja) 1994-02-17
KR960003050B1 (ko) 1996-03-04
AU1569892A (en) 1992-10-06
FI924845A0 (fi) 1992-10-26
JPH0769834B2 (ja) 1995-07-31
AU658399B2 (en) 1995-04-13
KR950006608B1 (ko) 1995-06-19
JPH0762826B2 (ja) 1995-07-05

Similar Documents

Publication Publication Date Title
US5577253A (en) Analyzing inductive expressions in a multilanguage optimizing compiler
US5836014A (en) Method of constructing a constant-folding mechanism in a multilanguage optimizing compiler
US5659753A (en) Interface for symbol table construction in a multilanguage optimizing compiler
US5613117A (en) Optimizing compiler using templates corresponding to portions of an intermediate language graph to determine an order of evaluation and to allocate lifetimes to temporary names for variables
JPH06501582A (ja) コード生成方法及び装置
US5493675A (en) Compiler back end calling predetermined front end routines that use effect and dependency indicators to provide information to the compiler to determine the validity of an optimization
Pandey et al. LLVM cookbook
Nellaiyapen Practical WebAssembly: Explore the fundamentals of WebAssembly programming using Rust
Wielemaker SWI-Prolog 2.9. 6
Wielemaker SWI-Prolog 3.2
Watson et al. Practicalities of Syntax Analysis
IE920608A1 (en) Interface for symbol table construction in a multilanguage¹optimizing compiler
Sestoft Language Concepts
Àµ½ ½Á et al. ¹® º» ¼º» µ «5® ³½ «eµ²½µf¶¥¥ § «5º» º¿ ¾