Pascalは、1960年代と1970年代のメインフレームであるCDC Cyberに最初に実装されました。これは、今日の多くのCPUと同様に、優れたシーケンシャル命令実行パフォーマンスを備えていますが、ブランチのパフォーマンスが大幅に低下します。サイバーアーキテクチャのこの特性およびその他の特性は、おそらくPascalのfor
ループの設計に大きな影響を与えました。
簡単に言うと、ループ変数の割り当てを許可するには、追加のガードコードが必要であり、通常は18ビットインデックスレジスタで適切に処理できるループ変数の最適化が台無しになります。当時、ソフトウェアのパフォーマンスは、ハードウェアの費用と他の方法で高速化できないために高く評価されていました。
長い答え
サイバーを含むControlDataCorporation 6600ファミリは、18ビットアドレスによって参照される60ビットの中央メモリワードを使用するRISCアーキテクチャです。一部のモデルには、6ビット文字フィールドを直接アドレス指定するための(高価な、したがって一般的ではない)オプションであるCompare-Move Unit(CMU)がありましたが、それ以外の場合は、いかなる種類の「バイト」もサポートされませんでした。CMUは一般的に信頼できないため、ほとんどのサイバーコードはCMUがないために生成されました。小文字のサポートが暫定的な12ビット文字表現に取って代わられるまで、単語あたり10文字が通常のデータ形式でした。
命令は15ビットまたは30ビット長ですが、CMU命令は実質的に60ビット長です。したがって、各ワードに最大4つの命令、または2つの30ビット、または15ビットと1つの30ビットのペアがパックされます。30ビット命令はワードにまたがることはできません。分岐先は単語のみを参照できるため、ジャンプターゲットは単語に合わせて配置されます。
アーキテクチャにはスタックがありません。実際、プロシージャ呼び出し命令RJ
は本質的に再入可能ではありません。 RJ命令がある場所の後に次の命令へのジャンプをRJ
書き込むことにより、呼び出されたプロシージャの最初のワードを変更します。呼び出されたプロシージャは、リターンリンケージ用に予約されている先頭にジャンプして、呼び出し元に戻ります。手順は2番目の単語から始まります。再帰を実装するために、ほとんどのコンパイラはヘルパー関数を利用していました。
レジスタファイルには、アドレス操作用のA0..A7、インデックス作成用のB0..B7、および一般演算用のX0..X7の3種類のレジスタのそれぞれ8つのインスタンスがあります。AおよびBレジスタは18ビットです。Xレジスタは60ビットです。A1からA5を設定すると、対応するX1からX5レジスタにロードされたアドレスの内容がロードされるという副作用があります。A6またはA7を設定すると、対応するX6またはX7の内容がAレジスタにロードされたアドレスに書き込まれます。A0とX0は接続されていません。Bレジスタは、他のA、B、またはXレジスタに加算または減算する値として、事実上すべての命令で使用できます。したがって、それらは小さなカウンターに最適です。
効率的なコードの場合、ループ変数には直接比較命令を使用できるため(B2 <100など)、Bレジスタがループ変数に使用されます。Xレジスタとの比較はゼロとの関係に制限されるため、たとえばXレジスタを100と比較するには、100を減算し、結果をゼロ未満でテストする必要があります。ループ変数への割り当てが許可されている場合、60ビット値Bレジスタに割り当てる前に、範囲をチェックする必要があります。これは本当に面倒です。Herr Wirthはおそらく、面倒で非効率なことの両方が実用性に値しないと考えました。プログラマーは、その状況で常にwhile
またはrepeat
...until
ループを使用できます。
追加の奇妙さ
いくつかのPascal独自の言語機能は、Cyberの側面に直接関連しています。
pack
キーワード:単一の「文字」が60ビットの単語を消費するか、単語ごとに10文字がパックされます。
- (珍しい)
alfa
タイプ:packed array [1..10] of char
- 固有の手順
pack()
とunpack()
パックされた文字を処理します。これらは、最新のアーキテクチャでは変換を実行せず、型変換のみを実行します。
text
ファイルの奇妙さ対。file of char
- 明示的な改行文字はありません。レコード管理は明示的に呼び出されました
writeln
- CDCでは非常に便利でしたが、メモリを
set of char
過剰に使用するため(8ビットASCIIの場合は32バイト変数/定数)、後続の多くの8ビットマシンではサポートされませんでした。対照的に、単一のサイバーワードは、改行などを省略して、ネイティブの62文字セットを管理できます。
- 完全な式の評価(ショートカットではなく)。これらは、ジャンプして1または0に設定することによって(今日のほとんどのコードジェネレーターが行うように)ではなく、ブール演算を実装するCPU命令を使用することによって実装されました。