NASAの火星探査車「Perseverance」のソフトウェアは約350万行のコードで動いている。国際宇宙ステーション(ISS)の制御システムは250万行。人類が宇宙に送り出すハードウェアは、膨大なソフトウェアによって支えられている。では、宇宙ではどんなプログラミング言語が使われているのか。
宇宙開発の主要プログラミング言語
宇宙開発で使われる言語には、「信頼性」という地上とは次元の異なる要件がある。バグがシステムを落とせば、数十億ドルのミッションが消える。宇宙では「動けばいい」は通用しない。
| 言語 | 主な用途 | 採用理由 |
|---|---|---|
| C | 組み込みシステム、フライトソフトウェア | ハードウェア直接制御、高速実行 |
| C++ | 地上管制システム、シミュレーション | オブジェクト指向による大規模開発 |
| Ada | 欧州宇宙機関(ESA)のフライトソフトウェア | 安全性検証、型システムの厳密さ |
| [Python](/tag/python) | データ解析、ミッション計画 | 科学者が扱いやすい |
| MATLAB | 軌道計算、制御系設計 | 数値計算に特化 |
| HAL/S | スペースシャトルのフライトソフトウェア | NASA専用に設計された言語 |
HAL/S——NASAが宇宙のためだけに作った言語
スペースシャトルのフライトソフトウェアは、HAL/S(High-order Assembly Language / Shuttle)という専用言語で書かれていた。インターロック社が1970年代にNASAのために開発したこの言語は、地上では一切使われない「宇宙専用」の存在だ。
HAL/Sの特徴は、リアルタイム処理のための組み込みスケジューラと、数学的な表記に近い構文にある。変数名に上付き文字や下付き文字が使えるため、物理学の方程式をほぼそのままコードに変換できた。
スペースシャトルのソフトウェアは約42万行のHAL/Sで構成され、1行あたり約1,000ドルの開発コストがかかったとされる。バグ密度は1,000行あたり0.1件未満という驚異的な品質を達成していた。
火星探査車はC言語で動く
NASAのジェット推進研究所(JPL)が開発する惑星探査車は、主にC言語で書かれている。Curiosity(2012年着陸)もPerseverance(2021年着陸)も、VxWorksというリアルタイムOSの上でC言語のフライトソフトウェアが動いている。
C言語が選ばれる理由は明快だ。ハードウェアを直接制御でき、実行時のオーバーヘッドが最小限で、数十年にわたる信頼性の実績がある。宇宙の放射線環境では、ガベージコレクションのような予測不能なタイミングで動く処理は致命的になりうる。
| 探査車 | 着陸年 | 主要言語 | コード行数 | CPU |
|---|---|---|---|---|
| Spirit / Opportunity | 2004年 | C | 約55万行 | RAD6000 (20MHz) |
| Curiosity | 2012年 | C | 約250万行 | RAD750 (200MHz) |
| Perseverance | 2021年 | C | 約350万行 | RAD750 (200MHz) |
Perseveranceに搭載されたRAD750プロセッサは200MHzで動作する。2000年代初頭のスマートフォン以下の性能だが、宇宙線に対する耐放射線性を持つ。このCPU上で350万行のCコードが火星の地表を走り回っている。
Pythonの宇宙進出
フライトソフトウェアはCやAdaの領域だが、ミッション計画やデータ解析ではPythonが主流になりつつある。2019年に人類史上初のブラックホール画像を生成したEvent Horizon Telescopeの画像処理パイプラインはPythonで書かれていた。
NASAのジェット推進研究所ではPythonが公式のスクリプト言語として採用されており、軌道計算やテレメトリ解析に使われている。宇宙の最前線で、Jupyter Notebookが動いているという事実は少し愉快だ。
次世代の宇宙言語は[Rust](/tag/rust)か
NASAは2023年、ソフトウェア安全性ガイドラインでメモリ安全な言語の使用を推奨し始めた。これを受けて、宇宙開発におけるRust言語への関心が高まっている。
CとRustは実行速度で互角だが、Rustのコンパイル時メモリ安全保証は宇宙の要件に適合する。火星での「segmentation fault」は誰にも直せない——この事実が、Rustの宇宙進出を後押しするかもしれない。
200MHzのCPUで350万行のCコードが火星を走る世界で、次にコードを書くのは人間だろうか、それともAIだろうか。