컴파일러는 우리가 작성한 프로그래밍어를 하드웨어가 읽을 수 있게 기계어로 바꿔준다.
이전에 Cmpiler와 interpreter의 차이에 대해 배운적이 있다.
간단하게 넘어가자.
트랜스파일러는 한 언어에서 비슷한 추상화 수준의 언어로 바꿔주는 녀석이다...
예를들어 ES6의 JS를 ES5의 JS로 바꿔준다거나, JSX를 JS로 바꿔주는 기능을 한다.
이를 Source-to-source compiler라고도 한다.
그러니까, 컴파일러의 한 종류가 트랜스파일러인 것이다.
요론 느낌...
구분 | 컴파일러 (Compiler) | 트랜스파일러 (Transpiler) |
---|---|---|
정의 | 고급 언어 → 저급 언어 (예: 기계어)로 변환 | 한 고급 언어 → 다른 고급 언어로 변환 |
변환 대상 | C, C++, Java → 기계어 또는 바이트코드 | ES6 → ES5, JSX → JS 등 |
목적 | 실행 가능한 바이너리 생성 | 다른 환경에서도 실행 가능한 코드 생성 |
출력 형식 | 바이너리, 바이트코드 | 다른 고급 언어의 소스 코드 |
Babel은 JSX를 JS로 변환하거나, JS최신문법을 이전 문법으로 변환하는 역할을 담당한다.
위 설명대로라면, Babel은 Transpiler여야한다. 그러나 공식문서에 들어가면 다음과 같은 문구가 우리를 반긴다
이는 Transpiler는 일종의 특수한 Compiler역할을 하기 때문이다.
결국 Babel은 Transpiler이자 특수한 Compiler다.
SWC는 애초에 Speedy-Web-Compiler의 약자다. 따라서 SWC또한 특수한 컴파일러다.
또한 Next.js와 Vite에서 Babel을 대체하여 사용된다.
왜냐하면 JS로 작성된 Babel보다 Rust로 작성된 SWC의 속도가 더 빠르다.
병렬처리도 지원하고, Typescript도 자체적으로 트랜스파일링(컴파일)해준다.
타입스크립트는 JS로 변환되어 실행된다. 이를 보통 컴파일한다고 말하는데, 사실 비슷한 추상화 수준의 언어로 변경하는 것이기에...트랜스파일이 조금 더 적합하다.
그러나 TS를 만들어낸 마이크로 소프트에서는 컴파일이라는 단어를 사용한다.
출처 : https://learn.microsoft.com/ko-kr/visualstudio/javascript/compile-typescript-code-npm?view=vs-2022
또한 실제로 node진영에서는 tsc
라는 타입스크립트 컴파일러가 ts에서 js로 변환한다.
기능적으로는 transpiler지만, 형식은 compiler다...
- 트랜스파일러는 컴파일러의 한 종류다.
- Babel,SWC는 컴파일러다.
- 구분짓는게 크게 의미있지 않다.
대부분 공식문서는 compiler라는 단어를 사용한다. 간혹 trasnpiler라는 단어도 쓰긴 하는데...
굳이 구분지어서 사용하는 의미가 있나 싶다.