컴파일과 트랜스 파일


92

차이점을 검색하는 동안 다음과 같은 정의를 발견했습니다.

컴파일 은 한 언어로 작성된 소스 코드를 다른 언어로 변환하는 일반적인 용어입니다.

트랜스 파일링 은 한 언어로 작성된 소스 코드를 비슷한 수준의 추상화를 가진 다른 언어로 변환하는 특정 용어입니다.

추상화가 무엇인지 이해합니다.

그러나 위의 정의에서 "유사한 추상화 수준"은 무엇을 의미합니까? 그리고 언어의 추상화 수준을 어떻게 찾을 수 있습니까?



답변:


142

위에서 인용 한 정의는 초보자가 완전히 이해하기에는 너무 일반적이므로 실제로 볼 수있는 것으로 단순화하겠습니다.

컴파일러 : 한 언어로 작성된 소스 코드를 다른 언어로 (또는 여러 개) 생성하는 프로그램을 설명하는 포괄적 인 용어입니다. 실제로 우리는 주로이 용어를 사용하여 C 코드를 입력으로 받아 바이너리 실행 파일 (머신 코드)을 출력으로 생성하는 gcc와 같은 컴파일러를 설명합니다.

트랜스 파일러 는 소스 간 컴파일러라고도합니다. 따라서 본질적으로 소스 코드 파일을 가져 와서 다른 소스 코드 파일 로 변환하는 컴파일러의 하위 집합입니다. 다른 언어의 이나 동일한 언어의 다른 버전으로 . 출력은 일반적으로 사람이 이해할 수 있습니다. 이 출력은 여전히 ​​컴파일러 나 인터프리터를 거쳐야 머신에서 실행될 수 있습니다.

트랜스 파일러의 몇 가지 예 :

  1. Emscripten : C / C ++를 JavaScript로 트랜스 파일
  2. Babel : ES6 + 코드를 ES5로 트랜스 파일 (ES6 및 ES5는 JavaScript 언어의 다른 버전 또는 세대 임)

이제 "유사한 추상화 수준"이란 무엇을 의미합니까? 내가 소스 파일로 컴파일 / 트랜스 파일한다고 말했듯이 어셈블리 언어도 소스 파일이므로 gcc도 트랜스 파일러라고 주장 할 수 있습니다. 그래서,이 주장은 이와 유사한 추상화 수준이 공허하는 것입니다.

언어를 하위, 중간 및 상위 수준으로 분류한다는 개념은 기계 / 아키텍처의 실제 작업에서 제공하는 추상화 수준을 기반으로합니다.

어셈블리와 같은 하위 수준의 언어는 프로세서 아키텍처에 매우 가깝습니다. 즉, 프로세서마다 다른 명령이 있습니다. C / C ++ / Java / JavaScript는이 모든 것을 추상화하여 더 많은 추상화를 제공합니다.

따라서 트랜스 파일러는이 추상화 측면에서 시작한 언어에 더 가까운 언어로 컴파일됩니다 (또는 중하 위 수준의 언어 래더에서 해당 언어 수준에 더 가까운).

도움이 되었기를 바랍니다!


9
"트랜스 파일러의 몇 가지 예 :"--- babel은 스스로를 컴파일러라고 부릅니다. 트랜스 파일러와 컴파일러의 분리는 실제로 인공적입니다.
zerkms

13
@zerkms 내가 말했듯이 트랜스 파일러는 컴파일러의 하위 집합입니다.
tapananand dec

1
한 가지 추가하고 싶습니다. 여기서 자연어에 대해 이야기하고 있습니다. 따라서 모호한 정의가 예상됩니다. 나는 컴파일러가 일을 읽기 어렵게 만드는 동안 트랜스 파일러의 출력을 "읽기 쉬움"이 예전과 비슷할 것으로 기대합니다. 따라서 Webpack / npm은 컴파일러이므로 출력을 읽고 싶지 않습니다. (적어도 당신은 예를 들어 .vue 파일에 대한 "로더"를 추가 할 때.
사무엘 Åslund

1
의견 : 정의는 다음과 같아야한다고 가정합니다. 컴파일 : 언어-> 하위 수준 언어. 번역 : 언어-> 같은 수준의 언어.
Deji

3
@Deji 반드시 동일한 수준의 언어는 아니지만 유사한 추상화 수준의 언어입니다.
tapananand

33

여기에 대답하는 일종의 설명적인 방법이 있습니다.

추상화 계층을이 예제로 생각하면 :

(1) CPU-level (actual logic gates on the CPU)
(2)machine code
(3)assembly code
(4)[C/C++, JVM/bytecode]
(5)[JavaScript, Python]

컴파일러는 더 낮은 수준 (더 낮은 숫자)으로 이동합니다. 트랜스 파일러는 같은 번호의 한 언어 (또는 언어 버전)에서 다른 언어로 전환합니다.


1
"추상화 수준"목록의 출처가 궁금한가요?
zerkms

그냥 무작위 실례, 나는 처음 두 감상 TBH 좀 알고,하지만 난 더 이상 목록을 원 : P
Araymer

2
나는 그것을 좋아하고 그것이 그런 "공식적인"분류라면 정말 멋질 것입니다. 도구가 없으면 하나 또는 다른 범주에 도구 (번역자)를 넣는 것이 어렵습니다. 예 : javac컴파일러인지 아닌지.
zerkms

2

나는 타파 나와 대답에 거의 동의하지만 ...


정의

단어는 "만들어진"것이므로 목적이 있습니다. 그리고 이것은 또한 시간에 따라 변합니다.

우리는 이제 코드를 소스 코드와 "더 유사한"다른 코드로 변환하는 컴파일러를 지정하기 위해 트랜스 파일러를 사용하는 경향이 있습니다. 그리고 둘 다 같은 맥락에서 언급 될 때 대부분을 구별하는 데 사용됩니다 (다시 말하지만 대부분 트랜스 파일 언어가 적어도 한 번 더 컴파일되어야 함을 의미 함)


그래서 모든 것이 매우 주관적입니다. 이 글을 쓰는 시점 :

  • Java 세계에서 왔기 때문에 CoffeeScript / TypeScript 트랜스 파일러를 호출하여 결과 코드가 원래 코드보다 더 효율적이지 않음을 나타낼 수 있습니다.
  • CoffeScript 문서에 따르면 컴파일러라고하고 babel은 트랜스 파일러입니다. CoffeeScript는 매우 유사하지만 Javascript가 아니라고합니다. 그것은 바벨이 생산하는 것이므로 적어도 그것의 버전은 아닙니다.
  • Babel 은 스스로를 컴파일러라고 부릅니다.

파지 트

따라서 transpile 은 현재 더 이상 거의 사용되지 않으며 두 컴파일러를 구분하기 위해서만 사용됩니다.

컴파일이 그것보다 훨씬 더 복잡하고 (동일 / 고 / 저 / 저 언어, 버전 등) 단어가 더 이상 유용하지 않은 것 같기 때문에 아마도 개념으로 사라질 것입니다 ( "transpilers"는 이제 유비쿼터스입니다).


2

예 : TypeScript (유형 안전 검사 기능이있는 JavaScript의 Microsoft 상위 집합)는 다른 유형의 브라우저에서 실행할 수있는 JavaScript 코드로 변환됩니다.

https://en.wikipedia.org/wiki/Microsoft_TypeScript "Microsoft TypeScript는 Microsoft에서 개발 및 유지 관리하는 오픈 소스 프로그래밍 언어입니다. JavaScript의 엄격한 구문 상위 집합이며 선택적 정적 타이핑을 언어에 추가합니다.

TypeScript는 대규모 애플리케이션 개발을 위해 설계되었으며 JavaScript로 트랜스 컴파일됩니다. [5] TypeScript는 JavaScript의 상위 집합이므로 기존 JavaScript 프로그램도 유효한 TypeScript 프로그램입니다. TypeScript는 클라이언트 측 및 서버 측 (Node.js) 실행을위한 JavaScript 애플리케이션을 개발하는 데 사용될 수 있습니다. "


"typescript 컴파일러"(또는 tsc) 도구가 있는데, 그 이름은 TypeScript가 트랜스 파일 되지 않고 컴파일 된다는 것을 의미합니다 .하지만이 도구는 TypeScript를 기본 하드웨어와 동일한 수준의 추상화 인 Javascript로 변환합니다. TypeScript는 컴파일 또는 트랜스 파일됩니까?
Alex McMillan

@AlexMcMillan TypeScript는 javascript의 상위 집합이기 때문에 COMPILED이므로 javascript로 컴파일됩니다.
Araymer

@Araymer 컴파일과 트랜스 파일의 차이점을 이해하십니까? TS가 컴파일되지 않았기 때문입니다. JS도 마찬가지입니다.
Alex McMillan

네 저도 그렇습니다. TS는 JS의 상위 집합이기 때문에 더 높은 수준의 추상화로 간주되므로 "컴파일 됨"이라고합니다. 컴파일 된 JS는 정상으로 해석됩니다. 따라서 TS를 찾는 경우 가장 많이 논의되는 단일 주제는 "컴파일"입니다. 그러나 번역과 편집의 경계에는 공식적인 양적 정의가 없습니다. 꽤 부끄러워서 컴파일 된 내용에 대한 귀하의 의견 (제작자와는 다른)은 귀하의 의견 일뿐입니다.
Araymer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.