[IT뉴비사전]_컴파일러 vs. 인터프리터

hanseungjune·2022년 6월 23일
0

Newbie_Dict

목록 보기
14/14
post-thumbnail

✅ 컴파일러와 인터프리터 요약

컴파일러와 인터프리터의 장단점을 한번 비교해 봅시다.

컴파일러인터프리터
개발 편의성코드를 수정하고 실행하려면 컴파일을 다시 해야 한다. 👎코드를 수정하고 즉시 실행할 수 있다. 👍
실행 속도빠르다. 👍느리다. 👎
보안프로그램의 코드가 유출되지 않는다. 👍프로그램의 코드가 유출될 수 있다. 👎
파일 용량프로그램의 실행 파일 전체를 전송해야 하므로, 용량이 크다. 👎프로그램의 코드만 전송하면 실행이 되므로, 용량이 작다. 👍
프로그래밍 언어C, C++처럼 비교적 저수준에 가까운 언어Python, Ruby처럼 비교적 고수준에 가까운 언어

✅ 프로그래밍 언어의 종류에 따른 실행 방식 차이

컴파일러 방식과 인터프리터 방식의 장단점을 한번 살펴 봅시다.

  • 컴파일러는 “개발 편의성은 떨어지지만, 실행 속도는 빠르다.”
  • 인터프리터는 “개발 편의성이 높지만, 실행 속도는 느리다.”

그런데 어디서 들어본 이야기인 것 같지 않나요?
사실 코드의 실행 방식은, 프로그래밍 언어의 특징과도 연결이 되는데요.

기억을 되살려 봅시다.

저수준 언어개발 편의성은 떨어지지만 실행 속도는 빨랐고요.
고수준 언어개발 편의성이 높지만, 실행 속도는 느렸습니다.

하나의 장점을 살리기 위해, 다른 것들을 일부러 포기한 거죠.

그런데 동일한 특징이 컴파일러와 인터프리터에서도 각각 나타나고 있는 거죠. 그래서 언어 마다 주로 쓰이는 실행 방식이 있습니다.

  • 고수준 언어는 개발 편의성이 생명인 언어인데, 컴파일 과정을 매번 거쳐야 한다면, 그 장점을 다 잃어버리고 말겠죠?
    그래서 파이썬, 루비같은 고수준 언어는 인터프리터 방식을 주로 사용합니다.

  • 반면, 저수준 언어는 개발 과정이 좀 힘들더라도, 어떻게든 최고의 성능, 효율, 속도를 만들어내고자 했습니다. 그런데 그게 인터프리터 방식으로 실행되어서, 느린 환경에서 실행된다면, 힘들여서 저수준 언어로 개발한 이유가 다 사라지겠죠?
    그래서 C, C++ 같은 저수준에 비교적 가까운 언어들은 컴파일 방식으로 실행되는 경우가 많습니다.

✅ 첫 번째 컴파일러는 어떻게 만들었을까요?

재미있는 질문을 하나 던져봅시다.
첫 번째 컴파일러를 만들 때는 컴파일러가 없었을 텐데, 어떻게 이 컴파일러 프로그램을 번역해서 실행할 수 있었을까요?
정답은 "번역을 하지 않고 컴퓨터의 언어로 사람이 직접 작성했다.” 입니다.
머신코드에 가장 가까운, 어셈블리 언어라는 걸 살펴본 적이 있었죠?

파이썬

print("Hello")

어셈블리 언어

		extern printf
        section .data
msg:    db "Hello", 0
fmt:    db "%s", 10, 0
        section .text
        global main
main:
        push    rbp
        mov     rdi,fmt
        mov     rsi,msg
        mov     rax,0
        call    printf
        pop rbp
        mov rax,0
        ret

머신코드

0010011010011001
1101010011100101
1100010101001010
0100101101010010
1101011000101100

이 어셈블리 언어를 사람이 직접 사용해서 첫 번째 컴파일러가 만들어졌습니다.
거의 머신 코드를 사람이 하나 하나 만든 셈이죠.

컴파일러가 만들어지기 전에는 사람이 컴퓨터의 언어를 직접 배워서, 컴퓨터가 실행할 수 있게 직접 코딩하는 것이 일반적이었습니다. 생각만 해도 매우 힘든 과정이었겠죠?

하지만 첫 번째 컴파일러가 만들어진 이후에는, 그 컴파일러를 이용해서 여러 가지 프로그램을 번역할 수 있었습니다. 그 다음 컴파일러도, 첫 번째 컴파일러로 번역했겠죠. 이제는 컴퓨터가 사람의 언어를 배우고 있는 것입니다!

최근에는 한 언어에도 여러 컴파일러 종류가 생기기도 했고, 한 언어에 대한 컴파일러를 자기 자신의 언어로 만들기도 한답니다.
실제로 Haskell 이라는 언어의 컴파일러는 최초에 Lazy ML이라는 언어로 작성되었다가, 자기 자신의 언어인 Haskell로 재작성 되었다고 합니다.

✅ 어셈블리 언어는 어떻게 만들어진 건가요?

어셈블리 언어에서 머신 코드로 변환되었다고 생각하기보다 그 반대로 생각하는 게 이해하기 쉽습니다. 이전 강의에서 주판 이야기나, 종이에 구멍을 뚫어 계산(프로그래밍)했다는 내용 기억 나시나요? 주판 알을 올리거나 내리고, 구멍을 뚫거나 뚫지 않는 것처럼 컴퓨터는 0, 1로 이루어진 기계어로 일을 합니다.

아마도 처음 기계어로 프로그래밍 하던 분들은 010111001..하고 프로그래밍 하셨겠죠?

프로그래머도 사람이다 보니 100110..하고 프로그래밍하는 데는 많은 불편함과 어려움이 있었을 것입니다. 그래서 기계어와 1:1 대응하여 만들어진 언어어셈블리어 입니다.

위키백과(https://en.wikipedia.org/wiki/Assembly_language)의 예시를 보면,

기계어 10110000 01100001을 16진법으로, 다시 어셈블리어로 변환하면 10110000이 MOV AL에, 그리고 01100001이 61h(=십진법으로 97)에 각각 대응합니다.

이렇게 기계어를 사용할 때보다 편하게 컴퓨터를 다룰 수 있게 만들어진 것이 어셈블리어입니다. (물론 어셈블리어도 약어로 이루어져 있어서 그냥 보면 무슨 소린가 싶지만.. 아무래도 10110000을 쓰는 것보다는 편하죠?)

profile
필요하다면 공부하는 개발자, 한승준

0개의 댓글