aboutsummaryrefslogtreecommitdiffstats
path: root/docs/design/023-optimizing-tier.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/design/023-optimizing-tier.md')
-rw-r--r--docs/design/023-optimizing-tier.md12
1 files changed, 8 insertions, 4 deletions
diff --git a/docs/design/023-optimizing-tier.md b/docs/design/023-optimizing-tier.md
index e119e97..bcc1064 100644
--- a/docs/design/023-optimizing-tier.md
+++ b/docs/design/023-optimizing-tier.md
@@ -76,10 +76,11 @@ C의 1.25배 안이다(roots 1.02 × 1.22). **빠듯하다.** JIT의 코드는 C
- **뜻은 그대로.** 수는 binary64이고 −0은 −0이다. 유한하지 않은 결과, 0으로 나누기, 없는 키, 넘친 예산은 이벤트를 실패시키고, 결함의
종류와 자리가 실행기와 같다. 바뀌는 것은 표현과 실행의 길뿐이다.
-- **결함은 빠른 길이 났는지만 안다.** 이벤트는 실패하면 통째로 되돌려지고, 같은 상태와 입력에서 결정적이다(`now`도 이벤트마다 정해진
- 값이다). 그래서 빠른 길의 검사는 "어딘가에서 결함이 난다"만 정확하면 된다: 나면 이벤트를 되돌리고 실행기가 처음부터 다시 돌아
- 같은 결함을 같은 자리에서 낸다. 끌어올린 검사가 너무 일찍 실패하면(실행기라면 거기까지 가지 않았을 때) 이벤트를 실행기로 다시
- 돌리면 되니 결과가 같다. 값은 실패할 때만 든다.
+- **옮긴 검사는 났는지만 안다.** 이벤트는 실패하면 통째로 되돌려지고, 같은 상태와 입력에서 결정적이다(`now`는 호스트가 이벤트
+ 전에 정한 `app->now`라 이벤트 안에서 그대로다). 그래서 계층이 루프 앞으로 옮기거나 하나로 묶은 검사는 "이 루프 어딘가에서 결함이
+ 날 수 있다"만 정확하면 된다: 그 검사가 실패하면 그 루프를 검사가 제자리에 있는 코드로 돌고, 거기서도 결함이면 이벤트를 되돌리고
+ 실행기가 처음부터 다시 돌아 같은 결함을 같은 자리에서 낸다. 제자리에 남은 검사(`require`, TPC-C의 거절 같은 뜻으로 실패하는
+ 이벤트)는 지금처럼 그 자리에서 정확히 낸다. 다시 돌리는 값은 옮긴 검사가 실패할 때만 든다.
- **모든 블록.** 핸들러, 본문 있는 보기, 함수의 블록 모두를 계층이 맡는다. 코드로 하지 않는 명령(드문 텍스트 편집 같은)은 지금처럼
step을 부른다. 값 모형으로 블록을 거르지 않는다.
- **벤치마크의 모양을 넣지 않는다.** 묶음의 상수(`48271`, `1048576`)나 프로그램의 모양을 아는 코드는 없다. 미리 읽기 같은 기법은
@@ -95,6 +96,9 @@ C의 1.25배 안이다(roots 1.02 × 1.22). **빠듯하다.** JIT의 코드는 C
SSA 값에 대응시키고 합류점(루프 머리 포함)에 φ를 둔다.
- 상태, 리스트, 텍스트는 메모리다. 명령마다 무엇을 읽고 쓰는지(리스트별)를 이미 안다(`changes`). 이것으로 루프 불변을 가린다.
- step을 부르는 명령은 메모리 전체를 쓰는 것으로 본다(부르기 전에 장부와 걷기의 자리를 쓰고, 부른 뒤 다시 읽는다. 022의 규칙 그대로).
+- 값 번호 매기기로 순수한 연산의 같은 값을 하나로 한다(같은 리스트의 같은 항목 읽기는 그 사이에 그 리스트를 바꾸는 것이 없을 때,
+ 같은 수의 텍스트 쓰기와 보간도). words는 let이 텍스트를 담지 못해 같은 단어를 두세 번 쓰는데, 바닥은 한 번 쓴다: 그 차이를 이것이
+ 메운다.
### 2. 타입과 범위