트렌딩 딥다이브 · 2026-07-22 · TrendShift Daily #10 · CHRISLGARRY

chrislgarry/Apollo-11 딥다이브
— 달에 사람을 보낸 1969년 유도 컴퓨터 원본 소스코드

Apollo-11 저장소는 1969년 아폴로 11호의 사령선(CM)과 달착륙선(LM)을 제어한 AGC(아폴로 유도 컴퓨터) 어셈블리 원본 소스코드를, MIT 박물관에 남아 있던 종이 인쇄본에서 한 글자씩 디지털로 옮겨 담은 것이다. 코드 자체는 반세기 전의 것이지만, 사람 목숨을 실은 실시간 시스템을 4KB 남짓 메모리 안에 욱여넣은 소프트웨어 공학의 정수라 지금도 개발자들이 주기적으로 다시 발견하고 별을 던진다. 이 저장소가 유명해진 결정적 계기는 코드 곳곳에 박힌 사람 냄새 나는 주석이었다. # TEMPORARY, I HOPE HOPE HOPE(임시방편이길 빌고 또 빈다), # OFF TO SEE THE WIZARD...(오즈의 마법사를 만나러) 같은 농담이 2016년 Reddit·해커뉴스를 강타했고, 여기에 프로그래밍 리더 마거릿 해밀턴의 이름과 1202 알람의 전설이 겹쳐 "역사적 코드" 저장소의 대명사가 됐다.

(저장소 chrislgarry/Apollo-11 · CM Comanche055(Colossus 2A) + LM Luminary099 · 어셈블러 yaYUL(Virtual AGC) · .agc 파일 175개·약 13만 줄 · 디지털화: Virtual AGC + MIT 박물관 · 번역 ~45개 언어(한국어 포함) · 라이선스 퍼블릭 도메인 · 클론 소스 직접 분석)
목차
  1. 프로젝트 한 줄 요약
  2. 왜 주목받는가 — 반세기 코드가 계속 트렌딩하는 이유
  3. 기술 스택 전체 지도 — AGC 어셈블리·yaYUL·Virtual AGC
  4. 아키텍처 심화 — AGC 하드웨어·Executive·Interpreter·1202 알람
  5. 디렉토리 구조 해부
  6. 학습 포인트 — 여기서 배워갈 설계
  7. 하드웨어 / 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한 줄 요약

"The code that took us to the moon." — 우리를 달로 데려간 코드
한 문장으로

Apollo-11 = 1969년 아폴로 11호 유도 컴퓨터(AGC)의 어셈블리 소스를 종이 인쇄본에서 원문 그대로 디지털 복원한, "달 착륙 소프트웨어"의 오픈 아카이브

이 저장소는 새 소프트웨어를 개발하는 곳이 아니다. MIT 계기연구소가 짜고 인쇄한 원본을 한 글자도 고치지 않고 스캔본과 똑같이 맞추는 것이 목표인 충실 복원(fidelity) 프로젝트다. 그래서 976개가 넘는 PR 대부분이 "스캔본에는 오타가 있으니 코드도 그 오타대로 되돌려라" 같은 것이다.

내용물은 딱 두 폴더다 — Comanche055/(사령선 컴퓨터, 코드명 "Colossus 2A")와 Luminary099/(달착륙선 컴퓨터, "Luminary 1A" 빌드 099). 빌드 시스템도, 프레임워크도 없다. 순수한 .agc 어셈블리 텍스트 175개가 전부이며, 실제로 돌려보려면 별도 프로젝트인 Virtual AGCyaYUL 어셈블러가 필요하다.

이 프로젝트가 특별한 이유는 "동작하는 최신 도구"라서가 아니라 인류가 처음 다른 천체에 발을 딛게 만든 소프트웨어의 실물이기 때문이다. 저장소 README의 정의를 그대로 옮기면 "사령선(Comanche055)과 달착륙선(Luminary099)을 위한 아폴로 11호 유도 컴퓨터 원본 소스코드. Virtual AGC와 MIT 박물관 사람들이 디지털화했다"이다. 코드를 짠 팀의 프로그래밍 리더는 "소프트웨어 공학(software engineering)"이라는 용어를 대중화한 마거릿 해밀턴(Margaret H. Hamilton)이며, 그의 서명은 저장소 안 CONTRACT_AND_APPROVALS.agc에 지금도 남아 있다.

용어
AGC (Apollo Guidance Computer, 아폴로 유도 컴퓨터)
아폴로 우주선의 항법·유도·제어를 담당한 탑재 컴퓨터다. 무게 약 32kg, 소비전력 약 55W, 메모리는 지울 수 있는 RAM 약 2K워드 + 고정된 ROM 약 36K워드가 전부였다. 요즘 스마트폰의 수백만 분의 1 성능이지만, 이 작은 기계가 엔진 분사·자세 제어·달 착륙 유도를 실시간으로 해냈다. 우주비행사는 DSKY라는 숫자 키패드로 "동사(Verb)+명사(Noun)" 코드를 입력해 컴퓨터와 대화했다.
용어
Comanche055 / Luminary099 (두 개의 프로그램)
아폴로 11호에는 컴퓨터가 두 대 있었다. Comanche055는 사령선(우주비행사 콜린스가 남은 곳)의 프로그램으로 코드명 "Colossus 2A", Luminary099는 달착륙선(암스트롱·올드린이 탄 곳)의 프로그램으로 "Luminary 1A"다. 뒤의 숫자 055·099는 빌드 리비전 번호다. 두 프로그램은 EXECUTIVE·WAITLIST·INTERPRETER 같은 공통 뼈대를 공유하되, 각자 사령선/착륙선 전용 유도 로직을 얹었다.

규모를 숫자로 보면 이렇다. 사령선 프로그램은 .agc 파일 85개·65,348줄, 착륙선 프로그램은 90개·64,838줄, 합쳐서 175개 파일·약 13만 줄의 어셈블리다. 라이선스는 퍼블릭 도메인(Public Domain Mark 1.0) — "저작권 제약 없이 상업적 용도로도 자유롭게 복제·수정·배포·실연 가능"하다. README는 이미 한국어를 포함한 약 45개 언어로 번역돼 있다(Translations/README.ko_kr.md).

2왜 주목받는가 — 반세기 코드가 계속 트렌딩하는 이유

최신 라이브러리가 아닌데도 개발자들이 자꾸 다시 별을 던지는 세 가지 힘

2016년 7월, 개발자 Chris Garry가 Virtual AGC 팀의 복원본을 GitHub에 통째로 올렸다. 며칠 만에 Reddit·해커뉴스 상위를 휩쓸었고, 이후로도 아폴로 관련 기념일·다큐·밈이 돌 때마다 주기적으로 트렌딩에 재진입한다. 이 저장소는 "기능"으로 경쟁하지 않는다. 대신 다른 종류의 힘이 세 가지 있다.

① 코드에 사람이 보인다 — 전설이 된 주석들

바이럴의 방아쇠는 유머러스하고 인간적인 주석이었다. 반세기 전 20대 엔지니어들이 극한의 압박 속에서 남긴 농담이, 오늘날 개발자들이 자기 코드에 다는 // TODO: fix this later와 똑같은 정서라는 게 사람들을 울렸다. 실제 파일에서 확인한 것들이다.

# Luminary099/LUNAR_LANDING_GUIDANCE_EQUATIONS.agc (179~180행) TC BANKCALL # TEMPORARY, I HOPE HOPE HOPE CADR STOPRATE # TEMPORARY, I HOPE HOPE HOPE # Luminary099/THE_LUNAR_LANDING.agc (254행) — 점화 루틴으로 점프하며 TC POSTJUMP # OFF TO SEE THE WIZARD... CADR BURNBABY # Luminary099/THE_LUNAR_LANDING.agc (245행) — 우주비행사에게 안테나를 돌리라 부탁하고… CAF CODE500 # ASTRONAUT: PLEASE CRANK THE TC BANKCALL # SILLY THING AROUND CADR GOPERF1 TCF GOTOPOOH # TERMINATE TCF P63SPOT3 # PROCEED SEE IF HE'S LYING

마지막 주석 # SEE IF HE'S LYING("비행사가 거짓말하는지 확인해봐")는 특히 유명하다. 착륙 레이더 안테나를 손으로 돌려달라고 부탁한 뒤, 정말 돌렸는지 센서로 검증하는 코드에 붙은 농담이다. GOTOPOOH·CHKPOOH의 "POOH"는 컴퓨터의 대기(idle) 프로그램 P00를 승무원들이 "곰돌이 푸(Pooh)"라 부른 데서 왔다.

비유

이 저장소가 사랑받는 건, 박물관 유리장 속 우주복이 아니라 "그 우주복 안주머니에서 나온 손때 묻은 메모"이기 때문이다. 공식 문서는 위대함을 말하지만, I HOPE HOPE HOPE 같은 주석은 마감에 쫓기던 진짜 사람을 보여준다. 개발자들은 거기서 50년의 시간차를 뛰어넘어 "아, 얘네도 우리랑 똑같았구나"를 느낀다. 코드가 유물이자 밈이 되는 순간이다.

② 이름들의 무게 — 마거릿 해밀턴과 그 팀

README의 "계약·승인" 표에는 실제 서명자들이 등장한다. 프로그래밍 리더 마거릿 해밀턴을 필두로 Daniel Lickly, Fred Martin, Norman Sears, 탄도학의 대가 Richard Battin, David Hoag 등이다. 해밀턴이 딸을 데리고 연구소에 나와 밤새 코드를 짜고, 자기 키만큼 쌓인 출력물 옆에 선 사진은 소프트웨어 공학의 상징적 이미지가 됐다. 이 저장소는 그 전설을 추상적 일화가 아니라 실제 파일로 만나게 해준다.

역사적 사실
1202 · 1201 알람 — 착륙 직전, 컴퓨터가 스스로를 구했다

달 착륙 마지막 몇 분, AGC가 "1202 알람"을 쏟아냈다. 랑데부 레이더가 불필요한 데이터로 컴퓨터를 과부하시킨 것이다. 보통 컴퓨터라면 멈췄겠지만, 해밀턴 팀이 설계한 우선순위 기반 스케줄러(Executive)낮은 우선순위 작업을 버리고 착륙 유도라는 핵심 작업만 살려 재시작을 반복했다. 관제센터의 24세 엔지니어 Steve Bales가 "GO"를 외쳤고, 착륙은 계속됐다. 이 드라마의 주역인 EXECUTIVE.agc·ALARM_AND_ABORT.agc·RESTARTS_ROUTINE.agc가 이 저장소 안에 그대로 있다.

③ 교보재로서의 가치 — 제약이 만든 천재적 설계

세 번째 힘은 순수하게 기술적이다. 요즘 개발자는 메모리·CPU를 사실상 무한정 쓴다. 그런데 AGC 팀은 RAM 약 2K워드, ROM 약 36K워드라는 상상 못 할 제약 안에서 실시간 멀티태스킹 운영체제, 소프트웨어 가상머신, 더블 정밀도 벡터 수학을 구현했다. 이런 "극한 제약 엔지니어링"은 임베디드·펌웨어·시스템 프로그래밍을 배우는 사람에게 최고의 교보재다. 아래 표가 이 저장소를 "여느 트렌딩 레포"와 구분한다.

보통의 트렌딩 레포chrislgarry/Apollo-11
목적새 기능·도구 개발역사적 원본의 충실 복원(스캔본과 1:1 일치)
PR의 성격버그 수정·기능 추가"스캔본 오타를 코드에 되살려라" 같은 고증
언어Python·TS·Rust…AGC 어셈블리 + 인터프리터 의사코드
빌드npm/pip/cargo빌드 없음 — 실행은 외부 yaYUL/Virtual AGC
가치당장의 생산성역사 + 극한 제약 설계 교보재
수명유행 지나면 하락기념일·다큐마다 재트렌딩

3기술 스택 전체 지도 — AGC 어셈블리·yaYUL·Virtual AGC

"프레임워크 제로" — 진짜 스택은 언어(어셈블리)와 그것을 되살리는 도구 생태계다

이 저장소에는 우리가 흔히 말하는 백엔드·프론트엔드·인프라가 없다. 대신 스택을 세 층으로 재해석할 수 있다 — ① 코드가 쓰인 언어(AGC 어셈블리 + 인터프리터 의사코드), ② 그 코드를 실제로 조립·실행하는 툴체인(yaYUL·Virtual AGC), ③ 저장소를 관리하는 현대 도구(문서 린트)다.

① 언어 층 — 두 개의 언어가 한 파일에 산다

AGC 소프트웨어의 묘미는 한 프로그램 안에 두 개의 언어가 섞여 있다는 점이다. 하나는 하드웨어가 직접 실행하는 기본 명령어(basic instructions), 다른 하나는 소프트웨어 인터프리터가 실행하는 의사명령어(interpretive)다. 후자는 CPU가 원래 못 하는 더블 정밀도·벡터·행렬 연산을 작은 메모리로 해내기 위한 1960년대판 "바이트코드 VM"이다.

구성정체비고
기본 명령어CA·CS·TS·AD·XCH·TC·TCF·CCS·MASK·INDEX하드웨어가 직접 실행. 극소수의 옵코드로 모든 걸 만든다
확장 명령어EXTEND 접두 후 DCA·DXCH·QXCH·RAND·WAND·BZFEXTEND 한 줄이 다음 명령을 "확장 모드"로 바꾼다
인터프리터 언어DLOAD·STODL·VXSC·DAD소프트웨어 VM이 실행하는 벡터/더블 정밀도 의사코드
의사명령(pseudo-op)ERASE·OCT·DEC·SETLOC·BANK·EBANK=·CADR·2DNADR·EQUALS어셈블러 지시어(메모리 배치·상수·뱅크 선택)
인터럽트 제어INHINT / RELINT인터럽트 금지/허용 — 실시간 시스템의 핵심 도구

실제 코드를 보자. 아래는 사령선의 Executive(작업 스케줄러) 도입부다. 극소수 옵코드로 "새 작업을 큐에 넣는" 저수준 동작을 짜는 방식이 보인다.

# Comanche055/EXECUTIVE.agc — VAC 영역이 필요 없는 작업 등록 NOVAC INHINT # 인터럽트 금지(임계 구역 진입) AD FAKEPRET # 우선순위 계산 TS NEWPRIO # 새 작업 우선순위 저장 EXTEND # 다음 명령을 확장 모드로 INDEX Q DCA 0 # 작업의 2워드 주소 로드(확장 명령) DXCH NEWLOC CAF EXECBANK XCH FBANK # 뱅크 전환 TS EXECTEM1 TCF NOVAC2 # Executive 뱅크로 점프
용어
yaYUL (어셈블러)
.agc 텍스트를 실제 AGC가 실행할 기계어로 번역하는 어셈블러다. 1960년대 MIT의 원조 어셈블러 이름이 YUL이었고, yaYUL은 "yet another YUL"(YUL의 현대 재구현)이다. Virtual AGC 프로젝트(개발자 Ron Burkey)의 일부다. 이 저장소 자체에는 yaYUL이 없다 — 모든 .agc 파일 헤더가 # Assembler: yaYUL이라 적어 두고, README가 "컴파일하려면 Virtual AGC를 받으라"고 안내한다.

② 툴체인 층 — Virtual AGC 생태계

저장소를 "돌려보는" 열쇠는 전부 외부의 Virtual AGC에 있다. 이 프로젝트는 세 가지를 준다.

즉 "코드는 여기(GitHub), 실행 환경은 저기(Virtual AGC)"로 역할이 깔끔하게 분리돼 있다. 저장소의 .gitignoreyaYUL.exe를 무시 목록에 넣어 둔 것도 이 협업 구조의 흔적이다.

③ 저장소 관리 층 — 코드가 아니라 "문서"를 위한 현대 도구

재미있게도 이 역사적 저장소에도 package.jsonbun.lockb(모던 Bun 락파일)가 있다. 하지만 이건 AGC 코드를 빌드하는 게 아니다. 유일한 의존성은 markdownlint-cli2 하나로, README·번역 문서의 마크다운 서식을 검사하는 용도다. CI(GitHub Actions)도 마크다운 린트와 PR 라벨링만 돌린다. "어셈블리 코드는 손대지 않고 고증만, 대신 문서 품질은 현대 도구로 관리"라는 이 저장소의 성격이 스택에도 드러난다.

흔한 오해
"git clone 하면 빌드해서 달에 갈 수 있다?"

아니다. 저장소에는 빌드 파이프라인이 없고, package.json은 문서 린트용일 뿐이다. 실제 어셈블·실행은 별도 프로젝트 Virtual AGC가 필요하다. 또 여기 있는 건 아폴로 11호 시점의 특정 빌드(Comanche055/Luminary099)이며, Luminary099는 저장소 헤더가 일관되게 "Luminary 1A"로 적는다("1C"가 아니다 — 1C는 이후 리비전).

4아키텍처 심화 — AGC 하드웨어·Executive·Interpreter·1202 알람

4KB 남짓한 기계가 "실시간 OS + 가상머신 + 유도 수학"을 굴린 방법

AGC를 이해하는 지도는 하드웨어(15비트 CPU + 뱅크 메모리) → 실시간 핵심(Executive·Waitlist·인터럽트) → 소프트웨어 VM(Interpreter) → 인간 인터페이스(DSKY)의 네 층이다. 이 층들이 어떻게 맞물렸는지 뜯어보자.

┌──────────────────────────────┐ │ 우주비행사 (Astronaut) │ │ DSKY: Verb/Noun 숫자 입력 │ └───────────────┬──────────────┘ │ 키 입력 / 램프·숫자 출력 ▼ ┌─────────────────────────────────────────────────────────┐ │ PINBALL_GAME_BUTTONS_AND_LIGHTS.agc (DSKY 인터페이스) │ └───────────────────────────┬─────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────┐ │ 실시간 핵심 (Real-time core) │ │ EXECUTIVE — 우선순위 기반 작업 스케줄러(최대 7 작업) │ │ WAITLIST — 타이머로 예약된 짧은 작업 큐 │ │ T4RUPT / KEYRUPT — 하드웨어 인터럽트 핸들러 │ └───────────────┬─────────────────────────┬───────────────┘ ▼ ▼ ┌───────────────────────────┐ ┌─────────────────────────┐ │ INTERPRETER (소프트웨어 VM)│ │ 유도·제어 로직 │ │ 더블정밀도·벡터·행렬 의사 │ │ THE_LUNAR_LANDING │ │ 명령을 실행하는 바이트코드│ │ LUNAR_LANDING_GUIDANCE_… │ └───────────────┬───────────┘ │ BURN_BABY_BURN(점화) │ │ └─────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────┐ │ CPU: 15비트+패리티(16비트 워드), 누산기 A·L·Q·Z 레지스터 │ │ MEMORY: Erasable(RAM ~2K워드, E뱅크) + Fixed(ROM ~36K, │ │ 코어 로프, F뱅크) — 슈퍼뱅크로 주소공간 확장 │ └─────────────────────────────────────────────────────────┘

(A) 하드웨어 — 15비트 워드와 "짜서 만든" ROM

AGC의 워드는 15비트 데이터 + 1비트 패리티 = 16비트다. 메모리는 두 종류다. Erasable(지울 수 있는) 메모리는 자성 코어를 쓴 RAM으로 약 2K워드, 프로그램 실행 중 바뀌는 변수가 산다. Fixed(고정) 메모리는 약 36K워드의 ROM인데, 놀랍게도 "코어 로프 메모리(core rope)" — 여성 작업자들이 구리선을 자성 고리에 통과시키거나(1) 비껴가게(0) 손으로 짜서 비트를 물리적으로 엮은 것이다. 그래서 별명이 "LOL 메모리(Little Old Ladies)"였다. 한 번 짜면 못 바꾸니, 발사 전 코드는 말 그대로 천에 새겨 고정됐다.

용어
뱅크 전환(bank switching)과 슈퍼뱅크
15비트 주소로는 메모리를 다 가리킬 수 없다(공간 부족). 그래서 AGC는 메모리를 여러 "뱅크(bank)"로 나누고, 지금 어느 뱅크를 볼지 레지스터로 전환했다. 지울 수 있는 쪽은 E뱅크, 고정된 쪽은 F뱅크, 그것도 모자라 슈퍼뱅크(super-bank)로 한 번 더 확장했다. 코드에서 BANK·EBANK=·SETLOC 같은 지시어가 끊임없이 나오는 게 이 때문이다. 오늘날 임베디드의 "페이지드 메모리"·"뱅크드 ROM"과 똑같은 발상의 원조 격이다.

(B) 실시간 핵심 — Executive와 Waitlist가 만든 협조형 멀티태스킹

AGC의 가장 현대적인 부분이다. EXECUTIVE.agc우선순위 기반 작업 스케줄러로, 최대 7~8개 작업(job)을 우선순위대로 돌린다. 긴 계산은 여기에 등록된다. WAITLIST.agc타이머로 예약된 짧은 작업을 관리한다("0.1초 뒤 이 루틴 실행"). 둘이 합쳐져, 한 대의 CPU가 여러 일을 동시에 하는 것처럼 보이는 협조형 멀티태스킹(cooperative multitasking) 실시간 OS가 된다.

비유

Executive는 응급실의 트리아지(중증도 분류) 간호사다. 환자(작업)가 밀려들면, 간호사는 도착 순서가 아니라 위급도(우선순위)로 진료 순서를 정한다. 병상(VAC 영역)이 부족하면 경증 환자는 대기시키고 중증부터 살린다. 착륙 순간 컴퓨터가 과부하됐을 때 "착륙 유도"라는 최중증 환자를 먼저 살리고 잡무를 미룬 것이, 바로 이 간호사(Executive)의 판단이었다.

아키텍처의 하이라이트
1202 알람의 실체 — 우아한 실패(graceful degradation)

착륙 중 랑데부 레이더가 스위치 오설정으로 가짜 작업을 계속 만들어 Executive의 작업 슬롯을 다 채웠다. 슬롯이 넘치자 Executive는 ALARM_AND_ABORT.agc를 통해 1202("Executive 오버플로")를 띄우고, RESTARTS_ROUTINE.agc낮은 우선순위 작업을 버린 뒤 핵심 작업만 안고 재시작했다. 멈추지 않고 "덜 중요한 걸 포기하고 계속 나아가는" 이 설계가 인간을 달에 내려놓았다. 현대 시스템 설계의 "graceful degradation(우아한 성능 저하)" 교과서 사례다.

(C) 소프트웨어 VM — Interpreter라는 1960년대 바이트코드

유도 방정식에는 더블 정밀도, 벡터, 행렬 연산이 필요한데 AGC 하드웨어는 그런 걸 직접 못 한다. 그래서 팀은 INTERPRETER.agc(약 90여 쪽)라는 소프트웨어 가상머신을 만들었다. DLOAD·STODL·VXSC 같은 의사명령을 정의하고, 인터프리터가 이를 해석해 실행한다. 속도는 느리지만 코드 밀도가 극적으로 높아져, 부족한 고정 메모리 안에 복잡한 물리 계산을 욱여넣을 수 있었다. 오늘날 JVM·파이썬 바이트코드·WASM과 정확히 같은 아이디어의 반세기 전 조상이다.

(D) 인간 인터페이스 — DSKY와 "동사·명사"

PINBALL_GAME_BUTTONS_AND_LIGHTS.agc(이름부터 "핀볼 게임")가 DSKY를 담당한다. 우주비행사는 동사(Verb, 무엇을 할지)명사(Noun, 무엇에 대해)를 각각 두 자리 숫자로 입력했다. 예를 들어 "Verb 16 Noun 68"은 "이 값을 계속 보여줘(16) — 착륙 정보(68)를"이다. 코드 주석은 이 인터페이스를 이렇게 정의한다: "통신의 언어는 동사와 명사라 불리는 한 쌍의 단어이며, 각각 두 자리 십진수로 표현된다." GUI도 자연어도 없던 시절, 제약이 낳은 극도로 압축된 명령 언어다.

(E) 조립 방식 — MAIN.agc라는 목차

수십 개 파일은 어떻게 하나의 프로그램이 될까? 각 프로그램의 MAIN.agc목차 겸 조립 지시서 역할을 한다. $파일명 형식으로 모든 조각을 순서대로 포함(include)하며, 원본 인쇄물의 쪽 번호까지 주석으로 달아 둔다.

# Luminary099/MAIN.agc — 착륙 시퀀스가 조립되는 순서(발췌) $BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc # pp. 731-751 $P40-P47.agc # pp. 752-784 $THE_LUNAR_LANDING.agc # pp. 785-792 $THROTTLE_CONTROL_ROUTINES.agc # pp. 793-797 $LUNAR_LANDING_GUIDANCE_EQUATIONS.agc # pp. 798-828 $ASCENT_GUIDANCE.agc # pp. 843-856 $SERVICER.agc # pp. 857-897

5디렉토리 구조 해부

폴더는 딱 둘 — 사령선(Comanche055)과 달착륙선(Luminary099)
Apollo-11/ │ README.md ★ 무엇인지·역사·기여 규칙 (한국어 번역 있음) │ CONTRIBUTING.md ★ "스캔본과 정확히 일치시켜라" 고증 규칙 │ LICENSE.md 퍼블릭 도메인 (Public Domain Mark 1.0) │ package.json ← AGC 빌드 아님! markdownlint(문서 린트)용 │ bun.lockb 문서 도구용 Bun 락파일 │ ├─ Comanche055/ ★★★ 사령선(CM) 프로그램 "Colossus 2A" │ │ .agc 85개 · 65,348줄 │ ├─ MAIN.agc ★ 조립 목차($include + 원본 쪽번호) │ ├─ CONTRACT_AND_APPROVALS.agc ★ 마거릿 해밀턴 서명이 있는 곳 │ ├─ EXECUTIVE.agc ★★ 우선순위 작업 스케줄러(실시간 OS 핵심) │ ├─ WAITLIST.agc ★ 타이머 예약 작업 큐 │ ├─ INTERPRETER.agc ★★ 소프트웨어 VM(더블정밀도·벡터 의사코드) │ ├─ PINBALL_GAME_BUTTONS_AND_LIGHTS.agc ★ DSKY(Verb/Noun) 인터페이스 │ ├─ CM_ENTRY_DIGITAL_AUTOPILOT.agc 재진입 자동조종 │ ├─ TVCDAPS.agc / KALCMANU_STEERING.agc 추력벡터·자세 제어 │ └─ IMU_CALIBRATION_AND_ALIGNMENT.agc 관성측정장치 정렬 │ ├─ Luminary099/ ★★★ 달착륙선(LM) 프로그램 "Luminary 1A"(빌드099) │ │ .agc 90개 · 64,838줄 │ ├─ MAIN.agc ★ 조립 목차 │ ├─ THE_LUNAR_LANDING.agc ★★ 착륙 제동 단계(P63) │ ├─ LUNAR_LANDING_GUIDANCE_EQUATIONS.agc ★★ 착륙 유도 방정식(전설의 주석) │ ├─ BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc ★ 엔진 점화 마스터 │ ├─ THROTTLE_CONTROL_ROUTINES.agc 엔진 추력 제어 │ ├─ ASCENT_GUIDANCE.agc 상승(이륙) 유도 │ ├─ EXECUTIVE.agc / WAITLIST.agc / INTERPRETER.agc (공통 뼈대) │ ├─ ALARM_AND_ABORT.agc ★ 1201/1202 알람 처리 │ └─ SERVICER.agc 50ms 주기 항법 갱신 루프 │ ├─ Translations/ README·CONTRIBUTING 약 45개 언어(한국어 포함) 69파일 └─ .github/ ISSUE_TEMPLATE + workflows(markdownlint, 라벨링)
읽는 순서 추천

README.md(무엇이고 왜 고증 프로젝트인지) → Luminary099/MAIN.agc(달착륙선 프로그램이 어떤 조각들로 조립되는지 지도 보기) → THE_LUNAR_LANDING.agc·LUNAR_LANDING_GUIDANCE_EQUATIONS.agc(가장 유명한 착륙 코드와 전설의 주석) → EXECUTIVE.agc(1202 알람을 이해하는 스케줄러) → INTERPRETER.agc(소프트웨어 VM의 발상) → PINBALL_GAME_BUTTONS_AND_LIGHTS.agc(DSKY 인터페이스). 어셈블리가 처음이라도, 주석만 따라 읽어도 "이 코드가 무엇을 시키는지"의 절반은 잡힌다 — 원본 팀이 주석을 아주 성실히 달아둔 덕이다.

용어
충실 복원(fidelity) 원칙 — CONTRIBUTING.md의 핵심
이 저장소의 기여 규칙은 특이하다. "코드 주석은 스캔본과 정확히 일치해야 한다. 만약 디지털본에 SPACECRAFT라 돼 있는데 스캔본에는 SPAECRAFT(오타)로 인쇄돼 있다면, 디지털본을 그 오타대로 되돌려라." 즉 버그·오타를 고치는 게 아니라 원본과 똑같이 보존하는 게 목적이다. 그래서 이곳의 PR·이슈는 "역사 고증" 성격이며, 코드 실행 결과를 바꾸는 변경은 받지 않는다.

6학습 포인트 — 여기서 배워갈 설계

우주 코드에 관심 없어도, 시스템 프로그래머라면 훔쳐올 게 많다
패턴 1 · 제약이 설계를 낳는다

2K RAM / 36K ROM 안에서 OS를 짜는 법

무한 자원에 익숙한 요즘, AGC는 "자원이 극도로 부족할 때 무엇을 포기하고 무엇을 지키는가"를 가르친다. 더블 정밀도를 위해 소프트웨어 인터프리터로 코드 밀도를 높이고, 주소 부족은 뱅크 전환으로 우회한다. 임베디드·펌웨어·게임보이 같은 저사양 타깃 개발의 사고방식이 여기 다 있다. "메모리가 무한하다는 착각"을 교정해주는 최고의 교보재다.

패턴 2 · 우선순위 스케줄링 + 우아한 실패

과부하 때 멈추지 말고, 덜 중요한 걸 버려라

1202 알람의 교훈은 소프트웨어 설계의 보편 원리다. 시스템이 과부하되면 전부 죽이지(crash) 말고, 우선순위 낮은 작업을 버리고 핵심만 살려 계속 나아가라(graceful degradation). 오늘날 서버의 load shedding, 실시간 시스템의 deadline 관리, 게임의 프레임 드랍이 전부 같은 발상이다. EXECUTIVE.agc는 그 원형을 어셈블리로 보여준다.

패턴 3 · 소프트웨어 가상머신으로 표현력 사기

하드웨어가 못 하면, VM을 얹어라

INTERPRETER.agc는 "하드웨어에 없는 능력(벡터·더블정밀도)을 소프트웨어 계층으로 만든다"는 아이디어의 반세기 전 실물이다. JVM·CPython·WASM·심지어 게임 스크립트 엔진까지 전부 이 계보다. "성능을 조금 내주고 표현력과 코드 밀도를 얻는다"는 트레이드오프를 눈으로 확인할 수 있다.

패턴 4 · 인터럽트와 임계 구역

INHINT / RELINT — 원자성을 손으로 지키기

실시간 코드는 "지금 이 몇 줄은 인터럽트가 끼어들면 안 된다"는 임계 구역(critical section)을 관리해야 한다. AGC는 INHINT(인터럽트 금지)와 RELINT(허용)로 이를 명시적으로 감싼다. 뮤텍스·스핀락·cli/sti가 하는 일의 밑바닥을, 추상화 없이 날것으로 배우기에 좋다.

패턴 5 · 코드는 사람이 읽는다 — 주석의 문화

50년 뒤에도 읽히는 주석을 쓴다는 것

기술만이 아니다. AGC 팀은 의도·불안·농담·출처를 주석에 남겼다. BURN_BABY_BURN이라는 파일명의 유래(1965년 LA 폭동기 DJ의 유행어)까지 코드 헤더에 설명돼 있다. "왜 이렇게 짰는지"를 미래의 독자에게 남기는 태도는, 반세기 뒤 이 저장소가 밈이 되고 교보재가 된 결정적 이유다. 좋은 주석은 코드의 수명을 늘린다.

패턴 6 · 재현성과 고증(provenance)

"원본과 정확히 일치"를 규칙으로 못박기

이 저장소의 기여 규칙(오타까지 스캔본대로 보존)은 극단적이지만, 출처와 재현성을 최우선으로 두는 아카이빙의 모범이다. 데이터셋·연구 코드·법적 증거처럼 "원본 그대로가 가치인" 작업에서, 무엇을 고치면 안 되는지·변경 이력을 어떻게 남길지에 대한 원칙을 배울 수 있다.

7하드웨어 / 시스템 요구사항

두 가지를 나눠 보자 — ① 코드가 돌던 1969년의 AGC, ② 오늘 내 PC에서 돌리는 법

① 원본이 돌던 하드웨어 — 아폴로 유도 컴퓨터

이 코드가 실제로 실행된 기계의 제원이다. 오늘날 기준으로는 믿기 어려운 사양으로 사람을 달에 보냈다(아래 수치는 널리 알려진 역사적 AGC 사양이며, 저장소가 아니라 하드웨어의 스펙이다).

항목제원
워드 크기15비트 + 패리티 1비트 = 16비트
클럭2.048 MHz(메모리 사이클 ≈ 11.7μs)
RAM(Erasable)2,048 워드 — 자성 코어 메모리
ROM(Fixed)36,864 워드코어 로프(손으로 짠 ROM)
명령어기본 ~11종 + EXTEND 확장 명령
무게 / 전력32kg / 약 55W
입출력DSKY(숫자 디스플레이 + Verb/Noun 키패드)
감이 오게

AGC의 고정 메모리 36K워드는 대략 요즘 이모지 한두 개의 데이터 크기다. 그 안에 실시간 OS, 소프트웨어 VM, 착륙 유도 물리 전부가 들어갔다. 지금 이 문서를 띄운 브라우저 탭 하나가 AGC 메모리 전체의 수만 배를 쓴다. "제약 속의 우아함"이라는 말의 뜻을, 이 대비가 단번에 설명해준다.

② 오늘 내 컴퓨터에서 돌려보려면

저장소만으로는 실행이 안 된다. Virtual AGC를 함께 써야 한다. 대략의 흐름은 이렇다.

단계도구 / 명령결과
1. 소스 받기git clone --depth 1 https://github.com/chrislgarry/Apollo-11.agc 소스 확보
2. 어셈블러 준비Virtual AGC 설치(yaYUL 포함)어셈블 환경
3. 어셈블yaYUL MAIN.agc(각 프로그램 폴더에서)AGC 기계어 이미지(코어 로프)
4. 실행yaAGC 시뮬레이터로 이미지 로드가상 AGC 구동
5. 조작yaDSKY 붙여 Verb/Noun 입력우주비행사처럼 대화
가장 쉬운 시작
GitHub 웹에서 그냥 읽기 — 어셈블 없이도 충분히 배운다

실행 환경 구축이 부담이면, GitHub 웹에서 .agc 파일을 읽는 것만으로도 학습 가치가 크다. GitHub는 AGC 어셈블리 문법 하이라이팅을 기본 지원하고, 원본 팀의 성실한 주석 덕에 "이 루틴이 무엇을 하는지"가 대체로 읽힌다. THE_LUNAR_LANDING.agc부터 열어 주석을 따라가 보라. 실행은 그다음 욕심내도 늦지 않다.

8직접 해볼 수 있는 실습 과제

난이도별로, 읽기에서 시뮬레이션까지

과제 1. 전설의 주석 사냥 난이도 ★☆☆

저장소를 클론한 뒤 grep -rn "HOPE HOPE HOPE\|OFF TO SEE THE WIZARD\|SEE IF HE'S LYING\|NUMERO MYSTERIOSO" .로 유명 주석을 직접 찾아본다. 각 주석이 어떤 코드 위에 붙어 있는지(무슨 동작을 하는 줄인지) 위아래 맥락을 읽어보라. 코드와 농담의 관계를 이해하는 것이 이 저장소 감상의 출발점이다.

과제 2. MAIN.agc로 프로그램 지도 그리기 난이도 ★★☆

Luminary099/MAIN.agc를 열어 $include 목록을 순서대로 읽으며, "착륙선 프로그램이 어떤 모듈들로 구성되는지" 자기 손으로 목차를 만들어본다. 그중 THE_LUNAR_LANDING·ASCENT_GUIDANCE·EXECUTIVE가 각각 착륙/이륙/스케줄링의 어디에 해당하는지 표로 정리하라. 대형 어셈블리 프로젝트의 "조립 구조"를 읽는 훈련이다.

과제 3. 어셈블리 한 루틴 해독하기 난이도 ★★☆

EXECUTIVE.agcNOVAC 루틴이나 THE_LUNAR_LANDING.agc의 P63 도입부를 골라, CA·TS·TC·EXTEND·INHINT 같은 명령을 한 줄씩 "이 줄은 무엇을 한다"로 한국어 주석을 달아본다. 모르는 옵코드는 Virtual AGC 문서에서 찾아라. 극소수 명령으로 로직을 짜는 RISC적 사고가 몸에 붙는다.

과제 4. Virtual AGC로 실제 어셈블·실행 난이도 ★★★

Virtual AGC를 설치해 yaYULComanche055 또는 Luminary099를 어셈블하고, yaAGC+yaDSKY로 구동해 Verb 16 Noun 36(시계 표시) 같은 기본 명령을 입력해본다. 반세기 전 우주비행사의 조작을 내 화면에서 재현하는 경험이다. 어셈블 에러가 나면 그 자체가 "고정 메모리 뱅크 배치"를 이해하는 좋은 계기다.

과제 5. 1202 알람 시나리오 추적 난이도 ★★★★

ALARM_AND_ABORT.agc·EXECUTIVE.agc·RESTARTS_ROUTINE.agc를 함께 읽으며, "작업 슬롯이 넘칠 때 어떤 코드가 1202를 띄우고, 어떻게 낮은 우선순위 작업을 버리고 재시작하는가"의 흐름을 직접 다이어그램으로 그려본다. 실제 착륙 때 무슨 일이 있었는지를 코드 레벨에서 재구성하는, 이 저장소 최고 난도의 감상법이다.

9관련 기술 심화 학습 로드맵

이 저장소를 발판 삼아 시스템·임베디드로 넓혀가는 4주 코스

1주차 — 어셈블리와 컴퓨터 구조의 기초

레지스터·누산기·메모리 주소·옵코드 같은 기본 개념을 정리하고, AGC의 15비트 워드·기본/확장 명령 체계와 대조한다. 요즘 아키텍처(x86·ARM·RISC-V) 중 하나의 어셈블리를 조금 맛본 뒤 AGC로 돌아오면, "명령어 집합이 적을 때의 설계"가 선명해진다. AGC의 EXECUTIVE.agc 한 루틴을 교재로 삼아라.

2주차 — 실시간 운영체제(RTOS)와 스케줄링

우선순위 스케줄링, 협조형 vs 선점형 멀티태스킹, 임계 구역과 인터럽트를 공부한다. AGC의 EXECUTIVE(작업)·WAITLIST(타이머)·INHINT/RELINT(임계 구역)를 실물 사례로 삼고, FreeRTOS 같은 현대 RTOS의 태스크·세마포어와 비교하라. 1202 알람이 "우아한 실패"의 교과서임을 코드로 확인하는 주차다.

3주차 — 인터프리터와 가상머신

바이트코드, 스택 머신, 인터프리터 루프의 개념을 익히고 INTERPRETER.agc가 더블정밀도·벡터 의사명령을 어떻게 해석·실행하는지 추적한다. 간단한 계산기용 바이트코드 VM을 직접 하나 만들어보면, "하드웨어에 없는 능력을 소프트웨어로 얹는다"는 발상이 손에 잡힌다. JVM·CPython 바이트코드와 이어 읽으면 계보가 완성된다.

4주차 — 임베디드·항공우주 소프트웨어와 신뢰성

메모리 제약, 결정론적 실행, 고장 감내(fault tolerance), 재시작 전략을 정리한다. AGC의 코어 로프(불변 ROM)·재시작 프로텍션·알람 체계를 현대 항공우주 표준(예: DO-178C의 개념)과 대비하며, "사람 목숨이 걸린 코드는 어떻게 다른가"를 생각한다. 마지막으로 자기 분야(웹·앱)에도 옮겨올 신뢰성 원칙 3가지를 스스로 정리하며 마무리한다.

10핵심 키워드 사전

이 문서에 나온 용어를 한 줄로
Apollo-11 (저장소)
아폴로 11호 유도 컴퓨터(AGC)의 사령선/달착륙선 어셈블리 원본을, MIT 박물관 인쇄본에서 원문 그대로 디지털 복원한 GitHub 저장소. 개발이 아니라 고증이 목적. 퍼블릭 도메인.
AGC (아폴로 유도 컴퓨터)
아폴로 우주선의 항법·유도·제어 탑재 컴퓨터. 15비트 워드, RAM ~2K·ROM ~36K워드, 약 32kg·55W. DSKY로 조작.
Comanche055 / Luminary099
각각 사령선(CM, "Colossus 2A")과 달착륙선(LM, "Luminary 1A" 빌드099)의 프로그램. 뒤 숫자는 빌드 리비전. 공통 뼈대(Executive·Waitlist·Interpreter) 공유.
코어 로프 메모리(core rope)
고정(ROM) 메모리를 구현한 방식. 구리선을 자성 고리에 통과(1)/비껴가게(0) 손으로 짜서 비트를 물리적으로 고정. 별명 "LOL 메모리".
뱅크 전환 / 슈퍼뱅크
15비트 주소로 부족한 메모리 공간을, 여러 뱅크로 나누고 전환해 확장하는 기법. E뱅크(지움)·F뱅크(고정)·슈퍼뱅크. BANK·EBANK=·SETLOC 지시어로 제어.
EXECUTIVE / WAITLIST
AGC의 실시간 OS 핵심. EXECUTIVE=우선순위 기반 작업 스케줄러(긴 작업), WAITLIST=타이머 예약 짧은 작업 큐. 둘이 협조형 멀티태스킹을 만든다.
1201 / 1202 알람
착륙 중 발생한 "Executive 오버플로" 경보. 컴퓨터가 과부하되자 낮은 우선순위 작업을 버리고 핵심 작업만 안고 재시작해 착륙을 지켜냈다. 우아한 실패(graceful degradation)의 상징.
INTERPRETER (소프트웨어 VM)
하드웨어에 없는 더블정밀도·벡터·행렬 연산을 위해 소프트웨어로 만든 가상머신. DLOAD·VXSC 등 의사명령을 해석 실행. JVM·바이트코드의 조상 격.
DSKY (Verb/Noun)
우주비행사용 디스플레이+키패드. "동사(할 일)+명사(대상)"를 각 두 자리 숫자로 입력하는 극도로 압축된 명령 언어. PINBALL_GAME_BUTTONS_AND_LIGHTS.agc가 담당.
yaYUL / Virtual AGC
yaYUL=.agc를 AGC 기계어로 번역하는 현대 어셈블러(원조 YUL의 재구현). Virtual AGC(개발자 Ron Burkey)는 yaYUL·시뮬레이터(yaAGC)·DSKY(yaDSKY)를 제공. 이 저장소를 실제로 돌리는 열쇠.
기본/확장 명령 · EXTEND
AGC는 극소수 기본 명령(CA/TS/TC/CCS…)을 갖고, EXTEND 접두로 확장 명령(DCA/DXCH/WAND…)을 켠다. 적은 옵코드로 표현력을 넓히는 설계.
충실 복원(fidelity)
이 저장소의 기여 원칙. 스캔본과 정확히 일치시키는 것이 목표라, 오타조차 원본대로 보존한다. 실행 결과를 바꾸는 수정은 받지 않는다.
마거릿 해밀턴
아폴로 소프트웨어 프로그래밍 리더. "소프트웨어 공학"이라는 용어를 대중화. 서명이 CONTRACT_AND_APPROVALS.agc에 남아 있다.

11참고 링크

원본부터 실행 환경·배경 지식까지

프로젝트

핵심 소스(먼저 읽을 파일)

배경 지식