CPython, JPython, IronPython, PyPy가 어떻게 다른지 이해하는 데 동일한 문제가있었습니다.
따라서 설명을 시작하기 전에 세 가지를 기꺼이 제거하려고합니다.
- Python : 언어이며, 통역사 (python 코드를 허용하는 프로그램)에게 자신을 전달 / 표현하는 방법 만 설명 / 설명합니다.
- 구현 : 통역사가 어떻게 작성되었는지, 구체적 으로 어떤 언어 로 무엇을하는지에 관한 것 입니다.
- 바이트 코드 : 이것은 "실제"컴퓨터 시스템 인 하드웨어 프로세서가 아닌 가상 시스템이라고하는 프로그램에 의해 처리되는 코드입니다.
CPython은 C 언어로 작성된 구현입니다. 파이썬 고유의 바이트 코드 (스택 머신 기반 명령 세트)를 생성 한 다음 실행합니다. 파이썬 코드를 바이트 코드로 변환하는 이유는 기계 명령어처럼 보이는 경우 인터프리터를 더 쉽게 구현할 수 있기 때문입니다. 그러나 파이썬 코드를 실행하기 전에 바이트 코드를 생성 할 필요는 없습니다 (그러나 CPython은 생성합니다).
CPython의 바이트 코드를보고 싶다면 할 수 있습니다. 방법은 다음과 같습니다.
>>> def f(x, y): # line 1
... print("Hello") # line 2
... if x: # line 3
... y += x # line 4
... print(x, y) # line 5
... return x+y # line 6
... # line 7
>>> import dis # line 8
>>> dis.dis(f) # line 9
2 0 LOAD_GLOBAL 0 (print)
2 LOAD_CONST 1 ('Hello')
4 CALL_FUNCTION 1
6 POP_TOP
3 8 LOAD_FAST 0 (x)
10 POP_JUMP_IF_FALSE 20
4 12 LOAD_FAST 1 (y)
14 LOAD_FAST 0 (x)
16 INPLACE_ADD
18 STORE_FAST 1 (y)
5 >> 20 LOAD_GLOBAL 0 (print)
22 LOAD_FAST 0 (x)
24 LOAD_FAST 1 (y)
26 CALL_FUNCTION 2
28 POP_TOP
6 30 LOAD_FAST 0 (x)
32 LOAD_FAST 1 (y)
34 BINARY_ADD
36 RETURN_VALUE
이제 위의 코드를 살펴 보겠습니다. 1-6 행은 함수 정의입니다. 8 행에서 CPython (인터프리터)이 생성 한 중간 파이썬 바이트 코드 (또는 파이썬 바이트 코드의 디스어셈블러)를 보는 데 사용할 수있는 'dis'모듈을 가져옵니다.
참고 : #python IRC 채널 에서이 코드에 대한 링크를 얻었습니다 : https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c
그리고 자이 썬 (Jython)이 있는데, 자바로 작성되어 자바 바이트 코드를 생성하게됩니다. Java 바이트 코드는 JVM (Java Virtual Machine)의 구현 인 Java Runtime Environment에서 실행됩니다. 이것이 혼란 스럽다면 Java가 어떻게 작동하는지 전혀 모른다고 생각합니다. 일반인 용어로, Java (컴파일러가 아닌 언어) 코드는 Java 컴파일러에서 가져 와서 JRE를 통해서만 실행할 수있는 파일 (Java 바이트 코드)을 출력합니다. 이는 Java 코드가 컴파일 된 후 Java 바이트 코드 형식으로 다른 시스템으로 이식 될 수 있도록하기 위해 수행되며, 이는 JRE에서만 실행할 수 있습니다. 그래도 여전히 혼란 스러우면이 웹 페이지를 살펴볼 수 있습니다 .
CPython의 바이트 코드가 Jython과 같이 이식 가능한지 물어볼 수 있습니다. CPython의 구현에서 생산 된 바이트 코드는 코드의 추가 실행을 위해 쉬운 그것을 만들기위한 인터프리터 특정했다 (I는 또한 처리의 많은 다른 통역으로 이루어집니다 단지 편의를 위해, 그와 같은 중간 바이트 코드 생성을 의심).
따라서 Jython에서는 Python 코드를 컴파일 할 때 JVM에서 실행될 수있는 Java 바이트 코드로 끝납니다.
마찬가지로 C # 언어로 작성된 IronPython은 Python 코드를 CLR (Common Language Runtime)로 컴파일합니다.이 언어는 Microsoft에서 개발 한 JVM과 유사한 기술입니다.