スペースシャトル用プログラミング言語HAL/S

ずいぶん間が空いてしまったけど、Make:Japanの記事に取り上げられていたスペースシャトルの制御に用いられたリアルタイムプログラミング言語HAL/Sに関する電子書籍が面白かったので、これを取り上げよう。HAL/Sは当初、宇宙機汎用言語として設計されたのだが、最終的にはスペースシャトルでしか使われることはなかった。その実態はとんでもない奴だったという話。

スペースシャトルが最初に打ち上げられたのは1981年で、昨年7月の最後のフライトでHAL/Sの役割も終わった。HAL/Sはスペースシャトルに搭載された主制御計算機AP-101用に開発されたプログラミング言語である。70年代頭という時代を考えるとアセンブリって選択肢もあったのかなと思ったけど、当時から高級言語を使いたいというニーズは明確にあったようだ。また、米国の軍事・宇宙関係のプログラミング言語だとAdaがぱっと頭に浮かぶ。Adaの国際競争入札が始まったのが1979年なので、HAL/Sの開発が始まったのはそれより前になる。言語そのものはPL/ICOBOLのミックスみたいな言語。今日的な感性から見ると「これはちょっと」と引くけど、それを差し引けばそれほどトンデモ言語には見えない。乗算が空白という仕様を除けば。タスク間のランデブは持っているけど、セマフォなどデータの排他機構がないのもきついよな。まぁ、詳しい言語仕様はリンク先の「プログラミングHAL/S」をお楽しみあれ。

ソフトウェア障害によって重大事故が起きなかったという意味では成功かもしれないが(その開発・保守には予想を上回るコストが費やされたのは置いておいて)、後の言語に与えず忘れ去られたという意味ではコンピュータサイエンス的に失敗と言わざるを得ないだろう。HAL/Sを開発したIntermetrics社は、Ada83及びAda95規格の策定に関わり、Adaコンパイラを出荷したらしいので、HAL/Sにあったリアルタイム機能などの知見は多少反映されたのかもしれないが。この時代のリアルタイム機能というのは、タイマなどの割込みの後にいかにタスクを実行するように制御するかというと等価だったようだ。割込みはOSの誕生にも必須のハードウェア機能であり、その起源はOS屋としても興味深い(参照:Selected Historical Computer Designs)。ちなみに言語にリアルタイム機能を入れるという意味ではFORTRANを拡張したOLERT(On-Line Executive for Real-Time)が走りで、(今日的な)最初のリアルタイムOS(DEC RSX)の誕生よりも先だそうな(航天機構「極初期のリアルタイムOS」、「リアルタイムOS史追記」)。OSそのもの起源もFORTRANモニタにあったわけだし、Lispの実装もFORTRANのサブルーチンパッケージから始まった。盲腸のように蔑まれながらも、HPCなどの分野では今だしぶとく生き残るFORTRAN、侮りがたし。話がずいぶんずれてしまった。。。

スペースシャトルの制御は4台のAP-101の多数決で決まるのだけど(なんで奇数じゃない?)、ブート時にデッドロックの問題があったそうな。面白かったのでちょっと長くなるけど引用する。

問題は最初の電源投入時である。コンピュータたちは全く別々のタイミングで起動する。1981年 4 月、最初のシャトル打ち上げの予定時刻 20 分前、コンピュータに火を入れるはずが全然起動しなかった。4 台のコンピュータが順番に互いにバスを閉じ合って、同期に失敗するデッドロックに陥ったのである。症状は即座にデッドロックだと診断された。打ち上げは 2 日延ばされ、ソフトウェアはそのままに打ち上げられた。
後の解析によると、電源投入は 67 分の 1 の確率でデッドロックにより失敗する事が判明した。初期化コードの肥大化によって起動に要する時間が延びて、初期の設計に無いデッドロックタイミングが生じたと診断された。調査すると、デッドロックは三ヶ月前にも一度開発中に起きていた。その後もバグは発覚し続けたが、ソフトウェアの修正により新しいリスクを抱え込むより、テスト済みであるプログラムをそのまま使い続ける方針が維持された。バグは発見され次第、それを避ける詳細な手順書が作成された。STS-7 ミッションの時には、それは既に 200 ページにも渡っていた。バグの実際の修正はチャレンジャー事故後に一括して行われた。

余談になるが、この電子書籍の筆者の水城徹さんのblog「航天機構 lifelog」が面白い。宇宙開発に興味がある人以外にも、組み込みシステムなどIT系の人間にも楽しめる話題がいろいろでお勧め。ソユーズに搭載されたTsVM-101にはMIPS互換CPUが載っているというのは初耳。そう言えば、放射線の影響というと、光ファイバー放射線を浴びると白濁してしまうので、宇宙では使えないそうな。

アポロの月面ミッションを支えた誘導コンピュータAGCに関しては次の書に詳しい。AGCのソフトウェアはアセンブリで開発された。

(追記:2012-01-24)Virtual AGCとか熱いなぁ。

The Apollo Guidance Computer: Architecture and Operation (Springer Praxis Books)

The Apollo Guidance Computer: Architecture and Operation (Springer Praxis Books)