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

내 이해에서 :

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

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

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

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



답변

먼저, 해석 / 컴파일은 언어의 속성이 아니라 구현의 속성입니다. 대부분의 언어에서 모든 구현이 하나의 범주에 속하지는 않지만 대부분 언어가 해석 / 컴파일되었다고 말하는 몇 단어를 절약 할 수 있지만 이해를 돕고 언어가 매우 많기 때문에 여전히 중요한 차이점입니다. 사용 가능한 두 가지 유형의 구현 (주로 기능적 언어 영역에서 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 와 같이 런타임에 최적화 된 머신 코드 .


답변

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

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


답변

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

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


답변

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

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

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

컴파일 단계가 없으므로 …

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

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


답변

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

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

우선 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를 포함한 다른 파이썬 구현을 보려면 여기클릭하십시오 .


답변

If (You Java) {

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

} 다른 {

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

}


답변

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