멘토링시간에 면접질문에 대한 리스트를 받아볼 수 있었다.
그 중 눈에 띄였던 compiler와 transpiler의 차이점에 대해 정리를 해보고자한다.
컴파일(compile)=> 한 언어로 작성된 코드를 다른 언어로 변환하는 것
예를 들어서 C언어를 기계어로 옮기는 것이 그 예시가 될 수 있다.
여기서 주의해야하는 점은 고수준의 언어를 바이트 단위의 기계어로 변환해야 컴파일이라고 하는 것이 아니다.
트랜스파일(transpile)=> 한 언어로 작성된 소스 코드를 비슷한 수준의 추상화를 가진 다른 언어로 변환하는 것
예를 들어 ES6의 코드를 ES5의 코드로 변환하는 것이 그 예시가 된다.
또는 Typescript를 javascript로 변환하는 것 역시도 예시가 된다.
대표적인 Transpiler인 Babel에 접속하게 되면 다음과 같은 웹 페이지를 볼 수 있다.
"Babel is a Javascript compiler"
분명 Babel은 크로스브라우징이 가능하도록 Javascript의 코드를 사용자의 브라우저 수준에 맞게 트랜스파일링을 해주는 역할을 하는데
웹 페이지에서는 컴파일러라고 한다.
Transpiler의 다른 말은 source to source compiler라고도 한다.
즉 compile이 좀 더 큰 범주에 속하고 그 안에 트랜스 파일의 개념이 있다고 생각하면된다.
Compile=> 다른 언어로 변환하는 것
Transpile=> 한 언어에서 소스코드를 비슷한 수준의 추상화를 가진 다른 언어로 변환하는 것
그런데 Transpile에서 비슷한 수준이라는 단어가 잘 이해되지 않아 이를 좀 더 알아보았다.
추상화(abstraction)는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말한다.
-from wikipedia
즉, 추상화란 핵심적인 개념 또는 기능을 간추려 내는것.
추상화의 수준이 높다면? 많은 디테일을 숨겼다.
추상화 수준이 낮다면? 디테일이 많이 드러났다.
즉 트랜스파일은 한 언어에서 비슷한 수준의 추상화를 가진 다른 언어로 변경되는 것이고
이 말은
"트랜스파일링은 언어에서 언어로 변경되는 과정 중에, 원본 언어의 코드 복잡도를 유사한 수준의 대상 언어로 변환하는 것"
사실 이렇게 보면 compile과 transpile을 크게 구분하여 사용하기보다는
적절한 상황에 맞는 용어를 사용하면 될 거 같다.