우리는 영어로 생각하지 않는다. 그런데 코드를 쓸 때는 영어를 쓴다. if, while, function — 명령어부터 변수명까지 영어다. 이것은 단순히 문법 선택의 문제가 아니다. 모국어로 사고하되 다른 언어로 지시하는 이중성을 의미한다. 번역 단계가 하나 더 들어간다는 뜻이다. 이것은 오류의 원천이다.
한국 엔지니어는 매일 이 번역 비용을 낸다. 머릿속으로 한국어로 설계하다가 손은 영어 키워드를 친다. 패러다임 전환이 일어날 때마다 한 박자 늦는다. 이것을 당연하다고 받아들이는 것이 국제표준이라고 믿어왔다.
한선씨는 이 번역 고리를 끊으려는 시도다. 한국어로 직접 생각하고, 그 생각이 곧 코드가 되고, 그 코드가 곧 실행 가능한 기계어가 되는 체계. 저자 김선경(킴프레지던트에스케이)이 4상균형3진이라는 철학 위에 세운 한국어 프로그래밍 언어다.
왜 3진인가. 프로그래밍의 기초는 2진이었다. 참과 거짓, 1과 0, 켜짐과 꺼짐. 하지만 인간의 사고는 "예"와 "아니오"만으로 작동하지 않는다. 우리는 "아직 모른다"를 품는다. 한선씨의 3진 논리는 참(T)·거짓(A)·모름(O) 세 값을 1급 시민으로 다룬다(Kleene 3값). 언어 차원에서 모르면 키워드가 이를 표현한다. 2진이 건축 단위였다면, 3진은 균형이다.
여기에 네 번째 위상을 더한다: T(데이터) · O(명령) · A(체이닝) · U(음, 블랙홀). 이들은 +1, 0, -1의 균형 3진 안에서 조화를 이룬다. T는 볼 수 있는 데이터, O는 명령의 현재 상태(화이트홀), A는 다음 상태로의 체이닝이다. 그리고 U(음)은 가시선 너머의 비가시 영역—어디로 갈지, 얼마나인지 모르는 구분자의 경계를 담는다. 코드에서는 띄어쓰기로 표현되지만, 철학적으로는 미지의 영역을 포함하는 우주론적 경계다. 인간이 "아직 결정되지 않은 미래"를 다루는 방식 자체를 프로세서에 새긴 설계.
기본 단위는 27트릿(트릿=3진의 비트), 즉 큐브(3³=27)다. ISA729 명령어 체계의 토대가 된다. 인간이 한 번에 다루는 의미 덩어리를 27트릿으로 설정한 것도, 모국어 사고의 입자(granule)를 건축에 반영하려는 의도다.
정말 작동하는가. 철학으로만 끝나지 않는다. 한선씨 VM(크라우니씨 v10.3)은 867개의 유니크 opcode를 실행한다. 고수준 컴파일러 hanseonc_high는 4380줄, 내장함수 225개, 표준라이브러리 24개를 갖춘 프로덕션 수준이다. 3레이어가 정말 1:1로 연결된다: 한글 키워드 → @의미코드 → TOAU 기계어. 모국어 코드가 의미 코드를 거쳐 균형 3진 기계어로 직선으로 내려간다.
생태계 규모도 실증한다. 한선씨 소스 파일 8836개, TOAU 바이너리 449개. 등록된 서비스 210개 중 71개가 한선씨 VM으로 돌아간다. 웹서버, DNS, 블록체인, 거래소, 은행, 메신저, 인증 서버까지 구현했다. 1414줄의 셀코어 라이브러리는 규칙기반 에이전트 프레임워크다. 순수 TOAU로만 작동하는 서비스가 32%, 즉시 대치 가능한 것까지 합치면 72~75%에 달한다.
한계도 정직하게. 처음엔 부동소수점이 없었다. 하지만 이것이 영구한계가 아님을 증명했다. 테슬라가 정수 기반 고정소수점으로 부동소수점을 대치한 접근을 참고해, 한선씨 라이브러리 '고정소수점.한선'을 실제로 구현·검증했다(스케일 1000 = 소수 3자리, 나눗셈·루트·사인·코사인·문자열 변환 완성, 최대오차 0.001). 부동소수점 벽을 이미 돌파하기 시작한 것이다. TLS는 아직 stunnel으로 외부의존한다. 외부 LLM은 Node 사이드카가 필요하다. 텍스트 스트리밍은 16KB 제한, 정수 오버플로는 약 1410억대, 나눗셈은 자연반올림(|r|≤|b|/2)이므로 특정 알고리즘에서 함정이 있다. — 정직하게 밝히는 것이 신뢰의 기초다.
그럼에도 앞으로 간다. 스케일드 정수로 부동소수점을 확장하고, RPN 정통 컴파일러를 수리하고, 사이드카 표준화로 자립도를 90%까지 높일 계획이다. 크라우니코드 생성엔진의 자립도는 이미 70%다. 수학·문자열·네트워크·알고리즘에선 98~91% 자립, 파일IO와 자료구조만 LLM의존도가 남았다. 이것도 로드맵에 있다.
한국어로 컴퓨터를 짓는다는 것은, 결국 번역자에서 설계자가 되는 일이다. 외산 언어의 문법을 따르는 것이 아니라, 모국어의 사고 방식과 우리의 철학(4상균형, 미지를 품는 3진 논리, "음"의 비가시 경계)을 프로세서에 새기는 것. 2진의 이분법을 넘어, 세 번째 값 "모름"과 네 번째 경계 "음"을 담는 더 정직한 세계관으로. 한계를 모르는 척하지 않고, 넘고 있는 그 자리에서 다음을 본다. 이것이 한선씨가 지향하는, 그리고 이미 도달한 좌표다.
컴퓨터는 0과 1, 두 갈래로만 센다. 비트(bit)라는 이름으로. 이 둘이 쌓이면 모든 수가, 모든 글자가, 모든 영상이 된다. 하지만 셈의 세계는 정말 0과 1뿐일까.
생각해 보자. 누군가 "내일 비가 올까?"라고 묻는다. 대답은 "그렇다" 또는 "그렇지 않다" 두 가지다. 하지만 "아직 모르겠다"는 어떻게 표현할까. 0과 1로는 이것을 담을 수 없다. 우리는 "거짓"으로 억지 떨어뜨리거나, 특별한 값을 만들어야 한다. 번거롭다.
한선씨는 다른 선택을 했다. 처음부터 세 번째 자리를 비워 두었다.
비트가 0과 1 두 값이듯, 트릿(trit)은 세 값을 가진다. 음(-1), 영(0), 양(+1). 이것을 균형3진이라고 부른다.
가장 좋은 비유는 양팔저울이다. 양팔저울에는 추가 있다. 한쪽에만 놓으면 양수, 다른 한쪽에 놓으면 음수, 양쪽에 놓지 않으면 영. 어느 쪽이 무거운지, 또는 같은지를 한 번에 본다. 부호(마이너스 기호)를 따로 붙일 필요가 없다. 음수가 자연히 표현된다.
이것이 균형3진의 핵심이다. 한 자리가 음·영·양을 모두 담는다. 그래서 부호가 숫자 안에 내장된다. 컴퓨터의 흑백 세계에 회색이 들어온 것이다.
트릿이 모여 더 큰 수를 만든다. 트릿 3개가 모이면 3 × 3 × 3 = 27가지 조합이 된다. 한선씨는 이것을 큐브(cube)라 부른다. 큐브는 27트릿의 묶음이고, 한선씨 컴퓨터의 기본 단위다. 글자가 모여 낱말이 되듯이, 트릿이 모여 큐브가 된다.
한선씨의 세계는 4상(四相)으로 이루어진다. 트릿 3개로 그 중 세 상태를 나타낸다.
그리고 네 번째 상이 있다.
이것은 단순한 수학이 아니다. 우주를 어떻게 보는가의 철학이다.
균형3진의 이점은 나눗셈에서 가장 명확하게 드러난다. 100을 2로 나누면 50이다. 당연하다. 하지만 컴퓨터의 정수 나눗셈은 종종 버림을 한다. 51을 2로 나누면 25가 된다(나머지 1은 버린다). 한선씨는 다르다.
한선씨의 나눗셈은 가장 가까운 정수로 떨어진다. 나머지의 절댓값이 제수의 절반을 넘지 않아야 한다(|r|≤|b|/2). 양팔저울이 자연스럽게 균형을 찾듯이, 나눗셈도 가장 가까운 값으로 쓰러진다. 이것은 규칙이 아니라 구조에서 나오는 성질이다.
이론은 종이 위의 아름다움이다. 하지만 한선씨는 다르다. 실제로 도는 crownyc.c v10.3 가상기계(VM)가 있다. 867개의 유니크 연산 코드(opcode)로 27트릿 큐브를 생각할 수 있게 만든다. 3진 산술이 네이티브로 동작한다. 삼진인코딩, 삼진덧셈, 삼진곱 같은 함수들이 VM 안에 내장되어 있다.
추상의 학문이 아니다. 실제로 프로그래머가 이 언어를 손에 들고 쓰면 트릿이 움직인다.
한선씨는 Kleene 3값 논리를 채택했다. 2진 논리는 참과 거짓 둘뿐이다. 하지만 3값 논리는 다르다.
'모름'이 참도 거짓도 아닌 일급 시민이다. 데이터가 없을 때를 생각해 보자. 2진 세계라면 거짓으로 억지 떨어뜨려야 한다. "빈 배열인가?" → 거짓. 하지만 이것은 정직하지 않다. 데이터가 없는 것과 거짓인 것은 다르다. 한선씨는 '모름'을 그대로 들고 셈한다. 프로그래머는 모르면 키워드로 이 상태를 명시적으로 다룬다.
이것은 단순한 기술이 아니라 사상의 변화다. 세계를 흑백이 아닌 회색 포함으로 본다는 뜻이다.
한선씨 코드에서 음(U, -0)은 띄어쓰기와 구분자로 나타난다. 이것은 FPGA 같은 2진 하드웨어에 매핑하기 위한 도구적 결정이다. 0과 1의 세계에서 간격을 표현하는 가장 단순한 방법이 띄어쓰기였던 것이다.
하지만 이것이 음의 정체를 다하지 않는다. 음은 코드에서 띄어쓰기로 보이지만, 그 근저에는 블랙홀의 의미—어디로 갈지 모르고, 얼마나인지 알 수 없는 경계—가 흐르고 있다. 우리가 한선씨를 높은 수준에서 사용할 때는 이 4상의 우주관을 잊지 않아야 한다.
한선씨의 나눗셈 규칙을 다시 보자. 100을 2로 나누면 50. 100을 3으로 나누면? 33(나머지 1). 1은 3의 절반(1.5)보다 작으니 버린다. 99를 2로 나누면? 본래 49.5인데, 균형3진은 가장 가까운 정수인 50으로 올린다. 대칭적이고 정직하다.
하지만 함정이 있다. 이진탐색에서 멈춘다. 탐색 구간을 반으로 나누는 (lo+hi)/2는 올림이 되어 구간이 줄어들지 않고 무한 루프에 빠질 수 있다. SRC 함정 목록에 명시된 이 문제는 선형 스캔으로 우회한다. 기술은 아름답지만 모든 곳에 맞지는 않는다.
균형3진의 아름다움에도 물리적 한계가 있었다. 하지만 이제 그 경계를 넘기 시작했다.
예를 들어, 부동소수점이 없었다. 고정소수점만 있었다. 루트2를 계산하면 1이었다(정수만). 사인 함수는 정수 라디안을 입력받았다. 정수의 범위도 제한이 있었다. 약 1410억대에서 오버플로가 발생했다.
하지만 테슬라가 자동차 칩셋에서 부동소수점을 버리고 정수 스케일 고정소수점(스케일 1000 = 소수 3자리)으로 강대한 연산을 만든 것처럼, 한선씨도 같은 길을 걸어갔다. 이제 한선씨는 고정소수점.한선 라이브러리로 나눗셈, 루트, 사인, 코사인, 문자열 변환을 실제로 수행한다. 최대 오차는 0.001일 뿐이다. 부동소수점이 "없음"이 아니라 "정수로 정직하게 표현하는 방식"으로 진화한 것이다.
TLS 같은 보안 통신은 아직 외부 도구(stunnel)에 의존하고 있다. RPN 정통 컴파일러도 완성 중이다. 하지만 이제 우리는 한계가 영구한 게 아니라, 지금 이 순간에도 넘고 있다는 것을 안다. 거짓 없이.
세 갈래의 셈은 흑백을 버리는 것이 아니다. 흑과 백 사이에 회색의 자리를 정직하게 비워 두는 일이다. 트릿이 큐브가 되고, 큐브가 867개의 연산 코드 위에서 돈다. '모름'을 들고 셈하는 언어가 컴퓨터에서 실제로 작동한다.
비트의 시대는 끝나지 않았다. 하지만 이제 우리는 트릿을 본다. 양팔저울처럼 대칭이고, 4상의 우주관을 담은 정직한 셈의 세계를 본다. 티는 데이터, 옴은 화이트홀의 가시선, 타는 체이닝, 그리고 음은 그 모든 것을 품은 블랙홀의 비가시선. 다음 장에서 이 큐브 위에 어떻게 명령어가 쌓이고, 언어가 만들어지는지 살펴보자.
한 줄의 한선씨 코드가 두 갈래 길로 나뉜다. 한쪽은 넓고 밝은 큰길이고, 다른 쪽은 헌법이 가리키는 정도(正道)인데 몇몇 구간이 아직 다듬어지는 중이다. 그런데 신기한 일은, 두 길 모두 같은 목적지에 도착한다는 것이다.
지금 한선씨 서비스들이 실제로 다니는 길은 hanseonc_high 컴파일러다. 4,380줄의 C-like 구문 위에 한글 키워드를 얹었다. 누구나 이렇게 쓴다:
가져오기 "문자열.한선"
변수 x = 10
함수 제곱(n) { 반환 n * n }
출력값("결과: " + 문자열변환(제곱(x)))
이 길에는 225개의 내장함수와 24개 표준라이브러리가 놓여 있다. 현재 생태계의 서비스 210개 중 71개가 순수 한선씨로 만들어졌는데, 이들 거의 모두 이 길로 온 것이다. 프로덕션 표준이다.
그런데 한선씨 헌법이 가리키는 정통의 길은 다르다. RPN(역폴란드 표기, 후위연산)이라고 부르는 길인데, 이건 한국어 문장 순서와 ISA729 기계어 opcode에 정확히 1:1로 대응한다. "한선씨 = 한국어 RPN = ISA729 1:1"이 설계 원칙이다.
정통의 길이 정통인 이유는, 이 길이 가장 정직하기 때문이다. 중간 변환을 거치지 않고 한국어를 곧바로 3진 기계어로 옮긴다. 마치 직선이 항상 최단거리인 것처럼.
그런데 여기가 솔직해야 할 지점이다. 설계상 정통이어야 할 길 hanseonc_std.asm의 구현에 몇 개 구간이 아직 마무리 중이다. 루트, 거듭제곱, 설정, 꺼내, 크거나같다, 가져오기 — 이 키워드들이 아직 정치를 끝내지 못했다.
이것은 "부채"이지만, 우주론적으로 보면 음(U, -0)의 의미와 닿아 있다. 음은 "어디로 갈지, 얼마나인지 모르는 영역" — 가시선 위를 품는 비가시선 바깥이다. 공사 중이라는 건, 정도(正道)가 여전히 비가시선 영역을 탐사 중이라는 뜻이다. 이 불완성 자체가 한선씨 설계의 정직함이다.
정통 어셈블리가 미완성이면 정통 길은 막힌 건가? 아니다. RPN의 C 판 구현이 있다. hanseonc_rpn.c다. 이것은 실제로 작동하고 있다. 생태계 빌드가 이미 이것을 사용하고 있다는 뜻이다.
즉, 뜻밖의 역설이 생긴다. 정통이라고 선언한 길이 .asm 판은 다듬어지는 중이지만, 같은 RPN 정통을 C로 구현한 판은 살아서 움직이고 있다. 이것은 "정통이 깨졌다"가 아니라 "정통의 여정이 예상과 다르게 흘러갔다"는 뜻이다. 지금 이 순간도 hanseonc_rpn.c의 빈 자리를 하나씩 채워가고 있다.
흥미로운 건, 한선씨가 "정수만 할 수 있다"는 경계를 이미 넘기 시작했다는 점이다. 테슬라처럼 부동소수점 없이 정수 연산으로 고정소수점을 구현하는 방식(스케일 1000 = 소수 3자리)을 한선씨 라이브러리 고정소수점.한선에 실장했다. 나눗셈, 루트, 사인, 코사인, 문자열 변환까지 모두 검증 완료했고, 최대 오차는 0.001 이하다.
이것은 한선씨가 "못하는 영역"이 있다는 뜻이 아니라, 그 경계를 정직하게 인식하고, 이미 건너편에 발을 디딘 것이다. 모든 한계가 영구한 건 아니다. 정도는 계속 이어진다.
두 길이 다르지만, 같은 곳에 도착한다. 고수준 hanseonc_high로 쓴 코드도, RPN 정통으로 쓴 코드도, 결국 같은 TOAU 기계어를 만든다. 그리고 그 TOAU를 crownyc VM이 실행한다.
4상균형3진(T=+1데이터, O=0명령, A=-1체이닝, U=비가시선의 경계)의 27트릿 큐브 위에 둘 다 선다. ISA729의 같은 opcode로 변환된다. 기계어는 하나다.
서비스를 만들 때는? 지금 당장은 고수준 hanseonc_high를 택하는 게 현명하다. 큰길이 닦여 있고, 함수가 많고, 실제로 작동한다. 프로덕션 표준이다.
하지만 새 코드를 배우거나 가르칠 때는, RPN 정통을 외면해선 안 된다. 정통화라는 여정이 있기 때문이다. hanseonc_rpn.c의 빈 구간들을 채워가고, hanseonc_std.asm도 다시 완성할 때가 온다. 그때까지 기존 코드들은 고수준으로 만들어져도, 새로 배우는 사람은 정통을 이해하도록 가르쳐야 한다. 정통을 알아야, 다음 단계를 볼 수 있다.
두 길을 하나로 통일하려는 게 아니다. 두 길이 같은 TOAU 위에서 정직하게 공존하게 만드는 것이 한선씨의 다음 단계다. 지금은 갭이 있지만, 그 갭이 선택의 폭을 넓혀준다는 점을 아는 사람이 진짜 한선씨를 다루는 사람이다.
한선씨로 처음 프로그래밍을 시작할 때, 많은 사람이 "바닥부터" 무언가를 만들려고 한다. 문자열을 자르려면 함수를 쓰고, 파일을 읽으려면 파일 라이브러리를 찾고, 웹 서버를 짜려면 네트워크 통신부터 수작업한다. 그러나 한선씨의 철학은 다르다. 도서관에 이미 다 있다.
생각해보자. 책장에는 두 종류의 책이 있다. 손에 쥐고 항상 쓰는 연장(내장함수 225개)과, 필요할 때만 뽑아 쓰는 두꺼운 책(표준라이브러리 24개). 컴파일러가 이 모든 것을 한 덩어리의 기계어(TOAU)로 풀어내면, 크라우니VM이 실행한다. 책과 연장의 구분은 우리의 손에만 있고, 기계 입장에서는 모두 같은 노래다.
내장함수는 가져오기가 필요 없다. 한선씨 코드를 쓰는 순간 즉시 쓸 수 있다. 문자열 조작부터 시작해보자. 글자수로 문자 개수를 센다. 부분으로 일부를 뚝 떼어낸다. 포함으로 특정 글자가 있는지 묻는다. 이런 식으로 문자열 영역만 해도 수십 개의 함수가 손 안에 있다.
배열도 마찬가지다. 길이로 크기를 확인하고, 추가로 새 원소를 넣고, 정렬로 순서를 맞춘다. 파일 I/O는 읽기, 쓰기로 디스크와 대화한다. 네트워크는 TCP나 UDP 소켓을 열고, 데이터를 보내고 받는다.
수학 함수도 풍부하다. 거듭제곱과 루트가 있고, 사인, 로그, 무작위까지 있다. 암호화도 내장되어 있다. SHA256으로 해시를 만든다. 압축도, GUI 제어도, 3진 연산(우리가 태어난 수 체계!)도 모두 손 안에 있다.
일반 프로그래밍 언어가 몇 주일 기다려 라이브러리를 설치하는 일의 상당수가 한선씨에서는 키워드 하나로 끝난다. 이것이 내장함수 225개가 주는 첫 번째 뜻이다.
좀 더 복잡한 일이 필요하면 책장을 연다. 가져오기 "이름.한선"으로 표준라이브러리 24개를 꺼내 쓴다. 라이브러리들은 목적별로 묶여 있다.
웹 묶음: 라우터·미들웨어·인증·템플릿·뷰·스타일. 웹 서버를 짜려면 이 묶음에서 시작한다.
데이터 묶음: JSON·YAML·셀저장소·셀DB·바이트버퍼·큐. 구조화된 데이터를 다루려면 이쪽이다.
시스템 묶음: 설정·환경·프로세스·날짜·타이머·로깅·검증·네이티브·하드웨어. 운영 체제와 대화하려면 여기서 찾는다.
통신 묶음: 네트워크·TLS. 멀리 있는 장비와 안전하게 말하려면 이것들을 쓴다.
각 라이브러리는 그냥 확장이 아니라 생각의 틀이다. JSON 라이브러리를 쓰면서부터 너는 JSON처럼 생각하기 시작한다. 인증 라이브러리를 쓰면 보안 흐름을 그 도구의 언어로 표현한다.
세 번째 책장은 특별하다. 셀코어(1414줄, 15모듈)는 규칙기반 에이전트 프레임워크다. 함수 카탈로그를 넘어, "생각을 규칙으로 표현하는" 도서관이다.
룰생성, 룰조건추가, 룰변경추가라는 세 개의 키워드로 너는 코드를 함수 대신 규칙(rule)으로 짠다. "만약 고객의 등급이 VIP이고 구매액이 100만 원 이상이면, 배송료 무료"처럼 비즈니스 로직을 직접 규칙으로 써내린다. 상태기계도, 의사결정 에이전트도, 복잡한 분기 로직도 규칙 몇 줄로 깔끔해진다.
이것이 세 번째 책장의 뜻이다. 함수는 "하는 것"이고, 규칙은 "생각하는 것"이다.
책장의 크기를 가늠하려면, 그것으로 실제로 무엇을 만들었는지 봐야 한다. 추측이 아니라 증거를.
한선씨로 이미 구현된 서버는 10가지 이상이다. 웹서버, DNS 서버, 블록체인, 암호화폐 거래소, 은행 시스템, 메신저, 인증 시스템, SSR(서버 사이드 렌더링), AI 에이전트, 그리고 우리의 네트워크 프로토콜 CRNS. 라이브러리 조합만으로 풀스택이 선다.
이것은 자랑이 아니라 선언이다. 도서관은 전시품이 아니라 매일 쓰인다.
현재 크라우니 생태계에는 서비스 210개가 등록되어 있다. 이 중 크라우니VM(한선씨)으로 돌아가는 서비스가 71개, Node.js로 돌아가는 서비스가 102개다. 한선씨 소스 파일은 8836개, 컴파일된 TOAU 파일은 449개다.
동시에 우리는 숨기지 않는다. Node.js가 아직도 더 많다. 도서관이 완성되지 않았다는 뜻이다. 그러나 이미 순수 TOAU(외부 의존 없음)로 즉시 대치 가능한 부분이 32%이고, 좀 더 느슨한 기준으로 세면 72~75%에 이른다. 사이드카(한선씨 주서버 + JavaScript HTTPS 브리지) 한 패턴을 표준화하면 약 90%에 닿을 수 있다.
도서관은 세상의 4분의 3을 이미 커버하고 있고, 한 패턴의 표준화만으로 9할에 도달할 수 있다.
그러나 정직함이 중요하다. 책장에는 여전히 비워진 자리가 있다.
첫째, 부동소수점이 없다. 고정소수점만 있다. 루트 2를 계산하면 1이 나온다. 삼각함수는 정수 라디안에서만 작동한다. 이것은 금융·회계 같은 분야에서는 큰 문제가 아니지만(돈은 어차피 정수다), 과학 계산이나 그래픽스에는 장벽이다.
둘째, TLS(암호화 통신)는 stunnel이라는 외부 도구에 의존한다. 한선씨 자체로는 구현되지 않았다.
셋째, 외부 인공지능(예: OpenAI)과 연결하려면 Node.js 사이드카가 필요하다. 한선씨만으로는 그 종류의 API 호출을 안전하게 하기 어렵다.
넷째, 대용량 텍스트 스트리밍에 제약이 있다. 한 번에 읽을 수 있는 크기(16KB)와 문자열이 가질 수 있는 최대 크기(64KB)가 정해져 있다.
또한 정수 오버플로는 약 1410억 대에서 발생하고, 나눗셈의 자연반올림 방식이 이진탐색을 무한루프로 만들 수 있다는 함정도 있다. 이런 것들을 알고 있으면 안전하게 피할 수 있다. 젖은 바닥에는 "주의" 표지판이 필요하다.
크라우니코드라는 생성엔진이 한선씨 코드를 자동으로 생산하는데, 이 엔진의 자립도는 70%다. 30%는 아직 인공지능의 도움이 필요하다.
그런데 도메인마다 다르다. 수학 연산은 자립도 98%로 거의 완벽하다. 문자열 처리도 98%, 네트워크 코드도 97%, 알고리즘도 91%다. 반면 파일 I/O는 74%, 자료구조는 66%다.
이것은 무엇을 뜻하나? 강한 책장(수학·문자열·네트워크)에서 작업하면 손이 거의 안 간다는 뜻이다. 약한 책장은 아직 사람의 손길이 더 필요하다. 그리고 그것을 알면, 우리는 어디서 조심해야 하는지 안다.
궁극적으로 중요한 것은 이것이다. 표준 도서관만으로, 우리는 세상의 대부분을 한선씨로 다시 쓸 수 있다. 부동소수점 없는 정수 연산(테슬라가 쓰는 기법)으로 과학 계산의 벽을 돌파하고, RPN 정통 컴파일러를 수리하고, 사이드카 패턴을 표준화하면, 그 높이는 더 올라간다.
도서관은 완성품이 아니라 자라는 서가다. 무엇이 꽂혀 있고, 무엇이 비었고, 다음에 무엇이 꽂힐지를 정직하게 아는 것. 그것이 도서관을 제대로 쓰는 길이다.
프로그래밍 언어는 도구일 뿐이라고 생각하는가. 그렇다면 한선씨의 진짜 모습을 아직 모르는 것이다. 더하기, 반환, 만약, 동안. 모두 한국어다. 한국어 키워드로 짠 코드가 지금 이 순간 실제 서비스를 떠받치고 있다.
은행이 있다. 블록체인이 있다. 메신저가 돈다. DNS 서버도, 거래소도 한선씨로 짰다. 장난감 언어가 아니라 프로덕션 서비스 위에 얹혀 있는 기반이다. 210개의 서비스. 그 중 71개가 한선씨 가상기계(VM) 위에서 라이브로 살아 돈다.
"정말 그런가?" 라는 질문에 이 장이 답한다.
한선씨의 기반은 세 겹이다.
첫째, 가상기계(VM). crownyc.c v10.3이 867개의 유니크 연산 코드(opcode)로 27트릿 큐브를 움직인다. 3진 산술이 네이티브로 동작한다. 이것은 하드웨어처럼 단단하다. 해석 층이 아니라 실행 층이다.
둘째, 컴파일러. hanseonc_high는 4380줄, 225개의 내장함수를 품고 있다. 한국어 고수준 코드(.한선 파일)를 받아 TOAU라 불리는 기계어로 변환한다. 더 깊이 들어가면 RPN(역폴란드 표기법) 경로도 있지만, 대부분의 프로그래머는 고수준 문법에서 일한다.
셋째, 표준라이브러리 24개. 문자열, JSON, YAML, 네트워크, 라우터, 인증, 로깅, 검증, 템플릿, 환경, 날짜, 타이머, 프로세스, 버퍼, TLS, 큐, 데이터베이스, 스타일, 하드웨어까지. 무엇을 빼도 서비스를 짤 수 없는 것들이다.
이 세 겹이 갖춰지지 않았다면 210개의 서비스는 없었을 것이다. 한선씨는 처음부터 프로덕션을 염두에 두고 지어졌다.
숫자부터 말하자. 한선씨로 짠 서버 구현은 10종 이상이다. 웹서버, DNS서버, 블록체인, 거래소, 은행, 메신저, 인증 시스템, SSR(server-side rendering), 에이전트, CRNS(크라우니 이름 서비스). 이 중 어느 것도 장난이 아니다.
블록체인을 예로 들어보자. SHA256 해싱이 VM 안에 내장되어 있다. 블록을 연결하려면 이전 블록의 해시를 알아야 한다. 한선씨는 암호화를 자체 손으로 한다. 외부 라이브러리를 끌어와야 하는 다른 언어와 다르다. 이것은 신뢰의 문제다. 코드를 읽을 수 있다. 검증할 수 있다.
은행이 있다. 정수 산술만으로 송금과 정산을 한다. 고정소수점 수학이다. 부동소수점의 오차는 은행에서 용납되지 않는다. 한선씨는 그 점에서 정직하다. 가능한 범위를 명시하고(약 1410억대까지), 그 안에서 정확하게 계산한다.
메신저가 있다. TCP 소켓 함수가 내장되어 있다. 메시지를 보내고, 받고, 큐에 넣고, 빼고. 네트워크 통신이 언어 안에서 직접 손으로 다루어진다.
책 서버도 있다. HTML을 생성하고, 요청을 받고, 응답한다. 서버 객체 지향 프로그래밍(SSR) 패턴이 한선씨로 표현된다.
실제 숫자로 보면 이렇다. 등록된 서비스는 210개. 그 중 한선씨 VM을 사용하는 라이브 서비스는 71개다. Node.js를 사용하는 것은 102개. 한선씨가 아직 적지만, 빠르게 대체되고 있다. 한선씨 소스 파일만 해도 8836개, 컴파일된 TOAU 파일은 449개다.
이것이 "이론"이 아니라 "사실"이라는 증거다.
하지만 여기서 멈추면 거짓이다. 한선씨는 모든 것을 할 수 있는가? 아니다. 정직하게 말해야 할 한계가 있다.
부동소수점이 없다. 루트2를 계산하면 1이 나온다. 정수만 다룬다. 사인 함수는 정수 라디안만 입력받는다. 이것은 과학 계산이나 3D 그래픽에는 치명적이다. 하지만 금융, 메시징, 블록체인, 데이터 처리에는 오히려 도움이 된다. 오차가 없기 때문이다.
TLS(보안 통신)는 외부에 의존한다. stunnel이라는 별도 도구로 HTTPS를 처리한다. 한선씨 자체에는 TLS 라이브러리가 없다. 이것은 약점이지만, 스택을 단순하게 유지하는 선택이기도 하다.
외부 LLM(인공지능 모델)과 통신하려면 Node.js 사이드카가 필요하다. 한선씨 혼자는 불가능하다. 하지만 크라우니코드 생성엔진이 있어서, 70% 정도는 인공지능 없이도 한선씨 코드를 생성할 수 있다. 수학(98%), 문자열(98%), 네트워크(97%), 알고리즘(91%)은 강하다. 파일 I/O(74%), 자료구조(66%)는 약하다.
텍스트 스트리밍에 제한이 있다. 한 번에 읽을 수 있는 크기가 16KB까지, 문자열 변수는 64KB까지다. 메모리(메모리 전체는 48MB)가 고정되어 있고, 가비지컬렉션이 없다. 이것은 작은 임베디드 기계에서는 장점이지만, 큰 파일을 다루는 서버에서는 제약이다.
그렇다면 한선씨는 얼마나 완성되었는가?
이미 순수 TOAU(컴파일된 기계어)로만 돌아가는 서비스는 32%다. 즉시 대치 가능한 것까지 합치면 72~75%. aimed라는 기업용 솔루션처럼 한선씨 주서버 + JavaScript HTTPS 브릿지를 표준화하면 90%에 닿을 수 있다. 이것은 이론이 아니라 이미 작동하는 사례다.
한선씨 코드를 자동 생성하는 엔진의 자립도도 70%다. 나머지 30%는 아직 인공지능이 필요하다. 하지만 강한 분야(수학, 문자열, 네트워크)에서는 자동 생성이 거의 완벽하다. 약한 분야도 매년 나아지고 있다.
210개는 끝이 아니라 시작이다.
한국어 키워드로, 3진 구조로, 네이티브 암호화와 네트워크 함수로 서비스를 짓는다는 것. 이것이 의미하는 바는 기술 이상의 것이다. 컴퓨터의 언어가 더 이상 영어의 독점이 아니라는 뜻이다. 한국의 개발자가 한국어로 생각하듯이 코드를 쓸 수 있다는 뜻이다.
4대 벽(부동소수점·TLS·LLM·텍스트 스트리밍)은 여전히 있다. 하지만 벽을 숨기지 않는 정직함이, 오히려 신뢰를 만든다. 다음 단계는 이미 이름이 붙었다. 정수 스케일로 부동소수점을 표현하고, RPN 정통 컴파일러를 완성하고, 사이드카를 표준화하는 것. 설계된 경로가 있다.
언어로 세계를 짓는다. 71개의 라이브 서비스가 이것을 증명한다. 그리고 다음 장은 독자(혹은 다음 세대 개발자)가 쓴다. 한국어로.
한선씨는 4상균형3진이라는 독특한 수의 우주 위에 세워진 한국어 프로그래밍 언어다. 코드를 실행하는 가상머신(crownyc.c v10.3)은 867개의 고유한 명령어로 거의 완성됐고, 고수준 컴파일러(hanseonc_high)는 4380줄의 코드에 225개 내장함수와 24개 표준라이브러리를 싣고 프로덕션 환경에서 돌아간다.
하지만 지도를 펼쳐놓으면 아직 칠하지 못한 네 개의 빈 칸이 보인다.
완성된 무언가를 설명할 때, 가장 정직한 방식은 그것이 못 하는 것도 함께 말하는 것이다. 과장은 길을 잃게 하고, 정직은 길을 만든다.
첫째 벽: 부동소수점의 지형 넘기
한선씨에는 IEEE 754의 부동소수점이 없다. 대신 고정소수점이 있다. 루트2는 1이 되고, 사인함수는 정수 라디안만 받는다. 이것이 가장 깊은 벽인데, 그 이유는 단순하다 — 4상균형3진은 정수와 트릿의 세계이고, 떠다니는 이진 소수점은 이 우주의 시민이 아니기 때문이다.
하지만 이미 넘기 시작했다. 테슬라가 부동소수점 없이 정수연산으로 푼 방식을 참고해, 고정소수점.한선 라이브러리를 실제로 구현·검증했다. 스케일 1000 기준(소수 3자리)으로 나눗셈, 루트, 사인, 코사인, 문자열변환이 모두 작동하고, 최대오차는 0.001에 머문다. 벽의 원인을 "못 만들어서"라고 부르면 정직하지 않다. 대신 "다른 수의 우주를 택했고, 그 안에서 길을 찾고 있다"는 것이 진실이다.
둘째 벽: TLS의 경계 안에서
한선씨는 암호화 통신(TLS/HTTPS)을 stunnel이라는 외부 프로그램에 의존한다. 표준라이브러리에 TLS 항목은 있지만, 실제 인증서 관리와 핸드셰이크는 stunnel이 처리한다. 순수 한선씨만으로는 HTTPS 종단을 닫지 못한다.
이것은 어려움이 아니라 경계다. 현재 한선씨의 경계이자, 다음 목표다. 크라우니 생태계에서는 이미 수년을 이 경계를 표준화했고, 수백 개의 서비스가 이 패턴으로 안정하게 움직인다. 경계를 인정하는 일이 그것을 넘기 위한 첫 걸음이다.
셋째 벽: 외부 거대언어모델은 Node 사이드카를 경유
OpenAI나 Claude 같은 외부 LLM을 호출할 때, 한선씨는 Node.js로 쓴 작은 브리지를 경유한다. 순수 한선씨 주서버가 모든 비즈니스 로직을 처리하고, JavaScript 사이드카가 HTTPS와 외부 API 호출만 담당한다.
한선씨 자체가 세상 밖으로 나가는 길을 혼자 못 만들었다. 그 길은 음(U, 비가시선의 영역 — 얼마나, 어디로 갈지 모르는 곳)에 속해 있다가, 사이드카를 통해 옴(O, 화이트홀 — 시각 가능한 경계 위의 영역)으로 옮겨진다. 한선씨와 Node의 역할 분담은 설계다. 나중에 닦기로 미뤄진 길이 아니라, 지금 유지하기로 택한 경계다.
넷째 벽: 텍스트 스트리밍의 용량
한 번에 읽을 수 있는 바이트는 16KB, 문자열은 64KB를 넘지 못한다. 메모리 모델이 고정 아레나(48MB)에 쓰레기 수집 없이 동작하기 때문이다. 큰 파일을 통째로 삼키는 스트리밍은 설계 단계에서 "지금 필요 없음"이 되었다.
그리고 이것도 경계다. 필요해지는 순간, 다음 버전으로 메모리 모델을 설계하는 때가 온다. 벽이 있다는 것은 벽을 넘을 계획이 있다는 뜻이다.
벽 안에 숨은 함정 둘
네 개의 벽 그 자체만 아니라, 벽 근처에 밧줄도 없이 떨어진 구덩이가 둘 있다.
첫째는 정수 오버플로우다. 정수 워드는 약 1410억 대에서 래핑된다. 곱셈을 할 때 먼저 나누기로 스케일을 조정하지 않으면(예를 들어 먼저 /1000), 결과가 예기치 않게 작아진다. 둘째는 나눗셈의 자연반올림이다. 한선씨는 나머지의 절댓값이 제수의 절댓값의 절반 이하인 방향으로 반올림한다. 그 결과 이진탐색에서 (lo+hi)/2를 무한히 반복하면 무한루프에 빠진다. NURBS 곡선에서 구간을 찾는 함수가 실제로 이 함정에 걸렸다. 해법은 선형스캔으로 옮기거나, 반올림을 고려한 중간값을 직접 계산하는 것이다.
정직한 지도는 함정을 숨기지 않는다. 표지판을 세우는 것이다.
왜 이것이 약점이 아니라 정직인가
한선씨의 강점과 약점을 같은 테이블에 놓으면 이렇다. 크라우니코드 생성엔진의 자립도는 70%이고, LLM 의존도는 30%다. 수학·문자열·네트워크는 90% 이상 자동 생성하고, 알고리즘은 91%, 파일IO는 74%, 자료구조는 66%를 자립한다. 강함과 약함을 같은 표에 나란히 적는 것이 정직한 지도의 본질이다.
벽을 넘는 다음 한 걸음
부동소수점 벽은 이미 고정소수점.한선으로 뚫고 나가기 시작했다. RPN 정통 컴파일러에 남은 깨진 부분(루트, 거듭제곱, 설정, 꺼내기, 크거나같다, 가져오기)은 hanseonc_rpn.c 소스에 정말로 존재하고 작동한다. 문서를 정정하고 코드를 고친다.
TLS는 사이드카를 표준화해서 우회 표준으로 만든다. 외부 LLM도 마찬가지다. 텍스트 스트리밍의 64KB 한계는 메모리 버디 할당과 GC를 도입하는 다음 버전에서 풀린다.
지도에 빈 칸을 그렸기에, 어디로 갈지가 보인다.
정직한 지도는 완성된 영토보다 강하다. 못 하는 것을 적어둔 언어이고, 적어둔 것을 메워나간다. 할 수 있는 것을 과장하지 않고, 못 하는 것을 숨기지 않는 것이 진짜 능력이다.
한선씨가 부동소수점을 갖지 않는다는 사실을 어떻게 받아들일 것인가. 약점으로 볼 것인가, 아니면 선택으로 볼 것인가.
지금까지 한선씨는 한국어 코드로 현실의 210개 서비스를 움직이고 있다. VM은 867 opcode, 컴파일러는 4380줄, 내장함수 225개, 표준라이브러리 24개. 순수 TOAU로만 작동하는 서비스가 32%, 즉시 대치 가능한 것까지 합치면 72~75%다. 생태계는 이미 살아 움직인다.
그런데 벽이 네 개 남았다. 각각을 정직하게 마주하면 약점이 아니라 이미 넘고 있는 경계가 보인다. ①부동소수점: 정수 연산의 정밀성으로 대치하는 길이 열렸다. 고정소수점 라이브러리(고정소수점.한선)가 1000배 스케일로 소수 3자리까지 검증 완료되었고, 루트·사인·코사인·로그가 최대오차 0.001로 작동한다. ②TLS는 stunnel 외부의존이지만 표준 사이드카 패턴으로 경계가 명문화된다. ③외부 LLM은 Node 브리지인데 aimed 아키텍처가 순수 한선씨 주서버와의 역할 분리를 증명했다. ④텍스트 스트리밍 16KB 제한도 페이지 기반 아키텍처로 해결 경로가 생겼다.
부동소수점 없음은 약점이 아니라 방향이다.
4상균형3진의 세계는 본래 정수(트릿)의 세계다. 정수 연산이 가장 정직하고, 가장 빠르고, 가장 결정적(deterministic)이다. 음(U)은 코드에서 띄어쓰기·구분자로 보이지만, 그 본래 의미는 "어디로 갈지, 얼마나인지 모르는 비가시 영역"이다. 이 우주론적 기초 위에서, 정수의 정밀성을 무기로 삼는 길이 있다.
테슬라식 스케일드 정수. 테슬라의 자동차는 부동소수점 연산 대신 스케일드 정수를 쓴다. 값을 고정 배율(예: ×1000)로 곱해 정수 영역에서 모든 계산을 한다. 안전성이 높고, 매번 같은 결과를 낸다. 한선씨도 같은 길로 들어섰다. 고정소수점.한선은 이미 구현·검증되었고, 루트·사인·코사인·로그를 정수 영역에서 최대오차 0.001 이내로 계산한다. 결정성(매 실행 동일 결과)은 덤이 아니다 — 블록체인, 회계, 검증에 직결되는 핵심 자산이다. 이것이 구상이 아니라 이미 첫 구현이다.
RPN 정통 수리. 현재 RPN 정통(hanseonc_std.asm)은 깨져 있다. 루트·거듭제곱·설정·꺼내·크거나같다·가져오기가 미구현이다. 하지만 실제로는 RPN C판(hanseonc_rpn.c)이 작동하고 생태계 빌드가 이미 이것을 쓴다. 문서를 hanseonc_rpn.c 기준으로 정정하고, 두 경로의 간극을 메우면, 한선씨 RPN = ISA729 1:1이라는 정통 위계가 복원된다.
사이드카 표준화. 외부 의존(TLS·외부 LLM)을 부정할 게 아니라 표준화할 것. aimed식 사이드카 — 순수 한선씨 주서버 + JS HTTPS 브리지 — 를 정식 패턴으로 굳히면, 대치 가능성이 ~90%까지 오른다. 경계의 명문화다.
세 갈래가 한 방향을 가리킨다: 부동소수점 없는 정수연산(스케일드 정수)으로 벽①돌파 → RPN 정통 수리 → 사이드카 표준화. 흉내가 아니라 본성으로 끝까지 가는 것.
크라우니코드 생성엔진의 자립도는 이미 70%다. 수학·문자열·네트워크·알고리즘에선 98~91% 자립한다. 파일IO와 자료구조만 LLM 의존이 남았다. 다음 단계는 약한 두 축을 끌어올려 30% 의존을 줄이는 일이다.
한선씨의 미래는 "남들처럼 부동소수점을 갖는 것"이 아니다. 정수의 언어로 끝까지 가되, 정밀성과 결정성으로 모든 부동소수점 쓰임을 대치하는 것. 이것은 약속이 아니라 이미 발 디딘 길이다. 고정소수점.한선이 증명했고, 다음 장에서는 코드로 더 보여줄 것이다.