Java Virtual Machine은 다른 언어로 작성된 코드를 어떻게 실행합니까?


12

Java 1.6부터 JVM은 Java 대신 다양한 프로그래밍 언어를 실행할 수 있습니다. Java VM에서 Java가 실행되는 방식을 개념적으로 이해하지만 다른 언어도 Java VM에서 실행되는 방식을 이해하지 못합니다. 나에게 그것은 모두 흑 마법처럼 보인다. 이 모든 것이 어떻게 조화를 이루는 지 더 잘 이해할 수 있도록 어떤 기사가 있습니까?


2
인텔 / AMD / Solaris (??) 프로세서가 기본 어셈블리 코드로 컴파일 할 수있는 "모든 언어"(실제로 언어를 실행하지 않고 흐름을 따라 가지만)를 실행할 수있는 것과 같은 방식입니다.
Apoorv Khurasia

13
문제는 JVM Java를 실행 하지 않는다는 것입니다 . 저수준 언어 인 고유하고 (자바 컴파일러가 의도적으로 쉽게 만들 수 있지만) 실행됩니다.

사실입니다. 그러나 JVM은 버전 6에서 다른 언어를 실행하기 시작했습니다. 버전 1.4.2에서는 파이썬이나 Groovy를 실행할 수 없었습니다. 왜 이렇게이다? 무엇이 바뀌 었습니까?
Pomario

@delnan 또는 "좀 더 저수준의 실행 모델로, javac 프로그램이 Java 코드로 빌드하는 방법을 알고 있습니다".
Apoorv Khurasia

9
@Pomario Jython 은 한동안 주변에있었습니다. 그리고 페이지는 자이 썬 스크립트 1.4.2에서 실행할 수 있음을 시사하는 것으로 보인다.
Apoorv Khurasia

답변:


23

핵심은 JVM의 모국어 인 Java 바이트 코드입니다. 모든 언어는 JVM이 이해하는 바이트 코드로 컴파일 할 수 있습니다.이 작업에 필요한 것은 바이트를 방출하는 컴파일러입니다. 그때부터 JVM의 관점과 차이가 없습니다. 컴파일 된 스칼라, 클로저, 자이 썬 등 클래스 파일을 가져 와서 일반적인 자바 소스 코드로 JAD 등을 사용하여 디 컴파일 할 수 있습니다.

다음 기사 / 스레드에서 이에 대한 자세한 내용을 찾을 수 있습니다.

Java 5 또는 6 JVM 의 기본 변경 사항을 알지 못해 다른 언어에서 코드를 컴파일하거나 실행할 수있게되었습니다. 내 이해에 따르면 JVM 1.4는 JVM 6과 같은 점에서 어느 정도 가능했습니다 (차이가있을 수 있습니다 .JVM 전문가는 아닙니다). 사람들이 10 년 상반기에 다른 언어 및 / 또는 바이트 코드 컴파일러를 개발하기 시작했으며, Java 6이 발표 된 2006 년경에 결과가 나타나기 시작했습니다.

그러나 이러한 모든 JVM 버전에는 몇 가지 제한 사항이 있습니다. JVM은 기본적으로 정적으로 유형이 지정되어 있으며 릴리스 7까지는 동적 언어를 지원하지 않았습니다. 이것은 invokedynamic동적 바이트 검사에 의존하는 메소드 호출을 가능하게하는 새로운 바이트 코드 명령 인을 도입하여 변경되었습니다 .


8
JVM이 동적 언어를 "지원"하지 않았다는 것은 사실이 아닙니다. 그들은 심각한 결점을 가진 해결 방법을 사용해야했습니다.
Michael Borgwardt

3
@MichaelBorgwardt, 우리는 JVM v7 이전 버전 동적 언어를 어느 정도 견딜 수 있다는 것에 동의 할 수 있습니까? :-)
Péter Török 2016 년

1
그것을 넣는 좋은 방법입니다 :)
Michael Borgwardt

3

JVM과 같은 가상 머신은 일반적으로 파일, 간단한 명령어 세트 (일반적으로 실제 CPU 명령어로 변환하기 쉬운)를 입력으로 받아들이고 실제로이를 네이티브 CPU 명령어로 컴파일하고 실행하는 프로그램입니다 (일반적으로 HotSpot 또는 JIT와 같은 주문형 컴파일러).

본질적으로 추상화 계층입니다. 여러 가지 유사성 (예 : 스택 기반)으로 인해 VM 명령어 세트 구현을 다른 프로세서 아키텍처로 이식하는 것이 일반적으로 훨씬 쉽습니다. 또한 원시 CPU 명령어보다 최신 프로그래밍 언어를 지향하기 때문에 다른 프로그래밍 언어를 VM 명령어로 이식하는 것이 훨씬 쉽습니다. JVM 및 CLR (.NET)과 같은 많은 가상 머신에는 가상 메소드 호출 및 오브젝트 인스턴스 작성에 대한 지시 사항이 포함되어 있습니다.

예를 들어 언어를 봅시다. 그것을 MyLanguage라고 부릅니다. 프로그래밍 언어이므로 궁극적으로 일부 CPU 아키텍처 명령어로 컴파일됩니다. 따라서 호환 가능하고 유연한 가상 머신 명령어 세트가 제공되면 MyLanguage를 해당 VM 명령어 세트로 컴파일 할 수도 있습니다.

기본적으로 수행 할 필요가없는 VM 명령어 세트에서 일부 해결 방법을 해킹해야 할 수도 있기 때문에 항상 효율성에 대한 의문이 있지만 여전히 가능합니다.


3

JVM은 Turing-complete 컴퓨팅 머신 (메모리가 제한적 제외)이며 Turing-complete 머신 (물리적 또는 가상)은 모든 프로그래밍 언어 (메모리, 성능 및 물리적 IO 제한 제외)를 실행할 수 있습니다.


음 .... 그렇다면 왜 컴파일러가 필요합니까? ;-)
Péter Török 2016 년

컴파일러와 인터프리터 자체는 Turing 머신에서 실행될 수 있습니다 (느리게 진행될 수 있음). 아마도 일부 사전 컴파일 / 번역 단계는 특정 언어로 특정 프로그램을 실행하는 성능을 향상시킬 수 있습니까?
hotpaw2

1
내 요점은 "모든 Turing-complete 시스템 (물리적 또는 가상)이 모든 프로그래밍 언어를 실행할 수 있음 "이라는 말은 문자 그대로 내 랩톱의 x86 CPU가 현재 작업중 인 멋진 Java 소스 파일을 직접 실행할 수 있음을 의미합니다. 또는 PowerPC 프로세서 용 기계 코드. 컴파일러없이-CPU에 컴파일러가 포함되어 있지 않습니까? :-)
Péter Török 2016 년

"컴퓨터"는 단순한 CPU 그 이상입니다.
hotpaw2

1
@ PeterTörök 당신의 요점을 참조하십시오. 그는 우리처럼 VM에 대해 자세히 설명하지 않았습니다. 그러나 나는 그의 대답이 여전히 OP의 질문에 간단히 대답한다고 생각합니다. JVM은 Turing이 완료되었으므로 프로그래밍 언어를 "실행"할 수 있기 때문에 다른 프로그래밍 언어를 "실행"할 수 있습니다. 아마도 정교하지는 않지만 간결하고 유효한 요점입니다. :)
Yam Marcovic

2

잠시 동안 JVM을 x86과 같은 자체 명령 세트가있는 프로세서로 생각하십시오. 프로세서는 기계 언어로 컴파일 된 C 코드를 실행할 수 있습니다. JVM에 동일한 비유를 적용하면 다른 언어가 JVM의 기계 명령어로 컴파일 된 경우 다른 프로세서와 마찬가지로 JVM에서 다른 언어를 실행할 수 있습니다. 그런 다음 JVM은 언어 X에 대해이 지시 사항을 실행할 수 있습니다.


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