CrownyVM JIT 기획+검증 (2026-07-02) — C-트랜스파일 JIT
효율검증 (실측, 결정적)
- 제곱합 1000만 루프: 인터프리터 36.30s vs 네이티브 트랜스파일 0.0141s = ~2574배.
- (곱셈 cube_mul shift-add 트릿곱 제거가 커서 격차 큼. 순수산술 상한.)
- 대조: 트릿박싱 1.4x·computed-goto 3% → JIT은 차원이 다름. compute-hot의 진짜 레버.
- 현실치: 실제 혼합루프(배열·함수호출 포함)는 50~500배 예상. 웹/채팅/규칙(I/O·짧음)엔 무효(암달).
메커니즘 검증 (실측)
- 런타임 C생성→
cc -O2 -shared -o x.so x.c→dlopen(RTLD_NOW)→dlsym→네이티브 호출: 정상 작동.
- 컴파일 1회 ~100~300ms(핫함수당, 수백만 호출에 상각). 이후 fnptr 캐시.
설계 (C-트랜스파일 JIT, 풀 트레이스-JIT 아님)
- 핫감지: 함수주소별 호출카운터>임계(1000) → JIT 대상.
- 트랜스파일: opcode열→C. 지역변수(memory[0~9999] 슬롯)=네이티브 long 언박싱, 산술=네이티브(÷,%만 균형3진 헬퍼 baldiv/balmod), 제어=C if/goto/while, 배열=mem_at 헬퍼. 미지원opcode(문자열/IO/TCP/셀/버퍼)=BAIL→비JIT표시 인터프리터.
- 런타임컴파일: .c생성→cc -shared→dlopen→fnptr 캐시(func_addr 키).
- 디스패치: CALL시 JIT fnptr 있으면 네이티브, 없으면 인터프리터+카운트.
- 경계: 진입/이탈서만 큐브↔long 박싱. 비정수(문자열핸들≥20000 등) 가드→BAIL.
- MVP: 안전subset(정수 ADD/SUB/MUL/DIV/MOD/CMP·지역var load/store·조건/루프점프·반환)만. 점진확장.
통합점 (crownyc.c)
- 함수: CALL=rpush(pc);pc=fn. callstack{caller_pc,func_addr,fp}(310,316). worker_execute(3967) 참고.
- 변수: memory[0~9999] 슬롯(mem_count=10000부터 배열힙). fp=프레임포인터.
- 메인루프: precomp 경로 14294+, total_ops_executed 카운터.
- 훅: CALL 지점에 핫카운트+JIT디스패치, 함수경계 opcode범위 트랜스파일.
빌드 계획 (다음, 대형·다단계)
- jit.c 모듈 분리(main 위험↓): 핫카운터+트랜스파일러(safe subset)+dlopen캐시+디스패치 훅.
- 백업+회귀19/19 게이트. 원본 crownyc.c 무변경 유지하며 COPY 빌드.
- 병렬: LLM 지식증강 고도화 에이전트 동시 진행(사장님 지시 "JIT 실행시 LLM 병렬").
【JIT 용량/크기 + 풀트레이스 vs C-트랜스파일 (3진연산)】(07-02)
크기 비교
| C-트랜스파일 | 풀트레이스 |
|---|
| VM바이너리 증가 | +~30KB(트랜스파일러) | +~150~300KB(자체 코드젠백엔드) |
| 런타임의존 | 외부 cc 툴체인(~200MB+) 필요 | 없음(자족) |
| 함수당산출 | .so ~15~30KB(디스크) | 실행메모리 ~수KB(파일없음) |
| 배포성 | cc있는 dev만 | 임베디드/티옴타 가능 |
| 컴파일지연 | ~100~300ms/함수(1회) | ~수십µs/함수(1회) |
- ★총배포용량: 풀트레이스 압도적 작음(자족 200KB vs C툴체인 200MB+). C-트랜스파일은 임베디드 불가.
3진연산 유리성 — HW 의존
- 2진 호스트(현재): 둘 다 2진기계어 에뮬. C-트랜스파일이 성숙한 C옵티마이저로 실용우위. 풀트레이스는 trit-SWAR 손코딩해야 비슷. → 2진선 3진이점 없음.
- ★진짜 3진HW(티옴타): 풀트레이스 결정적 유리. 자체백엔드가 네이티브 트릿명령 직접방출→3진 네이티브. C-트랜스파일은 호스트C(2진int)에 묶여 불가.
JIT 로드맵 2단
- C-트랜스파일(지금): dev에서 2574배 즉시활용, VM+30KB, compute가속.
- 풀트레이스(티옴타 엔드게임): 트릿네이티브 백엔드, 더작고 자족, 3진HW 네이티브. 임베디드 정답.
【배포 제약 → 자족 JIT (울트라씽킹)】(07-02)
- 제약: 크라우니브라우저/메신저=VM내장 CrownyOS전용앱 배포. 200MB 시스템컴파일러 불가 → 시스템-cc C-트랜스파일 배포앱 배제.
- ★핵심: 브라우저/메신저는 JIT 불필요. I/O바운드+무거운계산 이미 C빌트인(CAF/CVF코덱·SHA256·v11사전). 한선씨 로직 I/O바운드→JIT 0%. ⇒ 배포앱=인터프리터+C빌트인만으로 충분, 컴파일러문제 소멸.
- JIT 계층분리: 소비자앱=JIT없음 / 서버·compute=C-트랜스파일(cc있음, 2574배) / 임베디드compute=자족JIT / 티옴타=풀트레이스 트릿네이티브.
- 자족 JIT 3택(cc 불필요): ①★copy-and-patch(빌드타임 opcode 기계어템플릿 ~50~100KB 임베드, 런타임 memcpy+패치, 컴파일러0·자족·준네이티브, CPython3.13 방식, 티옴타 트릿템플릿 확장) ②libtcc(~1MB 인메모리, C-트랜스파일 설계유지) ③풀트레이스 자체백엔드(+200KB, 3진네이티브).
- ★결론: 배포앱 JIT미탑재(작고 자족). JIT빌드는 서버/compute용 C-트랜스파일 계속. 임베디드 필요시 copy-and-patch 50KB. 시스템cc는 배포 절대 미포함.
【JIT 이중병행 준적대검증 종합】(07-02, Workflow wiezpt1sk)
정량(재빌드 실측)
| Track A C-트랜스파일 | Track B copy-and-patch |
|---|
| 배속 | 16.4x | 36.4x |
| 크기 | .so 16776B | 88B |
| 준비 | 59~70ms(cc) | 9µs |
| 자족 | ❌cc필요(Xcode 4.7G) | ✅자족(스텐실임베드,MAP_JIT/W^X) |
| 한계 | 소비자배포불가·TOCTOU·파일난립·셸인젝션 | 단일프로그램 고정블롭·ARM64전용·baldiv음수버그 |
4상 최종결정
- 서버compute(cc): 티→Track A. 소비자앱: Track B(범용화후)/그전 순수인터프리터. 임베디드: libtcc(~100KB). 티옴타3진HW: 음(상위이관, ISA729 직결코드젠 별도트랙).
병행도구=CrownyJIT 단일IR/듀얼백엔드
toau bytecode SSOT+baldiv IR → 4상분별 백엔드자동선택(A서버/B앱/libtcc임베). 삼중구현 드리프트제거(B오답 근본원인). 손익분기게이팅(A~50k·B~수백). differential harness 상설(부팅self-test).
재최적화5: 1.B baldiv 부호안전화(음수PASS전 통합금지) 2.0나눗셈·sp경계 가드(IR divisor==0트랩) 3.A TOCTOU·파일난립·셸인젝션 하드닝 4.B스텐실 88B→60B 5.differential harness 표준게이트.
다음: 별도모듈 crownyc_jit.c, crownyc.c 훅1점. 우선순위 B정확성수정(즉시)→A서버통합(단기)→B범용화+스텐실자동생성기(중기)→소비자통합(후). 원본 crownyc.c 무수정.
★준적대검증이 실버그 사전검출: B음수·A인젝션·"200MB"→실측 Xcode 4.7G 사실오류. kps 검증방식 검증력 실증.
【CrownyJIT 재최적화 5종 완료】(07-02, 에이전트 ae1a792d)
- 1.★B baldiv 부호안전화: branchless sign-safe(|r|·|b| shift마스크, 부호delta), 음수4케이스 bit-identical → B통합게이트 OPEN.
- 2.0나눗셈·sp가드: baldiv(x,0)=0 defined contract(x86 SIGFPE 이식대비), 스택 경계검사.
- 3.A하드닝: 고유임시명(pid+atomic)·O_CREAT|O_EXCL|O_NOFOLLOW|O_CLOEXEC·posix_spawn 절대/usr/bin/cc(셸우회)·unlink. 동시2회 충돌0·잔존0.
- 4.B스텐선 최소화: 88B/22instr→60B/15instr(dead 콜리세이브 제거, x0 직접누산). 62x 유지.
- 5.★differential harness: 3자 REF/A/B 0불일치 GATE PASS. 구버그 10불일치 자동검출(통합 자동차단 능력 실증). 부팅 self-test 게이트 상설.
- 산출(scratchpad): jitB2.c·jitA2.c·harness3.c·enc_probe.s. 원본 crownyc.c 무수정.
- ★B 통합 허용(음수PASS+게이트PASS). 다음: crownyc_jit.c 별도모듈+crownyc.c 훅1점, 우선순위 B✅→A서버통합→B범용화(스텐실자동생성+hole-finding)→소비자통합. 회귀19/19+harness 게이트.
【CrownyJIT crownyc.c 통합 v0 완료】(07-02, 메인세션 직접)
- crownyc_jit.c 신규모듈 원본 crownyc.c 통합(훅3점: crowny_tls.c뒤 #include·CALL 6937 cj_note_call·main cj_init).
- ★안전설계: opt-in(env CROWNY_JIT), 부팅 differential self-test 게이트(baldiv 부호안전+고정커널 트랜스파일=참조 bit-identical, 실패시 JIT 자동비활성), 핫디스패치 v0=BAIL(인터프리터 유지). 재최적화5종 반영(posix_spawn·O_EXCL·고유명·unlink·0가드·부호안전 baldiv·differential).
- 검증: 원본 crownyc 재빌드 최종회귀 19/19 PASS(JIT OFF·ON 동일), self-test PASS(JIT 기계장치 VM내 실증). 표본6/6 base=OFF=ON 동일.
- 백업: crownyc.c.bak-20260702-002649·crownyc.c.bak-jit-·crownyc.c.bak-tritbox. 원본 무손상 승격.
- 다음 증분: 실제 함수 opcode 트랜스파일+핫디스패치(precomp[fn..ret]→C, safe subset), 그다음 A서버 손익분기게이팅→B범용화(스텐실자동생성)→소비자(copy-and-patch).
【fable대체 P3 검증루프 완료】(07-02, 에이전트)
- libs/검증루프.한선 20/20 PASS·GATE PASS. 오라클4종 인라인이식(top-level 데모 재실행 차단).
- 4도메인(목표분해/진척/경영제약/온톨로지) 전부: 단일패스 타(거부)→복합수렴 티(통과), 수렴스텝3. 물성 상회 실증.
- 5동작: 오라클라우팅·복합루프(4상)·음게이트(범위밖 기권)·자기검증(교차→불일치시 안전측 타채택+음검토)·감사추적·결정론(2회 동일).
【JIT 측정 + LuaJIT 비교】(07-02, 실측)
커널: sum baldiv(ii,7), 10M회.
| 시간 | vs인터프리터 | vs LuaJIT |
|---|
| CrownyVM 인터프리터 | 35.93s | 1x | 766x느림 |
| LuaJIT trace JIT | 0.0469s | 766x | 1x |
| CrownyJIT 네이티브(cc -O2) | 0.0188s | 1911x | 2.5x빠름 |
- ★CrownyJIT 산출물 LuaJIT보다 2.5배 빠름(cc -O2가 직선루프 강최적화, LuaJIT double 오버헤드).
- 단서: LuaJIT double 오버플로(타이밍만유효)/CrownyJIT int64 정확. 준비지연 CrownyJIT 70ms(C-트랜스파일) vs LuaJIT µs → copy-and-patch 9µs로 격차좁힘. v0는 self-test검증(핫디스패치 미배선), 0.0188s=JIT산출물속도.
- 결론: 정상처리량 CrownyJIT≥LuaJIT(둘다네이티브 cc근소우위). 남은건 준비지연(copy-patch)+핫디스패치배선(다음증분). luajit 설치 /opt/homebrew/bin/luajit 2.1.