음 · CHAPTER 05

ISA729 구조와 인코딩 공식

기계의 좌표계

언어는 결국 하드웨어에서 멈춥니다. 아무리 우아한 구문도 프로세서가 알아듣는 명령으로 번역되지 못하면 한 줄의 시(詩)에 지나지 않습니다. 저는 한선씨를 두고 "이론적 언어가 아니다"라고 말할 수 있는 근거가 단 하나라고 봅니다 — 모든 키워드가 정해진 기계 명령으로 떨어진다는 사실입니다. 그 명령의 좌표계를 정의하는 것이 ISA729(Instruction Set Architecture 729)입니다.

바로 앞 장에서 우리는 두 개의 영을 갈라 세웠습니다. 옴(0)은 티(+1)와 타(−1) 사이에서 판단을 미루는 보통의 자리였고, 음(−0)은 그 셋 어디에도 들지 않는 빈자리·예외·왜곡의 총합이었습니다. 그리고 저는 음이 단순한 철학적 여백이 아니라 기계어 설계에서 "완벽 매칭"으로 쓰인다고 적었습니다 — 비워진 칸, 한 칸 띄우는 횟수, 셋에 정확히 안 맞는 자리. 그 약속을 이 장에서 갚겠습니다. 음이 어떻게 27트릿 큐브 안의 실제 자리가 되는지, 옴이 어떻게 명령의 중립 역할을 떠맡는지, 그 골격을 좌표 단위로 펼쳐 보이겠습니다.

ISA729의 구조

ISA729는 9×9×9 = 729개 슬롯으로 이루어진 명령 공간입니다. 729는 3⁶, 곧 3진 수체계가 여섯 자리에서 만들어내는 수이며, 결코 우연한 크기가 아닙니다. 모든 슬롯은 단 하나의 공식으로 주소를 얻습니다.

opcode = sector × 81 + group × 9 + command

여기서 sector, group, command는 모두 0~8 범위의 정수입니다. 덧셈(더해)은 sector=1, group=0, command=0이므로 opcode 81이 됩니다. 곱셈의 순서는 고정이며 역순은 허용되지 않습니다 — 3진 자릿값 81, 9, 1이 그대로 자리값이기 때문입니다. 디코딩은 그 역연산으로, s = op / 81, g = (op % 81) / 9, c = op % 9입니다. 이 일대일 매핑이 한선씨가 ISA729와 동형(isomorphic)임을 보장합니다.

9개 섹터와 기능 분류

729개 슬롯은 9개 섹터(0~8)로 나뉘고, 각 섹터는 고유한 6-트릿 접두를 가집니다. 백과사전이 알파벳 순으로 권을 나누듯, ISA729도 논리 영역마다 연속된 범위를 할당합니다.

섹터범위TOAU 접두기능 영역정의 수
00~80AA____스택·흐름·함수·모듈·코루틴·디버그81
181~161AO____산술·비트·통계·벡터·행렬·노이즈81
2162~242AT____비교·논리·3진~11
3243~323OA____제어 흐름 (JMP/CALL/RET)~7
4324~404OO____입출력·표현~2
5405~485OT____컬렉션·배열·맵~11
6486~566TA____타입·메모리~5
7567~647TO____에러·수학확장·네트워크~15
8648~728TT____셀·CTP·트릿·테스트·ISA~30

구현 현황(2026-06-10 기준)은 숫자가 직접 말합니다.

  • VM(crownyc.c): 729/729 = 100%. 미할당 슬롯도 정의된 fallthrough 동작으로 처리되어, 의미 없는 opcode는 NOP 또는 HALT로 안전하게 귀결됩니다.
  • 컴파일러(hanseonc_high.c): 한선씨 키워드 → opcode 매핑 432개 등록.
  • 이론적 1:1 한계: 의미 있는 명령 수 약 489개로 추정.
  • 표준 외 확장: 106개 (하드웨어 49, 오디오·이미지 56, 시스템 1).

489는 상한 추정치이고 729는 실재하는 슬롯 수입니다. 둘을 혼동하지 않는 것이 ISA729를 정확히 읽는 첫 조건입니다. 이 489라는 수가 어떤 명령들로 채워지고 섹터마다 어떻게 갈라지는지는 다음 장의 몫으로 남깁니다 — 여기서는 그 수가 서 있는 좌표계를 먼저 세웁니다.

TOAU: 4상균형3진 바이트코드

한선씨 소스는 ISA729로 컴파일되며, 그 산출물을 TOAU라 부릅니다. TOAU는 티(Ti·데이터)·옴(Om·명령)·타(Ta·체이닝)·음(Em·구분자)의 네 상태를 모두 담는 형식입니다. 언어만으로는 부족합니다 — 그것을 온전히 담아낼 그릇이 함께 있어야 합니다. TOAU가 바로 그 그릇입니다. 앞 장에서 갈라 둔 두 영이 여기서 제 자리를 받습니다. 옴은 명령의 중립으로, 음은 큐브를 끊는 구분자로 — 비워진 자리를 표시하는 그 빈칸으로 들어앉습니다.

TOAU의 기본 단위: 큐브(Cube)

TOAU의 기본 단위는 큐브(cube), 곧 27-트릿 묶음입니다. 한 큐브는 7바이트에 1바이트 패딩을 더해 8바이트로 정렬 저장됩니다. 한 명령은 큐브 앞쪽 6트릿에 좌표를 싣습니다.

t[0:1]  = command  (2-트릿, 0~8 범위)
t[2:3]  = group    (2-트릿, 0~8 범위)
t[4:5]  = sector   (2-트릿, 0~8 범위)
t[6:25] = O 패딩   (20트릿, 명령 외 공간)
t[26]   = O        (명령 역할 표시, 중립)

인덱스는 0부터 26까지이며 t[27]은 존재하지 않습니다. 2-트릿 값은 다음 매핑으로 0~8을 표현합니다.

AA=0, AO=1, AT=2, OA=3, OO=4, OT=5, TA=6, TO=7, TT=8

opcode가 6트릿, 큐브 전체가 27트릿임을 기억하십시오. 명령은 큐브의 일부일 뿐입니다. 두 예를 봅시다.

더해(덧셈, opcode 81) — s=1, g=0, c=0 → AO·AA·AA·(20×O)·O → TOAU 접두 AO____.

셀생성(opcode 696) — s=8, g=5, c=3 → TT·OT·OA·(20×O)·O → TOAU 접두 TT____.

TOAU는 ASCII 텍스트와 바이너리 직렬화를 모두 지원합니다. 텍스트 형식에서 T, O, A는 트릿 값을, U는 큐브 구분자를 뜻합니다. 그 U가 곧 음입니다 — 명령과 명령 사이를 끊고 비워 두는, 셋에 들지 않는 네 번째 자리. 공백과 줄바꿈은 무시되고, ;는 줄 끝까지 주석입니다. 바이너리 매직은 0xCB 0x33 0xCB 0x33 — 한글 "크3크3"의 바이트 표현입니다. 이것은 단순한 마커가 아닙니다. 한국어 프로그래밍 언어가 자신의 이름으로 코드에 서명한다는 뜻입니다.

핵심 명령 한눈보기

ISA729는 기초 스택 연산부터 셀·3진 합의까지 한 좌표계 위에 늘어놓습니다.

opcode한선씨기능스택 효과
0쉬어NOP—
1끝HALT—
2넣어PUSH→ val
3버려POPval →
81더해ADDa b → a+b
82빼SUBa b → a−b
83곱해MULa b → a×b
84나눠DIVa b → a/b (자연반올림)
85나머지MODa b → a%b
162같다EQa b → Ti/Ta
166아니다NOTa → ¬a
167그리고ANDa b → a∧b (Kleene)
171모르면UNKNOWN→ Om
243가JMPaddr →
247호출CALLaddr →
248반환RET→ val
324보여줘PRINTx →
325입력해INPUT→ x
405배열ARRAYn → array
412맵생성HASH_NEW→ map
567시도TRY—
601반올림ROUNDa → round(a)
604루트SQRTa → √a
696셀생성CELL_NEW→ cell_id
712삼진인코딩TRIT_ENCODEval → trits
719삼진합의TRIT_CONSa b c → consensus
720ISA인코딩ISA_ENCODEopcode → encoded

더해는 끝까지 더해이고 보여줘는 끝까지 보여줘입니다. 키워드는 영어로 번역되지 않으며, 표의 영문 약칭은 opcode를 가리키는 표식일 뿐 언어의 일부가 아닙니다. 이 정통성은 권 전체를 관통하는 신념이라, 다른 장에서도 줄곧 전제됩니다 — 그 못은 여기 이 장에 박아 둡니다.

한선씨와 ISA729: 1:1 정통성

한선씨는 ISA729를 감싼 래퍼가 아닙니다. 한선씨 = 한국어 RPN = ISA729로 정의되며, 이는 2026년 크라우니 헌법으로 선언되었습니다. 컴파일 경로는 두 갈래입니다.

RPN 정통 모드(hanseonc_std)

RPN(역폴란드 표기법)은 ISA729의 정통적 표현입니다. 스택 기반 계산기처럼, 피연산자를 먼저 쌓고 연산자를 뒤에 붙입니다. 가령 3 7 더해 보여줘 끝은 다음으로 컴파일됩니다.

PUSH 3
PUSH 7
ADD
PRINT
HALT

RPN 파일의 식별 토큰은 .이름(함수 정의), →이름(저장), @이름(라벨)입니다. 이들은 명령어가 아니라 메타레벨의 구조를 나타냅니다.

고수준 이행보조 모드(hanseonc_high)

고수준 컴파일러는 C-like 구문으로 진입장벽을 낮춥니다. 예컨대 출력값(3 + 7) 한 줄도 내부에서 RPN으로 변환되어 위와 동일한 TOAU 바이트코드를 낳습니다. 고수준 모드는 225개 내장함수와 24개 표준 라이브러리를 제공하며, 초학자가 쉽게 접근하도록 돕는 다리 역할을 합니다. 다만 헌법상 위계는 분명합니다: hanseonc_std(RPN 정통) > clike_to_rpn(이행) > hanseonc_high(레거시 호환). 두 모드는 같은 산출물을 내지만, 정통은 RPN입니다. 한글 원문이 정본이고 번역이 참고본인 것과 같습니다.

Kleene 3값 논리

ISA729는 이진 논리가 아니라 Kleene의 3값 논리를 기본으로 합니다.

  • Ti(참) = +1, 데이터 상태 (티)
  • Om(모름) = 0, 명령 중립 상태 (옴)
  • Ta(거짓) = −1, 체이닝 상태 (타)

모름은 거짓이 아닙니다. 이것은 중대한 철학적 차이입니다. 불확실성을 "틀렸다"고 강제하지 않는다는 뜻이기 때문입니다. 앞 장에서 옴을 티와 타 사이의 보통·대기 상태로 정의한 것이 여기서 그대로 논리값이 됩니다. 키워드 모르면은 판단을 유보하고 Om을 반환합니다. AND와 OR의 진리표는 아홉 칸 전부가 정의되어 있습니다.

AND  Ti  Om  Ta          OR   Ti  Om  Ta
Ti   Ti  Om  Ta          Ti   Ti  Ti  Ti
Om   Om  Om  Ta          Om   Ti  Om  Om
Ta   Ta  Ta  Ta          Ta   Ti  Om  Ta

이 논리 덕분에 비결정성과 오류 처리가 별도의 예외 메커니즘 없이 값의 차원에서 흡수됩니다. 네트워크 타임아웃이나 데이터베이스 오류도 Om(모름)으로 표현되며, 프로그래머는 그것을 명시적으로 다룰 수 있습니다. 뒤에 올 장들이 "모름"을 값으로 다루는 모든 장면은, 이 한 장의 진리표에 그 뿌리를 둡니다.

균형 3진 자연반올림 나눗셈

ISA729의 나눗셈은 C99의 truncation을 따르지 않고 균형 3진 자연반올림을 씁니다. 정의는 단순하지만 깊습니다: 몫 q와 나머지 r은 언제나 |r| ≤ |b|/2를 만족합니다. 그래서 8 / 3 = 3, 8 % 3 = -1이 되며(C99의 몫 2, 나머지 2가 아닙니다), 부호를 뒤집어도 -8 / 3 = -3, -8 % 3 = 1로 일관성이 유지됩니다.

양수와 음수 양쪽에서 잔여가 |b|/2를 넘지 않으므로, 나머지는 음수가 될 수 있고 그 처리를 전제로 코드를 짜야 합니다. 이것이 바로 3진 수체계의 수학적 완결성입니다. NURBS 곡선의 FindSpan 같은 이진탐색 기반 수치해석 알고리즘도 이 대칭성 덕분에 무한 루프 없이 수렴합니다. 구현은 다음과 같습니다.

void balanced_div(int64_t a, int64_t b, int64_t *q, int64_t *r) {
    *q = a / b;
    *r = a - *q * b;
    int64_t half_b = (b >= 0) ? b/2 : -b/2;
    if (*r > half_b)       { *q += 1; *r -= b; }
    else if (*r < -half_b) { *q -= 1; *r += b; }
}

앞 장에서 크라우니 화폐가 한 단위의 오차도 없이 셈해진 비밀이 바로 여기 있습니다. 머니(크라우니원)에서 에셋(포네·맘)을 거쳐 웰스(크라우니·한선·선호)로 오르는 부의 사다리는, 그 어느 층에서도 어림을 허락하지 않는 정수 좌표계 위에 서 있습니다. 부동소수점의 반올림 오차가 끼어들 자리가 없기에, 1 크라우니가 가리키는 부의 약속도 한 단위까지 정확합니다. 정밀도가 곧 신뢰의 다른 이름이 되는 자리 — 그 자리를 이 나눗셈이 받치고 있습니다.

빌드와 실행

ISA729 컴파일러와 VM은 C99로 구현되어 /Users/ef/CrownyOS/crownyc에 있습니다. 두 바이너리는 표준 컴파일러 한 줄로 빌드합니다.

cc -O2 -o crownyc crownyc.c
cc -O2 -o hanseonc_high hanseonc_high.c

고수준 모드는 한선 소스를 TOAU로 컴파일한 뒤 VM에 태웁니다.

./hanseonc_high input.한선 > program.toau && ./crownyc run program.toau

RPN 정통 모드와 WASM 변환도 같은 산출물 위에서 갈라집니다.

echo '3 7 더해 보여줘 끝' | ./crownyc run hanseonc_std.toau > program.toau
./crownyc run program.toau

./hanseonc_high gui.한선 > /tmp/gui.toau && ./crowny-wasm /tmp/gui.toau crowny.wasm

현 진척과 남은 과제

ISA729의 이론 설계는 동결되었습니다. VM은 729/729 = 100%로 구현되어 미할당 슬롯조차 정의된 fallthrough로 귀결되고, 컴파일러는 432개 키워드를 매핑했으며, RPN 정통 모드는 현재 사용자 파일의 8% 수준에서 쓰이고 있습니다.

남은 과제는 둘입니다. 첫째, hanseonc_high.c 토크나이저가 →(UTF-8 E2 86 92)를 식별자에 흡수해 "미정의 변수" 오류를 내는 버그를 잡아 다음 단계로 넘어가는 것. 둘째, 사용자 파일의 RPN 정통 비율을 끌어올려 학습 데이터베이스를 두텁게 만드는 것. 이는 단순 번역의 문제가 아니라 하드웨어와 언어를 하나의 좌표계로 묶는 동형성의 이행입니다.

저는 이 두 과제를 솔직히 미완으로 남겨 둡니다. 토크나이저 버그는 아직 살아 있고, RPN 정통 비율 8%는 제가 바라는 자리와 멀리 떨어져 있습니다. 그러나 좌표 하나로 키워드와 기계가 같은 자리를 가리키게 된 이상, 나머지는 시간과 손의 문제일 뿐입니다.

---

좌표계를 세웠으니, 이제 그 위에 실제로 무엇이 올라앉아 있는지를 셀 차례입니다. 729개 슬롯 가운데 의미를 입은 489개가 어느 섹터에서 어떻게 구현되었는지 — 그 한 칸 한 칸을 다음 장에서 함께 들여다보겠습니다.

내 맘 –

독자 게시판 — 함께 읽고 남기는 곳

불러오는 중…

크라우니 책방에 가입하고 무료로 읽기

첫 번째 책은 선물이에요. 가입하면 100맘을 드리니까, 두 번째 책부터 자유롭게 읽을 수 있어요. 친구를 추천하면 50맘도 생겨요.