[compiler-construction] 컴파일과 트랜스 파일

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

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

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

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

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



답변

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

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

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

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

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

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

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

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

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

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


답변

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

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

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

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


답변

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


정의

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

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


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

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

파지 트

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

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


답변

예 : 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 애플리케이션을 개발하는 데 사용될 수 있습니다. “


답변