aboutsummaryrefslogtreecommitdiffstats
path: root/docs/research/028-shared-fixed-program.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/028-shared-fixed-program.md
parentd34f9426d5317a1948f12f229439946728bc342a (diff)
downloadpure-b1ce1927022d374198441afafeb27199fc8a052a.tar.gz
pure-b1ce1927022d374198441afafeb27199fc8a052a.zip
Establish native micro runtime checkpoint
Diffstat (limited to 'docs/research/028-shared-fixed-program.md')
-rw-r--r--docs/research/028-shared-fixed-program.md79
1 files changed, 79 insertions, 0 deletions
diff --git a/docs/research/028-shared-fixed-program.md b/docs/research/028-shared-fixed-program.md
new file mode 100644
index 0000000..3c48e97
--- /dev/null
+++ b/docs/research/028-shared-fixed-program.md
@@ -0,0 +1,79 @@
+# 028 — 고정 네이티브 앱의 불변 프로그램 공유
+
+2026-09-24. Linux AArch64, Zig 0.15.2, GCC 14.2. 첫 공개 체크포인트의 중간 결과다.
+마이크로 런타임의 기본 비용을 지키기 위해, **같은 정의로 실행하는 독립 인스턴스의 반복
+메모리에서 프로그램·교체 공간·선택형 캐시를 제거했다.** 코어의 기능이나 의존성을 늘리지 않았다.
+
+## 구조와 경계
+
+[027의 고정 용량 빌드](027-fixed-native-capacity.md)는 최대 예약을 줄였지만, 한 앱의
+명령·반응·대상 정보와 교체 준비 공간을 인스턴스마다 보유했다. CLI·피어는 정의를 실행 중
+교체하지 않으므로 준비 단계가 만든 동일한 정의를 Zig 빌드의 불변 `Program`으로 한 번
+링크한다. 인스턴스에는 설치 여부, 각자의 상태·진단·평가 기록만 남긴다. 고정 빌드에서
+C의 명령·반응 배열도 다시 링크하지 않는다.
+
+```text
+작성된 .pure → 기존 준비기 → 고정 빌드의 불변 Program (앱마다 한 벌)
+ ├─ scalar 인스턴스 A: 상태·진단·평가
+ └─ scalar 인스턴스 B: 상태·진단·평가
+```
+
+설치할 때 준비 정의의 SHA-256 identity와 상태·입력·명령·반응·대상 개수를 빌드 정의와
+대조한다. 복원 값은 모두 유한한지 확인한 뒤에야 상태·버전을 바꾼다. 여기서 identity는
+저장 상태의 **호환성 검사**이며 출처 인증이 아니다. 고정 실행물에서 다른 정의를 쓰려면
+재빌드해야 한다. 정의 staging API와 선택형 평가 캐시는 이 프로필에서 용량 오류를 반환한다.
+캐시 없는 평가와 정해진 작업 예산은 계속 사용한다. 정의 교체가 필요한 GTK 작성 창과
+브라우저 Wasm은 일반 프로필을 유지한다.
+
+초기 버전에는 설치 전의 빈 상태를 표현하려고 2,480 B짜리 빈 `Program`이 실행 파일에
+추가로 들어갔고, 기본 포인터 초기값은 읽기 전용 영역의 동적 재배치도 만들었다.
+최종 버전은 인스턴스의 설치 여부로 빈 상태를 표현한다. [실행물 의존성 검사](../../prototypes/workbench/results/2026-09-24-shared-program/dependencies.txt)에서
+CLI·피어 모두 `TEXTREL`이 없고, [심볼 검사](../../prototypes/workbench/results/2026-09-24-shared-program/symbols.txt)에서
+2,480 B `engine.shared_program` 한 벌만 남은 것을 확인했다.
+
+## 반복 비용과 동작
+
+`routed-layout.pure`의 [최종 크기·RSS 원자료](../../prototypes/workbench/results/2026-09-24-shared-program/instance-memory.json):
+
+| 범위 | 일반 작성 프로필 | 앞선 고정 용량 [027](027-fixed-native-capacity.md) | 공유 고정 프로필 |
+|---|---:|---:|---:|
+| scalar 인스턴스 요구 저장 공간 | 20,064 B | 5,456 B | **280 B** |
+| 같은 scalar 인스턴스 1,000개 초기화의 RSS 증가, 3회 중앙값 | 19,808 KiB | 5,536 KiB | **480 KiB** |
+
+각 인스턴스를 실제 할당·초기화·설치한 뒤 버전 합을 검사했다. RSS는 Linux의 초기화
+전후 차이이며 allocator·페이지 단위의 영향도 포함한다. 이 값은 **scalar 인스턴스
+반복 비용**이지 사용자 1,000명의 서비스 메모리·처리량이나 전체 피크가 아니다.
+고정 프로그램 자체는 앱마다 정적 저장 공간 2,480 B를 한 번 사용한다. 별도의 C 앱
+컨트롤러는 이 사례에서 928 B이고, 저장·입출력·스택·TLS·GTK는 위 280 B에 없다.
+
+[고정 프로필](../../prototypes/workbench/results/2026-09-24-shared-program/fixed-parity.json)과
+[일반 프로필](../../prototypes/workbench/results/2026-09-24-shared-program/general-parity.json)은
+기존 작성물 11개, 입력 170단계의 상태·출력을 Wasm과 비교했다. 두 C 호스트는 ASan/UBSan,
+Zig 모듈은 ReleaseSafe였다. 고정 단위 검사는 독립 상태, 설치 전 빈 상태, 잘못된 정의
+identity·개수 거부, 복원 실패의 원자성, 부호 있는 0과 reset을 확인했다. 일반 프로필의
+정의 staging·교체 검사도 통과했다. Zig 코어 37개와 브라우저/CLI 회귀 87개를 통과했다.
+
+## 선택한 실행물의 비용
+
+같은 `routed-layout.pure`, C `-O2 -g`의 [섹션 크기](../../prototypes/workbench/results/2026-09-24-shared-program/size.txt),
+[stripped 파일 크기](../../prototypes/workbench/results/2026-09-24-shared-program/stripped.txt),
+[CLI 빌드 식별](../../prototypes/workbench/results/2026-09-24-shared-program/cli-build.json),
+[피어 빌드 식별](../../prototypes/workbench/results/2026-09-24-shared-program/peer-build.json).
+
+| 선택한 범위 | 앞선 고정 용량 [027](027-fixed-native-capacity.md) | 공유 고정 프로필 |
+|---|---:|---:|
+| scalar 오브젝트 `text` | 18,252 B | **10,396 B** |
+| CLI 실행물 `text` | 48,059 B | **37,135 B** |
+| CLI stripped ELF | 68,000 B | **68,000 B** |
+| TLS 피어 실행물 `text` | 61,201 B | **50,277 B** |
+| TLS 피어 stripped ELF | 68,400 B | **68,400 B** |
+
+이 호스트의 ELF 배치·정렬 때문에 이번에는 **stripped 파일 크기가 줄지 않았다**.
+CLI는 libc, 피어는 libc·OpenSSL 동적 라이브러리를 요구한다. 피어의 유휴 RSS는
+[최종 인증·복원·오류 검사](../../prototypes/workbench/results/2026-09-24-shared-program/peer-check.json)에서
+7,856 KiB였다. 공통 저장 실행 코어의 별도 `text` 예산 5,932 B는 그대로 통과했다.
+
+이제 작은 scalar 인스턴스만 더 줄이는 측정은 우선순위가 아니다. 첫 공개 체크포인트에는
+실제 크기의 작성·저장·원격 작업을 포함한 **앱 전체 비용과 실패 조건**이 필요하다.
+이번 결과는 반복 메모리 제거와 기존 동작 유지의 증거이며 큰 서비스의 지연·처리량 우위나
+macOS 메모리 특성에 대한 증거는 아니다.