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 컴파일러 의 차이점을 다루는 다른 답변을 설명합니다 .