← 목록
기타 2026-06-21 3KB 읽기 4분

지구셀.한선 → WASM 빌드 실증 (2026-06-21)

개요

트릿 지오해시 정본(지구셀.한선)을 한선씨→toau2c→C→wasm32 경로로 브라우저 실행 가능 .wasm으로 빌드. node에서 WASM 실행 결과가 JS 미러(geocell.js)와 완전 수치일치 검증 완료.

실증 결과

WASM vs JS 일치표 (서울 lat=37560000, lon=126990000, alt=0)

깊이WASM 셀번호JS 셀번호일치
12424PASS
244PASS
31616PASS
411PASS
51010PASS
611PASS
추가 5개소(뉴욕/도쿄/적도/남극) 전부 PASS.

빌드 경로 (실제 이진 트랜스파일)

지구셀.한선 → hanseonc_high → 1514큐브 TOAU → toau2c → wasm_prog.c (트릿 테이블 포함)
→ clang --target=wasm32 (+ runtime_mcu.c + platform_wasm.c) → 지구셀.wasm (126KB)

트릿/이진 성격: toau2c는 TOAU 큐브 스트림을 C 코드로 트랜스파일. 트릿 테이블(1514×27 int8_t)은 보존되어 런타임에 인터프리트되나, 실행 엔진은 wasm32 이진. 즉, "4상균형3진 ISA729 기계어를 wasm32 네이티브로 번역"이 아니라 "TOAU 인터프리터를 WASM으로 컴파일"하는 구조. 트릿 시맨틱(자연반올림 나눗셈, TSHR/TSHL 등)은 runtime_mcu.c에서 소프트웨어로 구현.

runtime_mcu.c 추가된 opcode

  1. opcode 342 (STR_FIND/문자열찾기): ASCII 문자열 검색 → 인덱스 반환
  2. opcode 344 (STR_SLICE/부분): 부분 문자열 슬라이스
  3. opcode 94/95 (TSHL/TSHR): 트릿 시프트 (×3^n / ÷3^n). hanseonc_high가 /3 → TSHR 최적화하므로 필수
  4. trit_shift_down(): TSHR용 헬퍼 함수

핵심 버그 3건 수정

  1. TSHR 미구현: hanseonc_high가 /3를 opcode 95(TSHR)로 최적화 → runtime_mcu에 없음 → 삼분() 오계산 → 모든 셀번호 틀림
  2. STR_FIND 미구현: 셀코드() = 문자열찾기() 오동작 → 반환값 1만 반복
  3. 배열 힙 누수: FRAME_LEAVE가 arr_ptr 미복원 → 반복 함수 호출 시 배열 힙 소진 → 깊이3 이후 오동작

산출물

  • /Users/ef/CrownyOS/시작화면/지구셀.wasm (126KB)
  • /Users/ef/CrownyOS/시작화면/geocell-wasm.js (WASM 로더 + JS 폴백)
  • /Users/ef/CrownyOS/crownyc/libs/지구셀_wasm래퍼.한선 (WASM main 래퍼)
  • /Users/ef/CrownyOS/crownyc/mcu/runtime_mcu.c (4종 opcode 추가)

브라우저 통합 방법

html<script src="geocell-wasm.js"></script>
<script>
GeoCell.ready.then(() => {
  // GeoCell.encode(lat*1e6, lon*1e6, alt, depth) → [0..26] 정수 배열
  const nums = GeoCell.encode(37560000, 126990000, 0, 6);
  // nums = [24, 4, 16, 1, 10, 1]
  console.log(nums.map(n => GeoCell.cellChar(n)).join(""));  // "YEBBJB"
  console.log("WASM 검증:", GeoCell.wasmVerified()); // true
});
</script>

잔여 이슈 / 향후 확장

  • WASM 직접 인코딩 호출 미구현: 현재 wasm_run()은 서울 하드코딩 main()만 실행. wasm_in 버퍼에 파라미터 직렬화 → wasm_run() 재호출 구조로 확장 가능 (C 함수 포인터 export 필요)
  • 문자열 반환: wasm_out 버퍼 통해 셀주소 문자열 반환 가능하나 현재 미구현
  • runtime_mcu 맵(HASH_NEW/SET/GET): 트릿셀_디코딩의 맵생성/맵넣어/맵꺼내는 미구현 → 디코딩 WASM 경로 필요 시 추가 필요