안드로이드 사용자 질문/답변
(글 수 3,598)
이번에 2.2ㅠ에서 JIT컴파일러를 도입한다고 하는데
이에대한 정의와 원리...
그리고 사용자가 기대 할수 있는 부분이 무엇인지 궁금 하네요
의외로 인터넷에 jit 컴파일러에 대한 내용이 없는것 같은데 좀 궁금 하네요 ㅎㅎ
저스트 인 타임으로 바로바로 실행을 시킬수 있다정도로 생각되는데
최적화와는 또 어떤 관계가 될지 궁금 하네요
2010.08.05 14:10:24
일반적으로 JIT은 JIT compilation를 말합니다. 안드로이드에서만 사용되는 용어는 아니고요. 많은 프로그래밍 언어에서 사용됩니다.
이를 행하는, JIT 컴파일러의 이론적(...)이나 구현방식(...)은 많은 다른 문서를 참조하시는게 나을거고, 질문하신 내용에 대해서만 설명드리겠습니다.
JIT이 구동 되는 환경은 프로그램을 구동하기 위해 가상머신(VM)이나 인터프리터가 존재하는 환경으로, 특히 VM용 중간 언어(bytecode)가 있는 경우 이를 실행시간(어플리케이션이 동작하는 동안) 기계어등으로 변환 시켜주는게 주목적입니다.
안드로이드의 케이스에서는 Dalvik VM위에서 구동되는 안드로이드 어플리케이션의 바이트코드를 변환하는거고요.
VM위에서 구동되는 소프트는 상대적으로 VM을 거친 2차연산(기계->VM->APP)을 하게 되기 때문에 속도등에 손실을 보게 되며, 변환 가능한 영역을 기계어로 치환시켜주면 상대적인 속도의 상승을 볼 수 있는거죠.
이를 행하는, JIT 컴파일러의 이론적(...)이나 구현방식(...)은 많은 다른 문서를 참조하시는게 나을거고, 질문하신 내용에 대해서만 설명드리겠습니다.
JIT이 구동 되는 환경은 프로그램을 구동하기 위해 가상머신(VM)이나 인터프리터가 존재하는 환경으로, 특히 VM용 중간 언어(bytecode)가 있는 경우 이를 실행시간(어플리케이션이 동작하는 동안) 기계어등으로 변환 시켜주는게 주목적입니다.
안드로이드의 케이스에서는 Dalvik VM위에서 구동되는 안드로이드 어플리케이션의 바이트코드를 변환하는거고요.
VM위에서 구동되는 소프트는 상대적으로 VM을 거친 2차연산(기계->VM->APP)을 하게 되기 때문에 속도등에 손실을 보게 되며, 변환 가능한 영역을 기계어로 치환시켜주면 상대적인 속도의 상승을 볼 수 있는거죠.
2010.08.05 14:29:03
프로그램은 명령어의 반복입니다. 뭘 읽어라, 뭘 연산해라, 뭘 써라. 를 반복합니다.
윈도우에서 윈도우용 프로그램을 실행시키면 그냥
[명령 읽고 -> 실행]
만 반복합니다.
그런데, 자바프로그램은
[명령 읽고 -> (VM에서)현재 기계에 맞게 번역해서 -> (실제OS에서)실행]
을 반복하게되어 있습니다. 중간에 번역단계가 들어가니까 뭘 하던 시간이 더 오래 걸립니다.
그런데 JIT 가 들어가면,
[처음에 읽고 -> (현재 기계에 맞게) 자주실행되는 부분은 미리 번역해놓기] 를 한번 거치고
실제로 프로그램을 실행할때에는
[번역해둔거 읽어서 -> 실행]
으로 중간에 번역하기를 줄여서 실행하는 것입니다.
윈도우에서 윈도우용 프로그램을 실행시키면 그냥
[명령 읽고 -> 실행]
만 반복합니다.
그런데, 자바프로그램은
[명령 읽고 -> (VM에서)현재 기계에 맞게 번역해서 -> (실제OS에서)실행]
을 반복하게되어 있습니다. 중간에 번역단계가 들어가니까 뭘 하던 시간이 더 오래 걸립니다.
그런데 JIT 가 들어가면,
[처음에 읽고 -> (현재 기계에 맞게) 자주실행되는 부분은 미리 번역해놓기] 를 한번 거치고
실제로 프로그램을 실행할때에는
[번역해둔거 읽어서 -> 실행]
으로 중간에 번역하기를 줄여서 실행하는 것입니다.




자바 프로그램 언어 환경에서, JIT 컴파일러는 자바 바이트코드 (반드시 해석되어야만 하는 명령어를 포함한 프로그램)를, 프로세서에게 직접 전달될 수 있는 명령어로 바꾸어주는 프로그램이다. 하나의 자바 프로그램을 작성하고 나면, 소스 문장은 자바 컴파일러에 의해 바이트코드로 변환되는데, 이는 특정 하드웨어 플랫폼의 프로세서(예를 들면, 인텔의 펜티엄 마이크로프로세서, 혹은 IBM의 System/390 프로세서 등)에 맞는 명령어를 포함한 코드가 아니라, 어떤 플랫폼에도 인식되고, 실행 가능한, 플랫폼에 독립적인 코드이다. 과거에는, 특정 언어로 쓰여진 대부분의 프로그램들이 반드시 각각의 컴퓨터 플랫폼에 맞게 다시 컴파일 되어져야 했고, 경우에 따라서는 다시 작성되어야 하는 경우도 있었다. 자바의 가장 큰 장점은, 프로그램 작성과 컴파일을 단 한번만 하면 된다는 것이다. 한 플랫폼의 자바 가상머신은 컴파일된 바이트코드를 특정 프로세서가 인식할 수 있는 명령어로 해석한다. 그러나, 가상머신은 한번에 한 개의 바이트코드 명령어만을 다룰 수 있다. 특정 시스템 플랫폼에 있는 JIT 컴파일러 (실제로 2번째 compiler)를 사용하여, 바이트코드를 특정 시스템의 코드로(마치 그 프로그램이 처음부터 그 플랫폼에서 컴파일된 것처럼) 컴파일 할 수 있다. 코드가 일단 JIT 컴파일러에 의해 (다시) 컴파일되면, 대체로 그 컴퓨터에서 더 빠른 속도로 실행된다.
JIT 컴파일러는 가상머신과 함께 제공되며, 사용 여부는 선택에 달려있다. 이것은 바이트코드를 특정 플랫폼에 딱 맞아서, 즉시 실행 가능한 코드로 컴파일 한다. 썬 마이크로시스템즈는, 특히 실행 가능한 메쏘드가 반복적으로 재사용될 경우에, JIT 컴파일러를 선택하는 것이 대체로 빠르다고 말하고 있다.
------------------------------------------------------------------------------------------------위키백과에서 검색해봤습니다. 좀 알고있던 내용이긴하지만 이편이 더 정확한거 같아서요