diff options
Diffstat (limited to 'docs/research/037-build-time-prepared-runner.md')
| -rw-r--r-- | docs/research/037-build-time-prepared-runner.md | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/docs/research/037-build-time-prepared-runner.md b/docs/research/037-build-time-prepared-runner.md new file mode 100644 index 0000000..1a6fae4 --- /dev/null +++ b/docs/research/037-build-time-prepared-runner.md @@ -0,0 +1,59 @@ +# 037 — 작성 도구와 실행 전용 문서 앱 분리 + +2026-09-24. [036](036-gtk-memory-boundary.md)의 GTK 창은 44 MiB 이상의 +선택 비용을 지닌다. 마이크로 목표를 지키기 위해 이번에는 화면 기능을 늘리지 +않고, 기존 `.pure` 문서 앱의 **실행물에 매번 싣던 파서**를 분리했다. + +[`pure-compile`](../../prototypes/connections/compile-program.c)은 빌드 때 +기존 `pure_program_parse()`가 검증한 `PureProgram`을 C 초기화자로 출력한다. +[`pure-edit-fixed`](../../prototypes/connections/edit.c)는 생성된 상수를 +기존 `PureRuntime`과 기본 파일 저장소에 연결한다. 실행기 링크에는 +`program.c`와 컴파일 도구가 없다. 별도 `pure-edit`는 `.pure` 소스를 실행 때 +읽는 작성·실험 경로로 남긴다. 새 VM, 로더, 가변 명령 디스패치 또는 코어의 +항상 포함 기능을 추가하지 않았다. + +같은 Linux AArch64/GCC 14 `-O2` 빌드에서 기본 문서 CLI의 링크된 `text`는 +35,807 B, 고정 정의 실행기는 **19,244 B**다. 같은 `editor.pure`의 읽기, +조건부 수정, 응답과 기본 파일 저장을 수행하면서 **16,563 B(46.3%)** 줄었다. +직접 공유 라이브러리 의존성은 둘 다 libc뿐이다. +[20 KiB 실행기 코드 상한 결과](../../prototypes/connections/results/2026-09-24-fixed-program/profile-final.json). +컴파일 도구 자체의 `text`는 22,034 B이며 빌드 시 필요하다. 이를 프로젝트 +전체 비용에서 사라진 것으로 세지 않는다. + +1 MiB 문서 편집의 피크 RSS는 고정 실행기 **2,112 KiB**였다 +([4 MiB 회귀 상한 결과](../../prototypes/connections/results/2026-09-24-fixed-program/memory-verified.json)). +기존 소스 실행기의 같은 측정은 2,080 KiB였다. 따라서 이 결과는 **코드 +크기 감소**를 입증하지만 RAM 감소를 입증하지 않는다. 실행기 패키지는 +14,385 B 압축 파일이다 +([이동 후 실제 편집·복원 검사](../../prototypes/connections/results/2026-09-24-fixed-program/package-final.json)). +기존 22,482 B 소스 작성 패키지와는 포함 파일 및 실행 중 정의 변경 능력이 +다르므로 패키지 크기를 동등 기능의 성능 비교로 쓰지 않는다. 이 고정 패키지는 +`editor.pure` 파일과 파서·컴파일러를 포함하지 않는다. + +[동작 일치 검사](../../prototypes/connections/results/2026-09-24-fixed-program/parity-release.json)는 +소스 실행기와 고정 실행기를 서로 다른 저장 디렉터리에서 같은 작업으로 +비교했다. 문서 생성·수정·오래된 버전 충돌·잘못된 범위·1 MiB 복원뿐 아니라 +`selection.pure`의 동적 입력 범위, `excerpt.pure`의 중첩 읽기·필요 길이 +검사까지 결과 코드·본문·메타데이터가 같았다. 잘못된 소스의 컴파일은 기존 +생성 파일을 유지했고, 입력 파일을 출력 대상으로 지정하는 것도 거절했다. +같은 빌드 디렉터리에서 작성 정의를 +`editor → selection → editor`로 바꾸면 실행물이 각각 다시 빌드됐다. +`nm`에서도 고정 실행기의 파서 심볼이 없음을 확인했다. 기존 +`make check-release`, 새로운 `make check-fixed-profile`, 이동한 묶음의 +검사가 모두 통과했다. GTK 창의 기존 기능 검사도 통과했다. + +이 경로는 현재 **C 소스 초기화자**를 생성해 같은 대상의 C 컴파일러로 +빌드한다. 안정적인 이식 바이트코드 형식이나 대상 독립 ABI는 아니다. +사용자가 실행 중 `.pure` 정의를 바꾸려면 기존 소스 실행기·작성 창이 +필요하고, 고정 실행기는 다시 빌드해야 한다. 현재 작성 언어 자체도 +`get`/`put` 한 저장 효과 범위다. 따라서 코드 크기 절감이 대규모 앱 표현, +네이티브 UI 메모리, macOS 검증을 대신하지 않는다. 다음 구현은 더 큰 +앱을 작성 가능하게 하면서도 이 준비·실행 분리와 크기 상한이 유지되는지 +확인해야 한다. + +재현 명령: `make -C prototypes/connections fixed-editor check-fixed-profile`, +`make -C prototypes/connections BUILD=build/fixed-selection +FIXED_PROGRAM=examples/selection.pure fixed-editor`, +`make -C prototypes/connections BUILD=build/fixed-excerpt +FIXED_PROGRAM=examples/excerpt.pure fixed-editor`, +`python3 prototypes/connections/check_fixed_program.py`. |
