Interpreter and PVM (Python Virtual Machine)
대학을 막 졸업해서 초보 프로그래머로 일을 할 때 개인적으로 가지고 있던 편견 중 하나가 script language를 매우 하찮게 생각하면서 오직 compiler languages 만을 programming language로 생각했던 것이다. (지금 돌이켜보면 이불킥하고 싶을 정도로 부끄러운 생각이었다.)
학교에서 살짝 배웠던 Visual Basic에서 느꼈던 interpreter language의 간단함이 너무 머리에 남아서였는지 C, C++ 등의 언어와 달리 interpreter language를 무시하던 선입견을 가졌었다.
우스운 건, interpreter language는 무시하면서도 Virtual machine을 사용한 Java는 매우 열광적(?)으로 지지했다는 점이다. 매번 OS별로 compile해주어야 하고, define 등을 통해 다른 처리를 해줘야 했던 C, C++과 달리 Java는 한번 byte code로 comiple해놓으면 Java Virtual Machine(JVM)이 설치된 어느 장비에서도 동작했기 때문에 정말 편했다. 그리고 초기의 Java의 깔끔한 OOP적 요소에 반했던 거 같다 (연구용을 작성된 재사용은 전혀 고려되지 않은 cpp 확장자만 가진 C 프로그램 소스들에 질려있던 상황도 한 몫을 했던 거 같지만...).
Java의 등장은 Virtual Machine의 효율성을 모든 프로그래머에게 알려주었고, 오늘날 Python의 대유행 전까지 Java가 널리 사용될 수 있었던 주 요인이라고 생각된다 (물론 Oracle사에서 인수 후 Java의 변화가 긍정적이지 못한 측면이 없었다면 Java의 인기가 이렇게 떨어지지 않았을 거 같기도 하지만...).
실제로 C 수업 시간에 pointer를 가르치면서 경험한 친근한 블루스크린을 Java 수업 시간에선 거의 보지 않는다 (물론 VMS가 대중화되면서 C도 자기만 죽지 OS까지 죽이기는 어려워졌다. 대신 segment fault를 나타내는 다이알로그박스로 대체된 듯...).
주변의 능숙한 C 프로그래머들은 그다지 좋아하지 않는 Garbage collector가 초보 프로그래머들의 생산성을 상당히 끌어올렸다는 점은 부정하기 어렵다고 생각한다 (어느 경우나 높은 경지로 가는 건 쉽지 않다. 그렇다면 적당한 수준의 인력들만으로 수용가능한 수준의 품질이 나오게 하는 기술은 환영받을 수 밖에 없는 거 같다.).
지금은 거의 Python을 사용하는 처지가 된 터라... 격세지감도 느껴진다. image processing이나 machine learning, 통계처리, 데이터 처리, 신호처리 등등에서 Python은 압도적인 생산성과 편리함을 제공해 준다. 특히, 기존 interpreter의 단점을 Python virtual machine (PVM)의 도입 등을 통해 커버하면서, Python 고유의 dynamic language의 편리성 (사실 개인적으로는 엄격한 type check를 선호하지만...)은 전문 프로그래머가 아닌 수학자나 연구자들이 다양한 라이브러리를 쉽게 개발하여 배포할 수 있게 해 주었고 이는 강력한 third party libraries의 지원으로 이어졌다.
한때 연구실에서 알고리즘 개발이나 통계처리 등에서 많이 사용하던 Matlab이나 SPSS등 마저도 python으로 거의 대체된 것을 보면... (가장 애매한 언어가 R이다. 나쁘진 않지만... Python에게 점점 그 영역을 빼앗기고 있는 듯...)
아쉬운 건 C나 C++을 통해 컴퓨터의 내부 구조 등에 대한 이해를 같이 쌓아올리지 못한다는 점이지만...
이 부분도 본인이 필요하면 솔직히 따로 공부할 수 있는 것이니 이처럼 생산성과 편리함을 극대화시켜 이용하는 것도 나쁘지 않다고 생각된다.
Interpreter
Interpreter
는
- 해당 interpreter가 지원하는 programming language로 작성된 application나 commands로 작성된 script 등이
- OS를 통해 실행 (interpreter는 OS 상에서 동작하는 S/W)되도록
- 처리해주는 program을 가르킨다.
An interpreter is a type of computer program that is able to directly execute instructions that are written in a programming or scripting language, without needing to first compile them into machine language instructions.
마치,
- OS가 application과 H/W 사이에 위치하면서 application 개발자에게
다양한 HW를 고려하기 위한 학습이나 노력 없이도 단지 OS 하고만 대화할 수 있는 능력만 있으면
application을 개발하게 해주는 편리성을 제공한 것처럼, - Interpreter는 OS와 application 사이에 위치하면서
다양한 OS에 대한 고려 없이
해당 interpreter와 대화할 수 있으면 쉽게 application을 작성할 수 있게 해 준다. - Interpreter는 개발자가 작성한 script를 OS가 알아들을 수 있는 언어로 바꾸어주는 역할을 하기 때문에 통역사라는 이름이 붙음.
https://dsaint31.me/mkdocs_site/CE/ch08/ce08_compiler_interpreter/
다음은 Python Interpreter의 구성과 동작을 간략히 보여주는 diagram이다.
아래 그림에서도 보이듯이 요즘의 interpreter는 사실상 virtual machine라고 봐도 무방하다.
- 왼쪽 끝의 source code는 다음과 같은 세가지 방식 중 하나로 interpreter에 입력되어 수행되는데,
- shell을 통한 REPL 방식 (=shell execution)과
- script 파일(.py확장자)을 이용한 방식 (=script execution),
- 또는 -m 옵션을 통한 module로 수행하는 방식이 있다.
- 오른쪽 끝의 아이콘은 executable binary code로 OS가 직접 인식하고 실행할 수 있는 코드(machine code)이며 실제 시스템의 cpu를 통해 실행이 됨을 의미한다.
- 참고로 Library moduels가 들어오는 화살표와 비슷하게, 사용자가 해당 python source code에서 요구하는 입력들도 byte code가 PVM에서 실행될 때 주어진다.
Python Virtual Machine
초기의 interpreter
들은
프로그래머의 script를 step-by-step으로 실행 (주로 statement 단위로)하는 방식으로 동작했기 때문에
line(or statement) 별로 수행하고 그 결과를 즉시 확인하는 형태(immediate feedback)로 개발이 이루어지는 게 일반적이라
교육용으로는 적절했지만 최적화 등이 이루어지기 어려운 구조였다.
현재 Python의 interpreter
는
Python Virtual Machine (PVM)
을 중심으로,- Python code를 PVM에서 동작가능한 byte code로 변환해 주는 변환기와
- 기본적으로 제공되는 library (=built-in library)들
로 구성된다.
byte code에 대해선 다음 URL을 참고 :https://dsaint31.me/mkdocs_site/CE/ch08/ce08_compiler_interpreter/#byte-code
이 같은 virtual machine 기반의 interpreter는 step-by-step으로만 execution이 되던 interpreter의 단점을 극복하게 해 준다.
엄밀한 의미에서 interpreter는 runtime에 source code에 대한 lexing, parsing과 execute가 이루어진다.
때문에 당연히 느려질 수밖에 없으며 동시에 전체 code를 분석하여 얻어지는 optimization이 쉽지않다.
실제로 Virtual Machine
의 효용성은 Java
에서 검증이 되었다.
- 비록 OS에서 직접적으로 수행되는 가능한 executable code로 compile 및 linking이 이루어지는 C, C++ 보다는 느리지만,
- 기존 interpreter보다는 빠른 수행속도가 가능하고
- 동시에 C, C++ 이 가질 수 없는 interpreter 방식의 접근성 및 확장성을
Virtual Machine
은 가능하게 해 준다.
동시에 Just-In-Time (JIT)등의 기술 개발 및 컴퓨팅 하드웨어의 발전은 이전의 C, C++ 수준의 수행속도를 Python 및 Java 등에서 가능하게 해주고 있다.
참고: JIT https://ds31x.tistory.com/187
Virtual Machine
은 software로 구현된 computer의 abstraction이라고 정의할 수 있다.
매우 넓은 범위에서 사용되는 term으로 Oracle의 Virtual Box와 같이 컴퓨터 시스템을 완벽히 추상화한 매우 무거운 VM도 있으나,
Docker를 통해 Host OS와 Kernel을 공유하는 Container 수준의 가벼운 VM (엄밀하게는 이 둘은 구분되는 개념임),
또는 특정 instruction set 및 garbage collector 등을 지원하는 Java나 Python의 VM 등도 있기 때문에
context에 따라 다르게 생각해야 한다.
좀 더 자세하게
Virtual Machine의 개념 (Host OS와 가장 많이 격리되어 동작하는 VirtualBox 등의 VM)과
Container의 개념의 차이를 알고 싶다면
다음 URL을 참고할 것 : Container and Virtual Machine
일반적인 VM의 공통점은 고유의 수행가능한 instruction set을 가진다는 점이다.
(이 같은 정의를 좀 더 넓게 적용하면, Web Browser도 일종의 Virtual Machine이라고 볼 수 있다.) : 참고자료
PVM이나 JVM의 경우, Python이나 Java code를 해당 VM에서 동작가능한 byte code로 변환시키는데,
이 byte code는 해당 VM에서 수행가능한 instruction들의 모음이라고 볼 수 있다.
즉, 변화된 해당 byte code가 VM에서 수행되는데, VM은 해당 byte code를 결국 Host OS (VM이 설치된 컴퓨터 시스템의 OS)가 실행가능하도록 중간에서 중재(binary code로 변경)하는 역할을 하게 된다.
마치 OS가 application과 HW사이에서 중재하듯이...
Python에서 Interpreter는 Python Virtual Machine을 중심으로 하고 있으며, 해당 PVM이 어떤 언어 또는 플랫폼으로 구현되었는지에 따라 구별된다. 가장 널리 사용되는 PVM은 C언어로 구현된 CPython이지만 Java로 구현된 Jython, 닷넷 기반의 IronPython 등의 다양한 PVM이 존재한다.
'Programming' 카테고리의 다른 글
[Python] Assignment와 Shallow Copy, Deep Copy (0) | 2023.06.05 |
---|---|
[Programming] Garbage Collection (GC) (0) | 2023.06.05 |
[Python] recursive call : Fibonacci Sequence (0) | 2023.05.24 |
[ML] Levenshtein distance (1) | 2023.05.17 |
[Python] argparse 사용하기. (0) | 2023.04.05 |