파이썬 대 파이썬


447

파이썬과 CPython (Jython, IronPython) 에 대한 소란이 무엇입니까 , 나는 그것을 얻지 못했습니다.

python.org 는 CPython이 다음과 같다고 언급합니다.

"전통적인"파이썬 구현 (닉네임 CPython)

또 다른 스택 오버플로 질문 은 다음과 같이 언급합니다.

CPython은 C로 작성된 Python의 기본 바이트 코드 인터프리터입니다.

솔직히 나는 그 두 설명이 실제로 의미하는 것을 얻지 못했지만 CPython을 사용하면 샘플 파이썬 코드를 실행할 때 그 의미를 C 언어로 컴파일 한 다음 C 인 것처럼 실행한다고 생각했습니다. 암호

그렇다면 CPython은 정확히 무엇이고 파이썬과 비교할 때 어떻게 다른가? 아마도 파이썬보다 CPython을 사용해야한다면 그 장점은 무엇입니까?


답변:


689

CPython은 무엇입니까?

CPython은 원래 Python 구현입니다. Python.org에서 다운로드 한 구현입니다. 사람들은 그것을 CPython이라고 부르며 나중에 다른 파이썬 구현과 구별하고 언어 엔진의 구현을 파이썬 프로그래밍 언어 자체 와 구별합니다 .

후자는 혼란이 시작되는 곳입니다. 파이썬 코드를 실행 하는 것과는 별도로 파이썬 언어를 유지해야합니다 .

CPython과는 일이 정말 그냥 구현 세부 즉 C로 구현 될 수 있습니다. CPython은 Python 코드를 바이트 코드 (투명하게)로 컴파일하고 평가 루프에서 해당 바이트 코드를 해석합니다.

CPython은 또한 새로운 기능을 구현 한 최초의 업체입니다. Python-the-language 개발은 CPython을 기본으로 사용합니다. 다른 구현은 다음과 같습니다.

자이 썬 등은 어떻습니까?

Jython , IronPythonPyPy 는 현재 Python 프로그래밍 언어의 "기타"구현입니다. 이들은 각각 Java, C # 및 RPython (Python의 하위 집합)으로 구현됩니다. Jython은 Python 코드를 Java 바이트 코드로 컴파일 하므로 Python 코드는 JVM에서 실행될 수 있습니다. IronPython을 사용하면 Microsoft CLR 에서 Python을 실행할 수 있습니다 . PyPy는 Python의 하위 집합으로 구현되어 CPython보다 빠르게 Python 코드를 실행할 수 있습니다. :-)

실제로 C로 컴파일

따라서 CPython은 Python 코드를 C 자체로 변환 하지 않습니다 . 대신 인터프리터 루프를 실행합니다. 이 프로젝트 수행 C에 파이썬 틱 코드를 번역, 그리고 그 호출됩니다 사이 썬 . Cython은 Python 언어에 몇 가지 확장을 추가 하고 CPython 인터프리터에 연결 되는 코드 인 C 확장으로 코드를 컴파일 할 수 있습니다 .


93
이론적으로 파이썬 스크립트는 모든 구현을 사용하여 실행될 수 있으며 스크립트 실행 결과는 동일해야한다고 언급 할 가치가 있다고 생각합니다.
Douglas Mendizábal 2016 년

3
사실, 작업중인 프로젝트에 따라 여러 구현에서 Python 코드를 테스트하고 프로파일 링하는 것이 좋습니다. 이전에 Java + Jython 프로젝트에서 작업 한 경험이있는 개발자는이 플랫폼에서 라이브러리를 충분히 테스트하지 않았기 때문에 많은 놀라움을 경험할 수 있습니다.
rahmu

9
"PyPy가 CPython보다 빠르다"고 말하는 것은 조금 위험합니다. 정확히 여기에 그 질문에 대한 좋은 대답이 있습니다 : stackoverflow.com/questions/18946662/…
Max Leske

IronPython에 대해 흥분했습니다 ... Python 2.x 만 지원한다는 것을 알 때까지.
Sean Anderson

@SeanAnderson : Jython도 마찬가지입니다 (2015 년까지 공식 릴리스는 2.5 호환으로 9 년이 지났습니다 .2015 년에 마침내 2.7 릴리스가 있었지만 여전히 3.x 릴리스의 징후는 없습니다).
ShadowRanger

90

언어와 구현을 구별해야합니다. 파이썬은 언어입니다.

Wikipedia 에 따르면 , "프로그래밍 언어는 계산 또는 알고리즘의 사양 인 프로그램 작성을위한 표기법"입니다. 이것은 단순히 코드 작성을위한 규칙과 구문이라는 것을 의미합니다. 별도로 우리는 대부분의 경우 실제 인터프리터 또는 컴파일러 인 프로그래밍 언어 구현 을 가지고 있습니다 .

파이썬은 언어입니다. CPython은 C에서 Python을 구현 한 것입니다. Jython은 Java 등을 구현 한 것입니다.

요약하면 : 이미 CPython을 사용하고 있습니다 (여기 에서 다운로드 한 경우 ).


2
Martijn Pieters의 포스트 "CPython은 파이썬 코드를 C로 자체적으로 변환하지 않습니다. 대신 인터프리터 루프를 실행합니다. Python-ish 코드를 C로 변환하는 프로젝트가 있는데이를 Cython이라고합니다"
Raymond Chenon

2
왜 Cpython에 대해 너무 많은 강조가 있습니까? 즉, Cc ++, CJava 또는 심지어 CSwift가 들리지 않습니다. 아니면 뭔가 빠졌습니까?
Suhaib

3
@Suhaib : Java 세계에서는 HotSpot, OpenJDK, IBM J9 JDK, Azul 등이 있습니다. 일반적으로 더 정확합니다. 즉, "Java 설치"가 아니라 "Java JDK 8과 같은 호환되는 Java 8 JDK 설치"가 표시됩니다. JavaScript 세계에는 node.js, V8 등이 있습니다. "JavaScript 설치"가 아닌 "install node.js"입니까? 그러나 파이썬 세계에서는 "파이썬 3.6 설치"라고 말하고 특정 런타임이 아닌 언어 사양을 언급하는 것이 일반적입니다.
Hendy Irawan

37

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

따라서 설명을 시작하기 전에 세 가지를 기꺼이 제거하려고합니다.

  1. Python : 언어이며, 통역사 (python 코드를 허용하는 프로그램)에게 자신을 전달 / 표현하는 방법 만 설명 / 설명합니다.
  2. 구현 : 통역사가 어떻게 작성되었는지, 구체적 으로 어떤 언어무엇을하는지에 관한 것 입니다.
  3. 바이트 코드 : 이것은 "실제"컴퓨터 시스템 인 하드웨어 프로세서가 아닌 가상 시스템이라고하는 프로그램에 의해 처리되는 코드입니다.

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과 유사한 기술입니다.


3
자세한 설명은 thx! 이것은 CPython이 파이썬 코드를 바이트 코드로 변환하고 바이트 코드를 기계 코드로 해석한다는 것을 의미합니다. 요약하자면 CPython은 컴파일러 (파이썬에서 바이트 코드로)와 파이썬 가상 머신 (바이트 코드에서 머신 코드로)입니까? .Net과 비교하면 C #을 MSIL로 변환하는 C # 컴파일러와 MSIL에서 기계 코드로 변환하는 CLR이 있습니다.
rahulaga_dev 14

30

기사 는 다른 파이썬 구현의 차이점을 철저히 설명합니다. 기사가 말한 것처럼 :

가장 먼저 알아야 할 것은 'Python'이 인터페이스라는 것입니다. 파이썬이 무엇을해야하고 어떻게 동작해야하는지에 대한 사양이 있습니다 (모든 인터페이스와 마찬가지로). 그리고 모든 인터페이스와 마찬가지로 여러 가지 구현이 있습니다.

두 번째로 알아야 할 것은 '해석'과 '컴파일'은 인터페이스가 아니라 구현의 속성이라는 것입니다.


20

파이썬은 언어입니다. 프로그램을 작성하는 데 사용할 수있는 규칙 세트입니다. 이 언어에는 여러 가지 구현이 있습니다.

어떤 구현을 수행하더라도 프로그램의 텍스트를 취해 해석하고 명령을 실행하여 거의 동일한 작업을 수행합니다. 아무도 코드를 C 또는 다른 언어로 컴파일하지 않습니다.

CPython은 C로 작성된 원래 구현입니다. "CPython"의 "C"부분은 Python 인터프리터 자체를 작성하는 데 사용 된 언어를 나타냅니다.

자이 썬은 같은 언어 (파이썬)이지만 자바를 사용하여 구현된다.

IronPython 인터프리터는 C #으로 작성되었습니다.

파이썬으로 작성된 파이썬 인터프리터 인 PyPy도 있습니다. 선택하십시오 :)


8

implementation파이썬 코드를 구현하는 방법이 아니라 파이썬을 구현하는 데 사용 된 언어를 의미합니다. CPython을 사용하면 C 런타임의 가용성은 물론 C / C ++와 쉽게 통합 할 수 있다는 이점이 있습니다.

CPython은 원래를 사용하여 구현되었습니다 C. Python이 Java (JYthon) 또는 .NET Runtime (IronPython)을 활용할 수 있도록하는 원래 구현에는 다른 포크가있었습니다.

사용하는 구현에 따라 라이브러리 가용성이 다를 수 있습니다. 예를 들어 , Jython 에서는 Ctypes를 사용할 수 없으므로 ctypes를 사용하는 라이브러리는 Jython에서 작동하지 않습니다. 마찬가지로 Java 클래스를 사용하려는 경우 CPython에서 직접 사용할 수 없습니다. 접착제 (JEPP)가 필요하거나 Jython (The Java Implementation of Python)을 사용해야합니다.


4

CPython은 Global Interpreter Lock 때문에 멀티 스레딩을 실제로 지원하지 않는다는 것을 알아야합니다 . 또한 재귀에 대한 최적화 메커니즘이 없으며 다른 구현 및 라이브러리가 채우려 고 시도하는 다른 많은 제한 사항이 있습니다.

파이썬 위키 에서이 페이지 를 보아야 합니다.

페이지 의 코드 스 니펫을 보면 통역사가 무엇인지 알 수 있습니다.


17
CPython은 멀티 스레딩을 지원하지만 GIL을 사용하면 여러 코어 또는 CPU를 활용하기가 어렵습니다. 멀티 스레딩을 전혀 지원하지 않는 것과는 다릅니다.
Martijn Pieters

0

파이썬 의 원래의 표준 구현 은 일반적으로 CPython다른 옵션과 대조하고 싶을 때 호출 됩니다 ( 그렇지 않으면 일반 "Python" ). 이 이름은 휴대용으로 코딩되어 있다는 사실에서 비롯된 것입니다 ANSI C language code. 이것은 http://www.python.org 에서 가져 와서 ActivePythonEnthought 배포판을 사용하며 대부분의 Linux 및 Mac OS X 시스템에 자동으로 있는 Python입니다 . 컴퓨터에 사전 설치된 Python 버전을 찾은 경우 CPython회사 나 조직에서보다 특수한 방식으로 Python을 사용하지 않는 한 아마도 그렇습니다.

Python 으로 스크립트 Java.NET응용 프로그램을 작성하거나 이점을 얻 Stackless거나 PyPy강요 하지 않는 한 표준 CPython시스템 을 사용하고 싶을 것입니다 . 언어의 참조 구현이기 때문에 다른 시스템보다 가장 빠르게 실행되고 가장 완벽하며 최신 상태를 유지하는 경향이 있습니다.


3
나는 무례하다는 것을 의미하지는 않지만 CPython은 절대적으로 가장 빠른 속도로 실행되지 않습니다.
Myles Hollowed

0

프로그래밍 언어 구현은 컴퓨터 프로그램을 실행하기위한 시스템입니다.

프로그래밍 언어 구현에는 두 가지 일반적인 접근 방식이 있습니다.

  • 해석 : 통역사는 일부 언어로 된 프로그램을 입력으로 받아서 일부 기계에서 해당 언어로 작성된 조치를 수행합니다.
  • Compilation : 컴파일러는 어떤 언어로 된 프로그램을 입력으로 받아 다른 언어로 번역하여 다른 인터프리터 나 다른 컴파일러에 대한 입력으로 사용할 수 있습니다.

파이썬 은 1991 년 Guido van Rossum이 만든 해석 된 고급 프로그래밍 언어입니다 .

CPythonGuido van Rossum이 만든 C로 작성된 Python 컴퓨팅 언어의 참조 버전입니다 .

다른 파이썬 구현 목록

출처

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.