컴파일러를 만들 때 가장 참고하는 도서로 드래곤 북이라고 알려진 『 Compiler: Principles, Techniques and Tools』이 출간된 것은 1986년이다. Channel 9의 인터뷰에서 Turbo Pascal, Delphi, C#, TypeScript로 유명한 Anders Hejlsberg씨는 현재의 컴파일러 작성이 30년 전의 방식과 어떻게 다른지 설명했다.

 

고전적인 컴파일러의 큰 특징은 입력을 순차 처리하는 것이다. 그것은 주요 컴퍼넌트의 파이프 라인처럼 보인다.

Lexer->Parser->Type Checker->Code Generator->Emitter


근래 10년 사이에 IDE와 툴은 자동 컴파일, 리팩터링 코드 내비게이션, 정적 분석과 같은 기능을 제공하는 것이 기대되었다. Microsoft 사용자 조사에 따르면 이들 기능은 입력에 대해서 100ms 이하의 지연으로 응답해야 한다고 한다. 아니면 너무 느리다고 느끼는 것 같다. 이것은 중간 규모 크기에서 1분 이상 걸리는 프로젝트 전체의 컴파일 시간과는 아주 달랐다.

 

IDE의 고속의 피드백을 실현하기 위해서는 컴파일러가 실시간으로 실행할 수 있도록 처리를 되도록 한정할 필요가 있다. 그래서 키를 누를 때마다 프로그램 전체를 컴파일한다는 것은 선택에 할 수 없다. 대신, 컴파일러는 사용자에게 답을 제공하는 데 필요 충분한 정보를 준비한다.

 

고속 응답은 처리를 한정하여 오래된 데이터 구조를 최대한 재활용함으로써 실현된다. 사용자가 문자를 타이핑할 때마다 메모리에 있는 데이터 구조는 소거될 것으로 보지만 반응성을 높이기 위해서 변경되지 않은 것을 모두 재활용하는 것이다. 예를 들어 AST(Abstract syntax trees, 추상 구문 나무)에서는 이것이 표현하는 소스 파일이 변경되지 않으면 재이용할 수 있다.

 

데이터 구조가 변경되더라도 재활용이 가능하다. 변하지 않는 영속적 데이터 구조에서는 변경되지 않은 부분을 보유한 채 새 인스턴스를 생성하여 돌려줌으로써 변경을 취급할 수 있다. AST에게 이는 현재 노드와 루트까지 상위 노드를 변경하는 것을 의미한다. 나머지의 parse 트리는 같은 채로 새로운 인스턴스 구축에 재이용할 수 있다.

 

몇 년 전부터 IDE가 실시간으로 제공하는 기능 때문에 C# 컴파일러와 IDE 기능 구현 간의 코드가 중복되게 되었다. 이것은 Roslyn을 만든 커다란 이유의 하나였다. Roslyn은 아예 명령 라인 뿐만 아니라 IDE에서도 쓸 수 있도록 설계되고 있다.

 

마지막으로 Anders씨와 Seth씨는 현대의 컴파일러 작성에 대해서 배우기 위한 자원에 대해서 말했다. 그들은 예로서 RoslynTypeScript 프로젝트를 꼽았다.모두 오픈 소스로 GitHub에서 구할 수 있다.

 

 

출처: https://www.infoq.com/news/2016/05/anders-hejlsberg-compiler  

저작자 표시
신고
by 흥배 2016.07.01 13:30

티스토리 툴바