용어
- 소스(원시) 코드/프로그램 : 처음 작성된 코드/프로그램
- 목적 코드/프로그램 : 변환된 코드/프로그램
- 고급 언어 : 사람이 알아보기 쉬운 문법을 가진 언어
- 기계어 : 0,1로 이루어진 컴퓨터가 알아 볼 수 있는 언어
- 컴파일 : 원시코드에서 목적 코드로 옮기는 과정
컴파일러(compiler)
- 빌드타임에 프로그래머가 작성한 모든 소스코드에 대한 기계어를 생성(번역)
- 런타임에 빌드타임에서 생성한 모든 기계어를 기계로 보냄
- 번역과 실행이 따로 이루어짐
- 빌드 타임에 모든 구문 분석과 기계어 변환이 이루어지기 때문에 빌드가 느림
- 런타임의 경우 특별한 과정이 없어 속도가 빠름
- 운영체제에 종속적이므로 운영체제에 맞는 컴파일러가 필요
- 대표적인 언어: C, C++
⇒ 목적프로그램을 만들고 이 목적 프로그램을 실행하는 명령을 지시함으로써 실제 프로그램을 시행
인터프리터(interpreter)
- 런타임에 한 행씩 분석하여 알맞은 기계어를 생성한 뒤 기계로 보냄 (소스코드를 한줄씩 읽어들이면서 실행)
- 실행속도가 느리지만 코드 변경시 즉시 실행이 가능하여 테스트에 용이
- 번역과 실행이 동시에 이루어짐
- 별도의 실행파일이 존재하지 않음
- 대표적인 언어: 스크립트 언어
⇒ 소스 프로그램을 컴파일 하여 목적 프로그램을 생성하지 않고 라인 단위로 해석하면서 바로 실행
- ex: JAVA
JIT(Just-In-Time)
- 빌드타임에 런타임에서 실행할 수 있는 중간언어로 변환
- 런타임에 중간언어를 기계어로 변환하여 기계로 보냄
- 기계어를 생설 할때 캐싱을 통해 같은 함수가 여러번 불려도 기계어를 계속 생성하지 않고 기존에 만들어 놓은 기계어를 불러옴
- 어떤 운영체제에서도 같은 컴파일러로 중간언어를 만들기 때문에 운영체제에 독립적
- 운영체제에 맞는 중간언어를 기계언어로 변경하는 프로그램 (JVM, .NET Framework 등)이 필요
- 대표적인 언어: JAVA, C#
- 모던 브라우저의 자바스크립트 엔진은 모두 JIT컴파일 방식으로 Javascript 코드를 해석
( 구글에서 개발한 V8 - 크롬, 오페라, Node.js
모질라에서 개발한 TraceMonkey - 파이어폭스 3.5+부터 탑재
MS에서 개발한 Chakra - IE 9+부터 탑재
webkit 엔진에 탑재된 JavascriptCore - Safari에 탑재 )
⇒ 프로그램을 실제 실행하는 시점에서 기계어로 번역하는 컴파일 방법
어셈블리 언어(assembly language)
- 기계 명령어를 좀 더 이해하기 쉬운 기호 코드로 나타낸 것
- 기계어와 1:1로 대응된 명령을 기술하는 언어
- 하드웨어를 사실상 직접 제어하는 형태이기 때문에 하드웨어의 구조에 따라 프로그램을 달리 해야함(CPU마다 번지의 수와 위치가 달라지기 때문)
- 최소한의 명령으로 프로그래밍을 하기 때문에 크기가 매우 작고 효율적
- 프로그래밍 시간이 오래 걸리고 디버깅이 어려움, 유지보수가 힘듦
- 어셈블러를 이용해 실행 가능한 기계어로 변환
- 프로세서에 있는 모든 자원(register, i/o)을 직접 접근 할 수 있음