aboutsummaryrefslogtreecommitdiffstats
path: root/docs/research/005-foundation-contract.md
diff options
context:
space:
mode:
authoreunhhu <[email protected]>2026-09-24 17:14:54 +0100
committereunhhu <[email protected]>2026-09-24 17:14:54 +0100
commitb1ce1927022d374198441afafeb27199fc8a052a (patch)
tree6021f175f4c67ed03b44240eaa2f90d846f12f6f /docs/research/005-foundation-contract.md
parentd34f9426d5317a1948f12f229439946728bc342a (diff)
downloadpure-b1ce1927022d374198441afafeb27199fc8a052a.tar.gz
pure-b1ce1927022d374198441afafeb27199fc8a052a.zip
Establish native micro runtime checkpoint
Diffstat (limited to 'docs/research/005-foundation-contract.md')
-rw-r--r--docs/research/005-foundation-contract.md139
1 files changed, 139 insertions, 0 deletions
diff --git a/docs/research/005-foundation-contract.md b/docs/research/005-foundation-contract.md
new file mode 100644
index 0000000..842b732
--- /dev/null
+++ b/docs/research/005-foundation-contract.md
@@ -0,0 +1,139 @@
+# Pure 연구 보고서 005: 연산·수명·모듈 경계
+
+작성일: 2026-09-22
+상태: **설계 초안과 데이터 레이아웃의 제한된 컴파일 검사 완료**.
+버퍼 런타임·모듈 로더·포맷 지원·새 컴파일러가 구현됐다는 뜻은 아니다.
+
+## 이번에 정한 것
+
+사용자는 현재 문법이 매력적이고 기본 사용에 걸림돌이 없었다고 평가했다.
+동시에 현재 결과는 평범한 작은 DSL로 보이며 실제 서비스·앱·CLI 개발을 통해 가치를 확인해야 한다고 했다.
+이 피드백을 특정 사용자의 현재 경험으로 기록한다. 대규모 개발 생산성이나 독창성 검증으로 확대하지 않는다.
+
+그다음 합의는 **연산 의미 → 데이터 수명·소유권 → 모듈 계약**을 먼저 명세하는 것이다.
+커널 우회는 실제 입출력 병목이 확인될 때 별도 백엔드로 검토한다.
+압축·암호화·문서·미디어·OS를 다루려는 장기 목표도 기록했다.
+각 분야를 실제 지원하거나 새로운 알고리즘을 만드는 일은 별도의 구현·검증 범위를 갖는다.
+
+이번 산출물:
+
+| 문서 | 정한 경계 |
+|---|---|
+| [연산 의미](../design/001-operation-semantics.md) | 숫자 계산, 관리 상태 확정, 버퍼 변환, 외부 효과의 실패 범위 |
+| [메모리·수명](../design/002-memory-lifetime.md) | 예산, 버퍼 소유자·대여, 비동기 완료·취소·반납 |
+| [모듈 계약](../design/003-module-contract.md) | 프로파일·버전·진행 결과, 네이티브 호출과 영속 형식의 구분 |
+| [C17 레코드 초안](../design/abi-v0.h) | 핸들·구간·스트림 결과·한도 정보의 필드 폭과 크기 |
+
+제작 화면의 문법·동작은 이번 작업에서 바꾸지 않았다. 새 데모를 조작해 평가할 과제도 없다.
+현재 사용성 피드백을 유지하면서 다음 실제 앱이 요구할 기반을 명확히 하는 단계다.
+
+## 가장 중요한 세 가지 결정
+
+**첫째, 취소 요청과 버퍼 반납은 다르다.**
+파일·네트워크·장치 작업은 취소 요청 뒤에도 접근이 남을 수 있다.
+접수된 작업의 대여는 최종 완료를 회수할 때까지 유지한다. 동기 백엔드도 같은 요청 계약을 사용한다.
+libuv 역시 요청 관련 메모리를 완료 콜백 전에 해제하지 않도록 요구한다.
+이 자료를 일반적인 수명 계약의 근거로 사용했고 libuv를 실제 의존성으로 추가하지는 않았다.
+[libuv 요청 계약](https://docs.libuv.org/en/v1.x/request.html#c.uv_cancel)
+
+**둘째, 입력 소비·유효 출력·스트림 종료를 따로 센다.**
+압축 해제는 입력을 다 읽은 뒤에도 출력과 종료 처리가 남을 수 있다.
+첫 바이트 프로파일은 `consumed`, `produced`, `status`를 따로 반환한다.
+코덱의 내부 윈도·문맥도 예산에 포함해야 하므로 외부 버퍼 크기만으로 전체 메모리를 판단하지 않는다.
+근거로 읽은 Zstd 매뉴얼은 1.5.1이며 최신 라이브러리 버전 추천은 아니다.
+[Zstandard 매뉴얼](https://facebook.github.io/zstd/zstd_manual.html)
+
+**셋째, 물리적으로 쓴 바이트와 사용 가능한 데이터는 다르다.**
+첫 출력 프로파일은 유효 길이 0인 별도 버퍼에 쓰고, 완료 회수 시 검증된 접두부만 공개한다.
+인증 복호화는 해당 인증 단위가 성공한 뒤에만 평문을 유효 출력으로 전달한다.
+이것은 검증된 암호 라이브러리의 계약을 보존할 조건이며 자체 암호 알고리즘 제안이 아니다.
+[libsodium 인증 암호화](https://doc.libsodium.org/secret-key_cryptography/secretbox)
+
+## 현재 구현과의 차이
+
+현재 Workbench의 숫자 오류 복구는 32개 `f64` 배열을 임시 복사한 뒤 함께 확정하는 구조다.
+외부 출력이나 제자리 버퍼 쓰기까지 되돌리는 기능은 없다.
+그래서 새 초안은 **자원 예약 → 관리 상태·작업 목록 확정 → 실제 백엔드 제출 → 완료 처리**를 구분한다.
+확정 전 자원 부족은 기존 상태를 보존하며, 확정 후 백엔드 실패는 이미 발급한 티켓의 완료로 보고한다.
+
+현재 `revision`은 적용 횟수이며 ABI 버전이 아니다. 내부 Zig 구조체의 `@sizeOf`도
+포맷·모듈 파일의 직렬화 규칙이 아니다. 64 KiB는 Wasm 선형 메모리이며 전체 컴파일러·앱의 상한이 아니다.
+이 세 수치를 미래 계약의 보장으로 잘못 재사용하지 않는다.
+
+## 작게 만들기 위해 선택한 제약
+
+- 첫 모듈은 바이트 스트림 프로파일로 제한한다. 파일·GPU·다중 평면 미디어의 결과는 별도 프로파일이 필요하다.
+- 한 스트림 문맥에는 진행 요청 하나만 허용한다. 첫 제어 흐름은 실행 영역별 직렬 처리다.
+- 입력과 출력 버퍼를 분리하고 버퍼 전체 단위로 읽기 공유 또는 쓰기 독점을 적용한다.
+- 요청·완료·대여·버퍼 슬롯을 함께 예산에 넣는다. 느린 소비자로 포화되면 역압력을 반환한다.
+- 진행 작업·대여·열린 문맥이 남아 있으면 교체를 거절한다. 첫 계약은 무중단 모듈 교체를 약속하지 않는다.
+- 모듈마다 새 문법·전역 타입 분석·무제한 특수화를 컴파일러에 추가하지 않는다.
+- 작은 핵심 계약과 검증된 외부 라이브러리의 연결을 먼저 시험한다. 내부 알고리즘 재구현은 독립적인 비교 근거가 필요하다.
+
+제약은 비용을 줄이기 위한 가설이지 성능 측정 결과가 아니다.
+고정 풀도 미사용 예약 공간을 낭비할 수 있고, 공통 코드도 직접 특수화한 코드보다 느릴 수 있다.
+어느 쪽이 유리한지는 실제 작업과 전체 비용으로 비교한다.
+
+## 장기 분야가 요구하는 검증
+
+| 분야 | 공통 계약에 요구하는 것 | 해당 분야의 별도 책임 |
+|---|---|---|
+| 압축 | 부분 소비·생성, 종료 처리, 내부 메모리 상한 | 포맷 호환, 압축률·속도·입력 분포, 사전·윈도 |
+| 암호화 | 출력 공개 시점, 키·임시 버퍼 수명 | 검증된 구현, 키·nonce·인증 단위·프로토콜의 올바른 사용 |
+| 문서 | 범위가 명시된 읽기, 점진 처리, 오류 위치 | 구조·인코딩·참조·랜덤 접근·각 포맷의 의미 |
+| 미디어 | 버퍼 대여, 비동기 완료, 시간·역압력 | 프레임·평면·코덱·GPU 동기화·실제 시간 제약 |
+| OS·장치 | 외부 효과·핸들·완료·어댑터 경계 | 플랫폼 API·권한·드라이버·커널 경로, 자체 OS의 별도 설계 |
+
+이 표는 모든 분야를 하나의 바이트 함수로 표현할 수 있다는 주장이 아니다.
+공통으로 보존해야 할 수명·진행·비용 규칙을 정하고, 의미가 다른 부분은 각 모듈이 책임지게 한다.
+지원할 실제 포맷·버전·플랫폼의 목록이나 전체 OS 개발 일정은 아직 정하지 않았다.
+
+## 검증한 범위와 증거
+
+코드·문서 검토에서 다음 모순을 찾아 초안에서 해결했다.
+
+- 런타임 접수 전 거절과 관리 상태 확정 뒤 백엔드 제출 실패의 혼동.
+- 출력 오프셋이 임의일 때 단일 유효 길이로 초기화되지 않은 구간까지 공개할 수 있는 모호함.
+- 취소 중 공유 입력 읽기를 허용하는 규칙과 모든 읽기를 금지하는 검사 항목의 충돌.
+- 동기 백엔드 반환과 런타임의 완료 회수 중 어느 시점에 대여가 끝나는지의 충돌.
+
+그 결과 v0 출력은 빈 버퍼·오프셋 0으로 제한하고, 모든 접수 요청의 대여는 완료 회수까지 유지한다.
+입력의 공유 읽기는 허용하지만 충돌하는 쓰기·재사용은 거절한다.
+
+Zig 0.15.2의 C 컴파일러로 **AArch64 Linux, AArch64 macOS, wasm32**를 대상으로
+레코드 크기·오프셋의 `_Static_assert` 8개씩을 컴파일했다. 세 타깃 모두 성공했다.
+이는 헤더의 제한된 데이터 배치 검사다. M3 실행·함수 호출 ABI·버퍼 수명·성능 검증이 아니다.
+[컴파일 기록과 해시](../design/validation/2026-09-22-record-layout.json)를 보관했다.
+
+```sh
+python3 docs/design/check-abi-layout.py --zig /path/to/zig --output /tmp/pure-abi-new.json
+```
+
+출력 파일은 덮어쓰지 않는다. native ABI의 다음 검증은 독립 C 생산자와 Zig 소비자 사이의
+실제 호출, 버전 거절, 수명·예산 처리다. 현재 헤더에는 함수 테이블이나 동적 로더 구현이 없다.
+
+## 다음 구현의 합격 기준
+
+2026-09-22 후속 결정: [006의 문제 조사](006-problem-landscape.md)에 따라,
+아래 구현에 앞서 기존의 잘 구성한 구현에서 실제 비용과 남은 개선 여지를 확인한다.
+이 계약은 후보 설계이며, 조사·비교 결과에 따라 변경한다.
+
+먼저 작은 고정 버퍼 풀과 요청 슬롯에서 제출·완료·반납을 실행하고,
+포화·부분 출력·취소 경합·늦은 완료·오래된 핸들·교체 거절을 재현한다.
+이는 수명 계약 검사이며 실제 앱 사용성 평가로 대신하지 않는다.
+
+그다음 실제 파일 스트림과 검증된 변환 라이브러리를 연결해
+풀의 총 용량보다 큰 파일, 느린 출력, 잘린 입력, 출력 실패를 다룬다.
+직접 라이브러리를 호출하는 일반 구현과 결과·오류 의미를 맞춘 뒤 다음을 비교한다.
+
+| 측정 축 | 기록할 대상 |
+|---|---|
+| 컴파일러 | 소스·토큰·AST·IR 용량, 최대 작업 메모리, 컴파일 시간, 산출물 크기 |
+| 실행 메모리 | 확보·사용·유지 바이트, 내부 문맥·완료 큐·계측 공간, 전체 RSS |
+| 복사 | 계측한 경로별 바이트, 원본 버퍼 유지 시간, 측정하지 못한 경로 |
+| 처리 | 입출력 총량·정확성·처리량·큐 대기 포함 지연·완료/거절/취소 수 |
+| 제작 | 실제 앱에서 새 기능을 위해 계약 밖 코드나 실행기 변경이 필요했던 지점 |
+
+새 API가 모듈 내부 메모리를 숨기거나, 풀·완료 큐·이전 문맥을 포함하면 이득이 사라지거나,
+부분 실패에서 데이터를 잃으면 해당 설계를 수정한다. 기존 구현에 없던 제약을 붙여 이긴 경우에도
+같은 조건의 비교로 별도 보고한다. 이번 초안에서 새로운 원리·성능 우월성을 입증하지 않았다.