コンパイラ記述言語(CDL)は、接辞文法に基づくプログラミング言語です。バッカス・ナウア記法(BNF)と非常によく似ています。コンパイラの開発のために設計されました。その機能と制御フローは意図的に非常に制限されています。これらの制限には2つの利点があります。
一方、これらの手法は、CDL2オプティマイザが用いる高度なデータおよび制御フロー解析を可能にし、極めて効率的なコードを実現します。もう1つの利点は、非常に冗長な命名規則を促進することです。これにより、プログラムは高い自己説明性を備えるようになります。
この言語はPrologに少し似ています(どちらの言語も接辞文法の研究からほぼ同時期に生まれたため、これは驚くべきことではありません)。しかし、Prologとは異なり、CDLの制御フローは決定論的に成功/失敗に基づいています。つまり、現在の処理が成功した場合、他の処理は試されません。この考え方は構文解析式文法でも用いられています。
CDL3はCDL言語の第3バージョンであり、以前の2つのバージョンとは大きく異なります。
1971年にナイメーヘン大学のコルネリス・H・A・コスターによって設計されたオリジナル版は、かなり珍しいコンセプトを持っていた。それは、コアが存在しなかったことである。一般的なプログラミング言語のソースコードは、機械語命令またはそれらの命令の固定シーケンスに変換される。これらがコア、つまりその言語がサポートする最も基本的な抽象化を表す。このようなプリミティブには、数値の加算、変数間のコピーなどがある。CDL1にはこのようなコアがない。プリミティブ操作を、アセンブラまたは従来の言語のコンパイラによって機械語命令に変換できる形式で提供するのはプログラマの責任である。CDL1言語自体には、プリミティブの概念も、マシンワード(抽象的な記憶単位であり、必ずしも実際のマシンワードではない)以外のデータ型の概念もない。評価ルールはバッカス・ナウア記法の構文記述にかなり似ている。実際、CDL1ではBNFで記述された言語のパーサーを作成するのは非常に簡単である。
基本的に、この言語はルールで構成されています。ルールは成功するか失敗するかのどちらかです。ルールは、他のルール呼び出しのシーケンスである代替案で構成されます。ルールは、その代替案のいずれかが成功すれば成功します。これらの代替案は順番に試されます。代替案は、そのルール呼び出しがすべて成功すれば成功します。この言語は、再帰なしで評価ループを作成するための演算子(ただし、CDL2 ではオプティマイザが同じ効果を実現するため、厳密には必須ではありません)と、そうでなければ再帰的になる評価の効率を高めるためのショートカットを提供しますが、基本的な概念は上記のとおりです。文脈自由文法解析における明らかな用途以外にも、CDL は制御アプリケーションにも適しています。なぜなら、多くの制御アプリケーションは本質的に深くネストされた if-then ルールだからです。
CDL1 の各ルールは、評価中に、型が指定されていないデータに対して動作する可能性があります。理想的には、ルールが成功しない限り (失敗しても副作用がない限り) データは変更されるべきではありません。このルールが成功しても、それを呼び出すルールが失敗する可能性があり、その場合、データの変更は有効にならないため、問題が生じます。すべてのデータがスタック上に動的に割り当てられている場合は、上記の動作を保証することは比較的容易です (ただし、メモリを大量に消費します)。しかし、静的データがある場合 (多くの場合そうですが) は、かなり困難です。CDL2 コンパイラは、パラメーターの方向 (入力、出力、入出力) とルールのタイプ (失敗する可能性がある: test、述語; 失敗することができない: function、アクション; 副作用がある可能性がある:述語、アクション; 副作用がない: test、関数) をプログラマが指定する必要があるという要件のおかげで、起こりうる違反を警告することができます。
ルール評価はより単純なルールを呼び出すことに基づいているため、最終的には実際の処理を行うプリミティブルールが存在するはずです。CDL1 はまさにこの点で非常に驚くべき存在です。CDL1 にはそのようなプリミティブが存在しないのです。これらのルールは自分で用意する必要があります。プログラムで加算が必要な場合は、2 つの入力パラメータと 1 つの出力パラメータを持つルールを作成し、出力はコードによって 2 つの入力の合計となるように設定する必要があります。CDL コンパイラはコードを文字列として扱い(入力変数と出力変数の参照方法には規則があります)、必要に応じて出力します。加算ルールをアセンブリ言語で記述する場合は、CDL コンパイラの出力をマシンコードに変換するアセンブラが必要になります。すべてのプリミティブルール(CDL 用語ではマクロ)を Pascal または C で記述する場合は、CDL コンパイラの後に Pascal または C コンパイラを実行する必要があります。このようなコアプリミティブの欠如は、最も単純なマシン命令操作であっても、コードスニペットを記述する必要がある場合に非常に厄介です。しかしその一方で、CDLは難解で抽象的なプリミティブを実装する際に、非常に高い柔軟性を提供します。これらのプリミティブは、特殊な抽象オブジェクトに対して作用します(CDLにおける「マシンワード」は、データ格納単位のようなもので、格納されるデータの種類は考慮されません)。さらに、大規模プロジェクトでは、綿密に設計されたプリミティブライブラリが活用されました。これらのライブラリは、各ターゲットアーキテクチャとOSごとに複製され、すべての環境で非常に効率的なコードを生成することが可能になりました。
言語の感覚をつかむために、CDL2マニュアルから抜粋した短いコード例を以下に示します。
アクション クイックソート + > から + > へ -p -q: less+from+to、split+from+to+p+q、 quicksort+from+q、quicksort+p+to; +。 アクション分割 + >i + >j + p> + q> -m: make+p+i、make+q+j、add+i+j+m、halve+m、 (繰り返し: 上に移動+j+p+m、下に移動+i+q+m、 (less+p+q、swap item+p+q、incr+p、decr+q、*again; less+p+m、swap item+p+m、incr+p; less+m+q、swap item+q+m、decr+q; +)). 機能 上に移動 + >j + >p> + >m: less+j+p; より小さなアイテム+m+p; incr+p、*。 機能 下へ移動 + >i + >q> + >m: less+q+j; より小さなアイテム+q+m; decr+q、*。 テスト less+>a+>b:=a"<"b。 FUNCTION make+a>+>b:=a"="b。 FUNCTION add+>a+>b+sum>:=sum"="a"+"b. FUNCTION halve+>a>:=a"/=2". FUNCTION incr+>a>:=a"++". FUNCTION decr+>a>:=a"--". テスト対象:より小さなアイテム+>i+>j:="items["i"]<items["j"]"。 アクション swap items+>i+>jt:=t"=items["i"];items["i"]=items["j"];items["j"]="t。 ここでは、基本的な演算をJava(またはC)の用語で定義しています。これは完全なプログラムではありません。Java配列の要素は別途定義する必要があります。
1976年に登場したCDL2は、CDL1の原則を維持しつつ、大規模プロジェクトに適した言語へと改良しました。モジュールを導入し、データ変更は成功時のみに限定し、言語の機能もいくらか拡張しました。CDL2コンパイラ、特にCDL2 Laboratory(CDL2用のIDE)のオプティマイザは、当時だけでなく、世界最高水準の性能を誇りました。CDL2 Laboratoryのオプティマイザの特長の一つは、コンパイル単位をまたいで最適化を実行できる点です。つまり、プログラム全体を単一のコンパイルとして扱うことができるのです。
CDL3は比較的新しい言語です。以前のCDLバージョンにあった自由度の高い機能は廃止され、基本的な算術演算とストレージアクセスのためのプリミティブが提供されています。以前のCDLバージョンの極めて厳格な構文(キーワードとシンボルの数がどちらも一桁)も緩和されました。いくつかの基本的な概念は、明示的な意味論ではなく構文で表現されるようになりました。さらに、データ型が言語に導入されました。
商用版のmbp Cobol(PC用Cobolコンパイラ)や、MPrologシステム(IBMメインフレーム、VAX、PDP-11、Intel 8086など多数のアーキテクチャとDOS/OS/CMS/BS2000、VMS/Unix、DOS/Windows/OS2など多数のOSで動作する産業レベルのProlog実装)などが挙げられます。特に後者は、CDL2の移植性の高さを証明するものです。
CDLで書かれたプログラムのほとんどはコンパイラだが、CDLで開発・保守された商用GUIアプリケーションも少なくとも1つ存在する。このアプリケーションは歯科画像取得アプリケーションで、現在はDEXIS社が所有している。また、かつては歯科医院管理システムもCDLで開発されたことがある。
Mephisto III チェスコンピュータのソフトウェアは CDL2 で記述された。[ 1 ]