aboutsummaryrefslogtreecommitdiffstats
path: root/docs/research/014-layout-persistence.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/014-layout-persistence.md
parentd34f9426d5317a1948f12f229439946728bc342a (diff)
downloadpure-b1ce1927022d374198441afafeb27199fc8a052a.tar.gz
pure-b1ce1927022d374198441afafeb27199fc8a052a.zip
Establish native micro runtime checkpoint
Diffstat (limited to 'docs/research/014-layout-persistence.md')
-rw-r--r--docs/research/014-layout-persistence.md93
1 files changed, 93 insertions, 0 deletions
diff --git a/docs/research/014-layout-persistence.md b/docs/research/014-layout-persistence.md
new file mode 100644
index 0000000..5746552
--- /dev/null
+++ b/docs/research/014-layout-persistence.md
@@ -0,0 +1,93 @@
+# 014 — 여러 대상을 배치하고 작업을 다시 열기
+
+2026-09-23. 이번 단계는 작성한 인터페이스를 한 번 조작하고 끝내지 않고,
+작업 결과를 저장한 뒤 새 실행기에서 계속 편집할 수 있게 하는 것이다.
+처리량·지연·대규모 합성 벤치마크는 수행하지 않았다.
+
+## 실제로 할 수 있는 일
+
+[세 도형 배치](../../prototypes/workbench/examples/layout.pure)를 불러와 적용하면
+각 대상을 따로 움직일 수 있다. 마지막으로 잡은 대상은 방향키로 조정한다.
+**배치 저장** 후 파일을 **파일 열기**로 다시 열면 적용된 코드와 현재 배치가 복원된다.
+아직 적용하지 않은 미완성 코드도 별도 초안으로 남는다.
+새 페이지 또는 CLI에서 열어도 기존 실행기의 값을 참조하지 않는다.
+
+색상·이동·선택·키 반응은 예제 소스에 있다. 호스트에는 세 도형 전용 상태나
+이동 코드를 추가하지 않았다. 이전 드래그 놓기 수정도 유지했다.
+기존 .pure 저장과 코드 JSON 저장은 계속 초안만 저장하므로 배치 저장과 구별된다.
+
+## 무엇이 일치해야 하는가
+
+한 작업물에 서로 다른 세 종류의 정보가 있다.
+
+| 정보 | 저장·복원 의미 |
+|---|---|
+| 적용된 코드 | 복원한 값을 해석하고 실행할 정의 |
+| 현재 작성 상태 | 대상 위치·선택 등 선언된 모든 숫자 값 |
+| 편집 초안 | 미적용·문법 미완성이어도 보존, 자동 실행하지 않음 |
+
+현재 값을 코드의 초깃값으로 덮어쓰면 원래의 초기화 의미가 사라진다.
+반대로 코드만 저장하면 조작 결과가 사라진다. 따라서 소스와 현재 값을 별도로 저장하고,
+복원 시 한 번에 확정한다. **초깃값으로**는 여전히 작성한 소스의 초기값으로 돌아간다.
+
+입력 소유권·시계·오류 기록·계산 캐시·렌더러 객체는 작업 결과에 포함하지 않는다.
+복원은 정지 상태에서 시작하며 입력을 재생하지 않는다. 저장 전에 조작과 시간 진행을
+끝내도록 한다. 실행 실패가 남아 있으면 해결한 뒤 저장한다.
+작성자가 상태로 선언한 드래그 보조 값은 현재 모두 저장한다. 영속·일시 상태를
+구분하는 언어 기능이 생겼다고 주장하지 않는다.
+
+## 복원 구현
+
+version2 파일은 적용된 소스, 별도 초안, 이름과 값의 목록을 가진다.
+모든 상태 이름이 정확히 한 번씩 있어야 하며, 값은 유한한 숫자여야 한다.
+순서는 의미가 없다. 음의 0은 JSON 숫자 직렬화에서 사라지므로 전용 문자열 `"-0"`로
+보존한다. 다른 숫자 문자열은 허용하지 않는다. 파일 크기와 코드 한도를 검사한다.
+version1은 기존 코드 전용 파일로 계속 지원한다.
+
+호스트는 정의와 상태 목록을 검사한 뒤 코어의 준비 공간에 넣는다.
+코어는 전체 정의와 모든 복원 값을 검증한 후 활성 정의·상태를 함께 교체한다.
+값 하나를 넣다 실패해 현재 배치가 절반만 바뀌는 경로가 없다.
+새 준비 값은 기존 로드/계산 기록 공유 공간에 들어가며, 활성 프로그램 형식은 늘리지 않았다.
+
+32개 복원 값과 유효성 비트·정렬 때문에 준비 공간은 264 B 늘었다.
+현재 Wasm 코어 예약 구조체는 19,392 B, 선형 메모리 한도는 여전히 64 KiB다.
+이는 원자적 복원에 사용한 저장 공간의 회계이며 성능 개선 주장이나 프로세스 RAM 측정이 아니다.
+
+브라우저의 비동기 파일 읽기에는 초안 변경 번호, 적용 정의의 동일성, 성공 사건 수를 확인한다.
+읽는 도중 편집하거나 도형을 움직였다면 파일을 다시 열도록 안내한다.
+느린 파일 읽기가 뒤늦게 현재 작업을 덮어쓰지 않는다.
+CLI `save-project`와 `restore`도 같은 검증·복원 API를 사용하고 기존 파일은 덮어쓰지 않는다.
+
+## 검증
+
+- 네이티브 29개: 정의·복원 값의 원자적 확정, 부족·중복·비유한 값 거절,
+ 0개·32개 상태 경계, 기존 활성 실행과 준비 값의 분리, 원래 초기값 유지.
+- JavaScript 68개: 소스·상태·미완성 초안의 왕복, 상태 순서 변경, 음의 0,
+ 잘못된 파일의 비변경, 캐시 무효화, 조작 중 거절, CLI 파일 왕복과 기존 동작.
+- 실제 브라우저 작성·저장 17개: 세 대상 이동, 키보드 조정, 다운로드 파일로
+ 새 페이지 복원, 잘못된 파일, 편집·입력과 비동기 읽기의 충돌, 조작 중 저장 거절,
+ 모바일에서 추가 버튼의 가로 넘침 여부.
+- 기존 브라우저 작성 흐름 44개: 코드 저장·불러오기, 편집·적용·오류·키 입력 등 회귀 검사.
+
+브라우저 검증은 Linux AArch64 Chromium에서 수행했다. Codex 내장 브라우저에서
+이 새 파일 흐름까지 사용자가 검증한 것은 아니다. 앞선 놓기 수정은 사용자가 정상 동작을 확인했다.
+테스트 실행 도구의 경과 시간은 성능 근거로 해석하지 않는다.
+
+근거: [검증 로그](../../prototypes/workbench/results/2026-09-23-layout/verification.json),
+[코어 빌드·테스트](../../prototypes/workbench/results/2026-09-23-layout/build.json),
+[브라우저 결과](../../prototypes/workbench/results/2026-09-23-layout/layout-browser.json),
+[기존 작성 흐름](../../prototypes/workbench/results/2026-09-23-layout/authoring-browser.json),
+[브라우저 재현](../../prototypes/workbench/qa-layout.js),
+[문서 계약](../../prototypes/workbench/CONTRACT.md).
+
+## 다음에 풀 제약
+
+세 도형을 만들면서 대상마다 위치·잡은 위치·취소 위치·입력·반응을 반복 선언해야 했다.
+같은 이동 규칙이 대상 수만큼 커지는 구조가 현재의 구체적인 제약이다.
+현재 예제만으로 대규모 도구의 적합성이나 개발 경험 우위를 주장하지 않는다.
+
+다음 후보는 **대상 집합의 데이터는 분리하고, 같은 반응은 한 번만 정의하는 실행 표현**이다.
+포인터가 소유한 대상, 키보드가 선택한 대상, 저장한 대상의 식별이 일치해야 한다.
+개체 추가·삭제 뒤 잘못된 대상에 입력이 적용되지 않는 조건도 함께 검토해야 한다.
+문법을 꾸미거나 기존 수치를 반복 측정하기보다 이 반복과 식별 문제를 먼저 해결한다.
+현재 파일 저장은 수동 저장이며 자동 저장·실행 취소·다중 사용자 동기화는 구현하지 않았다.