네이티브 컴파일
서상현JIT를 하는 환경(JVM, .NET)은 종종 JIT보다 네이티브 컴파일을 선호할 수 있는데, 그 이유는 크게 세 가지로 보입니다.
시작 시간(startup time): 오래 실행되는 프로세스(long-running process)의 경우 JIT 컴파일에 걸리는 시간을 무시할 수 있지만, 실행 시간이 짧은 스크립트의 경우 JIT 컴파일 시간이 실행 시간의 큰 부분을 차지합니다. 또한 GUI 어플리케이션의 경우 일단 실행되고 나면 빠르다고 하더라도 시작이 늦다는 것은 큰 단점으로 작용합니다.
배포(distribution): 네이티브 컴파일을 하면 배포 시 JVM이나 .NET Framework의 설치를 요구하지 않아도 됩니다. 이것은 JVM이나 .NET Framework를 번들하여 해결할 수도 있지만, 네이티브 컴파일 시 필요한 부분만 링크하면 배포할 파일의 크기를 줄일 수 있다는 별도의 장점이 있습니다.
실행 시간 코드 생성(run-time code generation)이 불가능한 환경: 게임 콘솔이나 아이폰 같은 모바일 환경의 경우 기술적 제한이나 정치적 이유로 실행 시간 코드 생성이 불가능할 수 있습니다. 이 경우 일반적으로 JIT 위에서 실행되는 코드를 이들 환경에서 실행하기 위해서는 별다른 대안이 없습니다.
그러나 성능 상의 문제는 네이티브 컴파일을 필요로 하는 이유는 아닌 것 같습니다. 아래 네이티브 컴파일 환경들의 문서를 보면 네이티브 컴파일을 할 경우 오히려 성능이 떨어질 수 있다는 경고가 있는데, 이것은 실행 시간 최적화를 할 수 없기 때문인 것 같습니다.
.NET Framework의 경우 Ngen.exe(Native Image Generator)를 제공합니다. Mono에서는 AOT를 사용할 수 있습니다. JVM의 경우 GCJ로 네이티브 컴파일을 할 수 있습니다.
네이티브 컴파일을 하는 다른 이유나 JVM, .NET, 혹은 다른 JIT 환경에서 실행되는 코드를 네이티브 컴파일하기 위한 기술로는 무엇이 있을까요?
한국의 모바일 쪽에서는 일반적으로 AOTC로 구현된 것을 쓰나 봅니다. 흔히 하이브리드 형태라고 부릅니다.
요새 Native의 장점은 reversing이 어렵다는게 들어가죠. 난독화 기술이 따로 필요없다는 장점이... -_-. 회사에 있다보니 reversing하는 경우가 많다는 것을 알게 되네요. 특히 swf.
어도비에서 플래시의 아이폰 지원을 발표하면서 FAQ에 다음과 같이 적었는데, "실행 시간 코드 생성이 불가능한 환경"에 해당합니다.
Q. Are applications for iPhone built with Flash Platform tools interpreted at runtime?
A. No. iPhone applications built with Flash Platform tools are compiled into standard, native iPhone executables, just like any other iPhone application.