1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
# 108 — 경계에서 값이 그대로인가: 한 값, 모든 길
2026-09-30. [외부 리뷰 004](../outside-feedback/feedback-004.md)의 맺음말에서 시작한다. 리뷰는 "앱 코드와 저장·전달·화면
사이의 중복 상태와 변환을 실제로 줄인 것"을 가장 중요한 성과로 꼽고, "그 경계에서 의미가 유지되는지부터 고정하는 일"을 다음
연구의 기반으로 권했다.
변환은 줄었지만 없어지지는 않았다.
- 들어올 때: HTTP의 JSON 본문과 쿼리가 메시지의 필드가 된다(JSON 문자열의 이스케이프를 풀고, 수의 글자를 읽는다).
- 저장할 때: 상태가 저장 형식이 된다(위치는 varint, 2^53 미만의 정수는 zigzag varint, 그 밖의 수는 표시와 8바이트).
체크포인트는 그것을 다시 이미지로 쓴다.
- 보일 때: 스냅숏의 상태가 보기의 JSON이 된다(수는 가장 짧은 글자로, text는 JSON 문자열로).
- 보낼 때: 보냄이 outbox의 기록이 되고, 링크의 기록이 되고, 받는 쪽 입력의 배치로 옮겨진다(모양이 다르면 이름으로,
[014](../design/014-fields-by-name.md)).
변환마다 단위 검사는 있다. 그러나 한 값이 한 길로 들어가 다른 모든 길로 나올 때 같은지를 보는 검사는 없다.
착수 기준(검사를 짜기 전에 정해 커밋했다):
- **바꿀 결정.**
- 어떤 길이 값을 바꾸면(수의 비트, text의 바이트, 필드가 있고 없음) 다른 일보다 먼저 고친다.
- 형식이 싣지 못해 바꿀 수 없는 것은 계약으로 적는다.
- 경계마다의 계약을 설계 문서로 두고, 이 검사를 `make check`에 넣는다.
- **길.**
- 들어가는 길: HTTP의 JSON 본문, HTTP의 쿼리와 날 본문(text), 링크 전달, HTTP 전달.
- 나오는 길: 보기(연결 스레드가 스냅숏에서), 등록한 질의, 재시작(저장소의 로그에서), 체크포인트 뒤의 재시작(이미지에서),
모듈 교체(필드 순서를 바꾸고 u32를 number로 넓힌 모듈), 중계(A에서 B로 링크, B에서 C로 HTTP).
- **값.**
- 수: 0, −0, 2^53 부근, 가장 큰 수, 가장 작은 정규 수와 비정규 수, 1/3, 글자가 지수로 바뀌는 1e21 부근.
- u32: 0, 2^31, 2^32 − 1.
- text: 빈 것, 한글, 4바이트 UTF-8, 따옴표·역슬래시·제어 문자, NUL, U+2028, 4 KiB.
- 그룹 안의 필드.
- **통과 조건.**
- 받아들인 값은 모든 나오는 길에서 같아야 한다. 수는 비트까지(보기의 글자를 다시 읽은 binary64), text는 바이트까지.
- 거절할 값(넘치는 수, 음수·소수·2^32 이상의 u32, UTF-8이 아닌 text, 짝 없는 서로게이트)은 모든 들어가는 길이 거절해야
한다. 거절한 사건은 아무것도 남기지 않는다(보기에도, 보냄에도).
- **범위.** Pure의 경계다. 화면(Vega가 보기를 그리는 것)은 다음 단계다.
|