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/889 | 470~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건
검증
/private/tmp/키워드정합/에서 두 컴파일러 + crownyc VM 전부 재빌드 성공.
- 기존 대표
.한선 3본(고수준: libs/문자열.한선, libs/JSON.한선, libs/날짜.한선) 신구 컴파일러 toau byte-identical — 회귀 없음.
- RPN 대표 3본(libs/2단계인증.rpn.한선, pkg/libs/전역검색.rpn.한선, pkg/libs/기밀컴퓨팅.rpn.한선) 신구 컴파일러 toau byte-identical — 회귀 없음.
- 신규 수정 키워드(뮤텍스잠금/해제, 큐브생성, 타입검사, 벡터내적, 음초기화 등) RPN 스모크 컴파일+실행 정상(VM 크래시 없음).
- 저장/불러 별칭 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에서만 확인, 라이브 교체 안 함).
잔여 이슈
- 저장/불러(STORE/LOAD) 호출 인자 순서 문제:
저장(주소, 값)처럼 호출해도 VM이 기대하는 pop 순서(주소가 top)와 파서의 좌→우 push 순서가 맞물리지 않아 실제로는 값↔주소가 뒤바뀐 채 저장됨. 메모리쓰기/메모리읽기에도 동일하게 존재하던 기존 결함이라 이번 티켓 범위 밖으로 판단, 별도 티켓 필요.
- std.asm(레거시) 자체의 6개 편차는 문서화만 하고 미수정 — std.asm 자체가 방치 대상인지 정본 재검토 필요.
키워드대조.pl ②번 결과(std.asm에 20개 핵심 키워드 인식기 자체가 없음: 같다/더해/만약 등)는 T137 범위 밖(별도 T번호로 분리 권고).