원래 compilation(컴파일)은
- programming language로 작성된 소스코드(source code, 원시코드)를
- 타겟 하드웨어에서 동작할 수 있는 기계 코드 (machine code, binary code, opcode)로 바꾸어주는 것을 의미했다.
https://dsaint31.me/mkdocs_site/CE/ch08/ce08_compiler_interpreter/
C, C++ 과 같은 프로그래밍 언어들이 채택한 방식으로
Basic등의 interperter를 사용하는 script언어와 구분된다.
하지만, interpreter 방식의 언어들의 성능향상을 위해서 JIT Compiler등을 사용하면서,
기존의 Compiler를 Static Compiler라고 부르면서 여러 종류의 compiler방식이 제안됨.
현재 많이 사용되는 컴파일은 다음 네가지임.
- Static Compilation (정적컴파일):
source code(원시코드)를 빌드 과정에서 곧바로 binary code 형태의 machine code로 변환. - Bytecode Compilation (바이트코드 컴파일):
source code를 VM등에서 동작하는 bytecode 로 변환 (초기 제안된 javac가 이에 해당함). - Just-In-Time Compilation (JIT 컴파일):
interpreter등에서 매번 실행될 때 source code를 해석하여 machine code로 바꾸던 것을 개선하여, 최초 실행될 때에 machine code로 바꾸고 이를 caching하여 해당 source code가 변경되지 않는한 cached machine code를 사용하는 방식임. - Ahead-Of-Time Compilation (AOT 컴파일):
빌드 과정에서 source code가 bytecode로 변경시키는 bytescode compilation을 하고 나서, 얻은 결과물인 bytecode를 실행 전에 target H/W에서 동작 가능한 machine code로 미리 변환하는 방식임.
AOT 컴파일의 경우,
미리 machine code(=native code)로 바꾸기 때문에
JIT 컴파일이 최초 실행시 지나치게 느린 단점을 개선하며,
Static Compilation이 가지고 있는 최적화를 수행할 수 있는 장점을 가짐.