swc 비하인드 스토리: 2015년 ~ 2017년

생각을 글로 많이 적어두려했는데 좀 부끄러워서 사람들이 많이 궁금해하는 swc 관련 바하인드 스토리라도 적기로 했다. 아마 빠른 시일 내에 글도 생각을 정리한 글도 몇개 적을 것이다.

swc를 만들게 된 건 어느 날 웹 개발을 하다가 내가 에디터에서 저장을 한 뒤 브라우저 화면에 변경사항이 반영될 때까지 너무 오랜 시간이 걸려서 화가 났기 때문이다. 이 얘기는 여러 번 해서 아는 사람이 꽤 된다. 컨퍼런스 발표에서도 얘기했는데, 그거 아니라도 만난 사람들마다 이걸 물어보더라. 그런데 사람들이 모르는 비하인드 스토리가 있다.

내가 swc 레포를 만들고 첫 PR을 만든 건 2017년 12월이다. 그런데 babel에 화났던 시점이나, 대체하는 툴을 만들겠다고 결심한 건 훨씬 이전이다. 결심만 했다가 작업을 나중에 시작한 것 아닌가 할 수도 있는데, 아니다. 언어들 비교하면서 라이브러리 조사한 것 정도야 뭐 공부로 봐줄 수도 있지만, 난 2015년부터 시작해서 파서 작업과 incremental computation 시스템 작업을 여러 번 시도했다. 참고로 incremental computation 시스템을 구현하려고 시도한 건 성능 때문이다. 근데 그 당시는 그다지 진지하지 않았고, 열심히 작업한 것도 아니어서 PR까지 가지 못했을 뿐이다. 왜 PR까지 가지 못했냐를 얘기하려면 당시 내 상황을 알아야하는데, 이론적인 지식, 코딩 능력, 목표가 전부 문제였다.

우선 이론적인 지식에 대해서 얘기하자면, 난 지금도 컴파일러 이론을 잘 모른다. 거짓말이 아니고 진짜 모른다. 지금은 짬이 좀 있으니까 작업에 쓸 일이 있었던 것들은 알지만, 파싱 이론 같은 경우 지금도 기초적인 기호도 읽을 줄 모른다. 프로그래밍 언어학 수업도 2학년, 그니까 2019년에 수강은 했는데, 수업은 안 듣고 그 수업 시간에 swc 개발했다. 이미 그때엔 swc용 파서가 잘 작동하고 있었기에 시간이 아까웠다. 이론적인 지식이 없었던 탓에 다른 사람의 코드를 보지 않고 파서를 처음부터 직접 짠다는 선택지가 없었다.

코딩 능력 같은 경우 당시의 목표와 함꼐 얘기해야 한다. 내 목표는 어디까지나 재미였다. 그리고 웹 개발하다가 babel이 불편해서 직접 만들겠다고 결심할 정도로 불편하게 개발하는 걸 싫어했다. 이 두개가 만난 덕분에, 파서를 만들다가 파서 라이브러리가 불편하다고 느끼면 아름다운 파서 라이브러리를 설계하는 일에 열중했다. 그런데 그때의 나는 직접 짜는 것과 성능이 비슷한데 사용하면 코드가 우아해지는 아름다운 API를 가진 파서 라이브러리 같은 걸 만들 능력이 없었다. 덕분에 파서를 구현하려던 시도는 전부 파서 라이브러리를 설계하다가 흥미를 잃는 것으로 끝났다. incremental computation 역시 마찬가지였다. 이것 역시 더럽게 어려운 주제다. 그런데 내가 만족할만큼 아름다운 API를 가졌지만 성능 저하도 없는 그런 라이브러리는 당연히 존재하지 않았기에 이쪽 시도 역시 매번 라이브러리 설계 시도로 끝이 났다. 이게 그 시절 내가 레포조차 파지 않은 이유이다.

그런데 수능이 끝나고나서는 진지하게 시도해보기로했다. 진지한 목표가 생긴만큼 어느 정도의 불편은 감수할 수 있었다. 그럼에도 이론적 지식이 눈곱만큼도 없었기에 파서 제너레이터부터 시도했다. 파서 제너레이터는 기초적인 사용엔 이론적 지식이 별로 필요하지 않다. LL이었는지 LR이었는지 모호한 문법이 있을 때 어떻게 모호성을 제거하는지 알아야하긴 하는데, 난 모호성 제거 단계까지 가지 못했다. 이론적인 지식 없이도 할 수 있는 데까지 문법을 표현한 시점에서 이미 컴파일이 안 됐기 때문이다. 이유는 자바스크립트 문법이 너무 복잡해서다. lalrpop으로 파서를 생성했더니 생성된 파일이 18만줄이나 돼서 컴파일이 극도로 느렸다. 디버그 빌드에 1시간 6분이 걸렸던 걸로 기억하는데, 그거 보고 바로 파서 제너레이터 사용을 포기했다. 그리고 손으로 구현하기로 했다. 며칠 열심히 작업하다가 2017년 12월 23일에 첫 PR을 만들었다. lalrpop 같은 걸 시도할 때 PR을 만들지 않은 것은 저런 툴들이 자바스크립트의 복잡한 문법을 다 표현할 수 있다는 확신이 없었기 때문이다. 파서를 처음부터 설계할 능력은 없었기에 babel의 소스코드를 참고했다. 그리고 그 작업이 생각보다 잘 돼서 재미가 제대로 붙었다. 참고로 첫 PR을 마무리한 건 2018년 1월 12일이다.

swc는 이렇게 시작된 프로젝트이다. 만들겠다고 결심한지 한달만에 뚝딱 파서를 만든 게 절대 아니다. 개인적으로는 진지한 결심을 너무 늦게 내린 걸 후회한다. 충분히 빨랐다는 건 알지만, 난 swc를 진지하게 만들기 전까지 코딩을 내 진로로 여기지 않았다. 그래서 의대를 가려고 했었다. 그런데 swc를 만들면서 내 실력에 자신감이 생겼고, 코딩을 내 진로로 여기게 됐다. 만약 내가 의대를 노리지 않았다면 내 인생 최악의 암흑기는 없었을 것이다. 이 암흑기에 대해선 나중에 기회가 된다면 얘기해보겠다.