JIT 컴파일러는 비 JIT 컴파일러와 달리 구체적으로 무엇을합니까? 누군가 간결하고 이해하기 쉬운 설명을 줄 수 있습니까?
JIT 컴파일러는 비 JIT 컴파일러와 달리 구체적으로 무엇을합니까? 누군가 간결하고 이해하기 쉬운 설명을 줄 수 있습니까?
답변:
JIT 컴파일러는 프로그램이 시작된 후 실행 되고 코드 (보통 바이트 코드 또는 VM 종류의 명령어)를 즉석에서 또는 일반적으로 호스트 CPU의 기본 형식 인 빠른 형식으로 컴파일합니다 (일반적으로 바이트 코드 또는 VM 명령어) 명령어 세트. JIT는 동적 런타임 정보에 액세스 할 수있는 반면 표준 컴파일러는 자주 사용되는 인라인 함수와 같은 더 나은 최적화를 수행 할 수 없습니다.
이것은 프로그램을 처음 실행 하기 전에 모든 코드를 기계 언어로 컴파일하는 기존 컴파일러와 대조적 입니다 .
다시 말하면, 기존 컴파일러는 프로그램을 처음 실행하기 전에 전체 프로그램을 EXE 파일로 빌드합니다. 최신 스타일 프로그램의 경우 의사 코드 (p-code)로 어셈블리가 생성됩니다. OS에서 프로그램을 실행 한 후에 만 (예를 들어, 아이콘을 두 번 클릭하여) (JIT) 컴파일러가 시작되어 인텔 기반 프로세서 또는 이해할 수있는 머신 코드 (m 코드)를 생성합니다.
처음에 컴파일러는 고급 언어 (어셈블러보다 높은 수준으로 정의 됨)를 객체 코드 (기계 명령어)로 변환 한 다음 링커에 의해 실행 파일에 연결됩니다.
언어 진화의 한 시점에서, 컴파일러는 고급 언어를 의사 코드로 컴파일 한 다음 (통역사가 해석하여) 프로그램을 실행합니다. 따라서 객체 코드와 실행 파일이 제거되었으며 이러한 언어를 여러 운영 체제 및 하드웨어 플랫폼으로 이식 할 수있었습니다. 파스칼 (P-Code로 컴파일 된)은 첫 번째 중 하나였습니다. Java와 C #이 더 최근의 예입니다. 결국 P-Code라는 용어는 대부분의 의사 연산이 바이트 길이이므로 바이트 코드로 대체되었습니다.
JIT (Just-In-Time) 컴파일러는 런타임 인터프리터의 기능으로, 메소드가 호출 될 때마다 바이트 코드를 해석하는 대신 바이트 코드를 실행중인 머신의 머신 코드 명령어로 컴파일 한 다음이를 호출합니다. 대신 객체 코드. 이상적으로 객체 코드 실행의 효율성은 프로그램이 실행될 때마다 프로그램을 다시 컴파일하는 비 효율성을 극복합니다.
JIT- 제때에 단어 자체가 필요할 때 (요청시) 말합니다
소스 코드는 기계 코드로 완전히 변환됩니다
소스 코드는 구조와 같은 어셈블리 언어로 변환됩니다 (예 : C #의 경우 IL (중급 언어), java의 경우 ByteCode).
필요한 코드가 기계 코드로만 변환되어야하는 응용 프로그램이 필요한 경우에만 중간 코드가 기계 언어로 변환됩니다.
JIT에서 모든 코드가 기계 코드로 변환되는 것은 아닙니다. 필요한 코드의 일부가 기계 코드로 변환 된 다음 호출 된 메소드 또는 기능이 기계에없는 경우 기계 코드로 변환됩니다. CPU에 부담이됩니다.
머신 코드가 런타임에 생성 될 때 JIT 컴파일러는 머신의 CPU 아키텍처 실행에 최적화 된 머신 코드를 생성합니다.
다른 언급했듯이
JIT는 JIT (Just-in-Time)의 약자로, 런타임이 아니라 필요할 때 코드가 컴파일됩니다.
위의 논의에 포인트를 추가하기 위해 JVM은 함수가 실행되는 횟수를 카운트합니다. 이 수가 사전 정의 된 한계를 초과하면 JIT가 코드를 기계 언어로 컴파일하여 프로세서가 직접 실행할 수있는 코드를 처리합니다 (일반적으로 javac가 코드를 바이트 코드로 컴파일 한 다음 java와는 달리)-인터프리터는이 바이트 코드를 한 줄씩 해석하여 기계 코드 및 실행).
또한 다음에이 함수가 계산 될 때 코드가 한 줄씩 다시 해석되는 일반적인 해석과 달리 동일한 컴파일 된 코드가 다시 실행됩니다. 이렇게하면 실행이 더 빨라집니다.
JIT 컴파일러는 처음 실행될 때 바이트 코드를 동등한 기본 코드로 컴파일합니다. 모든 후속 실행에서 JVM은 성능을 최적화하기 위해 이미 컴파일 된 기본 코드 만 사용합니다.
JIT 컴파일러가 없으면 JVM 인터프리터는 바이트 코드를 한 줄씩 변환하여 마치 원시 애플리케이션이 실행중인 것처럼 보이게합니다.
JIT는 JIT (Just-in-Time)의 약자로, 런타임이 아니라 필요할 때 코드가 컴파일됩니다.
이것은 컴파일러가 특정 머신에 최적화 된 코드를 생성 할 수 있기 때문에 유리합니다. 일반적인 C 컴파일러와 같은 정적 컴파일러는 모든 코드를 개발자 컴퓨터의 실행 가능한 코드로 컴파일합니다. 따라서 컴파일러는 몇 가지 가정을 기반으로 최적화를 수행합니다. 사용자의 프로그램 실행 속도가 느려지지 않기 때문에 컴파일 속도가 느리고 최적화가 더 많이 수행 될 수 있습니다.
Java 컴파일러가 바이트 코드 (아키텍처 중립적)를 생성 한 후에는 JVM (Java)이 실행을 처리합니다. 바이트 코드는 로더에 의해 JVM에로드 된 다음 각 바이트 명령이 해석됩니다.
메소드를 여러 번 호출해야하는 경우 동일한 코드를 여러 번 해석해야하며 필요한 것보다 시간이 더 걸릴 수 있습니다. 따라서 JIT (Just-In-Time) 컴파일러가 있습니다. 바이트가 JVM에로드되면 (실행 시간) 전체 코드가 해석되지 않고 컴파일되므로 시간이 절약됩니다.
JIT 컴파일러는 런타임 중에 만 작동하므로 바이너리 출력이 없습니다.
JIT (Just In Time Compiler) :
특정 바이트의 기계 명령어로 Java 바이트 코드를 컴파일합니다.
예를 들어, 자바 코드에 loop 문이 있다면 :
while(i<10){
// ...
a=a+i;
// ...
}
위의 루프 코드는 i 값이 0 인 경우 10 회 실행됩니다.
동일한 명령어가 10 회 실행되므로 바이트 코드를 10 번 반복해서 컴파일 할 필요는 없습니다. 이 경우 해당 코드를 한 번만 컴파일해야하며 필요한 횟수만큼 값을 변경할 수 있습니다. 따라서 JIT (Just In Time) 컴파일러는 앞서 언급 한대로 이러한 명령문과 메소드를 추적하고 성능 향상을 위해 이러한 바이트 코드를 기계 코드로 컴파일합니다.
또 다른 유사한 예는 문자열 / 문장 목록에서 "정규 표현식"을 사용하여 패턴을 검색하는 것입니다.
JIT 컴파일러는 모든 코드를 기계 코드로 컴파일하지 않습니다. 런타임에 유사한 패턴을 가진 코드를 컴파일합니다.
자세한 내용은 JIT 이해에 대한 이 Oracle 문서를 참조하십시오 .
일부 IL (중급 언어)로 컴파일 된 코드가 있습니다. 프로그램을 실행할 때 컴퓨터는이 코드를 이해하지 못합니다. 네이티브 코드 만 이해합니다. 따라서 JIT 컴파일러는 IL을 네이티브 코드로 즉석에서 컴파일합니다. 메소드 레벨에서이를 수행합니다.
JIT (Just In Time Compiler)는 실행 불가능한 입력을 받아 실행되는 적절한 기계 코드를 반환하는 소프트웨어입니다. 예를 들면 다음과 같습니다.
Intermediate representation JIT Native machine code for the current CPU architecture
Java bytecode ---> machine code
Javascript (run with V8) ---> machine code
그 결과 특정 CPU 아키텍처의 경우 적절한 JIT 컴파일러를 설치해야합니다.
소스 코드를 기계 코드로 변환하려는 경우 일반적으로 예외가있을 수 있지만 다음을 사용할 수 있습니다.
Jit은 제 시간에 컴파일러를 나타냅니다. jit는 java 바이트 코드를 프로세서로 직접 보낼 수있는 명령어로 바꾸는 프로그램입니다.
특정 시스템 플랫폼에서 Java (Just-In-Time) 컴파일러 (실제로 두 번째 컴파일러)를 사용하면 바이트 코드를 특정 시스템 코드로 준수합니다. 코드가 jit 컴파일러에 의해 다시 컴파일되면 일반적으로 컴퓨터에서 더 빨리 실행됩니다.
JIT (Just-In-Time) 컴파일러는 가상 머신과 함께 제공되며 선택적으로 사용됩니다. 바이트 코드를 즉시 실행되는 플랫폼 별 실행 코드로 컴파일합니다.
JIT (Just-In-Time) 컴파일 (동적 변환 또는 런타임 컴파일) 은 실행 전에가 아니라 프로그램을 실행하는 동안 (런타임에) 컴파일 하는 컴퓨터 코드 를 실행 하는 방법입니다 .
IT 컴파일은 머신 코드로의 변환 에 대한 두 가지 전통적인 접근 방식 (AOT) 과 해석 의 조합이며 , 두 가지 장점과 단점을 결합합니다. JIT 컴파일은 컴파일 된 코드의 속도와 해석의 유연성을 결합합니다 .
JVM에서 사용되는 JIT를 고려해 봅시다.
예를 들어, HotSpot JVM JIT 컴파일러는 동적 최적화를 생성합니다. 즉, Java 응용 프로그램이 실행되는 동안 최적화 결정을 내리고 기본 시스템 아키텍처를 대상으로 하는 고성능 네이티브 컴퓨터 명령어를 생성 합니다.
컴파일을 위해 메소드가 선택되면 JVM은 해당 바이트 코드를 JIT (Just-In-Time) 컴파일러에 공급합니다. JIT는 메소드를 올바르게 컴파일하기 전에 바이트 코드의 의미와 구문을 이해해야합니다. JIT 컴파일러가 메소드를 분석하는 데 도움을주기 위해 바이트 코드는 먼저 추적 트리라는 내부 표현으로 재구성되며, 이는 바이트 코드보다 기계 코드와 더 유사합니다. 그런 다음 분석법의 트리에서 분석 및 최적화가 수행됩니다. 결국 나무는 원시 코드로 변환됩니다.
트레이스 트리는 프로그래밍 코드의 런타임 컴파일에 사용되는 데이터 구조입니다. 트레이스 트리는 핫스팟 동안 실행되는 코드를 추적하고 컴파일하는 '정시 컴파일러'유형에 사용됩니다. 이것을 참조하십시오 .
참조 :
비 JIT 컴파일러는 소스 코드를 가져와 컴파일 타임에이를 머신 특정 바이트 코드로 변환합니다. JIT 컴파일러는 컴파일 타임에 생성 된 머신 독립적 바이트 코드를 가져와 런타임에 머신 특정 바이트 코드로 변환합니다. Java가 사용하는 JIT 컴파일러는 단일 바이너리가 수정없이 여러 플랫폼에서 실행될 수 있도록하는 것입니다.
바이트 코드의 20 %가 시간의 80 %로 사용됩니다. JIT 컴파일러는 이러한 통계를 가져오고 인라인 메소드를 추가하고 사용하지 않는 잠금을 제거하고 해당 머신에 고유 한 바이트 코드를 작성하여 바이트 코드의 20 %를 더 빠르게 실행하도록 최적화합니다. 나는이 기사에서 인용하고 있는데, 그것이 편리하다는 것을 알았다. http://java.dzone.com/articles/just-time-compiler-jit-hotspot
JIT는 더 빠르지 만 더 많은 메모리가 필요한 JVM 구현 중 일부에서 실행 엔진을 의미합니다. 이 체계에서, 메소드의 바이트 코드는 메소드가 처음 호출 될 때 고유 머신 코드로 컴파일됩니다. 그런 다음 메소드의 기본 기계 코드가 캐시되므로 다음에 동일한 메소드가 호출 될 때 재사용 될 수 있습니다.
JVM은 실제로 성능상의 이유로 런타임 중에 컴파일 단계를 수행합니다. 이것은 Java가 컴파일 실행을 완전히 분리하지 않았 음을 의미합니다. 먼저 Java 소스 코드에서 바이트 코드로의 소위 정적 컴파일을 수행합니다. 그런 다음이 바이트 코드는 실행을 위해 JVM으로 전달됩니다. 그러나 바이트 코드 실행 속도가 느리기 때문에 JVM은 바이트 코드 실행 빈도를 측정하고 매우 자주 실행되는 코드의 "핫스팟"을 발견하면 바이트 코드에서 "핫스팟"코드 (핫스팟 프로파일 러)의 기계 코드로 동적 컴파일을 수행합니다. 오늘날 효과적으로 Java 프로그램은 머신 코드 실행으로 실행됩니다.