TypeScript 타입시스템으로 DOOM을 실행하다 (영상 요약)

1
post-thumbnail

핫한 이슈라 그런지 조회수 많군요 감사합니다 ㅎㅎ


원본 영상: https://www.youtube.com/watch?v=0mCsluv5FXA

정말 말도 안되는 영상이 올라와서 번역해봅니다.


TypeScript 타입 시스템으로 Doom을 실행하다

1993년 출시된 고전 게임 DoomTypeScript 타입 시스템에서 실행될 수 있을까?

누군가에게는 황당한 질문처럼 들릴 수도 있지만, 한 개발자는 1년 이상의 연구 끝에 순수 TypeScript 타입만을 이용해 Doom을 실행하는 데 성공했다. 이 프로젝트는 무려 3조 5천억 줄(3.5 trillion lines)의 타입 코드177TB의 데이터를 처리하는 타입 체크 과정을 거쳐야 했으며, 12일간 TypeScript 컴파일러(TSC)가 연속으로 실행되어야 했다.

이것이 가능한 일일까? 그리고 어떤 과정을 거쳐 이 목표를 달성했을까?
이번 글에서는 해당 프로젝트의 주요 내용을 소개하고, TypeScript 타입 시스템으로 가상 컴퓨터를 구현하고 Doom을 실행하는 방법에 대해 살펴보겠다.


TypeScript 타입 시스템으로 Doom을 실행한 개발자

이 프로젝트를 진행한 개발자는 "타입 챌린지 해결"을 전문으로 하는 유튜브 채널
Michigan TypeScript (구독자 약 1만명)이다. 300개의 TypeScript 타입 챌린지를 해결한 후, 그는 "Doom이 타입 시스템에서 실행될 수 있을까?"라는 의문을 품었다.

처음에는 단순한 호기심에서 출발했지만, 프로젝트는 점점 더 깊이 빠져들었고, 결국 세계에서 가장 큰 TypeScript 코드베이스를 만들게 되었다.


프로젝트의 규모: "이제까지 존재한 가장 거대한 TypeScript 코드"

이 프로젝트가 얼마나 거대한지 감을 잡기 위해, 일반적인 TypeScript 프로젝트와 비교해 보자.

  • 일반적인 TypeScript 앱: 약 20만 ~ 50만 개의 타입 인스턴스
  • Node.js의 DefinitelyTyped 패키지: TypeScript에서 가장 큰 타입 패키지 중 하나
  • DefinitelyTyped 전체 패키지: Node.js를 포함한 모든 타입 패키지를 합친 것

그리고...

  • Doom 실행을 위해 작성한 TypeScript 타입 코드:
    DefinitelyTyped 전체 패키지보다 몇 배 더 큰 규모

이 프로젝트는 단순히 "TypeScript로 Doom을 돌려보자"라는 개념을 넘어서, 순수 타입으로 WebAssembly 가상 머신을 구현하고, 이를 통해 Doom을 실행하는 것을 목표로 했다.


Doom을 실행하기 위해 만든 TypeScript 타입 기반 가상 머신

이 프로젝트의 핵심은 TypeScript 타입 시스템만을 이용한 가상 컴퓨터 구현이다.
즉, JavaScript 코드 실행 없이, 타입 시스템 자체가 프로그램 실행을 담당하는 구조를 만들어야 했다.

구현한 기능들

이 가상 컴퓨터는 다음과 같은 기능을 갖추고 있다.

  1. RAM 및 디스크 스페이스:

    • 메모리 관리 시스템을 구축해야 했으며, 실제 RAM처럼 동작하는 구조가 필요했다.
  2. 콜 스택 & 서브루틴 & 메모리 포인터:

    • 웹 어셈블리(WASM) 실행을 위한 콜 스택 및 서브루틴 호출을 타입 레벨에서 처리.
    • 메모리 주소 관리 및 포인터 시스템을 구축.
  3. 116개의 WebAssembly 명령어 구현:

    • Doom 실행을 위해 필요한 116개의 WASM 명령어를 타입 시스템에서 직접 구현.
    • CPU의 레지스터, 산술 연산, 제어 흐름 등을 타입으로 처리.
  4. 타입 기반 CPU 캐시 & 가비지 컬렉터:

    • 실제 CPU처럼 동작하는 캐시 시스템 구축.
    • 가비지 컬렉션을 위한 런타임 최적화.
  5. 런타임 메모리 압축 & 데드 코드 제거:

    • 실행 속도를 높이기 위해 메모리를 압축하고, 불필요한 타입을 제거하는 최적화 수행.
  6. 실시간 디버깅 & 스택 트레이스:

    • 타입 시스템만을 이용한 예외 처리 및 디버깅 도구 구현.
    • 실행 중 오류 발생 시, 타입 기반 코어 덤프 시스템으로 상태 분석 가능.
  7. Doom 그래픽 프레임 렌더링:

    • TypeScript 타입을 이용해 320x200 해상도의 Doom 프레임을 픽셀 단위로 생성.
    • 최종 출력은 TypeScript 객체로 표현되며, 각 값이 한 줄의 픽셀 정보를 포함.

TypeScript 컴파일러 한계를 돌파하는 방법

이 프로젝트를 진행하면서 TypeScript 컴파일러(TSC)의 여러 한계를 극복해야 했다.
기본적으로 TypeScript 타입 시스템에는 스택 깊이 제한, 타입 크기 제한, 재귀 제한 등이 존재한다.

이를 해결하기 위해 컴파일러 자체를 수정하여 다음과 같은 제한을 제거했다.

  • 타입 스택 깊이 제한 해제
  • 튜플 및 유니온 최대 크기 제한 해제
  • 무한 재귀 감지 기능 제거
  • TypeScript 타입 비교 깊이 제한 제거

이 과정에서 TypeScript 타입 체크러는 100GB 이상의 메모리를 소비했고,
잘못된 코드를 작성하면 무한 루프에 빠져 시스템이 정지하는 문제가 발생하기도 했다.


Doom을 실행하는 과정

이 프로젝트의 최종 목표는 "Doom을 실행하는 것이 아니라, Doom이 실행될 수 없는 이유를 찾는 것"이었다.

그러나, 모든 한계를 극복하고 결국 Doom을 실행하는 데 성공했다.
그 과정에서 다음과 같은 극한의 최적화를 수행해야 했다.

  1. 처음 계산된 실행 시간: 3개월 (1.25PB 데이터 처리 필요)

    • 최적화 후 12일(177TB 데이터 처리)로 단축
  2. TypeScript 컴파일러가 초당 2,000만 개의 타입 인스턴스를 평가

  3. 최종 출력: TypeScript 타입 시스템이 생성한 픽셀 데이터


결론: 미친 도전이 만들어낸 결과

"TypeScript 타입 시스템으로 Doom을 실행한다"는 말은 처음에는 불가능한 농담처럼 들릴 수도 있다.
그러나, 이 프로젝트는 그것을 현실로 만들었다.

이 과정에서 개발자는 1년 동안 매일 18시간씩 작업하며 새로운 기술을 익히고, 기존의 한계를 깨뜨리는 방법을 배웠다.
결과적으로, 세계에서 가장 큰 TypeScript 코드베이스를 만들고, 타입 시스템의 극한을 실험하는 프로젝트를 완수했다.


추가 자료 및 영상

이 프로젝트에 대한 상세한 설명은 유튜브 영상에서 확인할 수 있다.

이 미친 도전의 결과가 궁금하다면, 직접 확인해 보자! 🚀🔥

https://www.youtube.com/watch?v=0mCsluv5FXA


댓글 반응

대충 의역하자면...

"그는 요즘 회사들이 원하는 레벨의 신입 개발자입니다."

0개의 댓글

관련 채용 정보