앞 장에서 저는 여러분과 함께 ISA729라는 좌표계를 한 칸씩 들여다보았습니다. 729개 슬롯이 하나의 공식 opcode = sector × 81 + group × 9 + command로 주소를 얻고, 그 위에서 한선씨의 모든 키워드가 기계 명령으로 떨어진다는 사실 — 그것이 그 장의 결론이었습니다. 그런데 좌표계를 그렸다고 해서 그 좌표 위에 사람이 다 살고 있는 것은 아닙니다. 도시 계획도가 729개 필지를 그어 놓았다 해도, 실제로 집이 선 자리는 그보다 적은 법입니다.
저는 이 장에서 그 차이를 정직하게 적어 두려 합니다. 729는 실재하는 슬롯의 수이고, 489는 그 위에 실제로 지어진 의미 있는 명령의 추정 수입니다. 둘을 혼동하지 않는 것이 ISA729를 정확히 읽는 두 번째 조건이라고, 저는 앞 장의 끝에서 말했습니다. 이제 그 489가 어디에 어떻게 걸려 있는지, 어느 섹터에 얼마만큼 살이 붙었고 어느 섹터를 일부러 비워 두었는지를 펼쳐 보이겠습니다. 다리를 놓는 일과 다리 위를 걷는 일은 다른 일입니다. 이 장은 후자에 관한 백서입니다.
ISA729는 9×9×9 = 729개 슬롯을 가진 명령 공간입니다. 이는 3⁶의 엄밀한 수학이며, 모든 가능한 좌표의 집합입니다. 그러나 그 좌표 전부에 의미 있는 명령이 실린 것은 아닙니다. 2026년 현재 의미 있는 명령으로 추정되는 수는 약 489개입니다.
두 수의 관계는 다음과 같이 정리됩니다.
729 = 이론적 주소 공간. 존재할 수 있는 모든 슬롯.489 = 의미 있는 명령의 상한 추정. 실제로 정의된 함수의 범위.이 간격은 결함이 아니라 설계입니다. 미할당 슬롯은 정의된 fallthrough로 귀결됩니다 — NOP(쉬어) 또는 HALT(끝)로 떨어지므로, 의미 없는 opcode를 만나도 프로그램이 뻗거나 쓰레기를 실행하지 않습니다. 앞 장에서 "VM은 729/729 = 100%로 구현되었다"고 한 말과 이 말은 모순이 아닙니다. VM은 729개 슬롯 전부에 *동작*을 정의했고(미할당은 안전한 fallthrough), 그중 *의미 있는 명령*이 489개라는 뜻입니다. 빈 필지에도 "여기는 빈 땅"이라는 표지를 세워 둔 것과 같습니다.
729개 슬롯은 9개 섹터로 나뉘며, 각 섹터는 81개 슬롯과 고유한 6-트릿 접두를 가집니다. 다음은 2026년 현재 VM에서 직접 구현된 의미 있는 명령의 분포입니다.
| 섹터 | 범위 | TOAU 접두 | 기능 영역 | 직접 구현 |
|---|---|---|---|---|
| 0 | 0~80 | AA____ | 스택·흐름·함수·코루틴 | 18/81 |
| 1 | 81~161 | AO____ | 산술·비트·벡터·행렬 | 23/81 |
| 2 | 162~242 | AT____ | 비교·논리·3진 | 11/81 |
| 3 | 243~323 | OA____ | 제어 흐름 | 7/81 |
| 4 | 324~404 | OO____ | 입출력·표현 | 2/81 |
| 5 | 405~485 | OT____ | 컬렉션·배열·맵 | 11/81 |
| 6 | 486~566 | TA____ | 타입·메모리 | 5/81 |
| 7 | 567~647 | TO____ | 에러·수학확장·네트워크 | 15/81 |
| 8 | 648~728 | TT____ | 셀·3진·테스트·ISA | 30/81 |
직접 구현된 명령의 합계는 18+23+11+7+2+11+5+15+30 = 122개입니다. 이들은 crownyc.c 가상머신이 C로 직접 처리하는 가장 빠르고 근본적인 계층입니다. 그렇다면 489라는 수는 어디서 오는가 — 그것을 이해하려면 구현이 세 계층으로 나뉜다는 점을 보아야 합니다.
명령은 한 자리에서 한꺼번에 정의되지 않습니다. VM, 컴파일러, 라이브러리의 세 층위에 나뉘어 살고, 각 층위는 아래 층위 위에서만 가능합니다.
가상머신은 122개 opcode를 C로 직접 구현합니다. 가장 빠르고 가장 낮은 계층입니다. 예컨대 더해(ADD, opcode 81)는 스택에서 두 값을 꺼내 더하고 결과를 다시 넣습니다 — b = pop(); a = pop(); push(a + b);. 한 줄의 의미가 한 opcode에 정확히 대응하는, 동형성의 바닥입니다.
hanseonc_high.c 컴파일러는 432개 한선씨 키워드를 opcode로 변환합니다. 이 중 일부는 1단계의 직접 opcode와 1:1로 맞물리고, 나머지는 여러 opcode의 수열로 풀립니다. 함수는 단일 opcode가 아니라 프롤로그·프레임 설정·복귀 주소 저장이 묶인 매크로입니다. 곧 432라는 수는 "컴파일러가 인식하는 키워드"의 수이지, "고유한 opcode"의 수가 아닙니다.
libs/ 와 std/ 에는 108개 라이브러리가 있습니다. 이들은 VM 위에서 한선씨로 정의된 고수준 함수들입니다. 예를 들어 문자열 라이브러리는 가져오기 "문자열.한선"으로 불러와 부분(텍스트, 0, 2)처럼 문자를 자르고 붙입니다. 라이브러리는 새 opcode를 만들지 않습니다. 이미 있는 122개 위에서 조합으로 의미를 빚어냅니다.
세 수를 어떻게 합산하느냐에 따라 부르는 이름이 달라집니다. "VM과 컴파일러로 직접 구현된 핵심 명령"을 셀 때는 489라 하고, 라이브러리까지 포함한 전체 도달 범위를 가리킬 때는 더 큰 수가 됩니다. 같은 시스템을 어느 높이에서 세느냐의 문제일 뿐, 두 수는 충돌하지 않습니다.
489라는 숫자가 정확히 무엇인지 묻는 것은 정당합니다. 가장 깔끔한 답은 비율에 있습니다.
489 ≈ 729 × 2/3, 곧 489/729 ≈ 0.67 = 2/3.
이것은 우연이 아니라 철학의 흔적입니다. 크라우니 세계관에서 2와 3의 비율은 거듭 나타납니다 — 셀 기반 의사결정의 3상 중 2개 동의, 시간의 분할(일·배움·쉼). 기계의 2/3를 우리 목적으로 구현하고, 남은 1/3은 안전한 미정의로 비워 두었다는 뜻입니다. 무리해서 729를 다 채우는 대신, 필요할 때 더할 공간을 남겨 둔 것입니다.
다만 정직하게 덧붙이자면, 489는 깔끔한 정수비가 아니라 상한 추정치입니다. 실재하는 수는 729이고, 489는 "여기까지가 의미 있다"는 현재의 추정입니다. 비율이 철학과 공명한다는 점은 사실이되, 그 공명을 정확한 등식으로 오해하면 안 됩니다.
구현의 분포는 아무렇게나 정해지지 않았습니다. 각 섹터의 채움과 비움에는 이유가 있습니다.
섹터 0 — 스택과 흐름 (18/81). 모든 프로그램은 스택으로 움직이므로 푸시·팝·복제·교환은 첫날부터 필요합니다. 18개만 둔 까닭은 고수준 컴파일러가 위에서 추상화를 제공하기 때문입니다. 사용자는 변수와 함수로 짜지, 스택을 직접 조작하지 않습니다. 여기를 자세히 보는 것은 RPN 모드의 고급 사용자뿐입니다.
섹터 1 — 산술과 벡터 (23/81). 더해·빼·곱해·나눠는 필수입니다. 화폐가 정수로 정확히 움직인다는 약속이 이 섹터에서 나옵니다. 균형 3진 나눗셈(|r| ≤ |b|/2)이 어림과 손실을 막습니다. 나머지는 거듭제곱·루트·표준편차·비트 시프트·벡터 외적 같은 과학·공학 영역으로, 선택적이지만 가능한 한 갖춰 두었습니다.
섹터 2 — 논리 (11/81). Kleene 3값 논리의 진리표를 전부 구현했습니다. "모름"을 거짓이 아니라 하나의 값(O)으로 다루는 것이 크라우니의 정체성이므로, 여기는 생략할 수 없었습니다. 앞 장에서 못 박은 아홉 칸짜리 AND·OR 진리표가 이 섹터의 살입니다.
섹터 3 — 제어 흐름 (7/81). 점프, 조건 점프, 호출, 반환. 프로그램이 직선으로만 가지 않으므로 필수입니다. 7개면 충분합니다.
섹터 4 — 입출력 (2/81). 보여줘, 입력해. 터미널 I/O만 두었습니다. 파일 입출력은 섹터 7의 네트워크 소켓으로 확장되고, GUI는 별도 렌더링 레이어로 갑니다. 2개로 충분한 이유는 관심사의 분리입니다.
섹터 5 — 컬렉션 (11/81). 배열·맵·정렬·검색. 11개가 기본 CRUD를 커버합니다. 트리나 그래프 같은 고급 자료구조는 3단계 라이브러리에서 한선씨로 정의합니다.
섹터 6 — 타입과 메모리 (5/81). 최소한입니다. 타입 검사, 변수 할당, 메모리 할당. 고수준 컴파일러가 메모리 관리를 대부분 자동화하므로 사용자가 손댈 일이 드뭅니다.
섹터 7 — 에러와 네트워크 (15/81). 시도-제외, 로그, TCP 소켓 5개, 난수, 자연로그. 여기서 주목할 것은 네트워크의 우선순위입니다. 크라우니는 처음부터 분산 시스템이지 한 기계에 고립된 언어가 아닙니다. 그래서 TCP 대기(LISTEN)·수락(ACCEPT)·읽기(READ)·쓰기(WRITE)·닫기(CLOSE) 다섯 개를 섹터 7에 직접 박았습니다. 이 다섯이 분산 프로그래밍의 기초입니다.
섹터 8 — 셀과 3진 합의 (30/81). 가장 두텁게 구현된 섹터입니다. 셀(Cell)은 단순한 변수가 아니라 4상균형3진 상태를 가진 분산 데이터 단위입니다. 한 셀은 티(T, +1, 데이터·드러남), 옴(O, 0, 명령·중심), 타(A, -1, 체이닝·연결), 음(U, -0, 빈자리·예외)의 네 상태를 한 좌표 위에서 추적합니다. 셀생성·셀연결·셀읽기·셀설정의 기본 CRUD, 삼진인코딩·삼진디코딩·삼진합의의 트릿 연산, 테스트 어설션과 추적·디버그, 그리고 명령 자체를 데이터로 다루는 ISA 인코딩까지 — 30개의 구현은 "한선씨가 단순 스크립트 언어가 아니라 셀 기반 분산 아키텍처의 프로그래밍 인터페이스"라는 선언입니다.
어느 명령부터 구현했는가 — 그 순서는 실용성을 따랐습니다. 없으면 프로그램이 돌지 않는 것부터, 있으면 좋지만 없어도 핵심이 작동하는 것 순으로 내려갑니다.
마지막에 온 것들 — 고급 수학, HDL 생성, 이미지·오디오 처리 — 은 선택적 확장입니다. 이들은 표준 489 밖의 106개 확장(HDL 49, 이미지·오디오 56, 시스템 1)으로 따로 셉니다. 있으면 좋지만 없어도 핵심은 작동합니다.
ISA729를 정확히 읽으려면, 자주 어긋나는 세 지점을 못 박아 둘 필요가 있습니다.
"489가 모든 가능한 명령이다" — 아닙니다. 489는 현재 구현 범위의 상한 추정입니다. 실재하는 슬롯은 729이고, 앞으로 더 채울 수 있으며 다른 손이 확장할 수도 있습니다.
"미구현 슬롯은 에러다" — 아닙니다. 미할당 슬롯은 안전하게 정의된 fallthrough(NOP/HALT)입니다. 프로그램은 뻗지 않습니다.
"489와 432는 같은 수다" — 아닙니다. 432는 컴파일러가 인식하는 한선씨 키워드의 수이고, 489는 의미 있는 명령의 이론적 추정입니다. 키워드 하나가 여러 opcode 수열로 풀리기도 하므로, 두 수는 다른 것을 셉니다.
여기서 이 권 전체의 골격이 다시 드러납니다. 489개 명령은 그 자체가 목적이 아니라, 위로 오르는 사다리의 첫 가로대입니다.
VM(489) → 컴파일러(432 키워드) → 라이브러리(108) → 사용자 코드 → 애플리케이션 → 생태계 → 세계관 → 화폐
각 계층은 아래 계층 위에서만 가능합니다. VM 없이는 컴파일러가 없고, 컴파일러 없이는 라이브러리가 없습니다. 반대로 위로 오를수록 추상도가 높아지고 사람에게 가까워집니다.
이 사다리의 끝에 화폐가 있다는 사실은 우연이 아닙니다. 크라우니 경제는 세 계층입니다 — 교환·결제의 머니(크라우니원), 가치를 저장·표현하는 에셋(포네·맘), 그 위의 근원적 부인 웰스(크라우니·한선·선호). 위로 갈수록 더 근원적인 가치이지요. 그리고 이 모든 계층이 약속을 지킬 수 있는 까닭은, 사다리의 맨 아래에 어림도 손실도 비트 유실도 없는 정확한 489개 명령이 깔려 있기 때문입니다. 균형 3진의 정수 좌표 위에서 셈이 일어나기에, 포네는 $1 곁에서 흔들리지 않고 맘은 한 점의 마음을 정확히 실어 나릅니다. 한선과 선호 — 크라우니 위가 아니라 군집(cluster)으로, 앞으로 열릴 세상의 생산성 기대치를 담아 배치될 부의 단계들 — 도 언젠가 이 같은 정확함 위에서 약속을 지키게 될 것입니다. 그것은 지금 미리 적어 두는 미래의 이야기입니다.
---
제가 이 장에서 보여드리고 싶었던 것은 "우리가 무엇을 만들었나"가 아니라 "우리가 무엇을 *선택*했나"였습니다. 729개를 다 채울 수도 있었습니다. 그러나 2/3를 짓고 1/3을 빈 땅으로 남겨 두었습니다 — 표지만 세운 채로. 무리해서 채우는 대신 자랄 공간을 남겨 두는 것, 그것이 정밀함을 약속으로 바꾸는 절제라고 저는 믿습니다.
이제 사다리의 첫 가로대가 분명해졌으니, 다음 물음은 자연스럽습니다 — 이 489개 명령이 어떻게 한국어 문법과 한 몸이 되는가. 다음 장에서 우리는 한선씨가 한국어 RPN으로서 ISA729와 1:1로 맞물리는 마지막 고리를 함께 만나게 됩니다.
첫 번째 책은 선물이에요. 가입하면 100맘을 드리니까, 두 번째 책부터 자유롭게 읽을 수 있어요. 친구를 추천하면 50맘도 생겨요.