[PL] Compiler & Interpreter

parkheeddong·2023년 4월 14일
0
post-thumbnail


💬 컴퓨터는 어떻게 프로그래밍 언어를 이해할까?! 💬



✅ Compiler와 Interpreter의 차이


Translator는 한 언어를 다른 언어로 번역하는 것이라면 Interpreter는 한 언어를 다른 언어로 '번역'하는 것이 아니라, 그저 '이해'한다.



( Target program 은 Machine Language를 의미한다.)

컴파일러와 인터프리터의 차이도 동일하다.

➡️컴파일러는 프로그래밍 언어를 다른 프로그래밍 언어로 번역한다. 즉, 하이레벨 프로그래밍 언어에서 기계어로 변환하는 것이다.
➡️인터프리터는 프로그래밍 언어를 프로그래밍 언어로 '번역'하는 것이 아니라, 그저 '이해'한다.




✅ 컴파일러


1) 정의

컴파일러는 하이레벨 프로그래밍 언어에서 기계어로 변환하는 것이다.

2) 검증과 최적화

컴파일러는 검증작업을 하는데, Lexical Analysis, Syntax Analysis, Semantic Analysis를 수행한다.
또한 최적화 작업을 수행하는데, Dead Code를 삭제하고 Loop-unrolling을 수행한다.
컴파일러는 최적화 작업으로 인해, 혹은 번역하는 과정에서 소스코드를 바꿀 수도 있지만, 기본적인 의미(original semantic)을 바꾸지는 않는다.

3) 컴파일러 언어의 사용이 적합한 경우

컴파일러는 최적화를 수행하기 때문에, 성능이 중요한 소프트웨어를 개발하는 데 중요하다.
컴파일러는 검증 단계에서 에러를 감지하기 크고 복잡한 소프트웨어에 적합하다.
컴파일러는 기계어로 번역을 하기 때문에, 시스템 소프트웨어에 적합하다.

4) 정적타입의 언어

컴파일러는 주로 정적 타입(static type) 의 언어이다.
컴파일 시점에 변수와 표현식의 Type이 정해지고, 런 타임에서 변경되지 않는다.
옳지 않은 타입 간의 연산을 수행하고자 하면, 컴파일은 실패하고 컴파일 에러를 만든다.
이러한 Type Checking으로 인해, 안전한 프로그래밍이 가능하다.

int x = 3;
char y = 'c';

x = 10;
y = 'possible?' ; / y = char 인데 'possible?'은 string이므로 불가능

5) Type Inference를 하는 경우

컴파일 언어 중 일부(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'

5) 여러가지 컴파일러

(1) 프로그램이 기계어로 번역된다.

C/C++의 컴파일러는 gcc, clang이다. (gcc test.c = test.c를 컴파일하여라)
Ocaml의 컴파일러는 ocamlc 이다.

(2) 프로그램이 가상 머신 언어로 번역된다.

Java의 컴파일러는 javac이다.
Scala의 컴파일러는 scalac 이다.

(3) 프로그램이 중간 언어로 번역된다.

C#의 컴파일러는 mcs이다.
F#의 컴파일러는 fcs이다.






✅ 인터프리터 언어

1) 정의

인터프리터는 한 프로그래밍언어를 다른 언어로 변환하는 것이 아니라, 그저 '이해'하고 실제 '연산'을 수행한다.

2) Portable, Dynamic

portable하기 때문에cross-platform software에 적합하다.
dynamic feature을 가진다.

3) 동적타입의 언어

인터프리터 언어는 주로 동적 타입(Dynamic-type)의 언어이다.
변수와 표현식의 타입은 런 타임에 바뀔 수 있다.
같은 변수에 여러 다른 타입의 값들을 저장할 수 있다.
같은 표현식이어도, 타입에 따라 다르게 동작할 수 있다.

var x = 3; // int
var y = 'c'; // char

x= 10;
y = 'possible'? // y는 string이지만, 허용됨 

4) 여러가지 인터프리터

주로 스크립트 언어들은 인터프리터 언어이다.

Javascript

자바스크립트 엔진 v8은 크롬에 설치되어 있고, 자바스크립트를 실행한다.

  • Typescript는 정적 타입이고, Javascript는 동적 타입이다. Javascript는 compiler의 validation을 거치지 못하므로, typescript를 통해 더 reliable한 programming을 할 수 있다.

Python

파이썬 인터프리터에 의해 실행되며, 각 OS마다 파이썬 인터프리터가 있다.

Shell Script

시스템 프로그래밍에 많이 사용되는 Shell Script도 인터프리터 언어이다.
LINUX, MAC 0S Bash Shell

0개의 댓글