Vercel의 Scriptc - 바이너리에 JavaScript 엔진을 포함하지 않는 TypeScript 네이티브 컴파일러

1 hour ago 4

scriptc는 일반 TypeScript를 Node·V8·JavaScript 엔진 없이 실행되는 소형 네이티브 바이너리로 컴파일하며, 실제 TypeScript 컴파일러의 타입 검사와 Node 동작 호환성을 유지함 코드 구조별로 정적 컴파일 가능 여부를 판정해 기본적으로 네이티브 코드로 만들고, --dynamic을 선택한 경우에만 quickjs-ng로 npm 패키지의 JavaScript와 any 타입 코드를 실행함 클래스·제네릭·async/await·예외·정규식부터 Node 서버 API, fetch, npm 의존성까지 지원하며, 미지원 구문은 오류 코드·코드 프레임·수정 힌트와 함께 거부함 800개 이상의 프로그램을 Node와 네이티브 바이너리에서 실행해 출력과 종료 코드를 비교하고, AddressSanitizer와 참조 횟수 감사로 메모리 오류를 검사함 Apple M 시리즈 측정에서 시작 시간은 약 2.4ms, 정적 바이너리는 170~200KB, 일반적인 RSS는 1~4MB이며, 동적 모드와 내장 의존성을 포함하면 바이너리는 약 3MB가 됨 정적 컴파일 모델 별도 방언이나 어노테이션 없이 기존 TypeScript를 사용하며, tsconfig.json의 검사 엄격도와 TypeScript의 실제 es2025 라이브러리를 적용함 프로젝트에 @types/node가 있으면 함께 타입 검사함 lowering이 없는 도달 가능 코드는 정확한 진단을 내고 컴파일을 중단함 scriptc coverage는 분석한 문장 수, 정적으로 컴파일되는 비율, 차단 요소와 오류 코드를 보여줌 예시에서는 4,481개 문장 중 4,451개인 99% 가 정적으로 컴파일됨 실행 방식은 세 단계로 명시적으로 구분됨 정적 컴파일: 기본 모드이며 JavaScript 엔진 없이 네이티브 코드로 변환함 동적 실행: --dynamic을 지정하면 약 620KB의 quickjs-ng를 포함해 npm 패키지의 JavaScript와 any 타입 코드를 실행함 정적 코드로 넘어오는 모든 값을 런타임에 검증함 선언된 타입과 값이 다르면 메모리를 손상시키지 않고 잡을 수 있는 TypeError를 던짐 거부: 처리할 수 없는 코드는 오류 코드, 코드 프레임, 대체로 수정 힌트를 제공하며 조용히 잘못 컴파일하지 않음 지원하는 TypeScript와 표준 라이브러리 언어 기능은 단일 상속 클래스와 동적 디스패치, 클로저, 제네릭 단형화, 판별 유니온, 구조 분해, spread...

Read Entire Article