Programming

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

procodes 2020. 5. 29. 23:28
반응형

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


내 이해에서 :

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

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

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

이제 파이썬으로 돌아와서 이것에 대해 약간 혼란 스럽습니다. 어느 곳에서나 파이썬은 해석 된 언어이지만 기계 코드가 아닌 일부 중간 코드 (예 : 바이트 코드 또는 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) 컴파일러 .


python.org에 따르면 통역사입니다.

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

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

...

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

...

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

...

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


If (You Java) {

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

} 다른 {

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

}


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

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

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

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

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 를 사용하고 일부는 Just-In-Time 컴파일러를 사용 합니다. 참조 : 여기를 클릭하십시오

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


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


초보자를 위해

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

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

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


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

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

예 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아무것도 포함되어 있지 않으면 컴파일이 실패하여 실행됩니다.


작성한 python 코드는 .pyc 확장자를 가진 파일을 생성하는 python 바이트 코드로 컴파일됩니다. 컴파일되면 다시 질문은 컴파일 된 언어입니다.

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

실행 프로세스로 돌아가서 컴파일 단계에서 생성 된 pyc 파일에있는 바이트 코드는 적절한 가상 머신에 의해 실행됩니다.이 경우 CPython VM 타임 스탬프 (매직 넘버라고 함)는. py 파일은 새 pyc 파일이 생성되었는지에 따라 변경되거나 변경되지 않습니다. pyc가 현재 코드이면 컴파일 단계를 건너 뜁니다.

참고URL : https://stackoverflow.com/questions/6889747/is-python-interpreted-or-compiled-or-both

반응형