많은 JVM 언어를 지원하기 위해 JVM을 다재다능하게 만드는 이유는 무엇입니까?


18

JVM에서 지원하는 것처럼 자바 이외의 다른 많은 언어로 Groovy,Clojure,Scala자바와는 달리 기능적인 언어 (내가 언급하고있는 등 버전 8 이전에 자바Lambda's 지원되지 않음) 때문에 다양한 그것은 그 기능 capabilities.On에게 JVM을 만드는 것 높은 수준을 지원하지 않는 객체 지향 언어와 기능 언어를 모두 지원할 수 있습니까?


"기능성 인 그루비, 클로저, 스칼라 등". 그중 일부는 다른 것보다 더 기능적입니다. 나는 스칼라가 중간에있는 가장 작은 funcional Groovy와 Clojure와 가장 큰 스케일을 사용합니다.
Vorg van Geir

답변:


37

다른 VM과 비교할 때 JVM은 실제로 다용도로 사용되지 않습니다 . 정적으로 형식화 된 OO를 직접 지원합니다. 그 밖의 모든 것에는 사용할 수있는 부분과 그 부분 위에 언어가 필요로하는 모든 것을 어떻게 만들 수 있는지 알아야합니다.

예를 들어, Java 7이 invokedynamic바이트 코드를 도입 할 때까지 JVM 에서 동적으로 형식화 된 OO 언어를 구현하기가 매우 어려웠습니다. 성능에 좋지 않은 복잡한 해결 방법을 사용해야했고 스택 추적이 엄청나게 부 풀었습니다.

그러나 그 전에도 동적 언어 (Groovy, Jython, JRuby 등)가 JVM에서 구현되었습니다.

JVM이 매우 다재다능하기 때문이 아니라 매우 광범위하기 때문에 매우 성숙하고 잘 지원되며 고성능 구현이 가능하기 때문입니다.

그리고 훨씬 더 중요한 것은 아마도 많은 양의 Java 코드가 거의 모든 것을 수행하고 있기 때문에 언어가 JVM에서 실행되는 경우 해당 코드와 통합 할 수있는 기능을 쉽게 제공 할 수 있습니다. 기본적으로 JVM에서 언어를 실행하는 것은 C와의 상호 운용성을 제공하는 21 세기 버전입니다.


좋은 답변입니다 (+1). 마지막으로 언급 한 IMHO는 또한 언어로서 Java의 인기를 책임지고 있습니다. 결국 무료로 재사용 할 수있는 엄청난 양의 코드를 사용하면 최신의 가장 세련된 언어를 사용하는 것보다 훨씬 더 많은 시간을 절약 할 수 있습니다 풍모.
Giorgio

4

JVM은 기본적으로 CPU와 같은 역할을하도록 작성되었으며, VM과 같은 일련의 명령어 (예 : 어셈블리)가 바이트 코드라고합니다. 유효한 바이트 코드 세트를 생성하는 컴파일러를 작성할 수 있으면 JVM이이를 실행할 수 있습니다.

Wikipedia에는 ​​바이트 코드 목록이 있습니다.

http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings

JVM이 바이트 코드를로드하는 방법에 대한 설명과 함께

http://en.wikipedia.org/wiki/Java_virtual_machine

호출 스타일 바이트 코드를 사용하면 기능 언어는 소스의 모양에 관계없이 코드를 실행할 수 있습니다. 또한 invokevirtual을 추가함으로써 jruby와 같은 언어 구현이 실행 방식에 약간의 유연성을 제공했습니다.


1
YARV Ruby VM, Rubinius Ruby VM, CPython VM (결국 JVM 이전), 앵무새, 다양한 스몰 토크 및 Lisp VM, 물론 Pascal P- JVM이 모델링 된 후 코드 시스템.
Jörg W Mittag

합의에 따르면 JVM은 분명히 첫 번째 VM이 아닙니다. Java가 인기 있고 VM이 적극적으로 개발되고 문서화되어 있기 때문에 JVM이 다른 언어에 인기가 있다고 생각합니다.
sasbury

2

JVM이 잘 정의되고 꽤 괜찮은 JMM (메모리 모델 )을 지원한다는 점을 추가하겠습니다. 이는 일관된 (낮은 수준이지만) 스레딩 동작에 대한 훌륭한 지원을 의미합니다. 또한 강력한 Just In Time 컴파일러가 있습니다 (MethodHandles 및 invokedynamic 덕분에 동적 언어에는 더 이상 유용하지 않음).

마지막으로 JVM의 가비지 콜렉션 서브 시스템 은 언어에 관계없이 올바른 튜닝으로 메모리를 관리합니다.


JMM은 Java에서 가장 좋아하는 것 중 하나입니다. 나는 효과적으로 불변의 데이터의 팬입니다 (예 : 다른 스레드에 표시 된 후에 내용이 변경되지 않는 배열).하지만 someField = new int[]{42};새로운 배열을 보는 스레드가 값을 볼 수 있도록하는 유일한 방법 과 같은 문장이 주어졌습니다 42 final또는 필드를 만들 것입니다 volatile. 필드가 느리게 생성되었지만 자주 액세스하는 경우 final작동하지 않으며 필드를 만들면 액세스 할 volatile때마다 불필요한 동기화 패널티가 부과 될 수 있습니다. 심지어 가장 느슨한 .NET 모델에서도 ...
supercat

... 코드는 배열의 채우기가 참조 저장 전에 발생하도록 요청할 수 있습니다. 필드를 읽는 다른 스레드는 새 배열에 대한 참조를 보거나 보지 못하지만 새 배열을 볼 경우 그 내용을 볼 수 있다는 것을 확신 할 수 없습니다.
supercat

1

이것의 핵심 요소는 컴파일을 실행 단계와 분리하는 것입니다. 이것에 의해 다른 언어를 컴파일하는 다른 컴파일러를 바이트 코드로 작성할 수 있습니다.

바이트 코드는 CPU의 기계 코드와 유사하게 작동합니다. 프로그램을 실행하는 데 필요한 작은 작업이 모두 있습니다. 변수를 가져 와서 수학하고 조건부 작업을 수행 할 수 있습니다.

자바도 특별하지 않다. Java에서는 다른 VM과 달리 여러 언어의 존재가 디자인 목표조차 아니 었습니다. 를 들어 마이크로 소프트의 닷넷 CIL (... C #을, VB.Net) 여러 언어를 실행하는 기능의 핵심 디자인 요소도했다 ParrotVM 일반 VM으로 목표로 Perl6 프로젝트에서.

그것의 재미를 위해 나는 PHP의 젠드 엔진조차도 그것을 허용한다는 증거 를 한 번 만들었습니다 .

솔직히 말해서 실제 하드웨어에서도 C 또는 Fortran과 같은 여러 언어를 실행할 수 있습니다.

컴파일 및 실행과의 분리와의 차이점은 일부 형태의 기본, 쉘 스크립트 등과 같은 성서 해석기입니다. 이들은 즉각적인 형태로 코드를 가져 가지 않고 한 줄씩 코드를 실행하는 방식으로 작동합니다. 사이.


1

JVM은 내가 가비지 수집, 성능 및 실행 가능한 샌드 박스 모델을 알고있는 첫 번째 가상 머신입니다. JVM을 지원하기 위해 많은 언어가 등장한 것은 아마도 그 "다재다능 성"의 결과가 아니라 Java 언어에는 사람들이 프로그래밍 언어에서 원하는 중요한 기능이 부족하다는 사실입니다. 예를 들어, 대부분의 기계 언어에는 십여 개 정도의 데이터 유형 (예 : 바이트, 하프 워드, 워드, 더블 워드, 단 정밀도 플로트 및 배정 밀도 플로트) 만 있지만 대부분의 프로그래밍 언어는 코드를 사용할 수 있습니다 임의의 수의 사용자 정의 데이터 형식 JVM은 일반적인 시스템의 유형과 유사한 몇 가지 기본 유형과 하나 이상의 유형 인 무차별 객체 참조를 인식합니다. Java 언어도 마찬가지로 이러한 기본 요소를 인식합니다. 및 무차별 객체 참조. 변수는 특정 클래스가 아닌 것에 대한 참조를 보유하지 않도록 제한 될 수 있지만, 언어는 다음 유형의 필드 유형을 구분하지 않습니다.List<String>인스턴스 MyThing클래스 에서 보유 할 수 있습니다 MyClass.

  • 코드에 대한 참조는 불변의 구현으로 알고 있습니다. List<String>

  • 변경 가능한 목록 유형의 인스턴스에 대한 참조로, 변경 가능한 항목에 노출되지 않습니다.

  • MyThings의 메서드 실행 중을 제외하고 는 유니버스의 다른 위치에는 다른 참조가 존재할 수없는 변경 가능한 목록에 대한 참조입니다.

  • 다른 객체가 소유하고 있고 다른 객체MyThing 가 어떤 방식으로 사용하고 싶은 변경 가능한 목록에 대한 참조 .

  • MyThing소유하지만 변경 가능한 목록에 대한 참조로, 다른 객체에도 노출되어 무언가를 수행 할 수 있습니다.

이러한 필드는 모두 type을 가질 수 있지만 List<String>매우 다른 내용을 보유합니다. 표현 언어는 이러한 의미를 구별 할 수 있지만 Java는 그렇지 않습니다. 언어는 그러한 것들에 의미를 부여하고 (적어도 일반적인 컨텍스트 외부에서) JVM에서 실행될 수 있기 때문에 JVM 대상 언어가 Java가 할 수없는 개념을 표현할 수있는 여지가 많이 남아 있습니다.

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