새벽을 밝히는 붉은 달

[CS] Compiler와 Interpreter 본문

Computer Science

[CS] Compiler와 Interpreter

자윰 2022. 8. 24. 10:54

1. 들어가며

여러가지 언어들을 쓰며, 어떤 언어는 컴파일러로 동작해서 빌드 과정을 한 번 거쳐주어야 하고, 어떤 언어는 인터프리터로 동작해서 대화형으로 사용이 가능하다 등의 여러 특징들을 만났다. 대학교에 입학해서 C를 배우고, 컴퓨터 구조와 시스템 프로그래밍 과목에서 컴파일러가 소스코드를 어떻게 컴퓨터가 실행 가능한 파일을 만들어내는지는 배웠지만 인터프리터가 어떻게 동작하는지는 배우지 못했는데, 이번에 한 번 정리해보고자 한다.

 

 

2. 컴퓨터는 0과 1로 동작한다

아마 이 사실은 컴공과생이 아니어도 알지 않을까 싶다. 컴퓨터의 CPU는 0과 1로 이루어진 binary 로 된 instruction으로 동작하며, 이를 기계어 혹은 machine code 혹은 machine language 라고 부른다. 그러나 프로그래머가 프로그램을 만들기 위해 0과 1로 코드를 작성할 수는 없다. 일단 나는 0과 1로 코드를 작성해야한다면 다른 직업을 알아볼 것이다. 다행히도 사람들은 사람에게 친화적인 언어, high-level language 를 만들어냈다. 

 

 

3. 기계어로 translate 해주는 두 가지 translator, compiler와  interpreter

C나 Java, Python과 같은 High-level language는 사람이 쓰기엔 정말 편하지만 컴퓨터가 이해할 수 없다. 따라서 이를 로직을 그대로 가져가면서도 그대로 번역해주는 과정이 필요한데 (엄밀하게 말하자면 그대로는 아니다. 번역하는 과정에서 같은 결과를 출력하되 조금 더 효율적으로 동작하도록 바꾸기도 한다), 그 일을 compiler와  interpreter가 수행한다. 그러나 둘의 동작 과정은 매우 다르다. 어떻게 다른지 한 번 살펴보자.

 

Compiler는 우리가 실행하고자 하는 소스 코드 전체를 한 번에 기계어로 바꾼다. 이렇게 얻어진 기계어 파일은 instruction set이 같은 CPU를 가진 아무 컴퓨터에서 실행이 가능하며, (AMD칩과 ARM칩은 instruction set이 다르기 때문에 한쪽에서 컴파일된 파일은 다른 쪽에서 실행이 불가능하다. 이해가 불가능하기 때문이다!) 흔히 exe 파일로 확인할 수 있다.

 

C언어를 기준으로 조금 더 자세히 설명하면, 작성된 소스코드를 컴퓨터가 실행가능한 파일로 바꾸는 과정은 

 

1. C로 작성된 소스코드 -> Compiler -> assembly language program

2. assembly language program -> Assembler -> Object file (machine language module)

3. Object file (machine language module, library routine) -> Linker -> Executable Machine language program

 

의 과정으로 이루어지며, 이렇게 만들어진 executable machine language program, 즉 실행가능한 파일은 loader에 의해 memory에 올려지며 실행이 된다.

 

반면에 Interpreter는 프로그램 실행 중에 소스 코드를 한 줄씩 기계어로 바꾼다. 그렇기 때문에 프로그램을 다시 실행을 하거나, 혹은 input 값을 다르게 주어 프로그램을 실행을 한다면 기계어로 번역하는 과정이 다시 일어나게 된다. 

 

 

4. Compiler와 Interpreter의 비교

1) Execution time에 있어서

여기서 Compiler와 Interpreter의 차이가 드러나게 되는데, compiler의 경우 소스코드를 전체 다 분석하고, 이를 기계어로 실행 가능한 파일을 만들기 때문에 초반에 시간이 오래 걸리지만, 한 번 실행 가능한 파일을 만든 경우에는 기계어로 번역하는 과정 없이 바로 프로그램을 실행시킬 수 있다. 반면, Interpreter의 경우 실행을 하면서 line by line으로 기계어로 번역을 하기 때문에 기계어로 번역하는 시간은 적게 걸리지만, 프로그램을 여러번 실행하고자 하는 경우에는 그때마다 기계어로 번역하는 과정을 거쳐야 하기 때문에 시간이 많이 걸리게 된다.

2) Error에 있어서

Compiler는 소스코드를 분석하고, 이게 correct한 경우 기계어로 번역을 하기 때문에, 소스코드를 분석하는 과정에서 문법적 오류가 있다면 에러가 발생하게 된다. 반면 Interpreter는 소스코드를 실행할 때, 한 줄 씩 기계어로 번역하기 때문에 에러 또한 한 줄씩 발생하게 된다.

3) Output에 있어서

위에서 살펴보았듯이, Compiler를 사용하면 실행 가능한 파일이 생성이 된다. 그러나 Interpreter는 실행할 때마다 기계어로 번역이 되기 때문에, compiler처럼 파일이 만들어지거나 하지는 않는다.

 

이외에도 여러가지 차이점이 있는데, 어떤 차이점이 있는지 궁금한 사람들은 이 페이지에서 확인하면 좋을 것 같다.

 

 

5. 파이썬은 뭐지?

여기에서 말하는 파이썬은 CPython을 기준으로 한다.

 

분명 파이썬은 interpreter 언어라고 배웠던 기억이 난다. 근데 파이썬으로 개발을 해보았다면 알겠지만, 소스코드를 작성하고 실행을 시킬 경우 __pycache__라는 디렉토리 밑에 .pyc 라는 파일이 생성된다. Interpreter는 따로 파일이 생성이 안 된다고 했는데, 파이썬은 왜 .pyc라는 파일이 생성되는걸까?

 

이는 파이썬의 내부 동작과 관련이 있다. 파이썬으로 작성된 소스코드를 실행시켰을 때, 내부에서 일어나는 일은 다음과 같다.

 

1. python compiler가 소스코드를 bytecode로 변환한다. 이때, 소스코드가 잘 작성되었는지 검증을 하는데, 만약 에러가 있다면 bytecode로 변환하는 과정을 중단하고 에러 메세지를 출력한다.

2. 만약에 에러가 없다면 .pyc 로 된 bytecode를 생성한다. 이 bytecode는 아직 CPU가 이해할 수 있는 형태가 아니다.

3. 생성된 bytecode는 파이썬의 interpreter인 Python Virtual Machine(PVM)으로 보내지고, PVM은 이 bytecode를 기계어로 번역한다. 이 Interpretation 과정에서 에러가 발생하면 에러 메세지를 출력한다.

 

즉, 우리의 눈에는 파이썬으로 작성된 소스코드를 실행시켰을 때 줄마다 바로 기계어로 번역이 되어 실행되는 것처럼 보이지만, 내부로는 운영체제와 상관없이 PVM위에서 실행될 수 있는 bytecode라는 중간 파일을 생성하고, 이를 다시 기계어로 번역을 하는, 2단계에 걸친 과정이 일어나는 것이다. 

 

따라서 엄밀히 말해 파이썬은 완전한 인터프리터 언어라고 볼 수는 없다고 한다.

 

 

6. 참고

A Deeper Inspection Into Compilation And Interpretation

 

A Deeper Inspection Into Compilation And Interpretation

There is perhaps nothing more satisfying than seeing the pieces of a puzzle come together. This is the case for actual puzzles, which I am…

medium.com

Compiler Vs. Interpreter: What's the Difference?

 

Compiler Vs. Interpreter: What’s the Difference?

Difference Between Compiler and Interpreter [Compiler Vs. Interpreter]: Here, you will learn How compiler and interpreter works, Definitions, Roles, and more.

www.guru99.com

Internal working of Python

 

Internal working of Python - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

Why isn't there a python compiler to native machine code?

 

Why isn't there a python compiler to native machine code?

As I understand, the cause of the speed difference between compiled languages and python is, that the first compiles code all way to the native machine's code, whereas python compiles to python byt...

softwareengineering.stackexchange.com

 

'Computer Science' 카테고리의 다른 글

[CS] 배열의 인덱스가 0부터 시작하는 이유  (0) 2022.08.08
Comments