aboutsummaryrefslogtreecommitdiffstats
path: root/docs/research/015-shared-rules.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/015-shared-rules.md
parentd34f9426d5317a1948f12f229439946728bc342a (diff)
downloadpure-b1ce1927022d374198441afafeb27199fc8a052a.tar.gz
pure-b1ce1927022d374198441afafeb27199fc8a052a.zip
Establish native micro runtime checkpoint
Diffstat (limited to 'docs/research/015-shared-rules.md')
-rw-r--r--docs/research/015-shared-rules.md115
1 files changed, 115 insertions, 0 deletions
diff --git a/docs/research/015-shared-rules.md b/docs/research/015-shared-rules.md
new file mode 100644
index 0000000..44f6544
--- /dev/null
+++ b/docs/research/015-shared-rules.md
@@ -0,0 +1,115 @@
+# 015 — 대상별 값과 공유 규칙 본문
+
+2026-09-23. 여러 도형을 배치하는 작업에서 같은 이동·놓기·취소 반응이 대상마다
+복제되던 문제를 다뤘다. 규칙을 한 번 작성하고, 컴파일된 명령도 한 벌만 보관하며,
+각 입력 연결은 대상의 연속된 상태 구간을 지정한다.
+
+## 사용하는 형태
+
+```text
+record Position { x=0; y=0 }
+item green = Position(x=80,y=120)
+item blue = Position(x=280,y=160)
+rule move(t: Position) {
+ t.x = event_x
+ t.y = event_y
+}
+on drag_green.move use move(green)
+on drag_blue.move use move(blue)
+```
+
+전체 작성물 [shared-layout.pure](../../prototypes/workbench/examples/shared-layout.pure)는
+잡은 위치 유지, 제한된 영역의 이동, 놓기 확정, 취소 복귀, 선택한 대상의 방향키 조정을 포함한다.
+화면의 **공유 규칙으로 배치**에서 불러와 적용할 수 있다.
+`go_right` 한 곳을 고치면 연결된 세 대상이 같은 변경을 사용한다.
+대상별 입력과 출력 연결은 명시적으로 작성한다.
+
+## 실행 표현
+
+`record`는 필드의 기본값, `item`은 그 필드의 실제 값, `rule`은 공유되는 반응이다.
+각 item의 필드는 기존 숫자 상태 배열의 연속 구간에 놓인다. `green.x` 같은 이름은
+작성·수정·저장의 식별자이며, 이벤트마다 문자열을 찾아 실행하지 않는다.
+
+규칙 본문은 첫 사용 위치에서 한 번만 내린다. 연결마다 본문 범위와 대상 필드의
+시작 위치·개수를 기록한다. 읽기·쓰기는 `base + field_offset`으로 실제 상태에 접근한다.
+필드 번호 목록, 인자 값 복사, 별도 레코드 객체, VM 호출 스택을 추가하지 않았다.
+표시 표현식은 직접 해석된 기존 상태 읽기를 쓰므로 계산 캐시도 실제 필드 변경을 추적한다.
+
+매개변수 하나는 정확히 같은 record 타입의 item에 연결한다. 다른 타입, 누락된 필드,
+범위를 벗어난 슬롯, 잘못된 본문 공유는 거절한다. 사용하지 않은 규칙도 이름과 필드를
+검사하지만 명령 저장량에는 포함하지 않는다. 매개변수 이름이 전역 item 이름과 겹칠 때
+없는 필드를 전역 값으로 잘못 해석하지 않도록 검사한다.
+
+한 사건의 모든 연결은 기존처럼 작성 순서대로 실행한다. 뒤쪽 연결이 실패하면 앞쪽
+연결의 변경과 전역 상태 변경까지 함께 취소한다. 같은 item을 두 번 연결하면 두 번 실행한다.
+코드를 공유한다는 이유로 입력이나 효과를 생략하지 않는다.
+
+## 확인한 구조적 차이
+
+동일한 최종 코어에서 기존 `layout.pure`와 공유 규칙 작성물을 컴파일한 회계다.
+실행 시간 비교나 처리량 벤치마크는 아니다.
+
+| 항목 | 기존 명시적 반복 | 공유 규칙 |
+|---|---:|---:|
+| 저장된 명령 | 319 | 117 |
+| 이벤트 연결 | 16 | 24 |
+| 사용 중인 명령·연결 자료 | 5,360 B | 2,256 B |
+| 숫자 상태 | 22 | 25 |
+
+공유 버전의 추가 세 상태는 예제가 명시한 대상별 `id`다. 기존 키 반응의 대상별 조건을
+각 연결에 나누면서 연결 수는 늘었다. 코드 저장량 감소를 전체 메모리 감소나 속도 향상으로
+해석하면 안 된다. 각 대상의 값과 입력 소유권은 계속 필요하다.
+
+연결 구조체는 12 B에서 16 B로 늘었다. 활성·준비 프로그램의 고정 연결 배열 때문에
+코어 예약 공간은 이전 19,392 B에서 **19,904 B**로 512 B 늘었다.
+Wasm 선형 메모리 한도는 64 KiB다. 사용 중인 자료와 고정 예약 공간을 별도로 기록한다.
+이 구조가 모든 작은 작성물에 메모리 이득이라는 주장은 하지 않는다.
+[구조 회계](../../prototypes/workbench/results/2026-09-23-shared-rules/representation.json)는
+동일 ABI의 두 작성물을 비교하며 이전 12 B 연결 구조체의 수치를 섞지 않는다.
+
+## 의미 보존과 검증
+
+기존 작성물과 공유 버전에 같은 입력을 전달해 모든 대상의 위치·잡은 위치·취소 위치·
+조작 여부·선택·출력 값을 비교했다. 두 대상의 동시 조작, 한 대상의 취소, 키보드 조정,
+영역 밖 이동과 놓기 이후의 결과가 일치했다.
+
+선언 순서와 record 필드 순서를 바꿔도 `item.field` 이름으로 값을 보존하고 물리 연결을
+다시 만든다. 삭제한 item의 값은 사라지며 재선언은 새로운 초기값에서 시작한다.
+배치 파일은 물리 슬롯 번호를 저장하지 않는다. 새 실행기에서 소스를 다시 컴파일하고
+이름을 검사한 다음 정의와 값을 함께 확정한다. 이전 version2 형식은 유지한다.
+생성되는 필드 이름이 소스보다 길어질 수 있어, 최대 크기의 유효한 저장 파일을 자체
+로더가 거절하지 않도록 파일 크기 상한도 해당 이름 수를 포함해 정했다.
+
+- 네이티브 32개: 공유 명령의 독립 필드 접근, 같은 대상의 반복 연결, 여러 연결의
+ 원자성, 누락·잘못된 범위·부분 중첩 거절과 기존 코어 기능.
+- JavaScript 75개: 규칙 하나의 명령 수가 연결 증가로 복제되지 않음, 컴파일 오류,
+ 이전 작업물과 의미 동등성, 순서 변경·제거·복원, 캐시 무효화, 기존 작성·파일 기능.
+- 브라우저 23개: 공유 규칙 한 곳 수정, 서로 다른 대상에 적용, 선언 순서 변경,
+ 실제 마우스와 두 접촉의 독립 이동·취소, 다운로드와 새 페이지 복원, 파일 읽기 충돌.
+
+기존 작성 흐름의 브라우저 회귀 검사 44개도 통과했다.
+
+브라우저는 Linux Chromium이며 터치는 CDP 입력이다. 실제 모바일 하드웨어나 Codex 내장
+브라우저에서 이번 공유 규칙 흐름까지 사용자가 확인한 것은 아니다.
+
+근거: [Node 검증](../../prototypes/workbench/results/2026-09-23-shared-rules/verification.json),
+[코어 빌드](../../prototypes/workbench/results/2026-09-23-shared-rules/build.json),
+[브라우저 결과](../../prototypes/workbench/results/2026-09-23-shared-rules/shared-browser.json),
+[재현 스크립트](../../prototypes/workbench/qa-shared-rules.js),
+[계약](../../prototypes/workbench/CONTRACT.md).
+
+## 남은 제약과 다음 방향
+
+매개변수화된 규칙은 기존 프로그래밍 개념이다. 이번 결과는 이 작성·실행·저장 경로에서
+실제 명령 복제를 없애면서 상태와 조작 의미를 보존한 구현이다.
+현재 record당 필드는 1~8개이고, 모든 item의 필드는 합쳐서 상태 32개 한도에 포함된다.
+입력 8개·출력 24개 한도도 그대로다. 일반 함수 호출, 동적 대상 생성·삭제는 없다.
+
+이름으로 보존하는 정적 필드와 동적 대상의 생명주기 핸들은 다르다.
+예제의 `id`와 `selected`는 작성한 숫자 상태라서 중복 방지나 선택 정책을 실행기가
+자동 보장하지 않는다. 재사용한 ID를 오래된 입력이 가리키는 문제까지 해결한 것으로 세지 않는다.
+
+다음 제약은 대상마다 필요한 입력 연결과 키 사건의 모든 연결 순회다.
+**실행 중 대상 추가·삭제와 선택한 대상만 실행하는 경로**를 검토할 때,
+삭제·재사용 뒤 오래된 입력과 저장된 선택이 잘못된 대상에 적용되지 않는 식별 규칙이 필요하다.
+규모를 키운 속도 수치보다 이 작업 조건을 먼저 고정한다.