1. Compiler(번역기) vs Interpreter(해석기)
1) 컴파일러
- 소스코드 전체를 보고 프로세서가 실행할 수 있게 기계어로 변환
- 한번에 전부 변환 -> 한번에 전부 실행이기 때문에 실행속도가 빠름
- 소스코드 전부를 입력으로 넣기 때문에 코드를 모두 보고 컴파일타임 에러를 잡아냄
- 코드를 목적프로그램으로 변환하며, 메모리에 저장되어 다시 컴파일 안해도 됨
- 예 : C, FORTAN
2) 인터프리터
- 고레벨 언어를 중간 코드로 변환하고 이를 각 행마다 실행한다.
- 기계어변환 -> 1줄 실행 -> 기계어변환 -> 1줄 실행의 과정을 거쳐서 느림
- 소스코드의 일부를 입력으로 넣기 때문에 컴파일타임 에러를 못잡아냄
- 주로 스크립트 언어들이 인터프리터 기법으로 만들어진게 많음
- 목적프로그램으로 안만듬. 코드로만 되어있어서 다시 실행하면 다시 인터프리팅함
- 예 : BASIC, Javascript, HTML, PHP, Python
2. Hybrid (혼합기법)
가장 대표적인 Hybrid 언어인 Java를 보고 Hybrid 방식의 특징과 장점등에 대해 알아보자.
1) 컴파일러 ($javac HelloWorld.java)
- 컴파일러의 경우 프로그램이 작성된 것과 동일한 ABI에서 실행할 때 매우 효율적이다.
- Java의 경우는 C와 C컴파일러를 사용해 만들어진 언어이고, 이는 기계종속적이라는 것이다.
- 그러나 Java는 기계독립적인 언어로 매우 유명하다. Java의 경우 ABI에 종속된 것이 아니라
- 바로 JVM (Java Virtual Machine)에 종속적이다. 따라서 가상 기계를 위한 컴파일이 진행된다
- 이 것이 java -> javac(컴파일러) -> class 변환의 과정이다 (.class파일은 VM을 위한 기계어이다)
2) 인터프리터 ($java HelloWorld)
- 인터프리터의 경우 class파일을 입력받아 특정기계의 환경에서 실행될 수 있는 형태의 기계어로 변환한다
- 예를 들어 IBM PC에서 만들어진 java코드가 Mac에서 실행될 수 있다는 의미이다.
3) 왜 컴파일러와 인터프리터를 모두 사용할까?
- 기본적으로 ABI에 종속되지 않는 언어를 만들기 위해서는 인터프리터 기법으로 만들면 된다.
- 그러나 인터프리터 기법은 기본적으로 느리다. 때문에 일부 과정을 컴파일로 대체하여 빨라진다.
- 또한 먼저 컴파일 과정을 거치기 때문에 컴파일타임에 에러를 완벽하게 잡아낼 수 있다.
- 또한 인터프리터 방식의 단점인 소스코드 공개 컴파일러 방식의 단점인 ABI 종속성을 해결함
'언어이론' 카테고리의 다른 글
파스 트리 (2) - 모호성과 모호성 제거 (4) | 2020.05.18 |
---|---|
파스 트리 (1) - 파스 트리 그리는 방법 (0) | 2020.05.18 |
배커스-나우어 형식 (BNF) (4) | 2020.05.14 |
문맥자유언어 (Context Free Grammar) (1) | 2020.05.14 |
프로그래밍 패러다임 개요 (0) | 2020.04.14 |
컴파일 개요 (0) | 2020.04.14 |
프로그래밍 언어의 분류 (0) | 2020.01.22 |