컴파일? 인터프리트 언어? 내가 처음 프로그래밍 언어를 배울 때 들었던 기억이 있다.
처음에는
그게뭐지?
큰 차이가 있을까?
아~ 컴퓨터가 처리하는데 속도가 다르구나
정도만 이해하고 넘어갔다.
사실 지금도 이게 내가 알고 있는 전부일 수 있다. 하지만 이번 정리를 통해서 그때와 다른 생각으로 “이건 중요할 것 같다. “
라는 게 있으면 내 생각을 붙여서 Java는 어떤 언어인지 고민해보자.
먼저 컴파일과 인터프리트 모두 프로그래밍언어를 기계어로 바꾸어 컴퓨터가 작업할 수 있게 한다는 목적은 동일하다.
컴파일 : 개발자가 작성한 전체적으로 확인하여 오류가 없으면 전체코드를 기계어로 번역
인터프리터 : 각 라인을 실시간으로 기계어로 번역하여 실행한다.
컴파일 치킨집과 인터프리터 치킨집 모두 10마리의 치킨 주문이 들어왔다고 생각해보자.
컴파일 치킨집은 10마리를 한 번에 모두 튀기고 10마리를 챙겨서 배달을 나갈 것이다.
인터프리터 치킨집은 한 마리 치킨을 튀기고 한번 배달 가고 다녀와서 두 번째 치킨을 튀기고 배달하고
이런 방식으로 10마리의 치킨 주문을 각각 다르게 해결하는 치킨집으로 이해한다면 어는 치킨집의 서비스가 좋을지, 빠를지를 개인마다 상황에 따라 판단할 수 있을 것 같다.
인터프리터 특징
마침 이 글을 작성하기 전에 JavaScript를 사용하여 간단한 미니 프로젝트를 진행했는데 console.log("여기까지는 오류 없음")
이런 콘솔로그를 엄청나게 찍으면서 오류 해결하거나 로직을 이해하는 데 사용했다.
한 라인씩 실시간으로 번역 → 실행
을 순서로 하는 인터프리터여서 가능했다.
컴파일러 특징
C 같은 경우 컴파일 기반이기 때문에 실행중 오류가 발생하는 방식이아니라
실행되기전에 오류 오타와 같은 오류 코드가 있다면 컴파일이 되지 않아 정상적인 1,2 라인들도 실행이 되지 않는다. 하지만 에러 코드를 보고 찾을 수 있는 경우도 많고 아니라면… 굿 럭 😊
자바가 실행되는 과정을 검색하면서 위와 같이 좋은 자료를 찾을 수 있었다.
오오!! javac가 컴파일해서 바이트 코드가 되고 이 바이트 코드를 클래스 로더가 JVM으로 옮기고 있다.
그럼 Java는 인터프리터가 아닌 컴파일기반 언어인가 보다!!
할 수 있지만 뭐지? 왜 클래스로더가 옮겨준 JVM 내부 Execution Engine에 보이는 Interpreter랑 Compiler는 뭘까?
자바를 처음 접했을 때 누군가 나에게
자바는 컴파일 언어 아님 인터프리터도 아님 둘 다 사용하는 하이브리드임 라고 했던 기억이 난다
지금 생각해보니 자바는 컴파일러 장점과 인터프리터의 장점을 모두 누리고 싶은 것 같다. 그렇게 두 가지 모두 누리기 위해서 Execution Engine(java) 에서 interpreter와 JIT Compiler 가 존재한다.
컴파일러에대해서 찾아보면 링킹이라는 용어를 볼수 있는데 간단하게 말해서 해당 기계어 코드가 실행 되기 위해 연관된 파일들을 링크 하는 과정이라고 보면된다.
클래스로더(링킹은 작업)가 클래스를 가지고 JVM으로 데려간다.
클래스 로더는 바이트코드를 “로딩” 그리고 “링킹” 하여 실행 엔진이 실행할 수 있게 준비해 줌
JIT Compiler는 Interpeter의 단점을 극복하기 위해서 존재한다고 한다.
JIT Compiler는 다음에 더 공부해서 정리 예정 (커밍 쑤운)
⭐틀린 내용 수정은 언제나 환영합니다.⭐