컴파일러, 어셈블러, 인터프리터란


프로그래밍 언어와 컴파일러, 어셈블러, 인터프리터에 대해 알아보자.


먼저 프로그래밍 언어는 무엇인가? 프로그래밍 언어는 사람과 컴퓨터 사이에 존재하는 일종의 커뮤니케이션 수단으로, 개발자들이 코딩을 할 때 이 프로그래밍 언어를 사용한다.

프로그래밍 언어

  1. 저수준(Low level) 언어 기계어라고도 한다. 기계어는 CPU가 직접 해독하고 실행할 수 있는, 비트 단위(0과 1로 표기)로 쓰인 컴퓨터 언어를 통틀어 말한다. 비트 단위로 0과 1로만 작성되었기 때문에 사람이 직접 알아보기 아주 어려운 언어이다. 이 기계어는 프로그램을 나타내는 가장 낮은 단계의 언어이기 때문에 저수준 언어라고 하는 것이다. 기계어는 CPU의 종류에 따라 다른 코드를 갖게 된다. 예를 들어 아래와 같이 나타낼 수 있다.
      [  op  |  rs |  rt |  rd |shamt| funct]
     0     1     2     6     0     32     decimal
      000000 00001 00010 00110 00000 100000   binary
    
  2. 어셈블리 언어(Assembly Language) 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다. 즉 기계어는 대부분 어셈블리어를 거쳐 짜여지게 된다. 컴퓨터 구조에 따라 사용되는 기계어가 달라지기 때문에 기계어랑 대응되어 만들어지는 어셈블리어도 다 다르다. ``` adosseg .model small .stack 100h

.data hello_message db ‘Hello, World!’,0dh,0ah,’$’

.code main proc mov ax, @data mov ds, ax

    mov    ah, 9
    mov    dx, offset hello_message
    int    21h

    mov    ax, 4C00h
    int    21h   main endp   end main   ``` 3. 고수준(High level) 언어   고수준 언어는 사람이 이해하기 쉽게 작성된 프로그래밍 언어로, 사람이 읽고 쓰기 좋다. C, java 등등 언어가 있다.    고급 언어를 실행하는 데는 일반적으로 세가지 방식 중 하나가 사용된다.   * 해석(interpret)
Interpret 언어로 작성된 코드가 있을 때 컴파일 과정 없이 문법을 읽고 직접 실행한다.   * 컴파일(compile)
Compile 언어로 작성된 코드 는 실행 가능한 형태로 변환된 다음 실행된다.   * 소스 대 소스 번역(다른 프로그래밍 언어로 번역)

언어들이 있으니 이를 서로 변환해주는 작업이 필요하고, 여기에 언어 번역기 프로그램들이 필요하다.

언어 번역기 프로그램

  • 어셈블러(Assembler) 이름에서도 짐작할 수 있듯이 어셈블리어로 작성된 프로그램을 기계어로 작성된 프로그램으로 바꾸는 프로그램이다.
  • 컴파일러(Compiler) 고급 언어로 작성된 프로그램을 번역해서 기계어로 된 프로그램을 만들어준다. 참고로 모든 프로그램은 기계어로 번역되어야 실행이 가능하다. 컴파일 언어는 코드가 모두 기계어로 변환되면 이를 기계(JVM같은 가상 머신)에 넣고 코드를 실행하게 된다. 소스코드를 기계어로 번역하는 빌드 과정에서 인터프리터 언어에 비해 시간이 소요되지만, 런타임에서는 이미 모든 소스코드가 기계어로 번역이 되었기 때문이 실행시간은 빠르다.
  • 인터프리터(Interpreter) 프로그램을 한 줄씩 기계어로 해석해서 바로 실행한다. 웹페이지에서 사용되는 스크립트 언어들이 있다. 인터프리터 언어는 한 줄씩 읽고 기계어로 번역하기 때문에 빌드 시간이 없다. 런타임에서는 한 줄씩 읽어서 실행하기 떄문에 컴파일 언어에 비해 속도가 느리다. 하지만 코드를 바꿔도 빌드 과정 없이 실행이 가능하다는 장점이 있다. 예를 들어 루비같은 경우는 소스코드를 고치고 다시 서버를 시작하지 않아도 변경 사항이 반영된 상태로 테스트를 진행할 수 있다.

image

절차지향, 객체지향

그리고 위에서 언급했던 고수준 언어에는 크게 절차지향 언어, 객체지향 언어가 있다고 할 수 있다.

  • 절차지향 언어(Procedual Programming Language) 절차지향 프로그래밍에 쓰이는 언어를 절차지향 언어라고 한다. 절차지향 언어는 이름에서도 유추할 수 있듯이 개체를 순차적으로 처리해서 프로그램이 유기적으로 연결된다. 절차지향 언어의 구조는 컴퓨터 처리구조와 유사하기 떄문에 실행 속도가 빠르다는 장점이 있지만 단점들이 있다.
    1. 유지 보수가 어렵다. 모든 구성 요소가 순서대로 연결되어 있기 때문에, 한 부분에서 문제가 생기면 시스템 전체에 문제가 생긴다. 따라서 한 부분에서 문제가 생기면 시스템 전체를 고쳐야 할 수도 있고, 유지보수가 어려워진다.
    2. 비효율적이다. 코드의 순서가 바뀌면 결과가 달라질 가능성이 높아 융통성이 부족하다.
  • 객체지향 언어(Object Oriented Language) 위에 언급한 절차지향 언어의 단점을 보완하기 위해 등장했다. 추상적인 개념으로 나타낼 수 있는 것을 객체로 만들어서, 객체끼리 상호작용하도록 만드는 언어이다.

객체 지향 언어의 특성과 장단점을 더 자세히 보려면 글을 하나 새로 작성하는 것이 맞는 듯 해 여기에는 더 이상 적지 않도록 하겠다.