사전 컴파일
Ahead-of-time compilation| 프로그램 실행 |
|---|
| 일반적인 개념 |
| 코드의 종류 |
| 컴파일 전략 |
| 주목할 만한 런타임 |
| 주목할 만한 컴파일러 및 툴 체인 |
컴퓨터 과학에서 사전 컴파일(AOT compilation)은 실행 시 필요한 작업량을 줄이기 위해 프로그램을 실행하기 전에 (종종) 상위 수준의 프로그래밍 언어를 하위 수준의 언어로 컴파일하는 행위입니다.
대부분의 경우 C나 C++와 같은 상위 수준의 프로그래밍 언어 또는 Java 바이트 코드 또는 같은 중간 표현과 관련되어 있습니다.NET Framework Common Intermediate Language(CIL; 공통 중간 언어) 코드를 네이티브(시스템 의존) 머신 코드로 변환하여 생성된 바이너리 파일을 표준 네이티브 컴파일러와 같이 네이티브하게 실행할 수 있도록 합니다.이 특정 컨텍스트에서 사용되는 경우 JIT(Just-In-Time) 컴파일과 반대되는 경우가 많습니다.
좀 더 일반적으로 말하면, AOT 컴파일의 대상 언어는 반드시 네이티브 머신 코드에 고유한 것이 아니라 오히려 임의로 정의됩니다.일부 학술논문에서는 이 단어를 Java 바이트[1] 코드를 C로 컴파일하는 행위 또는 최적화 파이프라인이 [2]실행되는 타이밍을 의미하기 위해 사용합니다.학술[3] 프로젝트에서는 이 단어를 사용하여 JavaScript를 머신에 따라 최적화된 IR for V8([4]JavaScript 엔진) 및 머신에 의존하지 않는 JavaScriptCore [5]바이트 코드로 사전 컴파일하는 작업을 의미합니다.일부 산업용 언어 구현(Closure 및 Hermes JavaScript[7] 엔진[6] 등)에서는 소스 언어를 VM 고유의 바이트 코드로 미리 컴파일하는 작업을 의미하기 위해 이 단어를 사용합니다.Angular(웹 프레임워크)는 HTML 템플릿과 TypeScript를 JavaScript로 [8]변환하는 것을 의미하기 위해 이 단어를 사용합니다.
실제로 모든 정적 컴파일은 기술적으로 미리 실행되므로 이러한 사전 컴파일을 통해 얻을 수 있는 성능상의 이점을 강조하기 위해 이 특정 문구가 자주 사용됩니다.따라서 Java에서 Java로 바이트 코드를 컴파일하는 행위는 최적화가 아닌 필수 조건이기 때문에 AOT라고 부르는 경우가 거의 없습니다.
런타임 오버헤드 감소
중간 표현으로 컴파일할 수 있는 관리 코드 런타임의 일부 프로그래밍 언어에서는 JIT(Just-in-Time) 컴파일을 사용합니다.이것은 중간 코드가 실행되는 동안 중간 코드를 네이티브 실행을 위해 기계 코드로 컴파일하여 응용 프로그램의 성능을 저하시킬 수 있습니다.사전 컴파일을 사용하면 실행 중이 아니라 실행 전에 이 단계를 수행할 필요가 없습니다.
네이티브 머신 코드 또는 기타 정적 VM 바이트 코드에 동적으로 입력된 언어를 사전에 컴파일할 수 있는 것은 한정된 경우뿐입니다.[citation needed]예를 들어, Erlang 언어용 High Performance Erlang Project(HiPE) AOT 컴파일러에서는 고급 정적 유형 재구성 기술과 유형 사양이 이를 가능하게 합니다.
AOT가 컴파일된 프로그램과 라이브러리를 사용하는 대부분의 상황에서는 런타임 환경의 유용한 부분을 삭제하여 디스크 공간, 메모리, 배터리 지속 시간 및 시작 시간(JIT 웜업 단계 없음)을 절약할 수 있습니다.이 때문에, 임베디드 기기나 모바일 기기에서도 편리합니다.
퍼포먼스 트레이드오프
AOT 컴파일러는 복잡하고 고도의 코드 최적화를 실행할 수 있습니다.이는 대부분의 JITing에서 비용이 너무 많이 드는 것으로 간주됩니다.반면 AOT는 런타임프로파일 가이드 최적화(PGO), 의사 상수 전파, 간접 가상 함수 인라인화 등 JIT에서 가능한 일부 최적화를 수행할 수 없습니다.AOT는 타깃 아키텍처로 컴파일해야 하며, JIT는 소프트웨어가 출시된 지 몇 년이 지난 후에도 실행 중인 실제 CPU를 최대한 활용하기 위해 코드를 컴파일할 수 있습니다.
또한 JIT 컴파일러는 코드를 가정함으로써 핫 코드를 추측적으로 최적화할 수 있다.생성된 코드는 나중에 추측 가정이 틀렸다고 판명될 경우 최적화될 수 있습니다.이러한 작업을 수행하면 코드가 적응형 최적화에 의해 다시 최적화될 때까지 실행 중인 소프트웨어의 성능이 느려집니다.AOT 컴파일러는 이러한 가정을 할 수 없으며 컴파일 시 가능한 한 많은 정보를 추론해야 합니다.어떤 타입이 어떤 방식을 사용할지 알 수 없기 때문에 덜 전문화된 코드에 의존해야 한다.이러한 문제는 프로파일 가이드에 의한 최적화를 통해 해결할 수 있습니다.그러나 이 경우에도 생성된 코드는 JIT 컴파일러처럼 변화하는 런타임 프로파일에 동적으로 적응할 수 없습니다.
스토리지 트레이드오프
이 섹션은 확장해야 합니다.추가해서 도와주시면 됩니다. (2021년 5월) |
「 」를 참조해 주세요.
- asm.js 컴파일러(JavaScript)
- 바톡(CIL)
- Excelsior JET(자바)
- Java용 GNU 컴파일러
- IL2CPU(CIL)
- 네이티브 이미지 생성기(CIL)
- RubyMotion(루비)
레퍼런스
- ^ Jung, Dong-Heon; Park, Jong Kuk; Bae, Sung-Hwan; Lee, Jaemok; Moon, Soo-Mook (2006-10-22). "Efficient exception handling in Java bytecode-to-c ahead-of-time compiler for smbedded systems". Proceedings of the 6th ACM & IEEE International conference on Embedded software. EMSOFT '06. Seoul, Korea: Association for Computing Machinery: 188–194. doi:10.1145/1176887.1176915. ISBN 978-1-59593-542-7.
- ^ Chambers, Craig (2002-01-14). "Staged compilation". Proceedings of the 2002 ACM SIGPLAN workshop on Partial evaluation and semantics-based program manipulation. PEPM '02. Portland, Oregon: Association for Computing Machinery: 1–8. doi:10.1145/503032.503045. ISBN 978-1-58113-455-1.
- ^ Zhuykov, R.; Sharygin, E. (2017-01-01). "Ahead-of-time compilation of JavaScript programs". Programming and Computer Software. 43 (1): 51–59. doi:10.1134/S036176881701008X. ISSN 1608-3261.
- ^ ispras/v8-aotc, Ivannikov Institute for System Programming of the Russian Academy of Sciences, 2021-01-30, retrieved 2021-03-17
- ^ ispras/webkit-aotc, Ivannikov Institute for System Programming of the Russian Academy of Sciences, 2021-01-30, retrieved 2021-03-17
- ^ "Clojure - Ahead-of-time Compilation and Class Generation". clojure.org. Retrieved 2021-03-17.
- ^ "Hermes: A new open source JavaScript engine optimized for mobile apps". Facebook Engineering. 2019-07-12. Retrieved 2021-03-17.
- ^ "Angular". angular.io. Retrieved 2021-03-17.
외부 링크
- 속도: NGEN은 강력한 신기능으로 퍼포먼스를 향상시킵니다– MSDN Magazine, 2005년 4월
- 모노 AOT
- Excelsior JET – AOT 컴파일러를 사용한 Java SE 인증 구현
- Java용 GNU 컴파일러
- asm.js의 AOT 컴파일
- 실시간 Java, Part 2: 컴파일 기술 비교 – IBM developerWorks, 2007년 4월
- 스윙 퍼포먼스 향상: JIT vs AOT 컴파일– Linux World Magazine, 2004년 11월 Wayback Machine 2008-06-12 아카이브
- 만타