4473
2015-07-14 16:08:53
1
그런데 요즘에는 JIT 기술이나, 인터프리팅 기술이 워낙 발전하여서 최신 언어들에서는 컴파일/인터프리터 언어를 구분하기 쉽지 않습니다.
예를 들어 파이썬의 경우 일단은 인터프리터 언어로 분류되지만, 일단 한번 실행된 파일은 모두 기계어로 번역되어 인터프리팅 테이블과 함께 보관되며(파이썬 2.7 기준으로 실행후 생기는 .pyc 파일이 이에 해당됩니다), 해당 구문이 두번째 실행 될 때 부터는 컴파일된 기계어 파일을 사용하게 됩니다. 물론 일종의 JIT을 통해 실핸된 기계어 파일이라 C보다 크게 빠르진 않지만 단순 루틴에서는 제법 좋은 성능이 나옵니다.(사실 API 서버등으로 사용할 경우, 대부분의 병목인 네트워크/DB IO에 비하면 티도 안날 정도의 차입니다.)
자바/스칼라의 경우 중간어를 생성하는 대표적인 언어인데, 이 개념을 차용하여 최근에는 LLVM이 대부분 언어의 중간어 자리를 자청하고 있습니다.
LLVM은 튜링머신에 가까운 가상의 컴퓨터를 추상화하여, 해당 어셈블리 셋을 가지는 언어입니다.
C/JAVA/Python 등등 어떤 언어라도 일단 LLVM으로 컴파일 해 버린 후에, 실제로 실행될 환경에 도달한 하여 실행하기 직전에서야 최적화기로 해당 시스템에 맞게 최적화 하여 기계어로 된 실행파일을 생성하는 겁니다.
이렇게 할 경우, 고급언어 컴파일에서 가장 오래 걸리는 구문 분석이나 루틴단위 최적화는 고급언어->LLVM으로 컴파일 할 때 수행하고, 실행 될 환경에 영향을 받는 CPU명령어 셋 적용, 메모리 튜닝 등은 실행 될 곳에서 수행하게되어 추상화된 어셈블리에서 실제 어셈블리로 컴파일 되는 정도이기에 적은 자원으로 빠르게 실행 파일을 생성하여 실행될 수 있습니다.
최근에 python으로 nvidia cuda를 코딩한다거나, iOS 개발시 컴파일 한번으로 해당 플랫폼의 모든 디바이스에 적용 가능한 패키지 파일을 만든다거나 하는데 사용되고 있습니다.
말이 길어 졌는데, 아무튼 최근에는 컴파일 언어와 인터프리터 언어의 구분이 최적화를 최대한 한 후 실행하는 것이 먼저냐 일단 실행되고 나서 최적화는 천천히 할것이냐 정도의 우선순위 차이밖에 나지 않는 것 같습니다.