Java 1.6부터 JVM은 Java 대신 다양한 프로그래밍 언어를 실행할 수 있습니다. Java VM에서 Java가 실행되는 방식을 개념적으로 이해하지만 다른 언어도 Java VM에서 실행되는 방식을 이해하지 못합니다. 나에게 그것은 모두 흑 마법처럼 보인다. 이 모든 것이 어떻게 조화를 이루는 지 더 잘 이해할 수 있도록 어떤 기사가 있습니까?
Java 1.6부터 JVM은 Java 대신 다양한 프로그래밍 언어를 실행할 수 있습니다. Java VM에서 Java가 실행되는 방식을 개념적으로 이해하지만 다른 언어도 Java VM에서 실행되는 방식을 이해하지 못합니다. 나에게 그것은 모두 흑 마법처럼 보인다. 이 모든 것이 어떻게 조화를 이루는 지 더 잘 이해할 수 있도록 어떤 기사가 있습니까?
답변:
핵심은 JVM의 모국어 인 Java 바이트 코드입니다. 모든 언어는 JVM이 이해하는 바이트 코드로 컴파일 할 수 있습니다.이 작업에 필요한 것은 바이트를 방출하는 컴파일러입니다. 그때부터 JVM의 관점과 차이가 없습니다. 컴파일 된 스칼라, 클로저, 자이 썬 등 클래스 파일을 가져 와서 일반적인 자바 소스 코드로 JAD 등을 사용하여 디 컴파일 할 수 있습니다.
다음 기사 / 스레드에서 이에 대한 자세한 내용을 찾을 수 있습니다.
Java 5 또는 6 JVM 의 기본 변경 사항을 알지 못해 다른 언어에서 코드를 컴파일하거나 실행할 수있게되었습니다. 내 이해에 따르면 JVM 1.4는 JVM 6과 같은 점에서 어느 정도 가능했습니다 (차이가있을 수 있습니다 .JVM 전문가는 아닙니다). 사람들이 10 년 상반기에 다른 언어 및 / 또는 바이트 코드 컴파일러를 개발하기 시작했으며, Java 6이 발표 된 2006 년경에 결과가 나타나기 시작했습니다.
그러나 이러한 모든 JVM 버전에는 몇 가지 제한 사항이 있습니다. JVM은 기본적으로 정적으로 유형이 지정되어 있으며 릴리스 7까지는 동적 언어를 지원하지 않았습니다. 이것은 invokedynamic
동적 바이트 검사에 의존하는 메소드 호출을 가능하게하는 새로운 바이트 코드 명령 인을 도입하여 변경되었습니다 .
JVM과 같은 가상 머신은 일반적으로 파일, 간단한 명령어 세트 (일반적으로 실제 CPU 명령어로 변환하기 쉬운)를 입력으로 받아들이고 실제로이를 네이티브 CPU 명령어로 컴파일하고 실행하는 프로그램입니다 (일반적으로 HotSpot 또는 JIT와 같은 주문형 컴파일러).
본질적으로 추상화 계층입니다. 여러 가지 유사성 (예 : 스택 기반)으로 인해 VM 명령어 세트 구현을 다른 프로세서 아키텍처로 이식하는 것이 일반적으로 훨씬 쉽습니다. 또한 원시 CPU 명령어보다 최신 프로그래밍 언어를 지향하기 때문에 다른 프로그래밍 언어를 VM 명령어로 이식하는 것이 훨씬 쉽습니다. JVM 및 CLR (.NET)과 같은 많은 가상 머신에는 가상 메소드 호출 및 오브젝트 인스턴스 작성에 대한 지시 사항이 포함되어 있습니다.
예를 들어 언어를 봅시다. 그것을 MyLanguage라고 부릅니다. 프로그래밍 언어이므로 궁극적으로 일부 CPU 아키텍처 명령어로 컴파일됩니다. 따라서 호환 가능하고 유연한 가상 머신 명령어 세트가 제공되면 MyLanguage를 해당 VM 명령어 세트로 컴파일 할 수도 있습니다.
기본적으로 수행 할 필요가없는 VM 명령어 세트에서 일부 해결 방법을 해킹해야 할 수도 있기 때문에 항상 효율성에 대한 의문이 있지만 여전히 가능합니다.
JVM은 Turing-complete 컴퓨팅 머신 (메모리가 제한적 제외)이며 Turing-complete 머신 (물리적 또는 가상)은 모든 프로그래밍 언어 (메모리, 성능 및 물리적 IO 제한 제외)를 실행할 수 있습니다.