エドサック | 6 May 1949
電子遅延記憶自動計算機(EDSAC)は、初期の英国のコンピュータでした。ジョン・フォン・ノイマンの画期的な報告書「EDVACの初稿」に触発され、モーリス・ウィルクスと彼のチームがイギリスのケンブリッジ大学数学研究所で構築しました。EDSACは、マンチェスター・マーク1に続いて、定期的に稼働した2番目の電子デジタルストアードプログラムコンピュータです。
その後、プロジェクトはJ. ライオンズ社によって支援され、商業用コンピュータの開発が進められ、ライオンズ社がEDSACの設計に基づいてLEO Iを開発しました。EDSACの作業は1947年に始まり、1949年5月6日に初めてプログラムを実行しました。その際、平方数の表と素数のリストを計算しました。EDSACは1958年7月11日に運用を終了し、EDSAC 2に取って代わられ、1965年まで使用されました。
EDSACが稼働を開始すると、大学の研究ニーズに応えるために使用されました。メモリには水銀遅延ラインが使用され、論理回路には減圧真空管が使われていました。消費電力は11 kWでした。全ての通常命令のサイクルタイムは1.5ミリ秒、乗算の場合は6ミリ秒でした。入力は5穴パンチテープを介し、出力はテレプリンタを使用していました。
初期のレジスタは累算器と乗算器レジスタに限られていましたが、1953年にデビッド・ウィーラーがイリノイ大学から帰国し、元のEDSACハードウェアにインデックスレジスタを設計しました。
1952年には磁気テープドライブが追加されましたが、実用的に機能することはありませんでした。
1952年まで、利用可能な主メモリ(命令とデータ)はわずか512の18ビットワードで、バックアップストレージはありませんでした。遅延ライン(または「タンク」)は、各512ワードを提供する2つのバッテリーに配置されており、2つ目のバッテリーは1952年に稼働しました。
1024ワードの遅延ラインストレージは1955年または1956年初頭まで利用できず、それまではプログラムは約800ワードに制限されていました。
ジョン・リンドリー(1958年–1959年のディプロマ学生)は、「1950年代後半に利用できる粗悪で信頼性の低い自作のパンチ、印刷、検証機器を使って、一枚の正確な紙テープを作成するのに非常に困難であった」と述べています。
EDSACの主メモリは1024のロケーションで構成されていましたが、当初は512のロケーションのみが設置されていました。それぞれのロケーションには18ビットが格納されていましたが、最上位ビットはタイミングの問題により常に使用できず、実際には17ビットだけが利用されました。命令は5ビットの命令コード、1ビットの予備ビット、10ビットのオペランド(通常はメモリアドレス)、および17ビットまたは35ビットのオペランドを使用するかを制御する1ビットの長さビットで構成されていました。すべての命令コードは設計上、1つのニーモニック文字で表されており、例えば加算命令はEDSACの文字コードでAが使用されました。
内部的には、EDSACは2の補数の二進数を使用していました。数値は17ビット(1ワード)または35ビット(2ワード)の長さで、特に乗算器は数値を固定小数点の範囲 −1 ≤ x < 1 として扱うように設計されていました。すなわち、符号のすぐ右に二進数の小数点が配置されていました。累算器は符号を含む71ビットを保持でき、35ビットの長い数値を2つ掛け算しても精度を失うことはありませんでした。
利用可能な命令は以下の通りです:
- 加算(Add)
- 減算(Subtract)
- 乗算加算(Multiply-and-add)
- AND加算(Collate)
- 左シフト(Shift left)
- 算術右シフト(Arithmetic shift right)
- 乗算器レジスタのロード(Load multiplier register)
- 累算器のストア(およびオプションでクリア)(Store (and optionally clear) accumulator)
- 条件付きジャンプ(Conditional goto)
- 入力テープの読み込み(Read input tape)
- 文字の印刷(Print character)
- 累算器の丸め(Round accumulator)
- ノーオプ(No-op)
- 停止(Stop)
除算命令は存在せず、さまざまな除算サブルーチンが提供されていました。また、累算器に直接数値をロードする方法はなく、「ストアおよび累算器ゼロ」命令の後に「加算」命令を実行する必要がありました。無条件ジャンプ命令や手続き呼び出し命令も存在せず、これらはまだ発明されていませんでした。
モーリス・ウィルクスは、1953年に発表した論文の中でEDSACの相対アドレッシングモードについて議論しました。これはサブルーチンの利用を促進するための提案でした。
最初の命令は、ユニセレクタースイッチのセットにハードワイヤリングされており、起動時にメモリの低位ワードにロードされました。1949年5月までに、初期の命令はニーモニック設計を利用した原始的な再配置アセンブラを提供し、すべて31ワードで構成されていました。これは世界初のアセンブラであり、グローバルなソフトウェア産業の始まりとも言えます。EDSACのシミュレーションも利用可能で、初期命令や最初のプログラムの詳細な説明もあります。
EDSACによって行われた最初の計算は、1949年5月6日に実行された平方数を計算するプログラムでした。このプログラムは、カナダからこの機械を学ぶために来たビアトリス・ウォースリーによって書かれました。
この機械は、大学の他のメンバーによって実際の問題を解決するために使用され、多くの初期技術が開発され、現在のオペレーティングシステムに含まれています。
ユーザーは、自分のプログラムをアセンブラで紙テープにパンチすることで準備しました。彼らはすぐに、紙テープを光にかざしてコードを読み取る技術に熟練しました。プログラムが準備できると、それは紙テープリーダーの近くに張られたラインに吊るされました。日中に存在する機械オペレーターは、次のテープを選択してEDSACにロードしました。これは、今日でいうところのジョブキューとして知られています。プログラムが何かを印刷した場合、テープと印刷物はユーザーに返却され、そうでない場合はどのメモリ位置で停止したかが通知されました。デバッガーはまだ存在していませんでしたが、陰極線管の画面を特定のメモリの内容を表示するように設定することができました。例えば、数値が収束しているかどうかを確認するために使用されました。また、累算器の符号ビットにスピーカーが接続されており、経験豊富なユーザーはプログラムの健全な音と不健全な音を識別できました。特に、ループに「ハング」したプログラムの音が分かりました。
業務時間外には、「認可されたユーザー」が自分自身で機械を操作することが許可されており、夜遅くまで続けられましたが、通常はバルブが吹き飛ぶことがありました。このことは、フレッド・ホイルの小説『黒い雲』にも言及されています。
初期のプログラマーは、今日ではあまり好まれない技術を使用せざるを得ませんでした。特に自己修正コードの使用がその一例です。インデックスレジスタが後になってから追加されるまで、配列にアクセスする唯一の方法は、特定の命令が参照しているメモリ位置を変更することでした。
デビッド・ウィーラーは、このプロジェクトで世界初のコンピュータサイエンスの博士号を取得し、サブルーチンの概念を発明したとされています。ユーザーは、戻りアドレス(つまり、ジャンプ自体の位置+1)を累算器に格納してサブルーチンの開始地点にジャンプすることでルーチンを呼び出すプログラムを書きました。慣習として、サブルーチンはこの戻りアドレスを期待しており、最初の行動として終了ジャンプ命令をこの戻りアドレスに変更しました。ユーザーは各サブルーチンの長さを知っている限り、複数の入れ子のサブルーチンを呼び出すことができましたが、再帰呼び出しは禁じられていました。その後、ユーザーは自分のプログラムの終了部分にマスターテープからサブルーチンのコードをコピーしました。ただし、アラン・チューリングは1945年にNPL ACEの設計提案に関する論文でサブルーチンについて論じており、再帰を可能にする戻りアドレススタックの概念を発明しています。
インデックスレジスタの欠如は、サブルーチンの作成者にとって問題となりました。なぜなら、サブルーチンがメモリのどこにロードされるか事前に知ることができなかったため、データの保存に使用されるコードの領域(いわゆる「擬似命令」)をどのようにアドレス指定すればよいかわからなかったからです。この問題は、初期入力ルーチンを使用することで解決されました。このルーチンは、パンチテープからメモリにサブルーチンをロードする役割を担っていました。サブルーチンをロードする際に、開始位置を記録し、必要に応じて内部メモリ参照を増加させました。ウィルクスが述べたように、「機械外で命令を表現するために使用されるコードは、機械内部で使用されるコードとは異なり、プログラマーの異なる要件と機械の制御回路の異なる要件によってその違いが決定される」となります。
EDSACのプログラマーは、限られたメモリを最大限に活用するために特別な技術を使用しました。例えば、パンチテープからメモリにサブルーチンをロードする際に、特定の定数を計算する必要がある場合があります。この定数は、その後再計算される必要がないものでした。この状況では、定数を「インタールード」で計算することになります。この定数を計算するためのコードは、フルサブルーチンとともに提供されました。初期入力ルーチンが計算コードをロードした後、制御をこのコードに移します。定数が計算されてメモリに書き込まれた後、制御は初期入力ルーチンに戻り、サブルーチンの残りの部分を書き込むのを続けますが、最初に定数計算のコードを上書きするように開始地点を調整します。これにより、一般的なサブルーチンに対してかなり複雑な調整を行うことができ、特定の状況に合わせて調整した場合と同じメモリフットプリントを維持することができました。

