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

hanseonc_rpn.c vs hanseonc_high.c opcode 정합 (T137)

개요

집사회 티켓 T137: tools/키워드대조.pl이 보고한 24건 "opcode불일치"를 crownyc.c(VM 정본) opcode 테이블과 대조해 판정·수정. hanseonc_rpn.c와 hanseonc_high.c의 실제 상호 충돌(24건 중 16건)만 실질 수리 대상이며, 나머지는 std.asm(레거시) 쪽만의 편차이거나 이미 죽은 코드였음.

판정표

키워드VM 정본(crownyc.c)수정 전 rpn.c수정 전 high.c판정/조치
로그아웃502(AUTH_LOGOUT)507(FIREWALL_RULE, 오류)502(정본)rpn.c 507→502 수정
뮤텍스잠금547(MUTEX lock)548(UNLOCK, 오류)547(정본)rpn.c 548→547 수정
뮤텍스해제548(MUTEX_UNLOCK)549(CLASS, 오류)548(정본)rpn.c 549→548 수정
벡터내적146(VEC_DOT)146(정본)146(정본, 위쪽 항목) + 466(死코드 중복 별항목)high.c 466행 죽은 중복을 "삼진벡터내적"로 개명해 혼선 제거(런타임엔 영향 없었음 — find_builtin은 첫 매치라 146이 이미 승리)
음초기화·음샘플·음재생·음저장·음톤·음계·음해제·음길이·음레이트·음믹스 (음계열9+1=10건)400/883/881/882/884/885/886/887/888/889470~479(HDL opcode 범위, 전부 오류)전부 정본(2026-07-09 이전 수정 이력 존재)rpn.c 10건 전부 정본값으로 수정
큐브생성624(CUBE_NEW)751(HASH_HAS, 오류)624(정본)rpn.c 751→624 수정 (751은 이미 "맵있나" 키워드가 별도 점유 중이라 충돌 없음 확인)
타입검사632(TYPECHECK)482(NARROW, 오류)632(정본)rpn.c 482→632 수정
글자·꺼내·출력값·파일쓰기·파일읽기·파일추가각각rpn=high 일치rpn=high 일치std.asm 레거시만 편차 — RPN/HIGH 상호 충돌 아님, 문서화만(std.asm은 방치 대상, 수정 범위 밖)
저장·불러7(STORE)/8(LOAD)7/8(정본)키워드 테이블에 아예 없음(컴파일 실패)high.c에 별칭 추가(메모리쓰기/메모리읽기와 동일 opcode·arity로 등록)

무해한 차이(별칭류) — 문서화만, 수정 안 함

  • 글자(327→343 std편차)/꺼내(8→407 std편차)/출력값(345→324 std편차)/파일쓰기,읽기,추가(std 60x대 vs 620대 편차)
→ 이 6건은 rpn.c=high.c로 이미 일치하고 있어 "hanseonc_rpn.c vs hanseonc_high.c" 정합 범위 밖. std.asm(레거시 RPN 어셈블러)만의 편차이며 std.asm은 현재 hanseonc_std 경로가 아닌 방치 상태.

수정 파일

  • /Users/ef/CrownyOS/crownyc/hanseonc_rpn.c — 12개소 opcode 수정 (뮤텍스2 + 로그아웃 + 음계열10 + 큐브생성 + 타입검사)
  • /Users/ef/CrownyOS/crownyc/hanseonc_high.c — 저장/불러 별칭 2건 추가, 벡터내적 死코드 중복 개명 1건

검증

  1. /private/tmp/키워드정합/에서 두 컴파일러 + crownyc VM 전부 재빌드 성공.
  2. 기존 대표 .한선 3본(고수준: libs/문자열.한선, libs/JSON.한선, libs/날짜.한선) 신구 컴파일러 toau byte-identical — 회귀 없음.
  3. RPN 대표 3본(libs/2단계인증.rpn.한선, pkg/libs/전역검색.rpn.한선, pkg/libs/기밀컴퓨팅.rpn.한선) 신구 컴파일러 toau byte-identical — 회귀 없음.
  4. 신규 수정 키워드(뮤텍스잠금/해제, 큐브생성, 타입검사, 벡터내적, 음초기화 등) RPN 스모크 컴파일+실행 정상(VM 크래시 없음).
  5. 저장/불러 별칭 high.c 스모크: 메모리쓰기/메모리읽기(기존)과 저장/불러(신규 별칭) 호출 시 동일 toau opcode·동일 실행결과 — 파라미터 순서 관련 별도 이슈(호출 인자 push 순서와 STORE의 pop 순서 어긋남)는 기존에도 존재하던 것으로 이번 opcode 정합 범위 밖(별도 이슈로 남김, 아래 잔여 이슈 참조).

라이브 바이너리 교체

  • 회귀 완전 통과 확인 후 /Users/ef/CrownyOS/crownyc/hanseonc_high, hanseonc_rpn 교체 완료.
  • 백업: /private/tmp/키워드정합/백업/hanseonc_{high,rpn}.live_backup_20260731 (세션 종료 시 /tmp 휘발 가능 — 영구 보관 필요시 별도 이관 요망)
  • crownyc.c(VM)은 정본 확인용으로만 사용, 수정하지 않음(빌드도 /tmp에서만 확인, 라이브 교체 안 함).

잔여 이슈

  1. 저장/불러(STORE/LOAD) 호출 인자 순서 문제: 저장(주소, 값)처럼 호출해도 VM이 기대하는 pop 순서(주소가 top)와 파서의 좌→우 push 순서가 맞물리지 않아 실제로는 값↔주소가 뒤바뀐 채 저장됨. 메모리쓰기/메모리읽기에도 동일하게 존재하던 기존 결함이라 이번 티켓 범위 밖으로 판단, 별도 티켓 필요.
  2. std.asm(레거시) 자체의 6개 편차는 문서화만 하고 미수정 — std.asm 자체가 방치 대상인지 정본 재검토 필요.
  3. 키워드대조.pl ②번 결과(std.asm에 20개 핵심 키워드 인식기 자체가 없음: 같다/더해/만약 등)는 T137 범위 밖(별도 T번호로 분리 권고).