aboutsummaryrefslogtreecommitdiffstats
path: root/docs/research/027-fixed-native-capacity.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/research/027-fixed-native-capacity.md')
-rw-r--r--docs/research/027-fixed-native-capacity.md90
1 files changed, 90 insertions, 0 deletions
diff --git a/docs/research/027-fixed-native-capacity.md b/docs/research/027-fixed-native-capacity.md
new file mode 100644
index 0000000..4783634
--- /dev/null
+++ b/docs/research/027-fixed-native-capacity.md
@@ -0,0 +1,90 @@
+# 027 — 작성 정의만큼만 예약하는 네이티브 실행물
+
+2026-09-24. Linux AArch64, GCC 14.2, Zig 0.15.2. 첫 공개 체크포인트의 중간 결과다.
+**기본 실행 코어의 범위를 늘리지 않고, 선택한 앱 인스턴스의 반복 비용을 줄였다.**
+이 문서는 당시의 고정 용량 빌드 결과다. 이후 정의와 상태를 분리한
+[028 불변 프로그램 공유](028-shared-fixed-program.md)가 현재 CLI·피어 구조와 측정값이다.
+
+## 제거한 비용
+
+기존 native scalar 모듈은 작은 작성물에도 상태 32개, 입력 8개, 명령 512개, 반응 64개,
+포인터 대상 24개의 최대 배열을 **실행 정의와 교체 준비 공간 각각에** 예약했다. 실행 전용 CLI와
+피어는 빌드된 정의를 실시간 교체하지 않지만 인스턴스마다 20,064 B를 차지했다. 이 비용은
+동일한 작성물을 여러 독립 인스턴스로 운영할수록 반복된다.
+
+`prepare.mjs`가 이미 검증한 `.pure` 정의의 상태·입력·명령·반응·대상 개수를 Zig 빌드 프로필에
+함께 기록하도록 했다. `native-fixed.zig`는 기존 `engine.zig`를 해당 용량으로 빌드한다.
+배열이 비어 있을 때 Zig가 인덱스 연산을 컴파일할 수 있도록 0개 항목에는 1칸만 예약한다.
+언어의 상한 32/8/512/64/24는 그대로 검사한다.
+
+```text
+.pure → 기존 컴파일러의 검증된 정의 → application.c + fixed-profile.zig
+ ↓
+ 같은 scalar VM의 정확한 배열 용량
+```
+
+고정 정의를 쓰는 `manage.py native` CLI와 `--peer`만 이 프로필을 선택한다. 작성 중에 새
+정의를 적용하는 `--desktop`과 브라우저 Wasm은 여전히 전체 용량을 가진다. 고정 실행물에서
+다른 정의로 바꾸려면 다시 빌드한다. 입력 하나의 실행 중에 크기 검사나 동적 배열 할당을
+추가하지 않았고, 새 파서나 별도 인터프리터도 만들지 않았다. 앱 계산은 여전히 기존 scalar
+VM이며 AOT로 모든 연산을 기계어로 펼친 결과는 아니다.
+
+## 동작·한도 검증
+
+[전체 용량 결과](../../prototypes/workbench/results/2026-09-24-fixed-capacity/general-parity-final.json)와
+[고정 용량 결과](../../prototypes/workbench/results/2026-09-24-fixed-capacity/fixed-parity-final.json)는
+동일한 기존 작성물 11개, 입력 170단계에 대해 네이티브 상태·출력을 Wasm 결과와 대조한다.
+명령 319개인 `layout.pure`, 공통 규칙·대상별 배치를 포함한다. 두 C 호스트는 ASan/UBSan으로
+실행했고 Zig 모듈은 ReleaseSafe였다. 고정 `routed-layout.pure`에서는 용량보다 큰 상태·입력·
+명령 정의가 거절되고 기존 활성 상태·버전이 남는 것도 확인했다. 브라우저/CLI 회귀 87개,
+Zig 코어 37개, TLS 피어의 [인증·저장·오류 시나리오](../../prototypes/workbench/results/2026-09-24-fixed-capacity/peer-check.json)도 통과했다.
+
+| 작성물 | 명령 수 | 전체 용량 인스턴스 | 고정 용량 인스턴스 |
+|---|---:|---:|---:|
+| 비어 있는 작성물 | 0 | 20,064 B | 1,320 B |
+| 카운터 | 17 | 20,064 B | 1,576 B |
+| 직접 조작 | 82 | 20,064 B | 3,248 B |
+| 대상별 공유 규칙 배치 | 117 | 20,064 B | 5,712 B |
+| 피어와 CLI의 묶음 배치 | 117 | 20,064 B | 5,456 B |
+| 명시적 세 도형 배치 | 319 | 20,064 B | 11,792 B |
+
+이는 `pure_scalar_bytes()`가 요구하는 인스턴스 저장 공간이다. 앱 컨트롤러, TLS·GTK,
+스택·저장소·힙 관리 비용을 포함한 값이 아니다.
+
+반복 비용의 실제 효과를 별도로 확인했다. 같은 묶음 배치 정의로 독립 scalar 인스턴스
+1,000개를 초기화한 Linux 프로세스에서, 초기화 전후 RSS 차이의 3회 중앙값은 전체 용량
+**19,808 KiB**, 고정 용량 **5,536 KiB**였다. 둘 다 같은 실제 준비 정의를 적재했고
+각 인스턴스의 버전을 읽어 유효한 초기화를 확인했다. [원자료](../../prototypes/workbench/results/2026-09-24-fixed-capacity/instance-memory.json)와
+[재현 하네스](../../prototypes/workbench/native/instance-memory.c)를 보관했다. 이 수치는
+**scalar 인스턴스 1,000개의 메모리 확대 비용**만 비교한다. 1,000명 서비스의 전체 메모리나
+처리량·지연 개선이라는 뜻은 아니다.
+
+## 실행물 전체 비용
+
+동일한 `routed-layout.pure`와 `-O2 -g` C 빌드의 [ELF 섹션 원자료](../../prototypes/workbench/results/2026-09-24-fixed-capacity/size.txt),
+[stripped 파일 크기](../../prototypes/workbench/results/2026-09-24-fixed-capacity/stripped.txt),
+[CLI 빌드 식별](../../prototypes/workbench/results/2026-09-24-fixed-capacity/fixed-cli-build.json),
+[피어 빌드 식별](../../prototypes/workbench/results/2026-09-24-fixed-capacity/fixed-peer-build.json).
+
+| 선택한 범위 | 전체 용량 | 고정 용량 |
+|---|---:|---:|
+| scalar 오브젝트 `text` | 33,020 B | 18,252 B |
+| CLI 실행물 `text` | 62,827 B | 48,059 B |
+| CLI stripped ELF | 68,000 B | 68,000 B |
+| TLS 피어 실행물 `text` | [026의 기준](026-secure-peer-link.md) 75,969 B | 61,201 B |
+| TLS 피어 stripped ELF | [026의 기준](026-secure-peer-link.md) 133,936 B | 68,400 B |
+
+CLI의 `text`가 줄어도 stripped 파일은 이 호스트의 ELF 배치·정렬 때문에 같은 68,000 B였다.
+따라서 파일 크기 개선이라고 보고하지 않는다. 반면 피어는 세그먼트 경계를 넘어 실제
+stripped 파일도 작아졌다. 동적 OpenSSL의 파일·메모리 비용은 여전히 별도이며, 이번 피어 서버
+유휴 RSS 한 번의 관찰은 7,888 KiB였다. 공통 실행 코어 아카이브의 5,932 B 예산 및 CLI가
+libc만 직접 요구하는 성질은 그대로다.
+
+## 다음에 제거할 중복
+
+고정 용량 안에서도 각 인스턴스가 동일한 실행 정의를 **두 벌의 배열 공간에** 보관한다.
+이번 변경은 최대 크기 예약을 줄였지만 준비된 명령을 인스턴스 간 공유하지는 않는다.
+따라서 많은 독립 앱을 운영하는 다음 검증에서는 불변 프로그램을 공유하고 변경 가능한 상태·
+입력 소유권·평가 기록만 인스턴스에 둘 수 있는지 확인해야 한다. 정의 교체의 원자성,
+동시 실행의 수명, 스냅샷 호환성을 유지하면서 실제 반복 메모리를 더 줄일 수 있을 때
+구조를 채택한다. 큰 서비스 성능이나 컴파일 시간 우위는 아직 입증하지 않았다.