2.2.3 트랜스파일러
언어의 백엔드를 완전하게 작성하는 일은 엄청난 작업이 될 수 있다. 기존에 타깃으로 삼을 일반적인 IR이 있으면 프런트엔드를 여기에 연결시키면 되겠지만 그렇지 않다면 너무 막막하게 느껴질 것이다. 하지만 다른 소스 언어(source language)를 마치 처음부터 중간 표현인 양 취급한다면 어떨까?
먼저 여러분의 언어에 맞게 프런트엔드를 작성한다. 그런 다음 백엔드에서 원시적인 타깃 언어로 시맨틱을 로우레벨로 낮추느라 힘을 빼는 대신, 여러분의 언어만큼 하이레벨인 다른 언어에서도 사용 가능한 소스 코드 문자열을 생성한다. 그리고 그 언어의 기존 컴파일 도구를 이용해서 산에서 내려와 실행할 수 있는 뭔가로 탈출하는 것이다.
이것을 소스-대-소스 컴파일러(source-to-source compiler) 또는 트랜스컴파일러(transcompiler)라고 한다. 브라우저 실행을 위해 자바스크립트로 컴파일하는 언어들이 각광을 받으면서 트랜스파일러12가 핫하게 떠오르기 시작했다.
최초의 트랜스컴파일러는 하나의 어셈블리어를 다른 어셈블리어로 옮기는 일을 했지만, 오늘날 대부분의 트랜스파일러는 하이레벨 언어에서 작동된다. 유닉스(UNIX)가 입소문을 타며 갖가지 잡다한 머신으로 퍼져 나간 이후, 출력 언어로 C 코드를 만들어내는 오랜 컴파일러의 전통이 시작됐다. C 컴파일러는 유닉스가 있는 곳이면 어디든 사용할 수 있고 코드 효율이 우수했기 때문에 자신이 만든 언어를 여러 아키텍처에서 실행하기에 C만큼 좋은 타깃 언어도 없었다.