CCP 압축기 Phase10 — 한선씨 TRIT 디코더 완성 (4/4 모드)
개요
크라우니 압축기
.ccp의 순수 한선씨 해제기
src/CCP디코더.한선가 마지막 미지원 모드였던
TRIT(모드3, 엔트로피코딩)를 구현해
4/4 모드 전부(STORE·RLE·LZ·TRIT)를 순수 한선씨로 해제.
이제 크라우니브라우저가 네이티브 ccp 의존 없이 전 모드를 해제할 수 있다.
무엇을 했는지
Subbotin 레인지코더 + 적응 빈도모델(order-0/order-1)을 순수 한선씨로 이식.
TRIT 블록 두 형태 모두 지원:
tflag0(고속, 레벨4-7): order-0 단일스트림 → range_decode → LZ해제
tflag1(최대, 레벨8-9): 2스트림 분리(리터럴 order-0/1 + 제어 order-0) → LZ분할해제
단일블록 + 멀티블록 모두 지원.핵심 돌파 — u32 무손실 정수산술층 (한선씨 VM 함정 극복)
한선씨 VM은 4상균형3진이라 바이트/레인지코더 산술에 부적합. 전용 산술층으로 우회:
- 몫2k(x,k) = floor(x/2^k): POW2 룩업, 무할당 (2^k 제수, 최다 호출)
- 몫(a,b) = 일반 제수: 지수 e + POW2, 배열 무할당 ← 결정타
- 배열식 나눗셈은 심볼당 4회 호출 → VM 배열풀 고갈 →
후속 스트림 디코드가 조용히 깨짐(크래시 아닌 오답). 무할당 전환이 정확성+속도(5분46초→4초) 동시 해결.
- 곱32 = 16비트 분할곱: cum×range≈2^40 > VM정수상한(±2^37)이라 직접곱 오버플로 → 모든 중간값 <2^37
- 비트연산 없음: XOR<2^24 판정 → 상위8비트 동일(몫2k), AND 0xFFFF → 모드2k
- 배열 캡(4095): order-1 256컨텍스트 모델(65792엔트리) → 버퍼 16비트 LE 저장
검증
- order-1 리터럴 · order-0 제어 · LZ분할해제 각각 C 덤프 대조 byte-identical
- 다양성 스윕 24/24 PASS, 오버플로 0
- 4/4 모드 자체검증 주() 전부 PASS (STORE·RLE·LZ·TRIT 단일/멀티블록)
- 네이티브 ccp.c 불변 → 회귀 없음
관련 파일
/Users/ef/crowny-compressor/src/CCP디코더.한선 (해제기, ~7138 cubes)
/Users/ef/crowny-compressor/src/ccp.c (네이티브 본체, 불변)
/Users/ef/CrownyOS/crownyc/hanseonc_high (컴파일러)
잔여 이슈 / 다음
- VM이 131KB order-1 버퍼를 미해제 → 한 프로세스서 대량 블록 연속해제 시 SIGTERM (실사용=파일당1프로세스라 무관, 자체검증은 2블록으로 제한)
- Phase11: 크라우니브라우저 WASM 디코더(crowny-wasm 컴파일) · 한선씨 TRIT 인코더 · x86 SHA-NI/Windows(x86호스트 확보후)