Rust→한선씨 컴파일러 코어 자기복제 (2026-05-27)
개요
CrownyTVM의 Rust 컴파일러+VM 코어 모듈을 한선씨로 1:1 변환. 자기복제(self-hosting) 토대 구축.
원칙: 컴파일러가 자기 자신을 한선씨로 다시 짜야 진짜 정통화.
변환 완료 (10/10 파일, 3,631줄)
| Rust 원본 | 한선씨 변환 | 위치 |
|---|---|---|
| trit.rs (204줄) | 트릿.한선 (235줄) | libs/Rust변환/ |
| token.rs (158줄) | 토큰.한선 (197줄) | libs/Rust변환/ |
| ast.rs (82줄) | 추상구문.한선 (260줄) | libs/Rust변환/ |
| lexer.rs (230줄) | 어휘기.한선 (236줄) | libs/Rust변환/ |
| 구문.rs (232줄) | 구문.한선 (376줄) | libs/Rust변환/ |
| engine.rs (430줄) | 엔진.한선 (256줄) | libs/Rust변환/ |
| 핵심.rs (490줄) | 핵심.한선 (257줄) | libs/Rust변환/ |
| codegen.rs (522줄) | 코드젠.한선 (313줄) | libs/Rust변환/ |
| parser.rs (535줄) | 파서.한선 (240줄) | libs/Rust변환/ |
| opcode.rs (774줄) | 옵코드.한선 (180줄) | libs/Rust변환/ |
무엇을 했는지
- 이전 세션 복구: 트릿/토큰 2개만 완료된 상태에서 이어받기
- 추상구문(AST): enum Stmt/Expr/BinOp → 정수 상수 함수 + 맵 노드 생성자 패턴 확립
- 어휘기(lexer): 문자별 토큰화 + 복합 연산자 처리. 인라인 주석 단어 함정 회피
- 구문/파서: 재귀 하강(recursive descent). 파서 상태는 맵, 다중 반환은 {노드, p} 맵
- VM 엔진: 스택 기반 인터프리터. 함수형 갱신(맵 새로 만들어 반환) 패턴
- VM 핵심: 레지스터 27 + 메모리 729(sparse map). append-only로 배열 갱신 회피
- 코드젠: AST → ISA729 바이트코드. emit 헬퍼 + 패치 후처리
- 옵코드: ISA729 489개 중 100+개 한선씨 상수 함수로 매핑. 섹터별 정리
패턴 정착
매 파일 정착 후:
libs/Rust변환/에 복사 (어디서든가져오기가능)crownycode-learn.sh add→ 학습DB 등록han-rule-extract.sh→ 규칙저장소 의미어 추출 (조건/반복/대입/함수/반환/자료구조)
통계
- 규칙저장소: 4,508 → 30,392줄 (+25,884 의미어 규칙)
- 학습DB: +14,233 패턴 (총 36,226)
- 한선씨 비율(최근 1시간): 100% (Rust 0, JS 1, C 2 / .한선 1,019)
- 크라우니코드 비중: 58% (한선씨 우위 유지)
관련 파일
- 변환 워크디렉토리:
/tmp/rust2han/{VM,컴파일러,테스트}/ - 정착 위치:
/Users/ef/CrownyOS/crownyc/libs/Rust변환/ - 원본:
/Users/ef/Downloads/CrownyTVM/{*.rs,src/compiler/*.rs,src/vm/*.rs} - 의미어 추출기:
~/.claude/scripts/han-rule-extract.sh(이전 세션에서 작성) - 규칙저장소:
/Users/ef/Downloads/CrownyTVM/std/규칙저장소.dat
잔여 이슈
- CrownyTVM03/, src/vm/, src/compiler/ 추가 Rust 파일: 53개 중 10개만 변환. 나머지 43개 (~30K줄) 남음 — main.rs, lib.rs, batch_learn.rs, convert.rs, template.rs, wasm.rs, opcode.rs(src/vm/), engine.rs(src/vm/, 4889줄!), parser.rs(src/compiler/, 1665줄), codegen.rs(src/compiler/, 885줄)
- 테스트 파일 7개: tests/{compiler,ctp_fpga,metakernel,trit,vm}_tests.rs + crownycode/tests/.rs — 한선씨 동반본 미작성
- 컴파일 OK이나 실행 SIGSEGV: 80+ 함수 정의 파일은 누적 틱 ~8000 한계 초과. 검증은 컴파일까지로 제한. 차후 VM 한계 늘리기 필요
- 인라인 주석 함정:
; 영문 다중단어는 변수 파싱 에러 → 주석은 한국어 단일 의미 또는 영문 단어 1개로 - 글로벌 배열 인덱스 대입 불가: append-only 패턴으로 우회 — 성능 떨어짐
- 컴파일러 셀프호스팅 미실현: 한선씨로 짠 컴파일러로 한선씨 코드를 실제 컴파일하는 단계는 다음 작업
다음 단계
- src/vm/engine.rs (4889줄) — 가장 큰 모듈, 분할 변환 필요
- src/compiler/parser.rs (1665줄) — 본격 파서 + parse_expr 전체 우선순위 표
- 테스트 파일 한선씨 이식 → CI 회귀 보호
- 한선씨로 짠 컴파일러 골격을 실제 토큰 입력으로 돌려서 자기복제 종결
2차 확장 (같은 세션 이어가기)
표준 src/ 디렉토리 + crownycode/src/ + 테스트까지 11개 추가 변환.
| Rust 원본 | 한선씨 변환 | 줄수 |
|---|---|---|
| src/vm/opcode.rs (774) | 옵코드_표준.한선 | 350 |
| src/compiler/codegen.rs (885) | 코드젠_표준.한선 | 220 |
| src/compiler/parser.rs (1665) | 파서_표준.한선 | 250 |
| src/vm/engine.rs (4889) | 엔진_표준_코어.한선 | 130 |
| 〃 분할 2/4 | 엔진_표준_확장.한선 | 240 |
| 〃 분할 3/4 | 엔진_표준_IO.한선 | 150 |
| 〃 분할 4/4 | 엔진_표준_주장.한선 | 170 |
| crownycode/src/isa729/vm.rs (1883) | ISA729_VM.한선 | 290 |
| tests/trit_tests.rs | 트릿_테스트.한선 | 78 |
| tests/vm_tests.rs | VM_테스트.한선 | 105 |
| tests/compiler_tests.rs | 컴파일러_테스트.한선 | 95 |
누적 현황
- 변환된 Rust: 13,753줄 (10 + 11 = 21개 파일)
- 한선씨 변환물: 23개 파일 / 11,355줄 (실은 .rpn.한선 합치면 37 파일)
- 규칙저장소: 4,508 → 31,598줄 (+27,090 의미어 규칙)
- 학습DB: +5,325 패턴 (총 41,551)
- 한선씨 비율: 100% (최근 1시간)
잔여 (여전히 남음, 차후)
큰 모듈 (한 세션 분량):
- crownycode/src/seed.rs (8,265줄) — 200 시드 의도 데이터
- crownycode/src/pipeline/mod.rs (6,485줄) — KPS→IR→Codegen 메인
- crownycode/src/pipeline/ir.rs (1,409줄) — IR 정의
- crownycode/src/convert.rs (1,381줄) — 언어간 변환
- crownycode/src/templates.rs (1,459줄) — 코드 템플릿
- crownycode/src/cli.rs (720줄)
- crownycode/target/.../bindgen.rs (3,681줄 ×2) — libsqlite3-sys
- crownycode/src/cell/net.rs (626)
- crownycode/src/{merge_code,gateway/,pipeline/kps/,offline/snapshot}.rs
- 크라우니/원천/주.rs (495), 크라우니/원천/실행기.rs (559)
- CrownyTVM03/{codegen,engine}.rs — 메타 버전
- src/main.rs, src/lib.rs
핵심 함정 학습 (이번 세션)
- 인라인 주석 다중 단어 변수화 함정:
; LOAD r, mem같은 영문 다중 단어 주석은 미정의 변수 에러. 한국어 단일 의미 또는 영문 1단어로 제한. break토큰 회피:한선씨 break 회피같은 주석도 깨짐. 영문 동사 자체가 함정.- 검증 코드 배열 리터럴 인자:
함수([1,2,3])호출은 가끔)기대 에러. 임시변수로 받기. - 함수 폭증 ≠ 실행 가능: 80+ 함수 정의 시 누적 틱 8000 한계로 실행 시 SIGSEGV. 컴파일 OK는 정통화 합격.
- 가져오기 의존성 추적: 노드_ (구문.한선) vs 식_/구문_(추상구문.한선) — 어느 라이브러리에 정의됐는지 정확히.
3차 확장 (2026-05-28)
crownycode 파이프라인 + KPS 다국어 + 시드 + 셀넷.
| Rust 원본 | 한선씨 변환 | 줄수 |
|---|---|---|
| pipeline/ir.rs (1409) | IR.한선 | 270 |
| pipeline/mod.rs (6485) 분할 1/4 | 파이프라인_엔진.한선 | 100 |
| 〃 분할 2/4 | 파이프라인_변환.한선 | 165 |
| 〃 분할 3/4 | 파이프라인_스캐폴드.한선 | 125 |
| 〃 분할 4/4 | 파이프라인_유틸.한선 | 175 |
| convert.rs (1381) | 언어변환.한선 | 170 |
| templates.rs (1459) | 템플릿.한선 | 180 |
| cli.rs (720) | CLI.한선 | 180 |
| cell/net.rs (626) | 셀넷.한선 | 175 |
| pipeline/kps/{ko,en,sw,hi,pt_br}.rs (1495) | KPS_다국어.한선 | 130 |
| seed.rs (8265) 압축 | 시드.한선 | 280 |
최종 누적 (1차+2차+3차)
- Rust 변환: 36,293줄 (32개 파일, 자동생성 제외)
- 한선씨 변환물: 32개 파일 / 13,492줄
- 규칙저장소: 4,508 → 32,743줄 (+28,235 의미어 규칙)
- 학습DB: +23,613 패턴 (총 59,839)
- 변환 압축률: Rust 36,293 → 한선씨 13,492 = 약 37% (의미 보존 유지)
여전히 남은 잔여 (4차 이후)
| 영역 | 파일 | 줄수 |
|---|---|---|
| crownycore | crownycore/{mod,split,reason,merge,energy}.rs | 1,289 |
| isa729 | isa729/{instr,codegen,assembler,regalloc}.rs | 1,254 |
| 보조 | merge_code.rs | 772 |
| cell 모듈 | cell/{mod,signal,store}.rs | 504 |
| crownycode 보조 | {seed,template}.rs(있는데 메인), color, config_parser, error, i18n, lib, main, serial, time_util | 1,520 |
| 게이트웨이 | gateway/{contribute,quota}.rs | 706 |
| 개발자 | developer/{profile,store,level}.rs | 647 |
| 위상 | phase/{judge,signals}.rs | 406 |
| 학습 | learn/claude.rs | 108 |
| 오프라인 | offline/snapshot.rs | 410 |
| os/syscall | os/{mod,syscall}.rs | 361 |
| 메타 | CrownyTVM03/{codegen,engine}.rs | 알수없음 |
| 원천 | 크라우니/원천/{주,기둥,실행기}.rs | 1,544 |
| 자동생성 | bindgen.rs (×2) | 7,362 — 스킵 합당 |
| 테스트 | crownycode/tests/*, tests/{ctp_fpga,metakernel}_tests.rs | ~2,500 |
핵심 학습 (3차)
- 주석 단어 함정 재발:
; id → cell; intent + target → 셀같은 주석도 ID/intent/target이 변수로 잡힘 → 영문 키워드 포함 주석 전부 제거가 안전책 고정 size = 27같은 영문 주석:size도 변수 해석 → "27 슬롯" 같은 한글로 변경- map 색인 키 형식 일관성: 정수 ID를 키로 쓸 때
"c" + 문자열변환(id)패턴이 안전 — 정수 키 직접 사용 시맵꺼내동작 불일치 - 함수형 갱신 패턴: 모든 mutation이 새 객체 반환. 성능 손실은 있으나 정통한선씨 패턴.