← 목록
기타 2026-07-07 5KB 읽기 5분

ISA729 스펙 역생성기 구축

개요

크라우니 4상균형3진 기계어(TOAU/ISA729)의 공개 릴리즈를 앞두고, 기존 문서 (ISA729_FINAL.md, ISA729_QUICK_REF.md)가 실구현(crownyc.c)과 충돌/구식임이 감사에서 드러났다. 유일하게 신뢰 가능한 원천인 crownyc.c의 exec_opcode() switch(op) 실제 구현에서 스펙을 역생성하는 도구를 만들었다.

무엇을 했는지

  1. crownyc.c(18,014줄) 분석: exec_opcode()는 5199~16224줄, 내부에 중첩
switch가 다수 존재해(양자모드 스위치 등) 단순 grep "case N:"으로는 안전하지 않음을 확인. 브레이스 깊이 + switch 중첩 카운트를 추적해 depth==1인 case만 실제 opcode로 인정하는 파서를 작성.
  1. 주석/문자열 리터럴을 먼저 블랭크 처리(위치 보존)한 뒤 스캔 — 주석 안에
있던 "case 567: → 6853줄에서 구현" 같은 텍스트가 실제 case로 오인식되는 버그를 잡아냄.
  1. opcode_name()(영문, 4938~5091줄)과 opcode_name_kr()(한글,
4774~4936줄)에서 case N: return "X"; 매핑 추출.
  1. 6-trit 인코딩은 TOAU_ENCODING.md의 고정표(AA=0..TT=8, 균형삼진 아님)
기준으로 계산: sector*81+group*9+command, 0~728만 유효, 729+는 "확장영역"으로 표기.
  1. 기존 ISA729_QUICK_REF.md 표를 파싱해 번호 충돌을 검출.

핵심 발견 (실측)

  • 구현 opcode 총수: 924 (switch(op) depth==1 실제 case, 표 행수와 일치 확인)
  • 이름 미매핑(영문+한글 모두 없음): 567건 (924건 중 61% — opcode_name()
이 ~315개, opcode_name_kr()이 ~367개만 커버)
  • QUICK_REF 충돌: 38건 — 대표 사례:
  • 694번: QUICK_REF="VERSION" ↔ 실구현="SQL_WHERE" (과제 배경에서 지목된
  • 바로 그 충돌, 실측 확인됨. crownyc.c:15139 인라인 코멘트로 확인)
  • 9번: QUICK_REF="PUSH_NONE" ↔ 실구현="ROT"
  • 90~95번: QUICK_REF="BIT_AND/OR/XOR/NOT/SHL/SHR" ↔ 실구현="TRIT_AND/OR/XOR/NOT/TSHL/TSHR"
  • 245번: QUICK_REF="IF3" ↔ 실구현="JMPIFN"
  • 712/713번: QUICK_REF="TRIT_ENCODE/DECODE" ↔ 실구현="TRIT_ENC/DEC"
  • 확장영역(729 이상): 195건 (최대 945까지 구현됨, QUICK_REF는 728까지만
  • 기술)
    • 플랫폼 분기 변형: 20건 — opcode 760~779가 #ifndef _WIN32(실제 구현:
    PROC_FORK 등 시스템콜)/#else(Windows stub: 전부 A 반환) 두 곳에 등장. 첫 등장(비-Windows 실구현)을 대표값으로 채택.

    산출 파일

    • /Users/ef/CrownyOS/crownyc/tools/isa729_spec_gen.sh — bash 래퍼(실행 진입점)
    • /Users/ef/CrownyOS/crownyc/tools/isa729_spec_gen.pl — 실제 파싱/생성 로직(perl)
    • /Users/ef/CrownyOS/crownyc/tools/isa729_스펙생성.한선 — 한선씨 동반본
    (6-trit 인코딩 공식 + 버퍼파일읽기(opcode874) 기반 소규모 샘플 case-스캐너, compile+run 검증 완료)
    • /Users/ef/CrownyOS/docs/ISA729_IMPL.md — 역생성된 전체 스펙 문서
    (924행 표 + ①이름미매핑 ②QUICK_REF충돌 ③확장영역 ④플랫폼분기 목록)

    검증

    • 표 행수(924) == 실제 case 수(924) 일치 확인 (awk 카운트 교차)
    • opcode 0/81/162/243/324/405/486/567/696/890/945 등 10개 이상 샘플을
    crownyc.c 소스줄 직접 grep으로 교차검증 — 전부 일치
    • 694번이 SQL_WHERE로 나오는지 확인 — 확인됨 (QUICK_REF 충돌 ②에도 반영)
    • 한선씨 동반본: hanseonc_high 컴파일 성공, crownyc 실행 성공. 6-trit
    인코딩 자기검증(10개 opcode)이 perl 도구 출력과 100% 일치. 소규모 샘플 스캔(crownyc.c byte 202000~216000, opcode_name_kr() 구간)에서 "case " 토큰 397개 발견 — python3 바이트 카운트(397)와 정확히 일치

    함정 노트 (한선씨 개발 중 실측)

    • ; 코드 뒤 인라인 주석(세미콜론)이 콤마/식별자를 포함하면 파서가
    콤마를 별도 토큰으로 오인해 컴파일 에러 발생 — 세미콜론 주석은 반드시 독립된 줄에 둘 것 (코드 뒤에 붙이지 말 것)
    • 균형3진 자연반올림 나눗셈("/","%")은 floor semantics와 다를 수 있어
    (기존 학습DB의 fn_merge_isa_인덱스2트릿 패턴이 TOAU_ENCODING.md 고정표와 idx=1 등에서 불일치 — 별도 용도였을 가능성). 이 작업에서는 바닥나눗셈/바닥나머지를 자연나눗셈+보정으로 직접 구현해 사용

    크라우니코드 보고

    lookup HIT 2건(번호6트릿/인덱스2트릿 — 단, 인덱스2트릿은 이 스펙표 용도와 불일치 확인되어 미사용) / MISS 다수(perl 기반 스위치-깊이 추적 파서는 신규) / learn 4건 (인덱스2트릿_TOAU고정표, 번호6트릿_표시용_sector우선, 바닥나눗셈_나머지_비음수보정, 버퍼파일읽기_case토큰스캔)

    잔여 이슈

    • ISA729_FINAL.md(원본 위치 /Users/ef/CrownyOS/ISA729_FINAL.md)는 이번
    작업 범위에서 손대지 않음(기존 파일 수정 금지 규칙) — 필요 시 별도 작업으로 ISA729_IMPL.md를 정본으로 삼아 갱신 검토
    • 확장영역(729~945) 195건 중 상당수가 이름 미매핑 상태 — 양자/다항곱 관련
    최근 추가분으로 추정, 별도 네이밍 작업 필요
    • 코멘트 컬럼은 case 라인과 같은 줄의 /* ... */만 추출 — 여러 줄에 걸친
    코멘트(예: 945번)는 공란으로 남음 (표의 정확성에는 영향 없음, 설명 텍스트만 일부 누락)