승인 · 단계 · 문서
13. 결정 사항 — 승인 대기
| 번호 | 결정 | 어디에 |
|---|---|---|
| ① | 두 모드 — LuaJIT 2.1(FFI 백엔드)과 순수 5.3+. 순수 5.1·5.2는 제외 | 2절 — 소비 환경 조사(언리얼 임베드 LuaJIT 2.1.0-beta3)가 처음 권고 「5.3+만」을 뒤집었습니다 |
| ② | 암호·해시·체크섬 전부 C 모듈, 모듈 없이 평문은 읽힘(지연 require) | 3절 |
| ③ | C 모듈은 함수 4개, C 런타임에서 이식, 자족 단일 소스 | 4절 |
| ④ | 컬럼 디코드는 순수 Lua, 계측 후 재평가 | 5절 |
| ⑤ | 배열 1-기반, 옵셔널은 nil이 아니라 has 이웃 | 6절 |
| ⑥ | 예약어 이름 유지 — 대괄호 문자열 키 | 7절 |
| ⑦ | uuid는 정규형 문자열 | 8절 |
| ⑧ | 하네스는 벤더한 Lua 소스로 임베더를 빌드 | 12절 |
| ⑨ | 없는 키는 오류 — 타입당 공유 엄격 메타테이블 + 생성 파일의 LuaLS 주석 | 6절 |
구현하면서 갈라진 곳 — 3개
| 처음 적은 것 | 구현 | 왜 |
|---|---|---|
| C 모듈 함수 3개 | 4개 — sleepMs가 늘었습니다 | 업데이터를 옮기면서 Lua에 sleep이 없다는 사실이 드러났고, 바쁜 대기가 대안이었습니다 |
| int64 키 인덱스는 정렬 배열 + 이진 탐색 | 십진 문자열 키 해시 | 같은 성질(두 모드 공통·무손실)을 더 적은 코드로 줍니다. findBy… 안에서 정규화되므로 호출자는 모릅니다 |
rockspec (WriteManifest) | 내지 않습니다 | 첫 소비자가 엔진 임베드 쪽이고, 소스 통합에서 매니페스트는 방해입니다. 필요해지면 9절이 다시 정합니다 |
그리고 하나가 설계 그대로이되 결과에 이름을 남길 만합니다 — 참조 배열의 값 리스트는
구멍을 가질 수 있습니다. Lua 테이블은 nil을 담지 못하므로 해석되지 않은 원소는 없는
원소이고, 원소 수는 언제나 키 리스트(…Index)의 것입니다. serial-ref 게이트와 언어
가이드가 그 계약을 들고 있습니다.
14. 단계
| 단계 | 무엇 | 상태 |
|---|---|---|
| 0 | 스펙 확정 — 13절의 9개, 특히 ① | 됨. ①은 소비 환경 조사로 확정 |
| 1 | 리더 — 헤더·인코딩 14종·presence 둘·uuid, 그리고 2절의 백엔드 2개 | 됨. 생성기 전에 손 드라이버로 적합성 코퍼스와 optional을 두 모드에서 읽어 확인 — 두 모드의 출력이 바이트 단위로 같고, 이 코퍼스 하나가 인코딩 14종을 전부 밟습니다 |
| 2 | C 모듈 — tb_open·MD5 이식과 바인딩 | 됨. 서명된 코퍼스의 MAC 검증, 변조·벗기기 거부, 봉인 파일 복호·keyCheck·재호출 통과, 다른 키 거부, MD5는 RFC 1321 벡터 7개 — 두 런타임에서. MSVC /W4 /WX 통과 |
| 3 | 하네스 기반 — Lua 5.4.8 소스 벤더, 임베더, LuaToolchain | 됨. 호스트는 스위트가 한 번 빌드해 재사용하고, 소스가 더 새로우면 다시 빌드합니다 |
| 4 | 생성기·뷰·템플릿 5개·LanguageProfile.Lua(15번째) | 됨. 생성기 약 990줄·뷰 약 300줄·템플릿 5개 |
| 5 | 게이트 — 픽스처 recipe 11개에 타깃 추가, 12절의 아홉 | 됨. 읽기 게이트 10개(중첩·옵셔널·예약어·키 타입 포함)가 전부 값 대조입니다 |
| 6 | 업데이터와 그 게이트 | 됨. 실제 HTTP 서버 상대 4개 — 바뀐 것만 받기·손상 거부·재시도·404 무재시도. 게이트의 fetch는 curl이고, 그것은 계약의 예시이지 업데이터의 일부가 아닙니다 |
| 7 | 문서 — doc/languages/lua.md·side-by-side 항목·doc/dependencies.md 한 줄 | 됨 |
| 8 | 마무리 — 골든 재기록 → 비교본 재생성 → 샘플 재생성 → 기록 없이 재검증, 로드맵 항목 | 진행 중 |
15. 문서 — C 컴파일러를 요구하는 첫 번째 언어 가이드
doc/languages/lua.md에 들어가는 것은 다른 14개와 같지만, 의존성 절이 Swift보다 한 발 더
갑니다 — 패키지 매니저가 아니라 컴파일 절차를 안내해야 합니다.
| 절 | 내용 |
|---|---|
| 왜 C 모듈인가 | 3절의 근거. 안 빌드하면 무엇이 안 되는지(암호화·MAC·업데이터)까지 |
| 경로 ① 게임 엔진 임베드 | tabbit_native.c를 빌드에 넣고 등록 몇 줄 — 5.2+와 LuaJIT(5.1 API)의 등록이 달라서 둘 다 적습니다. 하네스의 임베더가 그대로 예시입니다 |
| 경로 ② 독립 인터프리터 | gcc·cl 각 한 줄로 .so/.dll을 만들어 package.cpath에 |
| 경로 ③ 빌드 없이 | 평문 파일만 — 무엇을 포기하는지 |
| 업데이터 | fetch 계약 — URL을 받아 본문, 또는 nil·메시지·재시도 여부 를 돌려주는 함수 |
| 주의사항 | 1-기반 배열의 한 칸, has 이웃 키, cdata의 LL 접미사, 참조 배열의 길이는 키 목록에서 |
doc/dependencies.md의 「생성된 코드의 의존」 표에는 한 줄이 들어갑니다 — 의존이 패키지가
아니라 동봉된 C 소스라는 점에서 Swift의 swift-crypto 줄과 형태가 다르고, 그 차이가
표에 남아야 합니다.
EOD