컴파일러와 인터프리터
프로그램 개발을위 한 코드 작성 부터 실행까지의 과정
1) 컴파일 : 작성된 코드를 컴포터가 이해할 수 있는 언어로 변환하는 과정. 2) 오브젝트파일 : 컴파일된 파일. 3) 링킹 : 일반적으로 하나의 프로그램은 여러개의 오브젝트 파일과 공용 라이브러리로 조합이 되며, 하나의 컴퓨터가 실행할 수 있는 프로그램을 완성하기 위한 작업. 4) 실행파일 : 사용자가 실행할 수 있는 파일. 코드로부터 컴파일 과정과 링킹과정을 거치면 생성되는 파일 5) 로더 : 완성된 실행파일을 사용자가 실행하게 되면 컴퓨터는 해당 프로그램의 내용을 메모리에 적재시키고 내용에 따라 프로그램을 수행하게 된다. 이러한 일을 수행한는 프로그램.
코드작성 --(컴파일)--> 오브젝트파일 --(링킹)--> 실행파일 --(로드)--> 메모리 적재 및 수행.
컴파일 과정에 대한 자세한 고찰
컴파일 과정은 다시 컴파일 및 어셈블리로 자세하게 나눠 질 수 있다. 코드를 컴파일하면 해당 아키텍처에 맞는 어셈블리어로 변환된다. 이후 어셈블리를 통해 0과 1로 이루어진 완벽한 컴퓨터를 위한 문법(오브젝트 파일)으로 다시 변환된다.
일반적으로 컴파일 과정이라 하면 컴파일 + 어셈블리 과정을 합쳐 말하며 한번 더 통합적으로 컴파일 과정이란 컴파일+어셈블리+링킹이라고 말하기도 한다.
오브젝트 파일
오브젝트 파일이란 0과 1로 이루어진 파일이다.
오브젝트 파일은 컴퓨터 아키텍처에 의존적이다.(아키텍처마다 달라진다.)
실행 파일을 만들기 위해 링킹 과정을 거쳐야 한다.
프로그램이 실행을 위해 메모리에 적재되는 이유
우리가 코드를 작성하고 변환 작업을 거친 파일들이 저장되는 곳은 흔히 말하는 스토리지(HDD,SSD 등) 이다. CPU와 스토리지가 직접 데이터를 주고 받기에는 너무 느리기 때문에 CPU가 처리하기 위한 모든 프로그램은 최소 메모리(ex. RAM)에 적재되어야 한다. (최소라고 말하는 이유는 메모리 종류에는 순차적으로 여러 개가 존재하기 때문이다.) 흔히 우리가 사용하는 RAM은 휘발성이기 때문에 평소에는 스토리지에 저장해 두었다가 필요한 부분만 메모리에 적재시켜서 사용하게 된다.
컴파일러 vs 인터프리터
컴파일러, 인터프리터 둘 다 C나 자바같은 고레벨 언어로 작성된 프로그래밍 언어를 기계어로 변환하는 것은 맞으나 그 과정에 있어서 차이를 보인다. 컴파일러는 전체소스코드를 보고 명령어를 수집하고 재구성하는 반면 인터프리터는 소스코드의 각 행을 연속적으로 분석하며 실행한다.
인터프리터의 특성
컴파일러는 소스코드 전체를 한 번 훑고 컴퓨터 프로세서가 실행 할 수 있도록 바로 기계어로 변환한다. 인터프리터는 고레벨 언어를 중간 코드로 변환하고 이를 각 행마다 실행한다. 이 중간 코드는 다른프로그램에 의해 실행된다.
일반적으로 컴파일러가 각 행마다 실행하는 특성을 가진 인터프리터보다는 실행시간이 빠르다.
(실행시간 : 컴파일러 < 인터프리터(더느림))
컴파일러는 전체 소스코드를 변환 한 뒤 에러를 보고하지만 인터프리터는 각 행마다 실행하는 도중 에러가 보고되면 이후 작성된 코드를 살펴보지 않는다. 이는 보안적인 관점에서 도움이 된다.
인터프리터 언어 ex) 파이썬
컴파일 언어 ex) c c++
자바의 컴파일러와 인터프리터
자바 컴파일러는 .java 파일을 javac(java compiler)가 바이트코드로 쓰여진 .class 파일로 변환한다. 바이트코드는 JVM을 위한 언어
자바 인터프리터는 자바 컴파일러에 의해 변환된 클래스파일내의 바이트코드를 특정 환경의 기계에서 실행될 수 있도록 변환한다.
왜자바는 컴파일과 인터프리트를 병행하는가?
컴파일러의 경우 프로그램이 작성된 기계상에서 실행할 때 매우 효율적.
하지만 인터프리터의 경우는 플랫폼에 종속 되지 않는다.
자바 바이트코드는 컴퓨터와 프로그램 사이에 별도의 버퍼 역할을 한다.(보안적 장점)
Reference
Last updated
Was this helpful?