( Target program 은 Machine Language를 의미한다.)
➡️컴파일러는 프로그래밍 언어를 다른 프로그래밍 언어로 번역한다. 즉, 하이레벨 프로그래밍 언어에서 기계어로 변환하는 것이다.
➡️인터프리터는 프로그래밍 언어를 프로그래밍 언어로 '번역'하는 것이 아니라, 그저 '이해'한다.
컴파일러는 하이레벨 프로그래밍 언어에서 기계어로 변환하는 것이다.
컴파일러는 검증작업을 하는데, Lexical Analysis, Syntax Analysis, Semantic Analysis를 수행한다.
또한 최적화 작업을 수행하는데, Dead Code를 삭제하고 Loop-unrolling을 수행한다.
컴파일러는 최적화 작업으로 인해, 혹은 번역하는 과정에서 소스코드를 바꿀 수도 있지만, 기본적인 의미(original semantic)을 바꾸지는 않는다.
컴파일러는 최적화를 수행하기 때문에, 성능이 중요한 소프트웨어를 개발하는 데 중요하다.
컴파일러는 검증 단계에서 에러를 감지하기 크고 복잡한 소프트웨어에 적합하다.
컴파일러는 기계어로 번역을 하기 때문에, 시스템 소프트웨어에 적합하다.
컴파일러는 주로 정적 타입(static type) 의 언어이다.
컴파일 시점에 변수와 표현식의 Type이 정해지고, 런 타임에서 변경되지 않는다.
옳지 않은 타입 간의 연산을 수행하고자 하면, 컴파일은 실패하고 컴파일 에러를 만든다.
이러한 Type Checking으로 인해, 안전한 프로그래밍이 가능하다.
int x = 3;
char y = 'c';
x = 10;
y = 'possible?' ; / y = char 인데 'possible?'은 string이므로 불가능
컴파일 언어 중 일부(Ocaml, C++(auto), F#, Scala 등) 는 자동적으로 타입을 추론한다. 개발자는 타입을 명시할 필요가 없다.
// type을 명시하지 않음 => 컴파일러가 타입을 추론
let x = 3 in
let y = 'c' in
let z = 'hello world' in
let x: int = 3 in
let y: char = 'c' in
let z: string = 'hello world' in
Format.printf 'hello'
C/C++의 컴파일러는 gcc, clang이다. (gcc test.c = test.c를 컴파일하여라)
Ocaml의 컴파일러는 ocamlc 이다.
Java의 컴파일러는 javac이다.
Scala의 컴파일러는 scalac 이다.
C#의 컴파일러는 mcs이다.
F#의 컴파일러는 fcs이다.
인터프리터는 한 프로그래밍언어를 다른 언어로 변환하는 것이 아니라, 그저 '이해'하고 실제 '연산'을 수행한다.
portable하기 때문에cross-platform software에 적합하다.
dynamic feature을 가진다.
인터프리터 언어는 주로 동적 타입(Dynamic-type)의 언어이다.
변수와 표현식의 타입은 런 타임에 바뀔 수 있다.
같은 변수에 여러 다른 타입의 값들을 저장할 수 있다.
같은 표현식이어도, 타입에 따라 다르게 동작할 수 있다.
var x = 3; // int
var y = 'c'; // char
x= 10;
y = 'possible'? // y는 string이지만, 허용됨
주로 스크립트 언어들은 인터프리터 언어이다.
자바스크립트 엔진 v8은 크롬에 설치되어 있고, 자바스크립트를 실행한다.
파이썬 인터프리터에 의해 실행되며, 각 OS마다 파이썬 인터프리터가 있다.
시스템 프로그래밍에 많이 사용되는 Shell Script도 인터프리터 언어이다.
LINUX, MAC 0S Bash Shell