맨위로가기

AOT 컴파일

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

AOT(Ahead-Of-Time) 컴파일은 런타임 이전에 소스 코드 또는 중간 코드를 기계어로 번역하는 기술이다. AOT 컴파일은 실행 전 컴파일을 수행하여 애플리케이션의 시작 시간을 단축하고, 런타임 오버헤드를 줄여 임베디드 시스템과 같은 자원 제약 환경에 유용하다. 또한, 복잡한 코드 최적화를 수행할 수 있지만, 런타임 프로파일에 동적으로 적응하는 JIT 컴파일에 비해 유연성이 낮고, 핫 코드에 대한 예측적 최적화가 어렵다는 한계가 있다. 자바, .NET CLR 등 다양한 환경에서 AOT 컴파일러가 구현되어 활용된다.

더 읽어볼만한 페이지

  • 컴파일러 - 바이너리 재컴파일러
  • 컴파일러 - 링커 (컴퓨팅)
    링커는 여러 모듈로 된 목적 파일을 결합해 실행 가능한 프로그램을 만들고, 정적/동적 링킹으로 라이브러리를 연결하며, 심볼 해결 및 재배치로 변수와 함수를 메모리 주소에 연결하는 소프트웨어 도구이다.
AOT 컴파일
개요
정의AOT(Ahead-Of-Time) 컴파일은 프로그램 실행 전에 미리 소스 코드를 기계어로 변환하는 컴파일 방식이다.
설명AOT 컴파일은 런타임 시 컴파일 작업을 줄여 프로그램 시작 속도를 향상시키고, 메모리 사용량을 최적화한다.
장점더 빠른 시작 시간
향상된 성능
향상된 보안
세부 정보
컴파일 시점빌드 시 또는 배포 전에 수행된다.
실행 시점이미 컴파일된 코드가 실행되므로 런타임 컴파일 과정이 없다.
사용 사례안드로이드 앱, iOS 앱, 게임 개발, 임베디드 시스템
기술적 특징
정적 컴파일프로그램의 모든 코드가 실행 전에 컴파일된다.
최적화컴파일러는 전체 코드를 분석하여 최적화를 수행할 수 있다.
AOT 컴파일러
예시GCC
LLVM
Angular
Hermes
관련 기술
JIT 컴파일런타임 시 코드를 컴파일하는 방식
Dynamic compilation프로그램 실행 중 필요에 따라 코드를 컴파일하는 방식
프로그래밍 언어 지원
지원 언어자바
C++
C#
Rust
Clojure
JavaScript

2. 장점

일부 관리 코드 런타임을 가진 프로그래밍 언어는 중간 표현으로 컴파일될 수 있으며, Just-in-time(JIT) 컴파일을 사용한다. 이는 중간 코드를 실행하는 동안 중간 코드를 네이티브 실행을 위한 기계어로 잠시 컴파일하며, 이로 인해 애플리케이션의 성능이 저하될 수 있다. 사전 컴파일은 실행 중에 발생하는 대신 실행 전에 수행되므로 이 단계를 제거한다.

동적 타이핑 언어를 네이티브 기계어 또는 다른 정적 VM 바이트 코드로의 사전 컴파일은 제한적인 경우에만 가능하다. 예를 들어, 언어 Erlang의 HiPE(High Performance Erlang Project) AOT 컴파일러는 고급 정적 타입 재구성 기술과 타입 추론 때문에 이를 수행할 수 있다.

대부분의 완전히 AOT 컴파일된 프로그램 및 라이브러리의 경우, 런타임 환경의 일부를 제거하여 디스크 공간, 메모리, 배터리 수명 및 시작 시간(JIT 웜업 단계 없음) 등을 절약할 수 있다. 이 때문에 임베디드 또는 모바일 장치에서 유용할 수 있다.

AOT 컴파일러는 복잡하고 진보된 코드 최적화를 수행할 수 있는데, 이는 대부분의 JIT(Just-In-Time) 컴파일의 경우 비용이 너무 많이 든다고 간주될 것이다. 반면 AOT는 런타임 프로파일 기반 최적화(PGO), 가상 상수 전파, 또는 간접 가상 함수 인라인화와 같이 JIT에서 가능한 일부 최적화를 수행할 수 없다. AOT는 대상 아키텍처로 컴파일해야 하지만, JIT는 소프트웨어가 출시된 지 몇 년이 지난 후에도 실행 중인 실제 CPU를 최대한 활용하도록 코드를 컴파일할 수 있다.

또한, JIT 컴파일러는 코드에 대한 가정을 함으로써 핫 코드를 예측적으로 최적화할 수 있다. 예측적 가정이 나중에 잘못된 것으로 판명되면 생성된 코드는 최적화가 해제될 수 있다. 이러한 작업은 적응적 최적화를 통해 코드가 다시 최적화될 때까지 실행 중인 소프트웨어의 성능을 늦춘다. AOT 컴파일러는 그러한 가정을 할 수 없으며 컴파일 시점에 가능한 한 많은 정보를 추론해야 한다. 메소드를 통해 어떤 유형이 전달될지 알 수 없기 때문에 덜 특화된 코드를 사용해야 한다. 이러한 문제는 프로파일 기반 최적화를 통해 완화될 수 있다. 그러나 이 경우에도 생성된 코드는 JIT 컴파일러가 하는 것처럼 변화하는 런타임 프로파일에 동적으로 적응할 수 없다.

2. 1. 런타임 오버헤드 감소

일부 관리 코드 런타임을 가진 프로그래밍 언어는 중간 표현으로 컴파일될 수 있으며, Just-in-time(JIT) 컴파일을 사용한다. 이는 중간 코드를 실행하는 동안 중간 코드를 네이티브 실행을 위한 기계어로 잠시 컴파일하며, 이로 인해 애플리케이션의 성능이 저하될 수 있다. 사전 컴파일은 실행 중에 발생하는 대신 실행 전에 수행되므로 이 단계를 제거한다.

동적 타이핑 언어를 네이티브 기계어 또는 다른 정적 VM 바이트 코드로의 사전 컴파일은 제한적인 경우에만 가능하다. 예를 들어, 언어 Erlang의 HiPE(High Performance Erlang Project) AOT 컴파일러는 고급 정적 타입 재구성 기술과 타입 추론 때문에 이를 수행할 수 있다.

대부분의 완전히 AOT 컴파일된 프로그램 및 라이브러리의 경우, 런타임 환경의 일부를 제거하여 디스크 공간, 메모리, 배터리 수명 및 시작 시간(JIT 웜업 단계 없음) 등을 절약할 수 있다. 이 때문에 임베디드 또는 모바일 장치에서 유용할 수 있다.

2. 2. 성능 최적화

AOT 컴파일러는 복잡하고 진보된 코드 최적화를 수행할 수 있는데, 이는 대부분의 JIT(Just-In-Time) 컴파일의 경우 비용이 너무 많이 든다고 간주될 것이다. 반면 AOT는 런타임 프로파일 기반 최적화(PGO), 가상 상수 전파, 또는 간접 가상 함수 인라인화와 같이 JIT에서 가능한 일부 최적화를 수행할 수 없다. AOT는 대상 아키텍처로 컴파일해야 하지만, JIT는 소프트웨어가 출시된 지 몇 년이 지난 후에도 실행 중인 실제 CPU를 최대한 활용하도록 코드를 컴파일할 수 있다.

또한, JIT 컴파일러는 코드에 대한 가정을 함으로써 핫 코드를 예측적으로 최적화할 수 있다. 예측적 가정이 나중에 잘못된 것으로 판명되면 생성된 코드는 최적화가 해제될 수 있다. 이러한 작업은 적응적 최적화를 통해 코드가 다시 최적화될 때까지 실행 중인 소프트웨어의 성능을 늦춘다. AOT 컴파일러는 그러한 가정을 할 수 없으며 컴파일 시점에 가능한 한 많은 정보를 추론해야 한다. 메소드를 통해 어떤 유형이 전달될지 알 수 없기 때문에 덜 특화된 코드를 사용해야 한다. 이러한 문제는 프로파일 기반 최적화를 통해 완화될 수 있다. 그러나 이 경우에도 생성된 코드는 JIT 컴파일러가 하는 것처럼 변화하는 런타임 프로파일에 동적으로 적응할 수 없다.

3. 한계

AOT 컴파일러는 복잡하고 진보된 코드 최적화를 수행할 수 있지만, 이는 대부분의 JIT(Just-In-Time) 컴파일에서는 비용 문제로 간주된다. 반면 AOT는 런타임 프로파일 기반 최적화 (PGO), 가상 상수 전파, 또는 간접 가상 함수 인라인화와 같이 JIT에서 가능한 일부 최적화를 수행할 수 없다. AOT는 대상 아키텍처로 컴파일해야 하지만, JIT는 소프트웨어가 출시된 지 몇 년이 지난 후에도 실행 중인 실제 CPU를 최대한 활용하도록 코드를 컴파일할 수 있어 유연성이 더 높다.

또한, JIT 컴파일러는 코드에 대한 가정을 통해 핫 코드를 예측적으로 최적화할 수 있다. 예측적 가정이 나중에 잘못된 것으로 판명되면 생성된 코드는 최적화가 해제될 수 있다. 이러한 작업은 적응적 최적화를 통해 코드가 다시 최적화될 때까지 실행 중인 소프트웨어의 성능을 늦춘다. AOT 컴파일러는 그러한 가정을 할 수 없으며 컴파일 시점에 가능한 한 많은 정보를 추론해야 한다. 메소드를 통해 어떤 유형이 전달될지 알 수 없기 때문에 덜 특화된 코드를 사용해야 한다. 이러한 문제는 프로파일 기반 최적화를 통해 완화될 수 있지만, 생성된 코드는 JIT 컴파일러처럼 변화하는 런타임 프로파일에 동적으로 적응할 수 없다.

3. 1. 런타임 최적화의 어려움

AOT 컴파일러는 복잡하고 진보된 코드 최적화를 수행할 수 있지만, 이는 대부분의 JIT(Just-In-Time) 컴파일에서는 비용 문제로 간주된다. 반면 AOT는 런타임 프로파일 기반 최적화 (PGO), 가상 상수 전파, 또는 간접 가상 함수 인라인화와 같이 JIT에서 가능한 일부 최적화를 수행할 수 없다. AOT는 대상 아키텍처로 컴파일해야 하지만, JIT는 소프트웨어가 출시된 지 몇 년이 지난 후에도 실행 중인 실제 CPU를 최대한 활용하도록 코드를 컴파일할 수 있어 유연성이 더 높다.

또한, JIT 컴파일러는 코드에 대한 가정을 통해 핫 코드를 예측적으로 최적화할 수 있다. 예측적 가정이 나중에 잘못된 것으로 판명되면 생성된 코드는 최적화가 해제될 수 있다. 이러한 작업은 적응적 최적화를 통해 코드가 다시 최적화될 때까지 실행 중인 소프트웨어의 성능을 늦춘다. AOT 컴파일러는 그러한 가정을 할 수 없으며 컴파일 시점에 가능한 한 많은 정보를 추론해야 한다. 메소드를 통해 어떤 유형이 전달될지 알 수 없기 때문에 덜 특화된 코드를 사용해야 한다. 이러한 문제는 프로파일 기반 최적화를 통해 완화될 수 있지만, 생성된 코드는 JIT 컴파일러처럼 변화하는 런타임 프로파일에 동적으로 적응할 수 없다.

3. 2. 저장 공간 문제

wikitable


4. 응용 범위


  • 메모리 및 CPU 제약이 있는 경우: 인터프리터는 너무 느리고 JIT 컴파일은 너무 부담이 큰 경우로 임베디드 시스템인 경우가 많다. 단 이 경우 목표 시스템에 내장 되는 프로그램에 한해서 AOT 컴파일을 하고 내려받는 프로그램은 인터프리터나 JIT 컴파일로 실행하는 경우가 보통이다.
  • 프로그램 특성 상 빠른 시작 시간과 일관된 성능이 중요한 경우: 데스크톱 환경에서 그래픽 사용자 인터페이스 위주의 프로그램인 경우가 이에 해당 한다.
  • 전통적인 컴파일러 최적화가 효과적인 경우: 계산이 많은 프로그램처럼 일반 컴파일을 통한 최적화가 효과적인 경우에 사용할 수 있다. AOT 컴파일은 소스 코드 대신 중간 언어를 받아 들인다는 점을 빼면 일반적인 정적 컴파일과 동일하기 때문에 실행 시간에 비해 충분한 프로그램 분석을 통해 최적화를 보여준다.

4. 1. 자원 제약 환경

임베디드 시스템과 같이 메모리 및 CPU 제약이 있는 환경에서 주로 사용된다. 이러한 환경에서는 인터프리터는 너무 느리고, JIT 컴파일은 부담이 크기 때문이다. 목표 시스템에 내장되는 프로그램은 AOT 컴파일을 사용하고, 내려받는 프로그램은 인터프리터나 JIT 컴파일 방식을 사용하기도 한다.

4. 2. 빠른 시작 시간 및 일관된 성능 요구 환경

데스크톱 환경에서 그래픽 사용자 인터페이스 위주의 프로그램은 빠른 시작 시간과 일관된 성능이 중요하기 때문에 AOT 컴파일이 적합하다. 계산이 많은 프로그램처럼 일반 컴파일을 통한 최적화가 효과적인 경우에도 AOT 컴파일을 사용할 수 있다. AOT 컴파일은 소스 코드 대신 중간 언어를 받아들인다는 점을 빼면 일반적인 정적 컴파일과 동일하므로, 실행 시간에 비해 충분한 프로그램 분석을 통해 최적화를 제공한다.

5. 구현

5. 1. 자바

GNU 컴파일러에 자바 전단부(front-end)를 넣어서 자바 코드를 실행 코드로 컴파일하는 GNU 자바 컴파일러가 있다.[10] Excelsior JET는 자바를 위한 상용 AOT 컴파일러 제품이다.[11]

5. 2. .NET CLR

.NET NGen은 마이크로소프트의 .NET CLR 구현에 포함된 AOT 컴파일러이다.[12] Mono AOT 컴파일러는 Mono 프로젝트의 AOT 컴파일러 구현이다.[13]

참조

[1] 서적 Proceedings of the 6th ACM & IEEE International conference on Embedded software - EMSOFT '06 Association for Computing Machinery 2006-10-22
[2] 서적 Proceedings of the 2002 ACM SIGPLAN workshop on Partial evaluation and semantics-based program manipulation Association for Computing Machinery 2002-01-14
[3] 간행물 Ahead-of-time compilation of JavaScript programs https://doi.org/10.1[...] 2017-01-01
[4] Citation ispras/v8-aotc https://github.com/i[...] Ivannikov Institute for System Programming of the Russian Academy of Sciences 2021-01-30
[5] Citation ispras/webkit-aotc https://github.com/i[...] Ivannikov Institute for System Programming of the Russian Academy of Sciences 2021-01-30
[6] 웹사이트 Clojure - Ahead-of-time Compilation and Class Generation https://clojure.org/[...] 2021-03-17
[7] 웹사이트 Hermes: A new open source JavaScript engine optimized for mobile apps https://engineering.[...] 2021-03-17
[8] 웹사이트 Angular https://angular.io/g[...] 2021-03-17
[9] 문서 마이클 프란즈의 UCI 홈페이지 http://www.ics.uci.e[...]
[10] 웨이백 GNU 자바 컴파일러 프로젝트 페이지 http://gcc.gnu.org/j[...] 20120831045746
[11] 웨이백 Excelsior JET 제품 페이지 http://www.excelsior[...] 20101216063748
[12] 문서 MSDN NGen.exe 설명 문서 http://msdn.microsof[...]
[13] 문서 Mono AOT 페이지 http://www.mono-proj[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com