두 권의 바인더 속에 숨겨진 달 탐사 임무
놀라운 사실이 하나 있습니다. 1969년 인류를 달에 착륙시켰던 코드가 여전히 존재하며, MIT 박물관에 보존된 두 권의 종이 바인더로부터 꼼꼼하게 필사되었습니다. 자원봉사자들은 이 역사적인 스캔본을 사용 가능한 디지털 코드베이스로 힘들게 변환했으며, 이제 누구나 접근하여 실행할 수 있게 되었습니다. 이는 보존과 협업의 결실을 보여주는 증거입니다.
이것은 한 명의 천재에 대한 이야기가 아닙니다. 당시 선구적인 컴퓨터 과학자였던 Margaret Hamilton은 MIT Instrumentation Laboratory의 소프트웨어 공학 부서를 이끌었습니다. 400명이 넘는 그녀의 팀은 Apollo 사령선과 달 착륙선을 위한 핵심 소프트웨어를 개발했습니다. Hamilton의 리더십과 방대한 규모의 노력은 Apollo 뒤에 숨겨진 집단적 지성을 잘 보여줍니다.
Apollo Guidance Computer를 위한 어셈블리어로 작성된 이 생존 소스 코드는 원본 메모리 이미지와 완벽하게 일치하도록 어셈블될 수 있습니다. 애호가들은 Virtual AGC 에뮬레이터를 통해 Apollo 11 우주비행사들이 실행했던 정확한 시퀀스를 경험할 수 있습니다. 이를 통해 초기 우주 비행 소프트웨어의 엄격하고 제한적인 세계를 전례 없이 깊이 있게 들여다볼 수 있습니다.
트윗보다 적은 메모리를 가진 컴퓨터
달 탐사 임무는 현대의 온도 조절기보다 성능이 낮은 하드웨어에서 실행되었습니다. MIT Instrumentation Laboratory에서 제작된 Apollo Guidance Computer(AGC)는 단 1.024 MHz로 작동했으며, 지울 수 있는 메모리는 2,048 워드, 즉 약 3,840바이트에 불과했습니다. 비교하자면, 현대의 Raspberry Pi Pico는 70배 더 많은 RAM과 130배 더 빠른 클럭 속도를 자랑합니다.
제약 사항들이 AGC를 정의했습니다. 72 KB의 읽기 전용 메모리는 물리적 프로그래밍의 경이로움인 core rope memory에 의존했습니다. 작은 자기 코어를 통과하는 와이어가 소프트웨어를 직접 인코딩했습니다. 링을 통과하는 와이어는 이진수 '1'을, 링을 감싸는 와이어는 '0'을 의미했습니다. 이는 빠른 소프트웨어 패치가 불가능했음을 의미합니다. 비행 코드는 말 그대로 하드웨어에 직조되어 발사 몇 달 전에 고정되었습니다.
이러한 한계는 뛰어난 설계를 강요했습니다. 엔지니어들은 완벽을 기하기 위해 엄격하게 검증된 매우 간결한 코드를 작성했습니다. AGC의 Executive 스케줄러는 작업을 우선순위에 따라 처리하며 12워드 슬롯에서 최대 8개의 작업을 관리했습니다. 필사된 GitHub 저장소를 살펴보면 알 수 있듯이, 코드 내부의 주석조차 때로는 구현된 로직과 일치하지 않는데, 이는 극한의 압박 속에서 이루어진 빠르고 반복적인 개발 과정을 보여줍니다.
코드에는 농담이 있습니다. 하지만 안전장치는 진지합니다.
유머는 달로 향하는 코드 속에서도 통용되는 보편적인 상수였습니다. 엄청난 압박 속에서도 MIT Instrumentation Laboratory의 엔지니어들은 Apollo Guidance Computer의 어셈블리 코드 곳곳에 유쾌하고 인간적인 주석을 남겼습니다. “Please crank this silly thing around(이 바보 같은 것을 돌려주세요)”는 우주비행사에게 착륙 레이더 안테나를 움직이라는 지시였고, “Off to see the wizard(마법사를 만나러 가자)”는 “Burn Baby Burn(타올라라)”이라는 재미있는 이름이 붙은 엔진 점화 시퀀스 앞에 위치했습니다.
우주비행사들은 작은 숫자 키패드와 디스플레이로 구성된 미니멀한 인터페이스인 DSKY(Display/Keyboard)를 통해 이 복잡한 시스템과 상호작용했습니다. 명령어는 간결한 숫자 형태의 동사와 명사 쌍으로 이루어졌습니다. 동작을 위한 '동사'(예: 표시)와 대상을 위한 '명사'(예: 시계)가 그것입니다. 종종 암기하거나 체크리스트를 참조했던 이 연습된 지시 사항들이 비행 중 컴퓨터를 조작할 수 있는 유일한 방법이었습니다.
하지만 그 재치 이면에는 철저한 회복 탄력성이 있었습니다. Apollo Guidance Computer의 Executive scheduler는 작업의 우선순위를 정하여 중요한 유도 기능이 항상 실행되도록 보장했습니다. Apollo 11 착륙 당시 결함이 있는 rendezvous radar로 인해 시스템 과부하가 발생했을 때처럼, 덜 중요한 작업은 제거되었고 1202와 같은 경보가 울렸습니다.
결정적으로, restart checkpoints는 중요한 작업을 보호했습니다. 컴퓨터가 재부팅되더라도 마지막 체크포인트에서 필수 프로세스를 다시 시작했으며, 심지어 descent engine까지 재가동했습니다. 이러한 견고한 설계 덕분에 컴퓨터는 임무를 포기하지 않고 오류를 관리할 수 있었으며, 이는 극한의 제약 속에서도 발휘된 선견지명의 증거입니다. 엄격함과 유머가 어우러진 이 코드를 탐구하고 싶은 분들을 위해 Original Apollo 11 Guidance Computer (AGC) Source Code가 공개되어 있습니다.
이 글이 마음에 드셨나요? 매일 아침 이런 글을 메일로 받아보세요.
하루 한 통 · 두 번의 클릭으로 구독 취소 · 제3자 추적 없음
1202 경보가 착륙을 중단시키지 않은 이유
Apollo 11 착륙 당시 악명 높았던 1202 경보는 프로세서 시간을 확보하기 위한 필사적인 사투를 알리는 신호였습니다. Lunar Module이 하강할 때 rendezvous radar가 초당 12,800개의 펄스를 발사하며 예기치 않게 컴퓨터 사이클의 13-15%를 점유했습니다. 이미 90%의 프로세서 자원을 사용 중인 상황에서 이러한 활동은 중요한 항법 작업이 제시간에 완료되지 못하게 만들었습니다.
Apollo Guidance Computer(AGC)의 Executive(스케줄러)는 각각 12워드 길이의 8개 작업 슬롯만 관리할 수 있었습니다. 항법 작업이 완료되지 못하면 새로운 복사본이 대기열에 추가되어 슬롯을 빠르게 채웠고, 이로 인해 1202 경보가 발생했습니다. AGC는 보호되지 않은 작업을 폐기하고 재시작함으로써 필수적인 하강 기능을 우선시했습니다. Steve Bales를 비롯한 비행 관제사들은 착륙을 계속할 수 있을지 빠르게 판단해야 했으며, 마지막 몇 분 동안 이 결정은 다섯 번이나 내려졌습니다.
이러한 회복 탄력성은 우연이 아니었습니다. MIT Instrumentation Laboratory의 Margaret Hamilton 팀은 AGC에 강력한 restart protection을 설계하여 하강 도중에도 중요한 작업을 재개할 수 있도록 했습니다. 코드 전반에 걸친 체크포인트는 descent engine과 같은 필수 작업이 즉시 재활성화될 수 있도록 보장했습니다.
오늘날 AGC의 탁월함은 직접 확인할 수 있습니다. Virtual AGC 프로젝트는 컴퓨터와 DSKY(Display and Keyboard) 인터페이스를 충실히 에뮬레이션하여 누구나 Apollo 11 비행 코드를 실행해 볼 수 있게 합니다. Apollo 11 AGC repository에서 발사 전 점검부터 착륙 경보까지 우주비행사들이 사용한 정확한 시퀀스를 탐색할 수 있습니다. Hamilton이 언급했듯이, 그녀의 팀에게는 "두 번째 기회"가 없었지만, 그들이 남긴 코드는 우리에게 배울 수 있는 무한한 기회를 제공합니다.
자주 묻는 질문
오늘날 원래의 Apollo 11 소스 코드를 실행할 수 있나요?
네. 변환된 소스 코드를 오픈 소스 Virtual AGC 에뮬레이터에서 조립하고 실행할 수 있습니다.
Apollo Guidance Computer의 메모리는 어느 정도였나요?
2,048워드의 지울 수 있는 메모리(약 3,840바이트)와 고정된 읽기 전용 core rope memory를 가지고 있었습니다.
Apollo 11 착륙 당시 1202 경보의 원인은 무엇이었나요?
레이더 펄스가 프로세서 시간을 점유하여 스케줄러의 제한된 작업 슬롯에 과부하를 일으켰습니다. 컴퓨터는 우선순위가 낮은 작업을 폐기하고 보호된 작업을 재시작했습니다.
Margaret Hamilton은 누구인가요?
Hamilton은 MIT Instrumentation Laboratory에서 Apollo 프로젝트의 소프트웨어 리더였으며, 유인 임무를 유도한 소프트웨어 개발을 도왔습니다.

