CPython은 무엇입니까?


최상의 답변

CPython은 C 프로그래밍 언어로 작성된 Python의 참조 구현입니다. C의 다른 구현을 포함하여 많은 다른 구현이 있습니다. 그러나 CPython이 가장 널리 사용되며 다른 모든 구현과 비교됩니다.

Python은 언어 사양입니다. 특정 구현을 지정하여 구현 세부 정보를 참조하는 경우 CPython 버전을 참조하는 것이 합당한 가정입니다.

구현을 검색 할 수 있지만 결과가 다소 혼란 스러울 수 있습니다. 모든 구현이 완료되지는 않았고 모두 “일반”시스템이나 기존 프로그램 실행 환경 (예 : 터미널 창 또는 텍스트 콘솔)에서 실행되지도 않습니다.

예 : MicroPython 은 마이크로 컨트롤러를 대상으로하는 CPython에서 파생 된 축소 형입니다. Jython 은 Java로 작성되었으며 JVM (Java Virtual Machine)에서 실행되며 네이티브 Java를 가져오고 상호 운용하는 기능 (인트로 스펙 션 포함)을 포함합니다. IronPython 은 Microsoft의 C #으로 작성되었으며 .NET 프레임 워크의 CLR (공용 언어 런타임) 내에서 실행되도록 타겟팅되었습니다. PyPy 는 대부분 Python으로 작성된 Python 버전이지만 제한된 언어 하위 집합을 구현하고 JIT (Just-In- 시간 동적 / 런타임 컴파일). (이 하위 집합은 RPython 이라고하며 Python 이상을 지원하기위한 것입니다.)

혼란이 무엇인지 알겠습니까?

자바 스크립트 로 작성되고 일반 브라우저 (DOM… 또는 Documenr에서 실행되도록 설계된 두 가지 이상의 Python 구현)가 있습니다. 개체 모델… 환경). Brython Skulpt 입니다. 또한 Transcrypt, pyjs -(공식적으로 Pyjamas) 그리고 아마도 RapydScript (Python과 JS의 하이브리드와 비슷합니다).

보시다시피 , 주제를 충분히 깊이 파고 들면 다양한 프로젝트와 도구를 구현으로 분류하기가 점점 더 어려워집니다.

예를 들어 Cython 는 특별히 주석이 달린 Python과 유사한 코드를 가져 와서 Python으로 가져 와서 인터프리터에 대한 다른 네이티브 컴파일 된 확장처럼 사용할 수있는로드 가능한 (바이너리 / 네이티브) 모듈로 컴파일하는 도구입니다. 선택한 Python 코드 스 니펫을 CPython interpeter의 바이너리 확장으로 최적화하기위한 도구만큼 Python의 구현으로 간주되지 않습니다. (자이 썬에서 작업하는 경우 코드의 일부를 Java로 다시 작성하고 Jython의 상호 운용 및 내부 검사 기능을 사용하여 해당 코드를 사용할 수 있습니다. 비유로 말하면)

Numba 는 Python 및 NumPy 코드를 LLVM 및 LLVM 런타임 지원을 Python 인터프리터의 실행 엔진에 통합합니다. 이것은 Cython의 고유 한 모듈 / 확장 패러다임보다 JIT에 가깝다고 설명됩니다. 그래도 전체 언어의 “구현”이라기보다는 도구에 가깝습니다.

그러나 Nuitka 를 보면 전체 Python 프로그램을 컴파일하는 야심 찬 프로젝트. 그래서 그것은 더 많은 구현 일 수 있습니다.

다른 프로젝트 (Python의 창시자 인 Guido van Rossum이 작업하고있는 프로젝트 인 것 같습니다)는 mypy -선택적 정적 유형 지정 및 일부 로컬 유형 추론이있는 Python. 이것은 새로운 구현이 아닙니다. 파이썬을 처리하고 (주석이없는) 파이썬을 CPython 런타임 엔진 (인터프리터)으로 다시 패어 싱하는 일종의 프런트 엔드 인 것 같습니다.

더 많은 구현에 뛰어 들고 싶다면 및 링크는 PythonImplementations-Python Wiki 를 참조하세요.

참고 저는 여기에서 많은 내용을 다루었으며 관련 방법을 설명하려고했습니다. 그렇게. 그 위키 페이지는 더 적은 설명과 함께 죽었거나 유지되지 않은 프로젝트에 대한 몇 가지 링크가있는 간단한 가방에 가깝습니다.

답변

CPython, JPython이 어떻게 작동하는지 이해하는 데 동일한 문제가있었습니다. , IronPython, PyPy는 서로 다릅니다.

따라서 설명을 시작하기 전에 다음 세 가지를 정리하겠습니다.

  1. Python : 언어이며 인터프리터 (파이썬 코드를 받아들이는 프로그램)에게 자신을 전달 / 표현하는 방법을 설명 / 설명합니다.
  2. 구현 : 통역사가 어떻게 작성되었는지, 특히 어떤 언어 종료되는 작업 .
  3. 바이트 코드 : 하드웨어 프로세서 인 “실제”컴퓨터 시스템이 아니라 일반적으로 가상 시스템이라고하는 프로그램에 의해 처리되는 코드입니다.

CPython은 C 언어로 작성된 구현. 결국 파이썬 고유의 바이트 코드 (스택 머신 기반 명령어 세트)를 생성 한 다음 실행합니다. Python 코드를 바이트 코드로 변환하는 이유는 “기계 명령어처럼 보이면 인터프리터를 구현하는 것이 더 쉽기 때문입니다. 그러나 실행 전에 일부 바이트 코드를 생성 할 필요는 없습니다 (하지만 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)

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 (인터프리터)에 의해 생성 된 중간 Python 바이트 코드 (또는 Python 바이트 코드 용 디스어셈블러)를 보는 데 사용할 수있는 “dis”모듈을 가져옵니다.

참고 : #python IRC 채널에서이 코드에 대한 링크를 얻었습니다. https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c

그리고 Java로 작성되어 Java 바이트 코드를 생성하는 Jython이 있습니다. Java 바이트 코드는 JVM (Java Virtual Machine)의 구현 인 Java Runtime Environment에서 실행됩니다. 이것이 혼란 스러우면 Java가 어떻게 작동하는지 전혀 모른다고 생각합니다. 평범한 용어로 Java (컴파일러가 아닌 언어) 코드는 Java 컴파일러가 가져와 JRE를 사용해서 만 실행할 수있는 파일 (Java 바이트 코드)을 출력합니다. 이렇게하면 Java 코드가 컴파일되면 JRE에서만 실행할 수있는 Java 바이트 코드 형식으로 다른 시스템으로 이식 할 수 있습니다. 그래도 혼란 스러우면이 웹 페이지 를 살펴 보시기 바랍니다.

여기에서 CPython이 있는지 물어볼 수 있습니다. ” s 바이트 코드는 Jython처럼 이식 가능하지만 그렇지 않은 것 같습니다. CPython 구현에서 생성 된 바이트 코드는 코드의 추가 실행을 쉽게하기 위해 해당 인터프리터에 특정한 것입니다. (저는 또한 이러한 중간 바이트 코드 생성은 처리의 용이성을 위해 다른 많은 인터프리터에서 수행됩니다.) 위의 코드에서 볼 수 있듯이 바이트 코드를 실행하는 것이 얼마나 쉬운 지 궁금하다면 (9 줄에서 끝까지) ), 그런 다음 이것을 생각해보십시오. 우리는 스택 (데이터 구조)을 가지고 있으며 바이트 코드의 모든 행은 스택을 적절히 수정하는 스택 작업을 수행합니다.이 수정 된 스택은 CPython (인터프리터)에서 코드의 최종 출력을 생성하는 데 사용됩니다. .

따라서 Jython에서 Python 코드를 컴파일하면 JVM에서 실행할 수있는 Java 바이트 코드가됩니다.

마찬가지로 IronPyt hon (C # 언어로 작성)은 Python 코드를 Microsoft에서 개발 한 JVM과 유사한 기술인 CLR (공용 언어 런타임)로 컴파일합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다