네이티브 머신 코드에 파이썬 컴파일러가없는 이유는 무엇입니까?


25

내가 이해하는 것처럼 컴파일 된 언어와 파이썬의 속도 차이의 원인은 첫 번째 코드가 네이티브 컴퓨터의 코드로 코드를 컴파일하는 반면 파이썬은 파이썬 바이트 코드로 컴파일하여 PVM에서 해석하기 때문입니다. 나는이 방법으로 파이썬 코드가 여러 운영 체제 (적어도 대부분의 경우)에서 사용될 수 있음을 알지만, 왜 기존 컴파일러와 동일한 방식으로 컴파일되는 파이썬을위한 추가 (선택적) 컴파일러가 없는지 이해하지 못합니다 . 이것은 프로그래머가 선택하도록 남겨두고 더 중요하다. 기본 시스템의 다중 플랫폼 실행 가능성 또는 성능 일반적으로; 컴파일되고 해석 된대로 동작 할 수있는 언어가없는 이유는 무엇입니까?


4
있다 . 컴파일 또는 GHCI을 통해 해석으로 하스켈도 행동 할 수
toasted_flakes

C ++에는 인터프리터 도 있습니다 . 그리고 아마도 다른 많은 언어들이 두 가지 구현을 모두 가지고있을 것입니다.
Claudio

2
사실, IronPythong을 선택하여 ( ironpython.net )와 "NGEN"를 사용하여 생성 된 IL 코드를 컴파일 ( msdn.microsoft.com/de-de/library/6t9t5wcf%28v=vs.110%29.aspx이 )가 있습니다 방법 파이썬을 네이티브 머신 코드로 컴파일합니다. 그 툴 체인을 테스트 한 것은 아닙니다.
Doc Brown

10
Python-to-native 컴파일러를 작성할 수 있습니다. 파이썬처럼 보이지만 훨씬 더 제한적인 언어를 실제로 구현하지 않는 한 실제로 성능을 크게 향상시키지 않기 때문에 그다지 흥미롭지 않습니다. 나는 다른 곳에서 왜 그런지 설명했다 .

답변:


29

파이썬과 C ++와 같은 언어 사이에 속도 차이가있는 이유는 정적으로 형식화 된 언어가 컴파일러에게 프로그램 구조와 데이터에 대한 많은 정보를 제공하여 계산과 메모리 액세스를 모두 최적화 할 수 있기 때문입니다. C ++은 변수가 int 유형이라는 것을 알고 있기 때문에 프로그램이 실행되기 전에도 해당 변수를 조작하는 최적의 방법을 결정할 수 있습니다. 반면에 파이썬에서는 런타임이 인터프리터가 라인에 도달 할 때까지 변수에 어떤 값이 있는지 알지 못합니다. 이것은 C ++에서 컴파일러가 컴파일하는 동안 메모리 내에서 구조의 크기와 필드의 모든 위치를 쉽게 알 수있는 구조에 매우 중요합니다. 이를 통해 데이터 사용 방법을 예측하는 데 큰 힘이되며 이러한 예측에 따라 데이터를 최적화 할 수 있습니다.

파이썬과 같은 언어를 효과적으로 컴파일하려면 다음이 필요합니다.

  1. 프로그램 실행 중에 데이터 구조가 정적인지 확인하십시오. 파이썬에는 eval과 metaclass가 있기 때문에 문제가됩니다. 둘 다 프로그램의 입력에 따라 프로그램의 구조를 변경할 수 있습니다. 이것이 파이썬에게 표현력을 부여하는 것 중 하나입니다.
  2. 소스 코드 자체에서 모든 변수, 구조 및 클래스의 유형을 유추하십시오. 어느 정도 가능하지만 정적 형식 시스템과 알고리즘은 너무 복잡하여 사용 가능한 방식으로 구현하기가 거의 불가능합니다. 언어의 하위 집합에 대해서는 가능하지만 전체 언어 기능에는 해당되지 않습니다.

6
이것이 문제를 어렵게 만들지 만 불가능하지는 않다는 점은 주목할 가치가 있습니다. sbcl 은 동적이고 공통적 eval이며 컴파일러 작성자를 슬프게 만드는 다른 많은 것들을 공유 하는 Common Lisp를 컴파일합니다 . gcc 수준은 아니지만 CPython의 인터프리터보다 확실히 빠릅니다.
Daniel Gratzer

3
@ jozefg 효과적으로 컴파일했다. 컴파일 만하는 것이 아닙니다. 파이썬도 네이티브 코드를 생성하는 Cython 컴파일러입니다. 요점은 정적 타입 언어를위한 컴파일러가 할 수있는 최적화의 일부조차도 수행 할 수없는 컴파일러이다. 그리고 성능을 비교할 때는 해석 된 파이썬이 아닌 컴파일 된 C ++과 비교하십시오.
Euphoric

2
실제로, 당신은 sbcl이 무엇을 할 수 있는지 놀랄 것입니다. 벤치 마크 게임은 자바와 같은 속도, GHC와 같은 속도, C의 1 ~ 10 배 내에서 실행되는 것으로 나타났습니다. 표준에 따라 속도가 느리지 않습니다. 예, 동적 유형은 컴파일을 어느 정도 억제하지만 생각하는 것만 큼 많지는 않습니다.
Daniel Gratzer 2016 년

3
해석 된 파이썬의 속도와 컴파일 된 파이썬의 속도를 비교하는 것은 그 자체로 흥미 롭습니다. "C ++ 사용"이라고 말하지 마십시오. 아마도 당신은 이미 파이썬으로 작성된 코드를 가지고있을 것입니다. 아마도 코드는 파이썬으로 작성하기가 더 쉽습니다. 누가 신경 쓰겠 어? 내가 신경 쓰는 것은 1.5 배의 속도입니다 (무엇이든). 그것은 큰 차이를 만들 수 있습니다.
Thomas Eding

3
즉, 컴파일하려면 C ++ 또는 Pascal과 같이 해당 언어로 조정 된 다른 언어를 선택하십시오.
Please_Dont_Bully_Me_SO_Lords

0

네이티브 머신 코드로 컴파일 된 파이썬이 컴파일 된 C 나 다른 일반적으로 컴파일 된 언어만큼 빠르지 않은 이유를 이해하는 데 두 가지 개념이 있습니다. 이른 바인딩과 늦게 바인딩이라고합니다.

필자는 파이썬 전문가가 아니라고 말하면서 우연히이 사이트를 방문했다. 그러나 나는이 사이트를 좋아한다.

다른 응답에서 언급했듯이 C ++ 컴파일러는 프로그램에 대해 많은 것을 알고 특정 데이터 구조에 사용할 연산을 결정할 수 있습니다. 예를 들어 두 개의 정수 변수를 함께 추가해야하는 경우 컴파일러는 예를 들어 32 비트 너비의 원시 정수임을 알고 하나의 "ADD"명령어와 함께 추가 할 수 있습니다. 따라서 ADD 명령어를 코드로 컴파일합니다. 프로그램이 잠겨있는 동안 잠겨 있으며 변경할 수 없습니다. 그것은 초기 구속력입니다.

반면 파이썬과 같은 언어에서는 프로그램이 복잡한 방식으로 다른 유형의 데이터를 함께 던질 것으로 기대할 수 있습니다. 이제 컴파일러는 두 변수가 정수, 부동 소수점, 문자열 또는 목록인지 알 수 없습니다. 따라서 런타임시 해당 정보를 결정하고 프로그램이 실행되는 동안 올바른 작업을 선택하는 코드를 컴파일해야합니다. 이것은 구속력이 있으며 프로그램이 실행되는 동안 추가 작업을 수행하면 성능이 저하 될 수 있음을 이해할 수 있습니다. Python과 같은 언어로 이러한 옵션을 열어 놓는 데 드는 비용이지만 런타임 유연성이 극대화됩니다.


-4

C #을 기계 코드로 컴파일 할 수없는 것과 같은 이유로 Python 사양 자체와 더 관련이 있다고 생각합니다. 언어 특성상 언어의 특성으로 인해 가능하더라도 프로그램에 버그가 생길 수 있습니다. 왜 C 언어를 배우지 않겠습니까? C ++보다 훨씬 쉽고 Python보다 약간 고급이지만 여전히 접근 가능합니다.


5
C #은 기계 코드로 직접 이동할 수 있습니다. 공통 중간 언어 : Ahead of Time 컴파일 - "CLI 호환 실행 환경에는 어셈블리의 AOT (Ahead-of-Time) 컴파일을 제거하여 더 빠르게 실행하도록 옵션이 제공됩니다. .NET Framework에는 AOT를 수행하는 NGEN (Native Image Generator)이라는 특수 도구가 있습니다. Mono에는 AOT를 수행하는 옵션도 있습니다. "
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.