← 목록
한선씨 2026-05-27 10KB 읽기 11분

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변환/
전체: Rust 3,657줄 → 한선씨 3,631줄. 모두 hanseonc_high 컴파일 OK.

무엇을 했는지

  1. 이전 세션 복구: 트릿/토큰 2개만 완료된 상태에서 이어받기
  2. 추상구문(AST): enum Stmt/Expr/BinOp → 정수 상수 함수 + 맵 노드 생성자 패턴 확립
  3. 어휘기(lexer): 문자별 토큰화 + 복합 연산자 처리. 인라인 주석 단어 함정 회피
  4. 구문/파서: 재귀 하강(recursive descent). 파서 상태는 맵, 다중 반환은 {노드, p} 맵
  5. VM 엔진: 스택 기반 인터프리터. 함수형 갱신(맵 새로 만들어 반환) 패턴
  6. VM 핵심: 레지스터 27 + 메모리 729(sparse map). append-only로 배열 갱신 회피
  7. 코드젠: AST → ISA729 바이트코드. emit 헬퍼 + 패치 후처리
  8. 옵코드: ISA729 489개 중 100+개 한선씨 상수 함수로 매핑. 섹터별 정리

패턴 정착

매 파일 정착 후:

  1. libs/Rust변환/에 복사 (어디서든 가져오기 가능)
  2. crownycode-learn.sh add → 학습DB 등록
  3. 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

잔여 이슈

  1. 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줄)
  2. 테스트 파일 7개: tests/{compiler,ctp_fpga,metakernel,trit,vm}_tests.rs + crownycode/tests/.rs — 한선씨 동반본 미작성
  3. 컴파일 OK이나 실행 SIGSEGV: 80+ 함수 정의 파일은 누적 틱 ~8000 한계 초과. 검증은 컴파일까지로 제한. 차후 VM 한계 늘리기 필요
  4. 인라인 주석 함정: ; 영문 다중단어는 변수 파싱 에러 → 주석은 한국어 단일 의미 또는 영문 단어 1개로
  5. 글로벌 배열 인덱스 대입 불가: append-only 패턴으로 우회 — 성능 떨어짐
  6. 컴파일러 셀프호스팅 미실현: 한선씨로 짠 컴파일러로 한선씨 코드를 실제 컴파일하는 단계는 다음 작업

다음 단계

  • 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.rsVM_테스트.한선105
tests/compiler_tests.rs컴파일러_테스트.한선95
2차 추가: Rust ~10,096줄 → 한선씨 2,078줄. 컴파일 모두 OK.

누적 현황

  • 변환된 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
기타 (~30 작은 파일):
  • 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

핵심 함정 학습 (이번 세션)

  1. 인라인 주석 다중 단어 변수화 함정: ; LOAD r, mem 같은 영문 다중 단어 주석은 미정의 변수 에러. 한국어 단일 의미 또는 영문 1단어로 제한.
  2. break 토큰 회피: 한선씨 break 회피 같은 주석도 깨짐. 영문 동사 자체가 함정.
  3. 검증 코드 배열 리터럴 인자: 함수([1,2,3]) 호출은 가끔 ) 기대 에러. 임시변수로 받기.
  4. 함수 폭증 ≠ 실행 가능: 80+ 함수 정의 시 누적 틱 8000 한계로 실행 시 SIGSEGV. 컴파일 OK는 정통화 합격.
  5. 가져오기 의존성 추적: 노드_ (구문.한선) 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
3차 추가: Rust ~22,540줄 → 한선씨 1,950줄. 컴파일 모두 OK.

최종 누적 (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차 이후)

영역파일줄수
crownycorecrownycore/{mod,split,reason,merge,energy}.rs1,289
isa729isa729/{instr,codegen,assembler,regalloc}.rs1,254
보조merge_code.rs772
cell 모듈cell/{mod,signal,store}.rs504
crownycode 보조{seed,template}.rs(있는데 메인), color, config_parser, error, i18n, lib, main, serial, time_util1,520
게이트웨이gateway/{contribute,quota}.rs706
개발자developer/{profile,store,level}.rs647
위상phase/{judge,signals}.rs406
학습learn/claude.rs108
오프라인offline/snapshot.rs410
os/syscallos/{mod,syscall}.rs361
메타CrownyTVM03/{codegen,engine}.rs알수없음
원천크라우니/원천/{주,기둥,실행기}.rs1,544
자동생성bindgen.rs (×2)7,362 — 스킵 합당
테스트crownycode/tests/*, tests/{ctp_fpga,metakernel}_tests.rs~2,500

핵심 학습 (3차)

  1. 주석 단어 함정 재발: ; id → cell ; intent + target → 셀 같은 주석도 ID/intent/target이 변수로 잡힘 → 영문 키워드 포함 주석 전부 제거가 안전책
  2. 고정 size = 27 같은 영문 주석: size도 변수 해석 → "27 슬롯" 같은 한글로 변경
  3. map 색인 키 형식 일관성: 정수 ID를 키로 쓸 때 "c" + 문자열변환(id) 패턴이 안전 — 정수 키 직접 사용 시 맵꺼내 동작 불일치
  4. 함수형 갱신 패턴: 모든 mutation이 새 객체 반환. 성능 손실은 있으나 정통한선씨 패턴.