브라우저에서 도는 Mere: 모든 것이 수렴하는 곳
다섯 Part에 걸쳐 세운 모든 부품이, 사람이 닿을 수 있는 장소를 가리켰다. 네 live page가 셀프 호스트 파이프라인을 웹에 올린다: Mere를 붙이면 정형하고, 돌리고, 타입을 추론하고, 혹은 Wasm 모듈을 돌려준다 —— 서버 없이, OCaml 없이. 여기에 새로운 것은 아무것도 없다. 그것은 모든 것의 조립이다: Wasm backend, 샌드박스, 외부 인터페이스, 그리고 언어 자신으로 쓰인 컴파일러가 수렴하여, 당신이 타이핑하는 코드를 컴파일하는 것을 볼 수 있는 컴파일러가 된다.
셀프 호스트 컴파일러는 Mere에 존재하고, 자기 자신을 뱉을 수 있다. 이 Part의 모든 것은, 사람이 실제로 닿을 수 있는 어딘가에서 돌기 위해 세워졌고, 각 부품은 떨어진 순간에 웹 페이지에 배선되었다. 이 마무리 회는, 그 페이지 —— 넷 —— 의 이야기이고, 그리고 그것들에 닿는 것이 전혀 새로운 발명을 요하지 않았다는 사실의 이야기다. 그것들은, 이 연재의 모든 Part가 한 번에 배당을 치르는 점이다.
네 페이지
각 셀프 호스트 부품이, 세워진 순서로 live page가 되었다. 포매터 페이지가 있다: Mere 소스를 붙이면, 깨끗이 정형되어 돌아온다. REPL 페이지: 식을 붙이면, 돌아 결과를 보인다. 타입 검사기 페이지: 코드를 붙이면, 그것에 추론된 타입을 보인다. 그리고 컴파일러 페이지: Mere 소스를 붙이면, WebAssembly 모듈의 텍스트를 돌려준다 —— 파일 위에서 컴파일러를 돌리는 것의, 파일 없이 서버 없이의 브라우저 판이다.
넷 모두가 같은 방식으로 돈다. 그것들은 셀프 호스트의 렉서, 파서, 포매터, 평가기, 타입 검사기, 코드 생성기 —— 앞 다섯 회의 Mere 프로그램 —— 이 WebAssembly로 컴파일되어, 페이지에 로드된 것이다. OCaml은 없다; 요청은 브라우저를 떠나지 않는다. Mere 파이프라인이, 그것이 닿도록 설계된 샌드박스로 컴파일되어, 탭 안에서 로컬로 일을 한다.
여기에 새로운 것은 아무것도 없다
이 페이지들의 두드러진 점은, 그 얼마나 적은 부분이 새로운 능력인가다. 그것들은, 저마다 자기 때에, 자기 이유로 세워진 부품의 수렴이다.
Part IV의 Wasm backend가, 셀프 호스트 파이프라인을, 브라우저가 로드할 수 있는 무언가로 컴파일한다 —— 샌드박스의 타깃, 당시, 여기로 이끌기 때문이라는 이유도 일부 있어 골라졌다. 샌드박스 모델이, 파이프라인을 페이지 안에서 기본으로 신뢰하지 않고 돌리고, 주어진 import를 통해서만 밖으로 닿게 하는 이유다. Part IV의 앞쪽의 외부 함수 인터페이스 —— DOM 요소의 불투명 핸들, 경계를 넘어 마셜링되는 문자열, 함수 테이블의 인덱스로 넘겨지는 이벤트 핸들러 —— 가, 컴파일된 Mere를, 당신이 타이핑하는 텍스트 박스와 결과가 나타나는 패널에 잇는 풀이다. 그리고 Part V의 셀프 호스트 파이프라인이, 돌려지고 있는 것이다. 그것들을 합하면, 웹 페이지 위의 컴파일러가 얻어진다; 그 저마다가 필요했고, 그 어느 하나도 여기서 세워지지 않았다. 이 회는 건설이 아니라 조립이다, 그것이야말로, 잘 세워진 부품의 이음이 마지막에 가능하게 해야 할 것이다.
장난감 식이 아니라, 진짜 프로그램
이 페이지들을 통해 도는 것은, 한 줄짜리에 한정되지 않는다. 진짜 프로그램이 브라우저의 셀프 호스트 컴파일러를 끝에서 끝까지 통과한다: FizzBuzz, 리스트를 정렬하는 quicksort, JSON 렌더러, Brainfuck 인터프리터, 정규 표현식 엔진. 그 마지막 쌍은 음미할 가치가 있다 —— Brainfuck 인터프리터는 그 자신이 작은 언어 구현이므로, 브라우저는, 그것이 컴파일하는 언어로 쓰인 컴파일러에 의해 컴파일된 인터프리터를, 돌리고 있다. 메타 순환과 부트스트랩의 회에서 추상적이던 자기 참조의 탑이, 여기서 구체적이고 클릭 가능 해진다: 당신이 붙이면, Mere의 컴파일러 —— 그 자신 Mere에서 컴파일된 —— 가 당신의 프로그램을, 눈앞에서 Wasm으로 바꾼다.
정직한 scope를 시야에 두는 것이 가치 있다, 커버리지 장부가 우기듯. 이 페이지들에서 도는 파이프라인은 Mere의 고전적인 함수적 코어다 —— 파싱, Hindley–Milner 타입, 평가, 그리고 그 코어를 위한 코드 생성. Mere를 특징짓는 분석 —— 대여 모드, region, 이펙트 시스템 —— 은, 아직 OCaml 레퍼런스가 검사하고, 아직 셀프 호스트되지 않았다. 페이지는 언어의 심장부를 돌린다, 셀프 호스트되고 바이트 검증되어; 아직 그 전부를 돌리지는 않고, 어느 것이 어느 것인지를 말하는 것이, 이야기를 곧게 이야기하는 것의 일부다.
기술적 아크의 끝
이것으로, 연재의 기술적 등뼈가 완성된다. 다섯 Part에 걸쳐 언어는, 사상과 최소 코어, 명시적 메모리 모델, 명시적 이펙트 시스템, 엄밀한 일치에 유지된 네 backend로의 코드 생성, 그리고 마지막으로, 자기 자신으로 쓰이고 브라우저에서 도는 컴파일러를 얻었다. 그것은 자기 자신의 소스를 읽고, 검사하고, 돌리고, 컴파일한다 —— 그리고 그 마지막을, 당신의 눈앞에서, 열 수 있는 페이지 위에서 한다. 문서 사이트와 셀프 호스트 노력 전체를 동기 부여한 주장 —— Mere는 실제로 만들 수 있는 언어다 —— 은, 이제 믿음으로 받는 것이 아니라, 클릭할 수 있는 것이다.
이야기에 남는 것은, 더한 기구가 아니라, 세계로의 통로다. 도는 언어는, 아직 누군가 쓰는 언어가 아니다; 그것은 무언가를 뜻하는 이름, 살 곳, 정체성을 요한다. 다음 Part는, 그 건넘에 대한 것이다 —— 언어가 결국 무엇이라 불리게 되었는가, 그리고 사적인 실험이기를 그치고 공적인 것이 되는 데 무엇이 들었는가. 다음, Part VI가 열린다: 이름 “Mere”, 그리고 공개.