파이썬은 해석되거나 컴파일됩니까, 아니면 둘 다입니까?


190

내 이해에서 :

해석 언어는 이동 (실행 후 기계 코드에 높은 수준의 언어를 변환하는 프로그램) 높은 수준의 언어 실행 및 인터프리터에 의해 실행이다; 한 번에 조금씩 프로그램을 처리합니다.

컴파일 된 언어는 그 코드를 먼저 실행 프로그램 (코드를 실행하는 다른 프로그램)가 컴파일러 (기계 코드로 고급 언어 변환 프로그램)에 의해 기계 코드로 변환 한 다음에 실행되는 고급 언어이다.

내 정의가 틀렸다면 나를 바로 잡으십시오.

이제 파이썬으로 돌아와서 이것에 대해 약간 혼란 스럽습니다. 어디에서나 파이썬은 해석 된 언어이지만 기계 코드가 아닌 일부 중간 코드 (예 : 바이트 코드 또는 IL)로 해석됩니다 . 그렇다면 어느 프로그램이 IM 코드를 실행합니까? 파이썬 스크립트가 어떻게 처리되고 실행되는지 이해하도록 도와주세요.



2
파이썬은 라이브러리를 가져올 때마다 .pyc 파일 (소위 byecode)을 만듭니다. AFAIK 바이트 코드는 실행 시간이 아닌로드 시간 만 가속화 할 수 있습니다.
Jesvin Jose

2
@aitchnyu : .pyc 파일에서 바이트 코드를 캐시하면 실제로 로딩 속도가 빨라지지만 파이썬 코드가 실행되기 전에 바이트 코드로 컴파일되는 경우에만 해당됩니다. 필자가 파이썬으로 구체적으로 시도한 것은 아니라고 생각하지만 다른 언어 구현에서는 바이트 코드가 일반 AST 또는 더 나쁘지 않은 구문 분석되지 않은 소스 코드보다 효율적으로 해석하기 쉽다는 것을 보여줍니다. 예를 들어, 이전 Ruby 버전은 AST에서 해석되었으며 AFAIK는 바이트 코드로 컴파일되는 최신 버전보다 성능이 약간 뛰어났습니다.

무례하게 말하고 싶지는 않지만 내가 의미하는 바가 아닙니까?
Jesvin Jose

1
@ aitchnyu : 나는 당신이 무슨 뜻인지 모르겠어요. 귀하의 의견이 정확하지는 않지만 일부 백그라운드 정보에 대해 로드 시간 만 단축하는 이유에 대한 좋은 기회를 제공 했기 때문에 해당 정보를 추가하기로 결정했습니다. 어떤 위반도 의미가 없습니다 :)

답변:


232

먼저, 해석 / 컴파일은 언어의 속성이 아니라 구현의 속성입니다. 대부분의 언어에서 모든 구현이 하나의 범주에 속하지는 않지만 대부분 언어가 해석 / 컴파일되었다고 말하는 몇 단어를 절약 할 수 있지만 이해를 돕고 언어가 매우 많기 때문에 여전히 중요한 차이점입니다. 사용 가능한 두 가지 유형의 구현 (주로 기능적 언어 영역에서 Haskell 및 ML 참조) 또한 Python의 서브 세트를 C 또는 C ++ 코드 (및 기계 코드)로 컴파일하려고하는 C 인터프리터 및 프로젝트가 있습니다.

둘째, 컴파일은 기본 머신 코드에 대한 사전 컴파일로 제한되지 않습니다. 컴파일러는보다 일반적으로 한 프로그래밍 언어의 프로그램을 다른 프로그래밍 언어의 프로그램으로 변환하는 프로그램입니다 (확실히 변환이 적용되는 경우 입력 및 출력 언어가 동일한 컴파일러를 사용할 수도 있음). 그리고 JIT 컴파일러 는 런타임 에 네이티브 머신 코드 컴파일합니다. 벤치 마크 및 구현 품질에 따라 사전 컴파일보다 속도가 훨씬 빠르거나 훨씬 빠릅니다.

그러나 nitpicking을 멈추고 질문하려는 질문에 대답하기 위해 : 실제로 (읽기 : 다소 인기 있고 성숙한 구현 사용) Python이 컴파일 됩니다. 사전에 머신 코드로 컴파일되지는 않지만 (즉, 제한적이고 잘못된 것으로 "컴파일"되지만, 일반적인 정의는 아님), "only"는 bytecode로 컴파일 되었지만 여전히 최소한의 이점이있는 컴파일입니다. 예를 들어, 명령문 a = b.c()은 "분해"될 때 다소 비슷하게 보이는 바이트 스트림으로 컴파일됩니다 load 0 (b); load_str 'c'; get_attr; call_function 0; store 1 (a). 이것은 단순화이며 실제로 읽기 어렵고 조금 더 저수준입니다. 표준 라이브러리 dis모듈을 실험 하고 실제 거래 모습을 볼 수 있습니다.

해당 바이트 코드는 참조 구현 (CPython)과 마찬가지로 해석되거나 (이론적 및 실제 성능면에서 직접 해석하고 중간 해석으로 먼저 컴파일하고 해석하는 것 사이에 차이가 있음을 유의하십시오) PyPy 와 같이 런타임에 최적화 된 머신 코드 .


2
자, 이것은 파이썬 스크립트가 먼저 바이트 코드로 컴파일 된 다음 CPython, Jython 또는 IronPython 등과 같은 인터프리터에 의해 구현됨을 의미합니다.
Pankaj Upadhyay

19
아니요, 바이트 코드로 컴파일 된 다음 해당 VM에서 바이트 코드를 실행합니다. CPython은 컴파일러와 VM 모두이지만 Jython과 IronPython은 컴파일러 일뿐입니다.
이그나시오 바스케스-아 브람스

1
@Igacio : IronPython / Jython에 대한 경험이 많지 않지만 최소한 Jython이 인터프리터와 같은 레이어를 제공하지 않습니까? 파이썬을 정적으로 유형이 지정된 JVM 바이트 코드로 바꾸는 것이 가능하다고 생각하지 않습니다. 그래도 컴파일러와 인터프리터가 동일한 패키지의 일부라는 점이 좋습니다.

2
+1 "... 구현의 속성". 나 자신 "는 대화 형 쉘 수 있습니다"라고 한 것
Jesvin 호세

2
@delnan : 자이 썬은 파이썬과 자바 VM 사이에서 일종의 중개자 역할을하지만 자바 바이트 코드로 컴파일한다.
이그나시오 바스케스-아 브람스

34

CPU는 기계 코드 만 이해할 수 있습니다. 해석 된 프로그램의 경우 해석기의 궁극적 인 목표는 프로그램 코드를 기계어 코드로 "해석"하는 것입니다. 그러나 일반적으로 현대적인 해석 언어는 사람의 코드가 너무 비효율적이므로 직접 해석하지 않습니다.

파이썬 인터프리터는 먼저 인간 코드를 읽고이를 기계 코드로 해석하기 전에 중간 코드로 최적화합니다. 그렇기 때문에 코드의 컴파일 된 실행 파일을 직접 실행할 수있는 C ++과 달리 Python 스크립트를 실행하려면 항상 다른 프로그램이 필요합니다. 예를 들어 c:\Python27\python.exe또는 /usr/bin/python.


11
나는 "다른 프로그램이 [it]을 (를) 실행해야한다는 점"에 대한 요점을 좋아합니다. 그것은 내 생각의 일부를 분명히하는 데 도움이되었다.
Matt

그래서 python.exe는 먼저 코드를 최적화 한 다음 해석합니까?
Koray Tugay

@KorayTugay, python.exe에 사람이 읽을 수있는 텍스트 소스 코드가 제공되면 먼저 최적화 된 바이트 코드를 생성 한 다음 해석합니다. 그러나 이미 바이트 코드 파일 (사전 컴파일 된)이있는 경우 첫 단계를 수행 할 필요가 없으므로 시간이 절약됩니다.
GordonBGood

31

대답은 사용중인 파이썬 구현에 따라 다릅니다. 당신이 말할 수 사용하는 경우 CPython의 (파이썬의 표준 구현) 또는 자이 썬 가 처음으로 번역된다 (자바 프로그래밍 언어와의 통합 대상) 바이트 코드 , 당신이 사용하는 파이썬의 구현에 따라이 bycode는 대응에 관한 것이다 해석을위한 가상 머신 . CPython 용 PVM (Python Virtual Machine) 및 Jython 용 JVM (Java Virtual Machine)

그러나 다른 표준 CPython 구현 인 PyPy 를 사용한다고 가정 해 봅시다 . 그것은 사용하는 것이 적시 (just-in-time) 컴파일러 .


바이트 코드로 변환하는 동안 컴파일러가 필요합니까?
RICKY

Pypy는 "CPython"구현이 아닌 Python 구현입니다. 실제로 Pypy는 CPython ( pypy.org/features.html ) 의 대안 입니다.
조르지오

13

파이썬의 공식 웹 사이트에 따르면 해석 된 언어입니다.

https://www.python.org/doc/essays/blurb/

파이썬은 해석되고 객체 지향적 인 고급 프로그래밍 언어입니다 ...

...

컴파일 단계가 없으므로 ...

...

파이썬 인터프리터와 광범위한 표준 라이브러리를 사용할 수 있습니다 ...

...

대신, 인터프리터가 오류를 발견하면 예외가 발생합니다. 프로그램이 예외를 포착하지 않으면 인터프리터는 스택 추적을 인쇄합니다.


7

그렇습니다. 컴파일 된 언어와 해석 된 언어입니다. 그렇다면 왜 우리는 이것을 일반적으로 통역 언어라고 부릅니까?

어떻게 컴파일되고 해석되는지 보라?

우선 Java 세계 출신이라면 내 대답을 더 좋아할 것이라고 말하고 싶습니다.

Java에서 소스 코드는 먼저 javac 컴파일러를 통해 바이트 코드로 변환 된 다음 JVM으로 보내 집니다 (실행 목적으로 원시 코드를 생성해야 함). 이제 Java를 컴파일 된 언어로 호출한다는 것을 보여 드리고자합니다. 소스 코드를 실제로 컴파일하고 .class 파일 (bytecode 이외)을 제공한다는 것을 알 수 있기 때문입니다 .

javac Hello.java ------->는 Hello.class 파일을 생성 합니다

java Hello --------> 실행 목적으로 바이트 코드를 JVM 으로 지정

파이썬에서도 마찬가지입니다. 즉, 먼저 소스 코드가 컴파일러를 통해 바이트 코드로 변환 된 다음 PVM으로 보내 집니다 (실행 목적으로 네이티브 코드를 생성해야 함). 이제 컴파일이 장면 뒤에서 그리고 파이썬 코드를 통해 실행할 때 일반적으로 파이썬을 해석 언어로 호출한다는 것을 보여 드리고자합니다 .

python Hello.py -------> 직접 코드를 만료시키고 코드가 구문 적으로 정확하다는 결과를 볼 수 있습니다.

@ python Hello.py 그것은 직접 실행되는 것처럼 보이지만 실제로는 먼저 해석 목적으로 원시 코드를 생성하기 위해 인터프리터가 해석하는 바이트 코드를 생성합니다.

CPython- 컴파일과 해석의 책임을집니다.

자세한 내용이 필요하면 아래 행을 살펴보십시오 .

앞에서 언급했듯이 CPython 은 소스 코드를 컴파일하지만 실제 컴파일은 cython 의 도움으로 이루어지며 CPython 의 도움으로 해석됩니다

이제 Java와 Python에서 Just-In-Time 컴파일러의 역할에 대해 조금 이야기 해 봅시다.

JVM에는 Java 인터프리터가 존재하여 바이트 코드를 한 줄씩 해석하여 실행 목적으로 원시 기계 코드를 얻지 만 인터프리터가 Java 바이트 코드를 실행하면 실행 속도가 항상 느려집니다. 그래서 해결책은 무엇입니까? 해결책은 해석 할 수있는 것보다 훨씬 더 빨리 실행될 수있는 원시 코드를 생성하는 Just-In-Time 컴파일러 입니다. 일부 JVM 공급 업체는 Java Interpreter를 사용하고 일부 JVM 은 Just-In-Time 컴파일러를 사용 합니다. 참고 : 여기를 클릭

파이썬에서 빠른 실행을 위해 인터프리터를 돌아 다니려면 CPython 대신 다른 파이썬 구현 ( PyPy )을 사용하십시오 . PyPy를 포함한 다른 파이썬 구현을 보려면 여기클릭하십시오 .


6

If (You Java) {

파이썬 코드는 자바처럼 바이트 코드로 변환됩니다.
해당 바이트 코드는 액세스하려고 할 때마다 다시 실행됩니다.

} 다른 {

파이썬 코드는 처음으로 traslated 무언가 바이트 코드라는
기계 언어에 아주 가까이 있지만 실제 기계 코드
마다 우리 액세스 또는 그것을 실행할 수 있도록 그 바이트 코드가 다시 실행

}


2

거의 파이썬은 해석 된 언어라고 말할 수 있습니다. 그러나 우리는 완전한 소스 코드를 자바 언어와 같은 바이트 코드로 변환하기 위해 파이썬에서 한 번 컴파일 프로세스의 일부를 사용하고 있습니다.


1

초보자를위한

파이썬은 스크립트를 컴파일하기 전에 바이트 코드라고하는 컴파일 된 코드로 자동 컴파일합니다.

스크립트 실행은 가져 오기로 간주되지 않으며 .pyc가 생성되지 않습니다.

예를 들어, 다른 모듈 xyz.py를 가져 오는 abc.py 스크립트 파일이있는 경우 abc.py를 실행하면 xyz를 가져온 후 xyz.pyc가 만들어 지지만 abc 이후에는 abc.pyc 파일이 만들어지지 않습니다. py를 가져 오지 못했습니다.


1

파이썬 작업을 시작한 사람들에게 큰 혼란이 있으며 여기에 대한 답변을 이해하기가 조금 어려워서 쉽게 만들 수 있습니다.

Python에게 스크립트를 실행하도록 지시 할 때 코드가 실제로 크 런칭을 시작하기 전에 Python이 수행하는 몇 가지 단계가 있습니다.

  • 바이트 코드로 컴파일됩니다.
  • 그런 다음 가상 머신으로 라우팅됩니다.

소스 코드를 실행할 때 파이썬은 소스 코드를 바이트 코드로 컴파일합니다. 컴파일은 변환 단계이며 바이트 코드는 플랫폼에 독립적 인 소스 코드 표현입니다. 파이썬 바이트 코드는 이진 기계 코드가 아닙니다 (예 : 인텔 칩에 대한 명령어).

실제로 Python은 소스 코드의 각 명령문을 개별 단계로 분해하여 바이트 코드 명령어로 변환합니다. 바이트 코드 변환은 실행 속도를 높이기 위해 수행됩니다. 바이트 코드는 원래 소스 코드 명령문보다 훨씬 빠르게 실행될 수 있습니다. 확장자는 has.pyc이며 컴퓨터에 쓸 수 있으면 쓰여집니다.

따라서 다음에 동일한 프로그램을 실행할 때 Python은 .pyc 파일을로드하고 변경되지 않는 한 컴파일 단계를 건너 뜁니다. Python은 소스 및 바이트 코드 파일의 타임 스탬프를 자동으로 확인하여 언제 다시 컴파일해야하는지 알 수 있습니다. 소스 코드를 다시 저장하면 다음에 프로그램을 실행할 때 바이트 코드가 자동으로 다시 생성됩니다.

파이썬이 바이트 코드 파일을 우리 머신에 쓸 수 없다면, 우리의 프로그램은 여전히 ​​작동합니다. 바이트 코드는 메모리에서 생성되며 프로그램 종료시 간단히 삭제됩니다. 그러나 .pyc 파일은 시작 시간을 단축시키기 때문에 더 큰 프로그램 용으로 작성되었는지 확인하고 싶을 수도 있습니다.

배후에서 일어나는 일을 요약합시다. 파이썬이 프로그램을 실행할 때, 파이썬은 .py를 메모리로 읽어 들여 바이트 코드를 얻기 위해 파싱 한 다음 계속합니다. 프로그램이 가져온 각 모듈에 대해, 파이썬은 먼저 .py 파일에 해당하는 타임 스탬프가있는 .pyo 또는 .pyc에 미리 컴파일 된 바이트 코드 버전이 있는지 확인합니다. 파이썬은 바이트 코드 버전을 사용합니다. 그렇지 않으면 모듈의 .py 파일을 구문 분석하여 .pyc 파일로 저장 한 다음 방금 만든 바이트 코드를 사용합니다.

바이트 코드 파일은 Python 코드를 제공하는 방법 중 하나입니다. 파이썬은 원본 .py 소스 파일이 없어도 are.pyc 파일을 찾을 수 있으면 프로그램을 계속 실행합니다.

Python 가상 머신 (PVM)

우리의 프로그램이 바이트 코드로 컴파일되면, 파이썬 가상 머신 (PVM)으로 실행되도록 출하됩니다. PVM은 별도의 프로그램이 아닙니다. 단독으로 설치할 필요는 없습니다. 실제로 PVM은 바이트 코드 명령을 하나씩 반복하여 작업을 수행하는 큰 루프입니다. PVM은 Python의 런타임 엔진입니다. 항상 파이썬 시스템의 일부로 존재합니다. 실제로 스크립트를 실행하는 구성 요소입니다. 기술적으로 그것은 파이썬 인터프리터라는 마지막 단계 일뿐입니다.


0

작성한 파이썬 코드는 파이썬 바이트 코드로 컴파일되어 확장자가 .pyc 인 파일을 만듭니다. 컴파일되면 다시 질문하십시오. 왜 언어를 컴파일하지 않습니까?

이것은 전통적인 단어의 의미에서 편집되지 않습니다. 일반적으로 컴파일은 고급 언어를 사용하여이를 기계 코드로 변환한다고합니다. 그러나 그것은 일종의 편집입니다. 기계 코드가 아닌 중간 코드로 컴파일되었습니다 (지금 받으십시오).

실행 프로세스로 돌아가서 컴파일 단계에서 생성 된 pyc 파일에 존재하는 바이트 코드는 적절한 가상 머신에 의해 실행됩니다. py 파일은 새로운 pyc 파일 생성에 따라 변경됩니다. pyc가 현재 코드 인 경우 컴파일 단계를 건너 뜁니다.


0

파이썬 (인터프리터)이 컴파일 됩니다.

증명 : 구문 오류가 포함되어 있으면 코드를 컴파일하지도 않습니다 .

예 1 :

print("This should print") 
a = 9/0 

산출:

This should print
Traceback (most recent call last):
  File "p.py", line 2, in <module>
    a = 9/0
ZeroDivisionError: integer division or modulo by zero

코드가 성공적으로 컴파일됩니다. 첫 번째 줄이 실행됩니다 ( print) 두 번째 줄이 발생합니다 ZeroDivisionError(런타임 오류).

예 2 :

print("This should not print")
/0         

산출:

  File "p.py", line 2
    /0
    ^
SyntaxError: invalid syntax

결론 : 코드 파일에 SyntaxError아무것도 포함되어 있지 않으면 컴파일이 실패 할 때 실행되지 않습니다.

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