React Compiler와 프로그래밍 언어 이론
React Compiler(구 React Forget)가 정확히 어떤 원리로 동작하는지 궁금해졌다. 그냥 "자동으로 메모이제이션 해준다"는 수준에서 멈추고 싶지 않았다. 그래서 관련 자료들을 찾아봤고, 읽어보고 싶은 것들을 모아봤다.
오늘 읽고 싶은 것들
React Compiler 공식 문서
https://react.dev/learn/react-compiler
React 팀이 직접 쓴 문서. React Compiler가 bail-out(최적화를 포기)하는 케이스가 정리돼 있다. 외부 객체를 직접 mutation하면 컴파일러가 포기한다는 게 흥미롭다. 왜 그럴 수밖에 없는지 이 글 읽고 이해하고 싶다.
AST Explorer
코드를 입력하면 AST(Abstract Syntax Tree)로 변환해서 보여주는 도구. Babel, ESLint, TypeScript가 모두 AST 기반으로 동작한다는 건 알고 있었는데, 직접 들여다본 적은 없었다. React Compiler도 소스 코드를 AST로 파싱하는 것부터 시작하니까 이걸 먼저 눈으로 확인해보고 싶다.
Crafting Interpreters
https://craftinginterpreters.com
Robert Nystrom이 쓴 무료 온라인 책. Lox라는 언어의 인터프리터를 직접 구현하면서 배우는 방식이다. 이론보다 코드 우선이라는 접근이 마음에 든다. 컴파일러 파이프라인(Lexing → Parsing → AST → IR → Code Gen)을 손으로 만들어보면 React Compiler가 내부에서 뭘 하는지 훨씬 잘 이해될 것 같다.
React 저장소 compiler/ 디렉토리
https://github.com/facebook/react
React Compiler 소스가 compiler/ 아래에 있다. HIR(High-level IR)과 SSA(Static Single Assignment) 관련 파일들이 실제로 어떻게 구성돼 있는지 궁금하다. 이론을 좀 더 쌓고 나서 읽으면 뭔가 보이겠지 싶어서 나중으로 미뤄둔 것들이다.
Types and Programming Languages — Benjamin Pierce
MIT Press 책. 타입 시스템 이론의 표준 교재라고 불린다. TypeScript가 structural typing을 쓰는 이유, 공변/반공변 같은 개념들이 왜 그렇게 설계됐는지 제대로 이해하고 싶을 때 읽을 책으로 점찍어뒀다. 당장은 아니고, 언젠가.
TypeScript Design Goals
https://github.com/microsoft/TypeScript/wiki/TypeScript-Design-Goals
TypeScript 팀이 "soundness와 생산성 사이의 균형"을 명시적인 설계 목표로 밝혀뒀다는 걸 어디선가 읽었다. 타입 시스템이 의도적으로 sound하지 않다는 게 무슨 뜻인지, 이 문서를 직접 읽어보고 싶다.