음 · CHAPTER 07

한선씨 — 한국어 RPN 1:1

앞 장에서 우리는 729개의 슬롯을 9×9×9로 펼치고, 그 안에서 의미 있는 489개의 명령이 섹터별로 어떻게 자리잡는지 추적했습니다. 그것은 기계의 어휘였습니다. 큐브 하나하나가 한 단어였고, 섹터는 품사였습니다.

그런데 저는 그 표를 들여다보면서 오래 멈춰 있었습니다. 기계의 어휘가 있다면, 사람의 어휘는 무엇인가. 우리는 보통 그 둘 사이에 두꺼운 번역층을 쌓습니다. C, Rust, Swift — 사람이 읽기 좋게 만든 다음, 컴파일러라는 통역사가 기계어로 옮깁니다. 통역은 언제나 손실과 마찰을 남깁니다.

크라우니의 설계자는 그 통역사를 없애기로 했습니다. 사람이 쓰는 한 줄이 기계의 한 명령과 정확히 같아지도록. 그 결정이 한선씨(Hanseonc)입니다. 한국어를 역폴란드 표기법으로 적되, 그 한 줄 한 줄이 ISA729의 opcode와 1:1로 맞물리는 언어. 이 장은 그 맞물림의 구조를 봅니다.

기원 — 3진 세계에 한글을 맞춘다

크라우니의 설계에서 언어는 선택지가 아니라 정합성의 문제입니다.

인류는 지난 70년간 이진법 컴퓨터로 살아왔습니다. 따라서 거의 모든 프로그래밍 언어는 2의 거듭제곱에 맞춰 설계되었습니다. 메모리 4KB, 8GB, 64비트. 불린은 참·거짓 둘뿐. 논리는 AND·OR·NOT 세 가지.

크라우니는 4상 균형 3진을 기반으로 합니다 — 티(T, +1), 옴(O, 0), 타(A, -1), 음(U, 구분자). 데이터·존재가 티, 명령·중립이 옴, 연결·반대가 타, 그리고 빈자리·여백·예외가 음입니다. 기반이 이러하면 언어도 같은 기반에 서야 합니다. 그렇지 않으면 언어와 기계 사이의 변환 마찰이 영구히 남습니다. 2진 언어로 3진 기계를 다루는 일은, 끝없이 환율을 계산하며 사는 것과 같습니다.

한선씨는 그 마찰을 제거하기 위해 2026년 5월 21일 크라우니 헌법 9조로 선포된 규칙입니다: 한선씨 RPN = ISA729 1:1.

의미는 단순합니다. 한선씨 RPN의 모든 키워드와 연산자는 ISA729의 특정 opcode와 정확히 대응합니다. 추가 번역 계층이 없습니다. 컴파일러는 한글을 읽고 대응하는 큐브를 출력할 뿐, 그 사이에서 의미를 재구성하지 않습니다.

두 경로와 한 VM

한선씨에는 두 개의 구현 경로가 있습니다. 도착지는 같고 출발지가 다릅니다.

RPN(hanseonc_std). 역폴란드 표기법입니다. 연산자가 피연산자 뒤에 옵니다. 3 7 더해는 10입니다. 스택 기반이라 중괄호도, 괄호도, 우선순위 규칙도 없습니다. 이것이 정통입니다. ISA729와 1:1로 맞물리는 형태이기 때문입니다.

RPN 한선씨(.한선) → hanseonc_std → .toau 바이트코드

고수준(hanseonc_high). C에 가까운 문법입니다. 조건문, 반복문, 함수 정의, 모듈 임포트를 갖춰 사람이 편하게 읽습니다. 이 경로는 일종의 문법 설탕(syntax sugar)이며, ISA729가 동결되기 전 단계에서 설계된 이행 보조입니다.

고수준 한선씨(.한선) → hanseonc_high → .toau 바이트코드

두 경로 모두 같은 VM(crownyc)에서 실행됩니다. .toau 파일은 동일한 큐브의 시퀀스이고, VM은 그 시퀀스가 어느 경로에서 왔는지 알지도, 알 필요도 없습니다.

설계 철학은 한 줄로 정리됩니다.

Rust / Swift → 고수준 한선씨 → RPN 한선씨 → 기계어(큐브)
(외부 언어)    (이행 보조)      (정통)        (1:1)

향하는 방향은 하나입니다. 점점 더 근본적인 형태로. 역방향은 금지됩니다 — 기계어에서 고수준으로 거슬러 복원하면 정보 손실로 인해 원래 코드가 나오지 않기 때문입니다. 헌법이 못 박은 것은 이 화살표의 방향입니다.

키워드 매핑 — 432개의 한글 단어

2026년 5월 27일 측정 시점에 ISA729와 매핑된 한선씨 키워드는 432개입니다. 각각은 특정 opcode와 대응합니다. (이 수치는 구현 진척에 따라 변동합니다.)

한글동작대응 opcode
더해두 값을 더함ADD(81) — sector 1, group 0, cmd 0
같은가같음 비교EQ(162) — sector 2, group 0, cmd 0
보여줘스택 상단 출력PRINT(324) — sector 4, group 0, cmd 0
셀생성새 셀 객체 생성CELL_NEW(696) — sector 8, group 5, cmd 3

432개 키워드는 9개 섹터에 분포합니다. 앞 장의 섹터 구조가 그대로 어휘의 지도가 됩니다.

  • 섹터 0 (0–80, 접두 AA): 스택·흐름 제어·함수·코루틴·디버그.
  • 섹터 1 (81–161, AO): 산술·비트·통계·벡터·행렬.
  • 섹터 2 (162–242, AT): 비교·논리·3진 연산.
  • 섹터 3 (243–323, OA): 제어 흐름(JMP/CALL/RET).
  • 섹터 4 (324–404, OO): 입출력·표현·형 변환.
  • 섹터 5 (405–485, OT): 컬렉션·배열·맵.
  • 섹터 6 (486–566, TA): 타입·메모리.
  • 섹터 7 (567–647, TO): 에러·수학 확장·네트워크.
  • 섹터 8 (648–728, TT): 셀·CTP·트릿·테스트·ISA.

이들은 순수하게 한글 단어입니다. 더해는 더해, 곱하기는 곱하기. 영어로 번역하지 않습니다. 번역은 다시 통역사를 부르는 일이기 때문이며, 통역사를 없애는 것이 이 언어의 존재 이유입니다.

컴파일 과정 — 4상 아래 3층 구조

한선씨의 컴파일은 3층 변환이며, 이 3층은 4상의 앞 세 상(T·O·A)을 그대로 빌려 옵니다.

제1층 (T — 한글). .한선 소스파일. 한글 키워드, 한글 식별자, 한글 주석. 사람이 읽는 층입니다.

제2층 (O — 의미코드). 컴파일러의 중간 표현. 각 한글 키워드가 opcode 클래스로 변환됩니다. 예: 더해 → @ADD_81.

제3층 (A — TOAU). 큐브의 시퀀스. 각 opcode가 6-트릿 인코딩으로 풀립니다. 예: @ADD_81 → AOAAAA + 역할 트릿.

VM은 제3층만 봅니다. 큐브를 읽고 실행할 뿐입니다.

이 3층 분리는 우연이 아닙니다. 설계자는 정보(T)와 표현(O)과 기계(A)를 분리하는 것이 근본이라는 점을 처음부터 알고 있었습니다. 그래서 세계관의 골격인 4상을 언어 설계에 그대로 끌어왔습니다. 티는 드러난 한글, 옴은 명령의 중심, 타는 연결된 기계어 — 그리고 그 사이의 빈자리, 정규 3상에 담기지 않는 여백은 음(U)이 구분자로 받아냅니다. 큐브와 큐브 사이를 가르는 그 구분자가 없으면 시퀀스는 한 덩어리로 뭉쳐 의미를 잃습니다.

RPN의 장점 — 스택과 명확성

RPN을 처음 접하면 낯섭니다. 하지만 기계 입장에서는 가장 명확한 형태입니다.

중위 표기법, 즉 우리가 수학에서 쓰는 형식: (3 + 7) * 2. 컴파일러는 괄호를 보고 우선순위를 판단하고, 재정렬하고, 추상 문법 트리(AST)를 세워야 합니다. 그 과정마다 해석의 여지가 끼어듭니다.

RPN: 3 7 더해 2 곱하기. 해석의 여지가 없습니다. 3을 push, 7을 push, 더해(pop·pop·결과 push), 2를 push, 곱하기. 스택을 순서대로 따라가면 그것이 답입니다.

특히 3진 논리에서 이 명확성이 결정적입니다. 3진에는 참(티)과 거짓(타) 사이에 모름(옴)이 있습니다.

참 거짓 그리고   → 거짓
참 모름 그리고   → 모름
모름 모름 그리고 → 모름

이 Kleene 3값 규칙을 RPN으로 적으면 스택만 따라가면 끝납니다. AST의 우선순위 전투가 필요 없습니다. 그리고 이 "모름"이야말로, 2진법이 끝내 표현하지 못했던 자리 — 옴이 채우는 대기·중립의 자리입니다.

ISA729와의 1:1 매핑 — 두 예시

예 1: 간단한 계산.

RPN 코드: 3 7 더해 보여줘 끝

컴파일 단계:

  1. 렉서가 3·7·더해·보여줘·끝을 토큰화합니다.
  2. 파서가 각 키워드를 opcode로 변환합니다.

- 3 → PUSH(3), 7 → PUSH(7) - 더해 → ADD(81) - 보여줘 → PRINT(324) - 끝 → HALT

  1. 코드 생성기가 opcode를 TOAU로 인코딩합니다.

- ADD(81): sector 1, group 0, cmd 0 → AOAAAA + 역할 트릿 - PRINT(324): sector 4, group 0, cmd 0 → OOAAAA + 역할 트릿

결과 .toau는 큐브의 시퀀스이고, VM이 로드해 실행합니다.

예 2: 인코딩 산식의 검증. 인코딩은 추측이 아니라 산식입니다. opcode = sector × 81 + group × 9 + command.

CELL_NEW(696)을 풀어 봅니다. 8 × 81 + 5 × 9 + 3 = 648 + 45 + 3 = 696. 정확히 맞습니다. 2-트릿 변환표(AA=0, AO=1, AT=2, OA=3, OO=4, OT=5, TA=6, TO=7, TT=8)로 6-트릿 슬롯을 채우면, command 3 → OA, group 5 → OT, sector 8 → TA가 되어 슬롯이 결정됩니다. 한 단어에서 한 큐브까지, 사람의 임의 판단이 끼어들 틈이 없습니다. 이것이 "1:1"이라는 말의 실제 무게입니다.

표준 라이브러리 — 224개 내장 함수

ISA729의 의미 있는 opcode는 489개이지만, 사용자가 직접 호출하는 내장 함수는 224개입니다. 이들도 모두 한글 이름을 가지며, 각 함수는 내부에서 정확히 어떤 opcode들의 조합을 호출하는지가 정해져 있습니다. 함수 호출 자체는 섹터 0의 CALL 계열로 구현됩니다.

  • 문자열: 글자수·글자·부분·포함·문자열변환
  • 배열·컬렉션: 길이·추가·설정·정렬·맵생성·맵넣어·맵꺼내
  • 입출력: 출력값·입력·읽기·쓰기·덧쓰기
  • 수학: 거듭제곱·루트·사인·로그·팩토리얼·절댓값·반올림·올림·내림
  • 네트워크: TCP대기·TCP수락·TCP읽기·TCP쓰기·TCP닫기·소켓생성·소켓바인드·소켓보내기·소켓받기
  • 셀: 셀생성·셀연결·셀읽기·셀설정
  • 3진: 삼진인코딩·삼진디코딩·삼진덧셈
  • 버퍼: 버퍼생성·버퍼쓰기·버퍼읽기·버퍼잘라

여기서 한 가지를 짚어 둡니다. 삼진인코딩·삼진디코딩 같은 함수는 다른 언어에는 존재할 이유가 없는 함수입니다. 정수를 균형 3진으로 펴고 되감는 일이 2진 기계에서는 군더더기지만, 크라우니에서는 기계의 모국어를 다루는 일입니다. 어휘가 기반을 닮는다는 것 — 그것이 정합성입니다.

고수준 모드 — 가독성을 위한 표현

고수준 한선씨는 직관성을 위해 추가 문법을 제공합니다.

변수 x = 10
함수 제곱(n) { 반환 n * n }
만약 (x > 5) { 출력값("x는 5보다 큼") } 아니면 { 출력값("x는 5 이하") }

이들은 RPN으로 자동 변환됩니다. 변수 x = 10은 내부적으로 메모리 할당·PUSH·STORE의 조합이 되고, 조건문의 괄호와 중괄호는 파서가 걷어냅니다. 결론적으로 고수준 코드는 가독성을 위한 표현일 뿐, 기계가 이해하는 것은 언제나 RPN입니다.

학습 곡선과 현실

한선씨를 처음 배우는 엔지니어에게는 두 갈래 길이 있습니다.

고수준에서 시작. C 문법이 친숙하므로 빠르게 프로토타입을 짭니다. 다만 ISA729의 정확한 구조는 잠시 가려집니다.

RPN에서 시작. 스택과 opcode를 직접 다루므로 기계를 더 깊이 이해합니다. 처음엔 느리지만 최적화 단계에서 더 강력합니다.

설계자의 권장은 명확합니다 — "새 코드는 RPN으로." 이유는 헌법에 적혀 있습니다. RPN이 정통이고 고수준은 이행 보조이기 때문입니다. 그러나 현실은 유연합니다. 초기에는 고수준으로 익히고 점차 RPN으로 내려가는 경로가 있으며, 중요한 것은 결국 RPN까지 도달하는 것입니다. 그 화살표의 끝, 가장 근본적인 형태에 발을 디디는 것.

다음 장으로

저는 이 장을 닫으며, 한선씨라는 이름이 단지 한 언어의 이름만은 아니라는 사실을 적어 둡니다. 이 세계관에는 부의 사다리가 있고, 그 사다리의 맨 위, 머니(크라우니원)와 에셋(맘·포네)을 지나 다다르는 웰스의 자리에 크라우니가 서고, 그 군집의 단계로 한선과 선호라는 이름이 예비되어 있습니다 — 아직은 앞으로 열릴 미래의 서사로 남겨진 이름들입니다. 한 언어의 정통이 한 부의 단위와 이름을 나눠 가진다는 것. 동형성은 이렇게 기계의 바닥에서 세계의 꼭대기까지 같은 무늬로 이어집니다.

다음 장에서는 이 432개의 키워드가 고수준 문법과 24개의 표준 라이브러리로 어떻게 조직되는지 봅니다. 한선씨는 opcode의 나열이 아니라, 이미 하나의 생태계이기 때문입니다.

내 맘 –

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

불러오는 중…

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

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