アポロ11号のコードから学ぶ！GPT-4oと共に過去の技術を解読し、現代エンジニアリングへ活かす

# アポロ11号のコード解析と現代エンジニアリングへの応用

宇宙開発史における金字塔、アポロ11号の月面着陸。
その偉業を支えたのは、現代から見ると驚くほど限られた計算能力のコンピュータと、極めて緻密に設計されたソフトウェアでした。

最近、偶然にもアポロ11号にまつわるコードをXのポストで目にする機会を得て、そのコードを読み解く過程で多くの発見がありました。

本記事では、GPT-4oの力を借りてアポロ11号のコードを解析し、得られた知見を現代のエンジニアリング、特に組み込みシステム、リアルタイムシステム、そして限られたリソースでの開発にどう活かせるかを掘り下げていきます。

---

## 発見！アポロ11号のコード断片と初期解析の試み
![A11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841127/fdae4adb-f2ac-2d0c-efbb-d908761353a1.png)


私が発見したコードは、アポロ誘導コンピュータ（AGC）の出力データの一部で、宇宙船のリアルタイム制御に不可欠な情報が含まれていました。以下は、プリントアウトに見られたデータの断片です。

```plaintext
FLAG: 0010011  ; システムのエラー状態を示すフラグ
LOS ALT: 27490.9  ; 観測対象の高度 (単位は不明)
LOS RNG: 40713.0  ; 観測対象の距離 (単位は不明)
STATIC VECTOR: RX=5729335, RY=2912736, RZ=-1656192, ... ; 宇宙船の静的ベクトルデータ
```

フォーマットは古く、それぞれのデータの意味は全く理解出来ませんでした。
そもそも画質が荒く人の目では判別がかなり難しい。そこでChatGPTに投げ掛けてみたところ、"AGC", "FLAG", "LOS"といったキーワードからアポロ11号との関連性、そしてリアルタイム制御システムの一部であることが判明しました。


## GPT-4oによるコード解読とAGC Assembly Language

コードの画像をGPT-4oに入力し、その内容、特に言語やデータの意味、そしてシステム全体の設計思想について質問してみました。

GPT-4oは、このコードが「AGC Assembly Language」で書かれたものである可能性が高いと回答。
AGC Assembly Languageは、アポロ誘導コンピュータ（AGC）のために特別に開発されたアセンブリ言語で、非常に限られたリソース環境でリアルタイム制御を実現するために設計されています。

### 得られた知見

- **各データセクションの意味と役割**:
  - `FLAG`セクションはシステムのエラー状態をビット単位で示す
  - `LOS ALT/RNG`は宇宙船のナビゲーションに不可欠な高度と距離情報
  - `STATIC VECTOR`は宇宙船の位置や姿勢を表すデータである

- **コード設計の背景にある哲学**:
当時の限られた計算資源を効率的に利用するため、シンプルさ、信頼性、そしてリアルタイム性が最優先事項として設計に組み込まれていたことがわかりました。

- **現代技術への応用可能性**:
アポロ11号のコードに見られる設計思想は、現代のIoTデバイス、組み込みシステム、そしてリアルタイムシステム開発にも通じるものがあり、多くの可能性を与えてくれると感じました。
---

## アポロ誘導コンピュータ（AGC）の技術的深堀り

AGCは1960年代の技術水準で開発されたコンピュータであり、現代の基準から見るとその性能は非常に限られています。

- **CPUクロック**: 約2MHz
- **ROM**: 36KB (ワイヤードメモリ)
- **RAM**: 2KB (磁気コアメモリ)
- **入力デバイス**: DSKY（数字キーボードと7セグメントディスプレイ）

現代のスマートフォンはおろか、一般的な電卓と比較しても（クロック10MHzくらいある）見劣りするスペックですが、AGCはこの厳しい制約の中で複雑な軌道計算やリアルタイム制御を実現しています。
これは、当時のエンジニアたちの創意工夫と徹底的な最適化の努力の賜物だと感じました。

## AGC Assembly Languageの詳細

AGC Assembly Languageは、AGCのハードウェアに特化して設計されたアセンブリ言語で、以下にAGC Assembly Languageの命令例とコードを示します。

```assembly
TC BANKCALL     ; 特定のメモリバンクへのジャンプ (Transfer Control)
TMI ADDR        ; メモリ位置ADDRにあるデータを取得してサブルーチンを呼び出す (Transfer Memory and Increment)
ADS VALUE       ; 現在の値にVALUEを加算 (Add to Storage)
```

TCはメモリ内の特定アドレスへのジャンプを簡潔に実現し、TMIはデータ取得と処理呼び出し、次の準備を1命令で統合、ADSはメモリ操作と演算を一体化して効率を向上させます。
これらの命令は、RAM 2KB・ROM 36KB・2MHzという厳しい制約下で、複数の操作を1命令にまとめて最大限の性能と信頼性を実現しています。


## 現代エンジニアリングへの応用：具体例と考察

### 1. IoTデバイス設計

IoTデバイスは、限られたリソース、低消費電力、そしてリアルタイム性が求められるという点で、AGCと多くの共通点があります。以下に例を示します：

```python
# 温度センサーデータ取得＆アラート送信 (省電力設計)
def monitor_temperature():
    temp = read_sensor()
    if temp > THRESHOLD:
        send_alert(temp)  # アラート送信は電力消費が大きいため、必要最小限に
        sleep(ALERT_INTERVAL) # アラート送信間隔を調整して電力消費を抑える

# メインループ (低消費電力モードを意識)
while True:
    monitor_temperature()
    sleep(SENSOR_READ_INTERVAL)  # センサー読み取り間隔を調整
```

#### 解説

##### 1. データ監視とアラート送信
```python
temp = read_sensor()
if temp > THRESHOLD:
    send_alert(temp)
    sleep(ALERT_INTERVAL)
```
- **`read_sensor()`**: 温度センサーからデータを取得
- **`if temp > THRESHOLD:`**: 温度がしきい値を超えた場合のみアラートを送信
- **`send_alert(temp)`**: アラートを送信。無駄な送信を防ぎ、電力消費を抑制
- **`sleep(ALERT_INTERVAL)`**: アラート送信後の待機で連続送信を防ぎ、安定動作を維持


##### 2. メインループでの制御
```python
while True:
    monitor_temperature()
    sleep(SENSOR_READ_INTERVAL)
```
- **`monitor_temperature()`**: 温度監視関数を実行
- **`sleep(SENSOR_READ_INTERVAL)`**: センサー読み取りの間隔を調整し、無駄な処理を削減


#### 特徴と利点
- **省電力設計**: アラート送信とセンサー読み取りの頻度を適切に制御することで、エネルギー消費を最小限に
- **シンプルな構造**: 分かりやすい関数分割とループ設計で保守性を向上
- **リアルタイム性の維持**: 必要な時にのみ動作する効率的な設計

このような設計は、バッテリー駆動のIoTデバイスや省電力が求められる環境で特に有効です。

---
### 2. リアルタイム制御システム

自動運転車、産業用ロボット、医療機器など、リアルタイム性が求められるシステムでは、AGCのリアルタイム制御技術が参考になります。

```cpp
// リアルタイム制御ループ (C++ example)
void control_loop() {
    while (true) {
        SensorData data = read_sensors(); // センサーデータ取得
        ActuatorCommands commands = process_data(data); // 制御コマンド生成
        send_commands(commands); // コマンド送信

        // リアルタイム性を保証するため、処理時間を厳密に管理
        auto elapsed_time = get_elapsed_time();
        if (elapsed_time < CONTROL_CYCLE_TIME) {
            sleep(CONTROL_CYCLE_TIME - elapsed_time); 
        } else {
            // 制御ループの遅延を記録・警告
            log_error("Control loop overrun!");
        }
    }
}
```
#### 解説

##### センサーデータの取得と処理
```cpp
SensorData data = read_sensors();
ActuatorCommands commands = process_data(data);
send_commands(commands);
```
- **`read_sensors()`**: センサーからデータを取得
- **`process_data(data)`**: データを基に制御コマンドを生成
- **`send_commands(commands)`**: アクチュエータ（動作装置）にコマンドを送信

これにより、システムは環境をリアルタイムに感知し、適切な動作を指示します。


##### 処理時間の管理
```cpp
auto elapsed_time = get_elapsed_time();
if (elapsed_time < CONTROL_CYCLE_TIME) {
    sleep(CONTROL_CYCLE_TIME - elapsed_time);
} else {
    log_error("Control loop overrun!");
}
```
- **`get_elapsed_time()`**: 処理にかかった時間を計測
- **`sleep()`**: 制御周期（`CONTROL_CYCLE_TIME`）に余裕があれば待機し、一定のタイミングを維持
- **遅延検知**: 必要な時間を超える場合はログを記録し、問題を警告

#### 特徴と利点
- **リアルタイム性**: センサーとアクチュエータ間の処理を正確な周期で実行
- **安定性**: 処理時間を厳密に管理することで、動作の遅延や不安定さを回避
- **エラー対応**: 遅延発生時の警告でデバッグを容易に

この構造は、自動運転やロボットなどでリアルタイム性を保証する基本的な設計パターンとして非常に重要です。

---

### 3. 組み込みシステム
組み込みシステム開発においても、AGCのようにハードウェア性能を最大限に引き出す効率的な設計が求められます。現代では、RTOS（リアルタイムオペレーティングシステム）がAGCの役割を担うケースが多く、タスク管理、リソース割り当て、リアルタイムスケジューリングなどを提供しています。

```cpp
// FreeRTOSタスク例 (優先度付きタスク管理)
void highPriorityTask(void *pvParameters) {
    while (1) {
        // リアルタイム性が要求される重要な処理
        vTaskDelay(HIGH_PRIORITY_TASK_INTERVAL); 
    }
}

void lowPriorityTask(void *pvParameters) {
    while (1) {
        // リアルタイム性はそれほど重要ではない処理
        vTaskDelay(LOW_PRIORITY_TASK_INTERVAL);
    }
}

int main() {
    // 優先度の高いタスクを先に登録
    xTaskCreate(highPriorityTask, "HighPriorityTask", 1000, NULL, 2, NULL); // 優先度 2
    xTaskCreate(lowPriorityTask, "LowPriorityTask", 1000, NULL, 1, NULL); // 優先度 1

    vTaskStartScheduler();
    return 0;
}
```
#### 解説

##### 1. タスクの優先度設定
```c
xTaskCreate(highPriorityTask, "HighPriorityTask", 1000, NULL, 2, NULL);
xTaskCreate(lowPriorityTask, "LowPriorityTask", 1000, NULL, 1, NULL);
```
- **`highPriorityTask`**: 優先度が2のタスク。リアルタイム性が求められる重要な処理を実行
- **`lowPriorityTask`**: 優先度が1のタスク。リアルタイム性がそれほど必要ない処理を実行
- 優先度の高いタスクがリソースを優先的に利用できるようスケジューリングされます



##### 2. メイン関数でのスケジューラ起動
```c
vTaskStartScheduler();
```
- FreeRTOSのスケジューラを起動し、登録されたタスクの優先度に基づいて実行を管理
- スケジューラが実行中は、優先度に応じてタスクが切り替わりながら動作可能



##### 3. タスク内の動作
```c
vTaskDelay(HIGH_PRIORITY_TASK_INTERVAL);
```
- 各タスクは必要な処理を行った後、`vTaskDelay`を使用して一定時間待機する
- 待機中は他のタスクにCPUリソースが割り当てられるため、効率的なマルチタスク処理が可能

#### 特徴と利点
- **優先度付き管理**: リアルタイム性が求められる処理を優先的に実行
- **効率的なリソース活用**: タスクの待機中に他のタスクを実行し、リソースの無駄を最小化
- **柔軟な設計**: タスクの追加や優先度変更が容易

このような優先度付きタスク管理は、組み込みシステムにおける複雑な要件を満たしつつ、高効率な動作を実現します。

---

## まとめ
今回、ふと目にしたアポロ11号のコードを解析してみたことで、多くの気づきがありました。まず、全く分からない資料に対してGPT-4oが解説をしてくれることのメリットを実感しました。これはプログラミングに限らず、歴史的資料や他の専門分野の資料においても、解説まで至らなくともヒントを得られる可能性が大いにあるということです。

次に、自力では理解できないことでも、GPT-4oを活用することで分かるようになる点です。例えば、今回取り上げたAGC Assembly LanguageについてQiita読者のほとんどがその存在自体知らなかったり、知っていてもコードを理解できる人は稀だったと思います。
従来であれば、このような直接業務に関係のないコードは人に尋ねたり調べるのに何日もかかり、「それほど重要ではない」と諦めるケースも多いはずです。しかし、GPT-4oを活用することで、わずか数時間、場合によっては数分のやり取りで解説が得られ、大切なことに気づかされることもあります。このように、学習効率が飛躍的に向上する点は非常に大きなメリットです。

さらに、古い技術や考え方が現代の技術やエンジニアリングに活かせることにも気づかされました。過去の技術のシンプルさや信頼性を重視した設計思想は、現在の開発にも通じる重要な指針です。これらを参考にすることで、より堅牢で効率的なソフトウェア開発が可能になります。

「そんなコード知ってどうなるの？」という声が聞こえそうですが、知らないことを知るという経験自体が非常に価値のあるものです。そしてAIを活用すれば、効率的に新しい知識を学ぶことができます。GPT-4oは、コードレビューや設計アドバイス、技術調査、ドキュメント作成を効率化するだけでなく、過去の知見を現代の課題解決に応用する架け橋として機能します。

ぜひ、この記事を参考に、AIの力を借りて新しい領域に飛び込み、未知の知識を効率よく学び、自分の技術をさらに進化させてください。それが、これからのエンジニアリングにおける大きな武器となる気がします。