ちょっとウラサワ感のあるシスコのおっさんが解説してくれます。
興味のある人は観てほしいですが、以下の図が一番興味を惹かれました。これはアポロ11号が着陸の最終フェーズでコンピュータから手動に切り替えた原因を説明します。
ここで示されている負荷はCPUの負荷です。アポロ11号では、司令船とのドッキング用レーダーのジョブが走りっぱなしになるというハードウェアのバグによって、着陸フェーズでジョブのスロット(最大7つ)が足りなくなり、再起動を繰り返しても復旧せずに手動操作で着陸したということのようです。
手動と言っても、IMU(地球ゴマ)と姿勢制御は有効なので、先日ネタにしたゲームと操作感はちかいはずです。視界が狭いことや、TPSとFPSの違いはあると思いますが。
システムとしては、リアルタイム制御層の上にインタプリタを実装して、ジョブシステム(これはいわゆるタスクシステムのような気がしますが)まで搭載しているというのが感慨深いです。
まぁ、負荷というのは設計するべきで、想定負荷を超えたらアラームを出す、という基本が守られているのは素晴らしいと思いますね。世の中には想定負荷すら不明なままでぶん回して異常動作してから解析を始めるという間抜けな方法論で「モノ」が動くと勘違いしている連中がいっぱいいますから。
あと、質疑応答で、こんな話が出ていました。
the constraints I think I wrote my first bit of code in about 1967・・・
we were used to the fact that we had very small memory in th・・・
おじさまが、語り始めます。シスコのおっさんも組み込み系なのでリソース制約の厳しい環境については叩き込まれているはずですが、うまいこと返します。
forgotten how to write or in some sense we’re unbale to write software yeah・・・
could not write a hello world that took less than 100 kilobytes
背景として、AGCの搭載RAMが2Kワードという話があります。ROMは36Kワード。
RAMはコアメモリですね。
ロジックICはMIT謹製、モジュール間の配線は当然のことながらラッピングワイヤーです。
ごみためはマイコン世代なので、60年代にはまだ生まれていないわけですが、70年代~80年代の8ビットPCではRAMはせいぜい32KiBとか64KiBでした。(PC-9801が80年代前半で128KiB)
どれくらいRAMが貴重だったかというと、80年代のファミリーベーシックでも2KiBしか積んでいません。
ちなみに、Hello, Worldで100KiBを超えるというのは、LLとかの話じゃないですかね。(インタプリタ込み)
$ g++ main.cpp
$ ./a.out
Hello, World!
$ ll
・・・
-rwxr-xr-x 1 gomita gomita 16528 Aug 27 16:51 a.out*
・・・
cat main.cpp
#include <iostream>
int main()
{
std::cout << "Hello, World!" << std::endl;
return 0;
}
→16KiB
IOCSルーチンとか入れての話なのかもしれませんが、たぶんそんなに変わりません。
蛇足ですが、上記のようにコンパイルするといろいろ余計なものが付いてきます。それを極限までそぎ落とすというのは、コードゴルフとは違って、バイナリアンが好きな話題です。
あと最後に、少し補足です。このAGCは32kgという重さの制限と、当時希少なIC(1パッケージにNORが2個)で構築された今でいう組み込みコンピュータです。
従って「60年代のコンピュータはRAMがたった2000ワードしかない」「画面が7セグ3行」などという勘違いをしないように注意した方が良いかもしれません。
例えばシステム360は、65年には8KB以上のメインメモリで出荷されています。67年には8MiBメモリ、16MIPS仕様もあったということです。
The 1967 IBM System/360 Model 91 could execute up to 16.6 million instructions per second.[4] The larger 360 models could have up to 8 MB of main memory
当然、OSもありました。
リンクル:
Virtual AGC Luminary Page (ibiblio.org)