파이썬은 해석되거나 컴파일됩니까?


76

이것은 해석되고 컴파일 된 언어에 대해 읽는 동안 궁금했습니다.

루비 는 소스 코드가 실행 시점에 인터프리터에 의해 처리되므로 인터프리터 언어는 의심의 여지가 없습니다.
반대로 C 는 컴파일 된 언어입니다. 먼저 머신에 따라 소스 코드를 컴파일 한 다음 실행해야합니다. 이 결과는 훨씬 더 빠른 실행입니다.

이제 파이썬 으로 왔습니다 .

  • 가져올 때 파이썬 코드 ( somefile.py ) 는 동일한 디렉토리에 파일 ( somefile.pyc )을 만듭니다 . 파이썬 쉘 또는 장고 모듈에서 가져 오기가 완료되었다고 가정 해 봅시다. 가져온 후 코드를 약간 변경하고 가져온 함수를 다시 실행하여 여전히 이전 코드를 실행하고 있음을 확인하십시오. 이것은 * .pyc 파일이 C 파일을 컴파일 한 후 생성 된 실행 파일과 유사한 파이썬 파일로 컴파일되었지만 * .pyc 파일을 직접 실행할 수는 없음을 나타냅니다.
  • python 파일 (somefile.py)이 직접 실행되면 (./somefile.py 또는 python somefile.py) .pyc 파일이 생성되지 않으며 해석 된 동작을 나타내는대로 코드가 실행됩니다.

이것은 파이썬 코드가 새로운 프로세스에서 임포트 될 때마다 컴파일되어 .pyc가 직접 실행될 때 해석되는 동안 .pyc를 생성 할 것을 제안합니다.

어떤 언어로 생각해야합니까? 해석되거나 컴파일 되었습니까? 그리고 그 효율성은 해석 및 컴파일 된 언어와 어떻게 비교됩니까?

위키의 Interpreted Languages 페이지 에 따르면 , 가상 머신 코드로 컴파일 된 언어로 표시됩니다. 그 의미는 무엇입니까?


1
루비가 통역 언어인지에 대한 의문은 언제입니까? 컴파일되었을 때. :) macruby.org
mipadi

8
현대 언어가 엄격한 의미로 해석되지 않는다는 점은 주목할 가치가 있습니다. 거의 모든 것이 바이트 코드로 컴파일됩니다.
Winston Ewert

@Winston Ewert : 브라보! Applesoft Basic (1980 년대)은 바이트 코드로 컴파일되었습니다. 이 경우 "현대"는 살아있는 기억에있는 모든 해석 된 언어를 의미하며 일부 예외적 인 Dartmouth Basic 구현은 예외입니다.
S.Lott

6
>> 반대로 C 언어는 컴파일 <<이다 root.cern.ch/drupal/content/cint
igouy

3
@ S.Lott : Applesoft와 '80 년대 BASIC 통역사가 "바이트 코드 컴파일"을했던 토큰 화 프로세스를 호출하는 것은 조금 별개입니다. 예, 사용자가 입력 한 프로그램 코드는 예약어 당 1 바이트 씩 압축 된 형태로 메모리에 저장되었지만 입력 할 때까지 그 이상은 수행되지 않았습니다 RUN. 그것은 렉싱 단계를 수행 한 다음 컴파일러가 프로그램을 실행할 때마다 다시 구문 분석 해야하는 스트림을 출력하는 컴파일러를 사용하는 것과 같습니다. 예를 들어, javaclexing, parsing 및 최적화를 포함하는 현대 바이트 코드 컴파일과 전혀 다릅니다.
dodgethesteamroller

답변:


80

언어 는 해석되거나 컴파일되지 않지만 언어 구현 은 코드를 해석하거나 컴파일 한다는 점에 주목할 가치가 있습니다. Ruby는 "통역 된 언어"이지만 Ruby a MacRuby를 컴파일 할 수 있으므로 항상 해석되는 언어는 아닙니다 .

거의 모든 Python 구현은 컴파일러가 아닌 인터프리터로 구성됩니다. 표시되는 .pyc파일은 Python 가상 머신 (Java .class파일 과 유사)의 바이트 코드입니다 . 네이티브 머신 아키텍처를 위해 C 컴파일러가 생성 한 머신 코드와 동일하지 않습니다. 그러나 일부 Python 구현 은 Python 바이트 코드를 기본 기계 코드로 컴파일 하는 JIT (Just-In-Time) 컴파일러 로 구성됩니다 .

(파이썬 용 네이티브 머신 컴파일러를 모르기 때문에 "거의 모든 것"이라고 말하지만, 어디에도 존재하지 않는다고 주장하고 싶지 않다.)


정의에 따라 Python 용 기본 머신 컴파일러가 존재합니다. 일부는 파이썬의 하위 집합 만 컴파일합니다. 다른 사람들은 모든 파이썬을 구현하지만 파이썬 API를 사용하여 실제로 C에서 수행 할 수없는 작업을 수행합니다.
Winston Ewert

필자는 실제로 파이썬이 내가 '반 컴파일'이라고 부르거나 실제로 전체 컴파일 될 수 있다고 설명한다고 생각합니다. 세미 컴파일이란 일반적으로 Python 가상 머신에서 사용하는 '중급 언어'.pyc 파일로 컴파일되므로 일반적으로이 '반 컴파일 된'형식으로 실행되므로 일반적으로 해석 된 코드의 일반 런타임 해석 흥미롭게도 세미 컴파일 된 코드는 네이티브 컴파일 된 코드보다 빠를 수 있습니다 (예 : C #은 일반적으로 C ++보다 빠릅니다).
Chris Halcrow

5
Cython은 Python 코드를 C로 컴파일하여 공유 객체로 컴파일 할 수 있습니다.
greyfade

이 방식으로 바이트 코드와 기계 코드를 구별하는 것은 매우 임의적입니다. Java가 컴파일 됨 : javac 컴파일러는 가상 머신 (예 : 핫스팟) 또는 하드웨어 (예 : Jazelle 확장명을 가진 ARM 프로세서)에서 실행될 수있는 하위 레벨 명령어를 포함하는 클래스 파일을 생성합니다. 내가 아는 한, 유사한 프로세서 아키텍처가 파이썬 vm 명령어를 직접 실행하도록 설계 할 수없는 기술적 인 이유는 없습니다.
Jules

@Jules 우연히도 Jython 코드는 실제로 py 소스를 수정할 때까지 재사용되는 .class 파일로 컴파일됩니다.
JimmyJames

35

파이썬은 바이트 코드로 해석됩니다. .py소스 코드는 먼저로 바이트 코드로 컴파일됩니다 .pyc. 이 바이트 코드는 해석 (공식 CPython) 또는 JIT 컴파일 (PyPy) 할 수 있습니다. Python 소스 코드 ( .py)는 IronPython (.Net) 또는 Jython (JVM)과 같은 다른 바이트 코드로 컴파일 할 수 있습니다. 파이썬 언어에는 여러 가지 구현이 있습니다. 공식적인 것은 해석 된 바이트 코드입니다. 바이트 코드 JIT 컴파일 구현도 있습니다.

다양한 언어 구현에 대한 속도 비교를 위해 여기에서 시도 할 수 있습니다 .


벤치 마크에 따르면 파이썬의 성능은 떨어집니다!
crodjer

1
내가 준 링크는 이것들이 언어 구현의 결함있는 벤치 마크 라고 명시하고있다 . 실행 성능에 대해 너무 걱정한다면 파이썬은 언어를 선택해서는 안됩니다. 여전히 비교하려면 비슷한 언어를 비교하십시오. 공식 CPython으로 해석되는 바이트 코드는 JIT 컴파일 Ruby보다 비슷하거나 빠릅니다.
aufather

1
@ jase21- "2006 년 계획은 Psyco에서 구현 된 기술을 PyPy로 이식하는 것입니다. PyPy를 사용하면보다 유연한 JIT 전문가를 구축하고 실험하기가 쉬우 며 진화 과정을 따라 가지 않아도됩니다. "파이썬 언어" psyco.sourceforge.net/introduction.html
igouy

1
@ jase21- "파이썬 코드가 C 카운터 파트보다 빠르게 실행되게한다"-우리는 단지 당신의 말을 받아 들여야합니까?
igouy

3
답변의 링크가 끊어졌습니다.
Basilevs

11

컴파일 및 해석은 일부 상황에서 도움이 될 수 있지만 기술적 인 의미로 적용 할 때는 잘못된 이분법입니다.

(가장 넓은 의미에서) 컴파일러는 변환기 입니다. 프로그램 A를 프로그램 B로 변환하고 나중에 실행할 수 있도록 머신 M을 사용합니다.

(가장 넓은 의미에서) 통역사는 집행자 입니다. 프로그램 A를 실행하는 것은 기계 M입니다. 비록 우리는 일반적으로 물리적 기계 (또는 물리적 기계와 같은 역할을하는 비 물리 기계)를이 정의에서 제외합니다. 그러나 이론적 관점에서 볼 때, 그 구별은 다소 임의적입니다.


예를 들어 보자 re.compile. 정규식을 중간 형식으로 "컴파일"하고 해당 중간 형식을 해석 / 평가 / 실행합니다.


결국, 그것은 당신이 말하는 수준의 추상화와 관심있는 것에 달려 있습니다. 사람들은 프로세스의 가장 흥미로운 부분에 대한 광범위한 설명으로 "컴파일"또는 "통역"이라고 말하지만 실제로 대부분의 모든 프로그램은 어떤 방식 으로든 컴파일 (번역) 및 해석 (실행)됩니다.

CPython (Python 언어의 가장 보편적 인 구현)은 코드 실행에 주로 흥미 롭습니다. 따라서 CPython은 일반적으로 해석 된 것으로 설명됩니다. 이것은 느슨한 레이블이지만.


7

가상 머신 코드는 원본 소스 코드 (바이트 코드)의 압축 버전입니다. 머신 코드가 아니기 때문에 가상 머신에서 여전히 해석해야합니다. 그러나 인간이 작성한 원래 코드보다 구문 분석이 더 쉽고 빠릅니다.

일부 가상 머신은 가상 머신 코드를 처음 해석하는 동안 머신 코드를 생성합니다 (JIT). 다음 호출은이 기계 코드를 직접 사용하므로 실행 속도가 빨라집니다.

내가 아는 한 Ruby> = 1.9는 Python과 같은 가상 머신도 사용합니다.


5

Python 런타임은 가상 머신에서 사용자 정의 오브젝트 코드 (바이트 코드)를 실행합니다.

컴파일 프로세스는 소스 코드를 객체 코드로 변환합니다.

작업 속도를 높이기 위해 객체 코드 (또는 원하는 경우 바이트 코드)가 디스크에 저장되므로 다음에 프로그램을 실행할 때 재사용 할 수 있습니다.

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