파이썬에는 왜 컴파일러와 인터프리터가 필요합니까?


9

Java에는 컴파일러와 인터프리터가 모두 필요하다는 사실을 이해할 수 있습니다. 소스 코드를 바이트 코드로 컴파일 한 다음 가상 머신 (Windows, Linux, Android 등)은 해당 바이트 코드를 현재 아키텍처의 머신 코드로 변환합니다.

그러나 왜 파이썬에는 컴파일러와 인터프리터가 필요합니까? 파이썬은 플랫폼에 독립적이지 않기 때문에 왜 해석을 사용하지 않습니까? 내가 아는 한, 수정하지 않으면 Windows 또는 Linux 컴퓨터에서 Python 프로그램 (바이트 코드로 컴파일)을 실행할 수 없습니다. 아니면 내가 틀렸어?


당신은 틀릴 수 있습니다. 파이썬 대신 루아를 사용하면 잘못되었을 것입니다.
Basile Starynkevitch

답변:


13

내가 아는 한, Windows 또는 Linux와 같은 모든 컴퓨터에서 수정하지 않고 Python 프로그램 (바이트 코드로 컴파일)을 실행할 수 없습니다.

당신은 틀 렸습니다. 파이썬 바이트 코드는 크로스 플랫폼입니다. 파이썬 바이트 코드는 버전에 따라 다릅니 까?를 참조하십시오 . 플랫폼에 따라 다릅니 까? 스택 오버플로. 그러나 여러 버전에서 호환되지 않습니다. Python 2.6은 Python 2.5 파일을 실행할 수 없습니다. 따라서 크로스 플랫폼이지만 일반적으로 배포 형식으로 유용하지 않습니다.

그러나 왜 파이썬에는 컴파일러와 인터프리터가 필요합니까?

속도. 엄격한 해석이 느립니다. 사실상 모든 "해석 된"언어는 실제로 소스 코드를 일종의 내부 표현으로 컴파일하므로 코드를 반복적으로 구문 분석 할 필요가 없습니다. 파이썬의 경우이 내부 표현을 디스크에 저장하여 다음에 코드가 필요할 때 구문 분석 / 컴파일 프로세스를 건너 뛸 수 있습니다.


7

Java에는 컴파일러와 인터프리터가 모두 필요하다는 사실을 이해할 수 있습니다.

그렇지 않습니다. Java 언어 사양에는 Java에 컴파일러가 필요하다고 말하는 것은 없습니다. Java 언어 사양에는 Java에 인터프리터가 필요하다고 말하는 것도 없습니다.

인터프리터, 컴파일러 또는이 둘의 조합 사용 여부는 구현 자의 재량에 달려 있습니다.

실제로, Java 용 GNU 컴파일러와 같이 기계 코드로 직접 컴파일되는 Java 구현 이 있습니다gcj . 기술적으로 Oracle OpenJDK Java 컴파일러는 머신 코드, 특히 JVM 바이트 코드로 컴파일됩니다. 자, 당신은 말할 수 있습니다. 잠시만 요, 그것은 기계 코드가 아닙니다! 그러나 x86 기계어 코드에 대한 소프트웨어 인터프리터가 있으며 JVM 바이트 코드를 실행할 수있는 하드웨어 CPU가 있으므로 어떤 것이 "네이티브"이고 다른 하나는 그렇지 않습니까?

JVM 바이트 코드는 x86 기계 코드와 마찬가지로 Java 언어 사양 외부에 있습니다.

가상 머신 (Windows, Linux, Android 등)은 해당 바이트 코드를 현재 아키텍처의 머신 코드로 변환합니다.

다시 말하지만 그것은 전적으로 구현 자에게 달려 있습니다.

원래 Sun JVM은 번역하지 않았으며 항상 해석되었습니다. 현재 Oracle OpenJDK JVM이 해석하고 자주 실행되는 부분 컴파일됩니다. Maxine Research VM은 항상 JIT 컴파일입니다. Excelsior.JET 구현은 미리 한 번 컴파일됩니다. IKVM.NET JVM은 CIL 바이트 코드로 컴파일됩니다. Android 런타임은 설치 중에 미리 한 번 컴파일됩니다. 또한 Android 런타임은 JVM 바이트 코드를 이해하지 못하며 완전히 다른 언어 인 Dalvik 바이트 코드를 사용합니다.

그러나 왜 파이썬에는 컴파일러와 인터프리터가 필요합니까?

다시 말하지만, 그렇지 않습니다. 파이썬 언어 사양에는 파이썬에 컴파일러가 필요하다고 말하는 것은 없습니다. 파이썬 언어 사양에는 파이썬이 통역사가 필요하다고 말하는 것도 없습니다.

실제로 파이썬은 해석 되지 않습니다 . 기존의 모든 파이썬 구현은 항상 파이썬을 다른 언어로 컴파일합니다. 그 언어는 차례로 해석되거나 해석되지 않을 수 있지만 그 언어는 파이썬과 다른 언어입니다. 파이썬은 해석되지 않습니다.

왜 해석을 사용하지 않습니까?

파이썬은 기계에 의해 쉽게 해석되도록 설계되지 않았기 때문입니다. 인간이 쉽게 해석 할 수 있도록 설계되었습니다. CPython 바이트 코드 인 OTOH 기계가 쉽게 해석 할 수 있도록 설계되었습니다. 따라서 인간을 위해 설계된 언어로 코드 를 작성 하고 기계를 위해 설계된 언어로 해석 하는 것이 합리적 이며, 서로를 위해 컴파일해야합니다.

내가 아는 한, 수정하지 않으면 Windows 또는 Linux 컴퓨터에서 Python 프로그램 (바이트 코드로 컴파일)을 실행할 수 없습니다.

그래 넌 할수있어. CPython VM은 PyPy, Jython 및 IronPython과 같이 Windows와 Linux 모두에서 사용할 수 있습니다.


언어는 컴파일하거나 해석 할 필요가 없습니다. 언어 입니다. 사실, 언어가 완벽하지 않고 존재할 수 있는 인터프리터 나 컴파일러를! 예를 들어, 1930 년대에 디자인 한 Konrad Zuse의 Plankalkül은 평생 동안 구현되지 않았습니다. 당신은 여전히 ​​그 안에 프로그램을 작성할 수 있고, 그 프로그램을 분석하고, 그에 대한 이유를 설명하고, 속성을 증명할 수 있습니다 ... 당신은 단지 그것을 실행할 수 없었습니다. (실제로, 심지어 잘못된 것입니다. 물론 머리 나 펜과 종이로 실행할 수 있습니다.)

이제 언어의 특정 구현 은 컴파일러 (또는 여러 컴파일러), 인터프리터 또는 임의의 조합을 사용할 수 있습니다. 그러나 그것은 언어가 아니라 구현 의 특성이다 . 모든 언어는 컴파일러로 구현할 수 있으며 모든 언어는 인터프리터로 구현할 수 있습니다.

그러나 인터프리터 없이는 프로그램을 실행할 수 없습니다. 컴파일러는 단순히 한 언어에서 다른 언어로 프로그램을 번역합니다. 하지만 그게 다야. 이제 다른 언어로 된 동일한 프로그램이 있습니다. 실제로 프로그램의 결과를 얻을 수있는 방법입니다 해석 을. 때로는 언어가 매우 간단한 이진 기계 언어이며 인터프리터는 실제로 실리콘으로 하드 코딩되어 있으며 ( "CPU"라고 함) 여전히 해석됩니다.

또한 이 답변에 관심 있을 수 있습니다. 이 설명은 인터프리터, JIT 컴파일러 및 AOT 컴파일러를 결합하는 차이점과 다른 방법 및 AOT 컴파일러JIT 컴파일러 의 차이점을 다루는 다른 답변을 설명합니다 .


3
대부분의 시간을 질문에 대답하는 대신 페데 닉으로 보낸 답은 나를 슬프게합니다.
Winston Ewert

3

바이트 코드가 배포 형식으로 적합하지 않다는 것이 사실이지만 그것이 그것이 쓸모가 없다는 것을 의미하지는 않습니다. 주어진 머신에서 시작 시간을 개선하는 것 외에도 첫 번째 실행 후 바이트 코드 해석은 AST 해석 또는 행 단위로 해석하는 것보다 훨씬 간단합니다.

바이트 코드는 코드의보다 낮은 수준의 규칙적이고 압축 된 (의미 적으로나 메모리 레이아웃 측면에서) 표현입니다. 연산 순서는 이미 정해져 있으며 로컬 변수 이름은 더 간단한 형태 (정수 인덱스)로 해결되었습니다. 따라야 할 복잡한 구문이없고 단지 하나의 간단한 명령이 이어집니다. 또한 줄 단위로 해석하려면 기본적으로 전체 파서를 유지해야하며 AST 인터프리터는 트리 탐색으로 호출 스택을 날려 버리는 반면 바이트 코드 인터프리터는 임시 값을 위해 작은 스택이 필요합니다. 지역 주민.

이러한 요소들과 다른 요소들은 바이트 코드 인터프리터를 다른 인터프리터보다 훨씬 빠르게 만들려고합니다.

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