-
[Python] - 동작원리( Build , hybrid )개발/Python 2022. 9. 18. 23:55
Python 작업 시, 순환 참조를 하게 만들면 Garbage가 쌓이게 되고 이게 증가하다 보면 실제 사용되는 메모리에 영향을 끼쳐 OOM이 나는 경우가 발생합니다. 이 때문에 Gabage Collection의 동작원리를 파헤치기 위해 어떻게 동작하는지 부터 정리해보려고 합니다.
Python의 문법과 Compiler 전공 수업을 들은 바가 있기 때문에 상세한 내용은 생략하고 진행하겠습니다.
1. Build란?
컴퓨터가 실행 가능한 파일로 만드는 것을 Build라고 합니다.
컴퓨터는 0과 1만 이해 할 수 있습니다. 우리가 작성하는 코드(Python, C, Java, Ruby .. ) 과 같은 언어는 고급언어로 컴퓨터가 이해 할 수 있는 기계어로 변경해주는 과정을 말합니다.
일반적으로 Build하는 과정을 통역하는 과정과 유사하게 말합니다.
외국어로 된 책을 이해하기 위해서는 한국어로 된 내용이 필요합니다.
이와 같이 변경하는 총 3가지의 방식을 가지고 있습니다.
1. Compiler
소스 코드 전체를 기계어로 번역
- 대표적으로 C,C++,Go,C-Object언어들입니다.
- 총 4단계로 이루어지는데
1. Preprocessing
- 아래와 같이 표현을 미리 정의 해두었다고 생각하면 됩니다.
#include #define
2. Complication
- gcc,g++,visual C++ 과 같이 많이 사용해본 용어들이 컴파일러입니다.
- 중간언어, 저수준의 언어로 번역됩니다. ( 일반적으로 Assembly )
- 왜 바로 컴퓨터 언어로 변경하지 않냐고 하면, 0100 이라는 것을 보고 우리는 어떤 의미인지를 파악하기 어려워 중간 과정이라고 생각하면 됩니다.
3. Assemble
- Cpu가 이해할 수 있는 언어로 번역된 파일로 Object File이라고 합니다.
4. Linking
- 번역본을 여러 권으로 나누었으니 하나로 합쳐 실행하는 파일로 만드는 과정입니다.
- 장점
- 빌드가 완료된 실행가능한 파일은 속도가 빠릅니다.
- 매번 번역할 필요가 없이 실행 파일만 실행하면 되기 때문에 시간면에서 효율적입니다.
- 단점
- 수정해야 할 경우 처음부터 빌드과정을 다시 거쳐야 하며, 대규모의 프로그램에서는 생산성이 하락합니다.
- 플랫폼에 의존적입니다.
- 각 OS마다 서로 다른 라이브러리가 존재하여 Linker들은 OS에서 요구하는 라이브러리가 필요하여 각자 구현이 필요하여 불편을 야기합니다.
2. Interpreter
소스코드 한 줄씩 번역하여 실행
- 터키에 가서 터키 사람이 말을 하면 못알아 듣지만 옆에서 통역사가 바로바로 실시간 통역해주는 역할이 Interpreter와 유사합니다.
- Python, JS, Ruby 와 같은 언어를 Interpreter라고 합니다. ( 반은 맞는말 반은 틀리다. )
- 명령어 한줄씩 바로바로 기계어로 번역하여 실행해주는 방식이기 때문에 OS에 맞는 언어만 설치해준다면 동일한 결과를 얻을 수 있습니다.
- 실행 가능한 파일은 소스코드 자체가 실행가능한 파일입니다.
- 메모리를 별도로 할당 받는 것이 아닌 필요할 때마다 할당하여 사용합니다.
- 장점
- 컴파일 과정이 없이 실행되기 때문에 수정, 디버깅에 유리 -> 개발 속도 향상
- 각 플랫폼에서 지원하는 인터프리터만 있다면 실행 가능하여 독립적
- 단점
- 빌드 되어있는 컴파일 언어 프로그램보다 실행 시간이 느리다.
3. Hybrid
소스코드 전체를 Byte code로 변역한 뒤 VM이 한 줄 씩 실행
- 컴파일과 인터프리터 방식을 혼합하였습니다.
- 컴파일러는 플랫폼에 의존적이고, 인터프리터 언어는 실행속도가 느리지만, 플랫폼에 독립적입니다.
- 위 둘의 단점을 상호 보완하여, Hybrid로 만든 것이죠.
- 대표적인 언어는 Java, Python이 존재합니다.
- 세계에서 가장 많이 쓰이는 영어를 번역하여 두면, 나머지 국가에서도 영어를 보고 다시 번역하여 처리하면 쉽고 빠르게 처리가 가능하죠.
- 위와 같은 원리로 Byte code로 변환시켜 준뒤 , Byte code에 알맞은 VM을 설치하면 언제든지 동일한 결과를 나타 낼 수 있습니다.
- 장점
- 각 플랫폼에 지원하는 가상머신 있다면 실행 가능하기 때문에 플랫폼에 독립적입니다.
- 단점
- 컴파일 언어처럼 하드웨어를 직접 제어하는 작업은 불가능하다.
- 현재 제가 사용 중인 Python3를 예시로 보여드리겠습니다.
- Cpython을 Interpreter로 채택하고 있는 것을 볼 수 있습니다.
- Python Interpreter안에는 Compiler가 있습니다.
- 상세한 동작 원리와 문제점은 뒤에 순환 참조 관련된 예시를 보여드리면서 설명하겠습니다.
$ import platform $ platform.python_implementation() > 'CPython'
'개발 > Python' 카테고리의 다른 글
[Python] - Cyclic reference (0) 2022.09.19 [Python] - Garbage Collection (0) 2022.09.19 [Python] - Decorator (0) 2022.09.02 [Python] - Closure (0) 2022.07.28 [Python] - First class functions (0) 2022.07.28