문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 JIT (문단 편집) == just-in-time 컴파일 == [[컴퓨터 과학]]과 [[프로그래밍 언어]]에서 사용하는 용어. [[C언어|C]]나 [[C++]]에서 하는 것처럼 프로그램을 실행하기 전에 처음 한 번 [[컴파일]][* JIT 컴파일에 대비되는 방식으로 정적 컴파일(Static Compilation) 또는 AOT 컴파일(Ahead-Of-Time Compilation)이 있다. 정적 컴파일과 AOT 컴파일의 차이점은 원시 코드를 곧바로 기계어로 컴파일하느냐, 미리 해석되어 있는 바이트코드를 기계어로 재차 컴파일하느냐의 차이. JIT와 AOT의 'Time'은 Runtime, 즉 실행 시간을 말한다.]하는 대신, 프로그램을 실행하는 시점에서 필요한 부분을 즉석으로 컴파일하는 방식을 말한다. 보통 [[인터프리터]] 방식의 언어 구현들이 성능 향상을 목적으로 도입하는 경우가 많은데, JIT 컴파일러는 같은 코드를 매번 해석하는 대신 처음 실행될 때 인터프리트를 하면서 자주 쓰이는 코드를 캐싱한 뒤[* Java Virtual Machine의 경우 메소드 영역에 있는 코드 캐시(Code Cache) 공간에 JIT로 컴파일된 기계어 코드를 캐싱한다.], 이후에는 캐싱된 코드를 가져다 쓰기 때문에 인터프리터의 느린 실행 속도를 개선할 수 있다. [[바이트코드]] 컴파일을 사용하는 [[Java]]도 바이트코드를 기계어로 번역할 때 JIT 컴파일러를 사용한다. 단점이라면 초기 구동 시에는 소스 코드(혹은 바이트코드)를 실행 단계에서 컴파일하는 데에 시간과 메모리를 소모하기 때문에 정적 컴파일된 프로그램에 비해 실행 속도 면에서 손해를 본다는 것으로, 특히 실행 시간이 매우 짧은 경우에는 애써 컴파일된 코드를 제대로 울궈먹기도 전에 프로그램이 끝나는 배보다 배꼽이 더 큰 상황이 벌어지기도 한다.[* 보통 그 정도로 실행시간이 짧은 프로그램은 어차피 컴파일해서 돌리나 인터프리터로 돌리나 몇 초 차이나지도 않는 경우라 오히려 스크립트 언어로 짜고 대충 돌리는 경우가 많긴 하지만, '''벤치마크를 할 때는 이것 때문에 본의 아니게 평판을 깎아먹곤 한다.''' 특히 초심자들이 JIT 따위 고려하지 않은 어설픈 벤치마크 코드를 짜놓고 "아 Java 구리네 C 만세" 이러는 경우가 간혹 있다.] 크게 나눠서 [[Java Virtual Machine|HotSpot VM]]과 같이 메소드(함수) 단위로 JIT 컴파일을 하는 방식과, 그보다 더 작은 단위에서 프로그램 실행 흐름을 실시간으로 추적하며 컴파일할 코드를 탐색하는 Tracing JIT 방식으로 분류할 수 있다. 특히 Tracing JIT의 경우에는 '''실행 시점에만 알 수 있는 정보를 컴파일에 적극적으로 반영'''[* 가능한 최적화의 예로, 루프 내에서 어떤 객체의 메소드를 자주 부른다는 걸 파악하면 컴파일할 때 객체의 메소드를 동적으로 찾는 대신 해당 메소드의 위치를 정적으로 바인딩할 수 있다.]하기 때문에 이론적으로는 정적 컴파일 방식보다 컴파일 속도가 더 빨라질 수도 있다. 미리 컴파일된 코드를 실행하는 것이 아닌, 런타임에 동적으로 코드를 생성하여 실행한다는 특징 때문에 JIT 컴파일러는 잠재적으로 상당한 보안 문제를 가지고 있다. 특히 JIT 컴파일러 자체에 버그가 있는 경우 곧바로 보안취약점이 되는 경우가 많다. 대표적으로 인텔 [[CPU 게이트]]로 유명한 [[스펙터]] 보안취약점은 JIT에 의존하는 JavaScript 엔진을 가진 브라우저에서만 발생했다. 오라클의 HotSpot VM 또한 JIT 컴파일러 버그로 인한 다수의 보안취약점이 있었다. 참고로 [[iOS]]에서는 상기한 보안문제를 이유로 네트워크로 바이너리나 코드를 다운받아 실행하는 것을 금지하고 있다. [[Chrome]]이나 [[Firefox]]의 iOS 버전이 자체 엔진을 쓰지 못하고 [[Apple|애플]]이 제공하는 [[WebKit]]의 웹뷰를 사용할 수밖에 없는 주요 이유 중 하나다.[* 물론 가장 큰 이유는 애플이 서드파티 웹 브라우저 엔진을 허용하지 않아서이긴 하다.] 요즘 브라우저들은 JavaScript 엔진으로 JIT를 쓰기 때문. iOS도 편법으로 구현이 가능하나 정책이 이를 허용하지 않아 스토어에 올릴 때 Reject된다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기