Typescript는 JS로 전송됩니다. 그런 다음 트리 흔들림, "적음"(선택 사항) 및 배포 프로세스에서 다른 작업이 있습니다. 그러나 그런 (afaik)은 "컴파일"과 관련이 없습니다. 모든 것이 번들로 묶여지고 고도로 최적화되지만 실제로 컴파일되지는 않습니다.
컴파일 이란 언어 A 로 작성된 프로그램을 언어 B로 작성된 의미 상 동등한 프로그램으로 변환 하여 컴파일 된 프로그램을 언어 B 의 규칙에 따라 평가 (예 : B에 대한 인터프리터로 해석 )하면 동일한 결과를 산출하고 언어 A 의 규칙에 따라 원래 프로그램을 평가하는 것과 동일한 부작용 (예 : A 의 통역사와 함께 해석 ).
컴파일이란 단순히 프로그램을 A 언어에서 B 언어로 번역하는 것을 의미 합니다. 그게 전부입니다. (또한 A 와 B 가 같은 언어 일 수도 있습니다.)
어떤 경우에는 A 와 B 가 무엇인지, 컴파일러가 하는 일에 따라 특정 종류의 컴파일러에 대해 더 전문화 된 이름 이 있습니다.
- 경우 A는 어셈블리 언어로 인식되고 B는 기계 언어로 인식되고, 우리는 그것에게 전화 어셈블러 ,
- 경우 A는 기계 언어로 인식되고 B는 어셈블리 언어로 인식되고, 우리가 부르는 디스어셈블러 ,
- 경우 A는 보다 낮은 수준으로 인식 B , 우리가 부르는 디 컴파일러 ,
- 경우 와 B는 같은 언어이며, 그 결과 프로그램이 어떤 방식으로 빠르거나 가볍다, 우리는 그것을 호출 최적화 ,
- 경우 와 B는 같은 언어이며, 그 결과 프로그램이 작은, 우리가 부르는 minifier ,
- 경우 와 B는 같은 언어이며, 그 결과 프로그램이 덜 읽을 수있는, 우리가 그것에게 전화를 난독 ,
- 만약 및 B는 추상화 대략 동일한 레벨로 인식되고, 우리는 호출 transpiler 및
- 만약 및 B는 추상화 거의 같은 수준에있는 것으로 인식하고, 생성 된 프로그램의 보존은 코멘트를 포맷하고, 프로그래머 의도 그러한되어 그러므로 우리는 호출 원 프로그램과 동일한 방식으로 생성 된 프로그램을 유지하는 것이 가능하다는 것을 그것을 재 설계 도구 .
또한 이전 소스에서는 "컴파일"및 "컴파일러"대신 "번역"및 "번역자"라는 용어를 사용할 수 있습니다. 예를 들어 C는 "번역 단위"에 대해 말합니다.
"언어 프로세서"라는 용어를 우연히 발견 할 수도 있습니다. 이는 정의에 따라 컴파일러, 인터프리터 또는 컴파일러와 인터프리터 모두를 의미 할 수 있습니다.
Javascript 자체는 여전히 해석됩니다.
JavaScript는 언어입니다. 언어는 논리적 규칙 및 제한의 집합입니다. 언어는 해석되거나 컴파일되지 않습니다. 언어 는 .
컴파일과 해석은 컴파일러 나 인터프리터의 특성입니다 (duh!). 모든 언어는 컴파일러로 구현할 수 있으며 모든 언어는 인터프리터로 구현할 수 있습니다. 많은 언어에는 컴파일러와 인터프리터가 모두 있습니다. 많은 최신 고성능 실행 엔진에는 하나 이상의 컴파일러와 하나 이상의 인터프리터가 모두 있습니다.
이 두 용어는 서로 다른 추상화 계층에 속합니다. 영어가 입력 된 언어 인 경우 "interpreted-language"는 유형 오류입니다.
일부 언어에는 인터프리터 나 컴파일러가 없습니다. 전혀 구현되지 않은 언어가 있습니다. 그럼에도 불구하고 그것들은 언어이며 프로그램을 작성할 수 있습니다. 당신은 그들을 실행할 수 없습니다.
또한 모든 것이 어느 시점 에서 해석된다는 점에 유의 하십시오. 무언가를 실행 하려면 해석 해야 합니다. 컴파일은 한 언어에서 다른 언어로 코드를 번역합니다. 그것을 실행하지 않습니다. 통역 이 그것을 실행합니다. (때때로 인터프리터가 하드웨어로 구현 될 때이를 "CPU"라고 부르지 만 여전히 인터프리터입니다.)
적절한 사례 : 현재 존재하는 모든 주류 JavaScript 구현에는 컴파일러가 있습니다.
V8은 순수한 컴파일러로 시작했습니다. 자바 스크립트를 적당히 최적화 된 네이티브 머신 코드로 직접 컴파일했습니다. 나중에 두 번째 컴파일러가 추가되었습니다. 이제 두 가지 컴파일러가 있습니다. 어느 정도 최적화 된 코드를 생성하는 경량 컴파일러이지만 컴파일러 자체는 매우 빠르며 RAM을 거의 사용하지 않습니다. 이 컴파일러는 또한 프로파일 링 코드를 컴파일 된 코드에 삽입합니다. 두 번째 컴파일러는 더 무겁고 느리고 비용이 많이 드는 컴파일러이지만 훨씬 더 단단하고 훨씬 빠른 코드를 생성합니다. 또한 첫 번째 컴파일러가 주입 한 프로파일 링 코드의 결과를 사용하여 동적 최적화 결정을 내립니다. 또한 두 번째 컴파일러를 사용하여 재 컴파일 할 코드는 해당 프로파일 링 정보를 기반으로 결정됩니다. 통역사가 관여하지 않습니다. V8은 해석하지 않고 항상 컴파일합니다. 그것은 통역사도 포함합니다. (사실 요즘에는 처음 두 번의 반복을 설명하고 있다고 생각합니다.)
SpiderMonkey는 JavaScript를 SpiderMonkey 바이트 코드로 컴파일 한 다음 해석합니다. 인터프리터는 또한 코드를 프로파일 링 한 다음 가장 자주 실행되는 코드는 컴파일러에 의해 원시 기계 코드로 컴파일됩니다. 따라서 SpiderMonkey에는 두 개의 컴파일러 가 포함되어 있습니다 . 하나는 JavaScript에서 SpiderMonkey 바이트 코드로, 다른 하나는 SpiderMonkey 바이트 코드에서 원시 기계 코드로.
거의 모든 JavaScript 실행 엔진 (V8 제외)은 JavaScript를 바이트 코드로 컴파일하는이 AOT 컴파일러 모델과 해당 바이트 코드의 해석과 컴파일 사이를 전환하는 혼합 모드 엔진을 따릅니다.
댓글에 다음과 같이 썼습니다.
기계 코드가 어딘가에 관련되어 있다고 생각했습니다.
"머신 코드"는 무엇을 의미합니까?
한 사람의 기계어가 다른 사람의 중급 어이고 그 반대의 경우는 무엇입니까? 예를 들어 기본적으로 JVM 바이트 코드를 실행할 수있는 CPU가 있습니다. 이러한 CPU에서 JVM 바이트 코드 는 기본 기계 코드입니다. 그리고 x86 기계어 코드를 실행하면 해당 x86 기계어 코드 가 바이트 코드 로 해석되는 인터프리터가 있습니다.
Java로 작성된 JPC라는 x86 인터프리터가 있습니다. 네이티브 JVM CPU에서 실행되는 JPC에서 x86 기계어 코드를 실행하면… 바이트 코드와 네이티브 코드는 무엇입니까? x86 기계어 코드를 JavaScript로 컴파일하고 (예,이를 수행 할 수있는 도구가 있습니다.) 내 폰 (ARM CPU가있는)의 브라우저에서 실행하면 바이트 코드이고 기본 기계어 코드는 무엇입니까? 내가 컴파일하는 프로그램이 SPARC 에뮬레이터이고이 프로그램을 사용하여 SPARC 코드를 실행하면 어떻게됩니까?
참고 모든 언어는 추상적 인 기계를 유도하고, 그 기계에 대한 기계 언어입니다. 따라서 모든 언어 (매우 고급 언어 포함)는 기본 기계 코드입니다. 또한 모든 언어에 대한 통역사를 작성할 수 있습니다. 따라서 모든 언어 (x86 기계어 코드 포함)는 네이티브가 아닙니다.