빌드과정에 따른 프로그래밍 언어의 분류

language | 04 December 2017

Tags | programming build interpreter compile

본 글은 이 글( link ) 을 읽고 작성합니다.

텍스트로 된 소스코드가 실행가능한 프로그램 파일로 변하는 과정을 빌드(Build) 라고 부른다. Build 안에는 compile, preparse, preprocess, link 등의 다양한 과정이 포함되어있다.

소스코드가 빌드가 되는 방식에 따라 프로그래밍 언어의 종류를 몇가지로 나눌 수 있다. 그 분류는 아래와 같다.

id type description
1 Compile language 소스코드가 기계어로 바로 번역되어 실행파일이 됨
2 Byte Code language 소스코드가 가상 머신이 읽는 바이트코드 파일로 번역되고, 그 바이트코드가 인터프리터처럼 한줄씩 기계어로 번역되 실행됨
3 Interpreter language 소스코드가 한줄씩 기계어로 번역되어 실행됨

Compile Language

컴파일 언어는 소스코드가 기계어 실행파일로 바로 빌드된다. 컴파일 언어의 빌드 과정은 보통 Preprocessing->Parser->Translation->Assembler->Linker 의 과정을 거친다. C, C++ 등의 언어가 이곳에 속한다.

장점

  1. 빌드를 마친 기계어 실행파일의 실행속도가 매우 빠르다
  2. 빌드를 마친 기계어 실행파일은 배포시 코드 독해가 어려워서 보안에 유리하다
  3. 직접 하드웨어가 실행하는 실행파일을 만드므로, 하드웨어 제어가 가능하다

단점

  1. 소스 코드를 수정하고 실행파일에 반영하기 위해선 또다시 긴 빌드 작업을 거쳐야하기 때문에 개발 생산성이 떨어진다
  2. 서로 다른 OS 에 맞춰 빌드된 실행파일을 다른 OS 에서 실행하지 못한다 (맥은 .exec,윈도우는 .exe 확장자명의 실행파일)

빌드 과정

순서 과정 description
1 Preprocessor (전처리기) #define 같은 매크로나 지시자를 소스코드로 변경하고, c파일이 i파일이 된다
2 Parser (문법검사) Syntax(코드 문법)을 검사하고, 문법에 따라 코드를 쪼갠다
3 Translation (번역) 문법 파싱이 끝난 소스코드를 어셈블리어로 번역하고, i파일이 s파일이 된다
4 Assembler (번역) 어셈블리어를 기계어만큼 낮은 수준의 언어로 번역하고, s파일이 o(object,바이너리,기계어) 파일이 된다
- - 여기까지를 보통 Compile (소스코드->기계어) 이라고 칭함
5 Linker (object파일연결) 작성된 소스코드가 사용하는 OS API(시스템 콜) 이나 표준 라이브러리를 연결시켜서, exe 파일(실행파일)로 만든다.

Byte Code language

작성된 소스코드가 컴파일러(Compiler)를 거치면서 가상머신이 읽을 수 있는 바이트코드(가상머신 기계어)로 번역(Compile)된다. 가상머신은 하나의 프로그램으로, 어느 OS 위에나 설치할 수 있다. 가상머신은 자신이 읽을 수 있는 기계어로 번역된 바이트코드를 다시 Native OS 가 읽을 수 있는 바이트코드(기계어)로 번역한다. JVM (java virtual machine) 을 사용하는 언어들 (Java, Kotlin, Scala 등)이 이곳에 속한다.

가상머신을 Runtime Environment 라고 부를 수 있다.

장점

  1. OS 에 상관없이, 가상 머신 프로그램만 깔려있다면 어디서나 컴파일된 프로그램이 사용 가능하다

단점

  1. 직접적인 하드웨어 제어는 불가능하다

Java 소스코드 실행 과정

순서 과정 description
1 Compile (컴파일) 가상머신일 읽을 수 있는 바이트코드로 번역되고, .java파일이 .class 파일로 변한다
2 Virtual Machine 가상머신에서 바이트코드가 기계어로 번역되어진다

Interpreter Language

소스코드를 한 줄씩 번역해서 실행한다. 이 한 줄씩 번역하는 프로그램을 Interpreter 라고 한다. 한 줄씩 번역되므로 실행시 메모리 소비가 적다. Python 등의 언어가 이렇다.

장점

  1. 실시간 실행이 가능해서 코드의 실시간 분석이 가능하다

단점

  1. 빌드된 상태의 컴파일 언어 실행파일보다는 속도가 느리다