Làm thế nào để Máy ảo Java thực thi mã được viết bằng các ngôn ngữ khác?


12

Vì Java 1.6, JVM có thể chạy vô số ngôn ngữ lập trình thay vì chỉ Java. Về mặt khái niệm tôi hiểu cách Java chạy trên máy ảo Java, nhưng không hiểu làm thế nào các ngôn ngữ khác cũng có thể chạy trên nó. Đối với tôi, tất cả trông giống như ma thuật đen. Bạn có bài viết nào để chỉ cho tôi để tôi có thể hiểu rõ hơn về việc tất cả những thứ này khớp với nhau như thế nào không?


2
Giống như cách bộ xử lý Intel / AMD / Solaris (??) của bạn có thể thực thi "bất kỳ ngôn ngữ" nào (mặc dù bạn không thực sự chạy ngôn ngữ, nhưng chỉ đi theo dòng chảy ở đây) có thể được biên dịch thành mã lắp ráp gốc.
Apoorv Khurasia

13
Vấn đề là, JVM không chạy Java. Nó chạy một trình biên dịch Java riêng biệt (mặc dù có liên quan và dễ dàng tạo ra), ngôn ngữ cấp thấp hơn.

Điều đó đúng. Nhưng JVM bắt đầu chạy các ngôn ngữ khác từ phiên bản 6; bạn không thể (hoặc không ai làm) chạy python hoặc Groovy trên nó trong phiên bản 1.4.2. Tại sao lại như vậy? Điều gì đã thay đổi?
Pomario

@delnan Hay đúng hơn là "mô hình thực thi cấp thấp hơn, rằng chương trình javac biết cách xây dựng mã Java".
Apoorv Khurasia

9
@Pomario Jython đã xuất hiện được một thời gian. Và này trang dường như cho thấy Jython script có thể chạy trên 1.4.2.
Apoorv Khurasia

Câu trả lời:


23

Khóa này là ngôn ngữ bản địa của JVM: mã byte Java. Bất kỳ ngôn ngữ nào cũng có thể được biên dịch thành mã byte mà JVM hiểu - tất cả những gì bạn cần cho đây là trình biên dịch phát ra mã byte. Từ đó trở đi, không có sự khác biệt nào từ quan điểm của JVM. Nhiều đến mức bạn có thể lấy một tệp lớp Scala, Clojure, Jython, v.v. đã biên dịch và dịch ngược nó (sử dụng ví dụ JAD ) thành mã nguồn Java trông bình thường.

Bạn có thể tìm thêm chi tiết về điều này trong các bài viết / chủ đề sau:

Tôi không nhận thấy bất kỳ thay đổi cơ bản nào trong các JVM Java 5 hoặc 6 , điều này sẽ giúp (các mã được biên dịch từ) các ngôn ngữ khác có thể chạy trên nó trở nên khả thi hoặc dễ dàng hơn. Theo hiểu biết của tôi, JVM 1.4 ít nhiều có khả năng liên quan đến JVM 6 (mặc dù có thể có sự khác biệt; tôi không phải là chuyên gia về JVM). Chỉ là mọi người bắt đầu phát triển các ngôn ngữ và / hoặc trình biên dịch mã byte khác trong nửa đầu thập kỷ và kết quả bắt đầu xuất hiện (và được biết đến rộng hơn) vào khoảng năm 2006 khi Java 6 được xuất bản.

Tuy nhiên, tất cả các phiên bản JVM này đều có chung một số hạn chế: JVM được nhập tự nhiên và đến phiên bản 7, không hỗ trợ các ngôn ngữ động. Điều này đã thay đổi với việc giới thiệu invokedynamic, một lệnh bytecode mới cho phép gọi phương thức dựa vào kiểm tra kiểu động.


8
Không chính xác là JVM không "hỗ trợ" các ngôn ngữ động. Họ chỉ phải sử dụng cách giải quyết có nhược điểm nghiêm trọng.
Michael Borgwardt

3
@MichaelBorgwardt, chúng ta có thể đồng ý rằng JVM pre v7 dung nạp các ngôn ngữ động (ở một mức độ nào đó) không? :-)
Péter Török

1
Đó là một cách hay để đặt nó :)
Michael Borgwardt

3

Một máy ảo, như JVM, là một chương trình chấp nhận làm đầu vào, thường là các tệp, một tập các lệnh đơn giản (thường dễ chuyển đổi thành các lệnh CPU thực) và thực sự biên dịch và chạy chúng như các lệnh CPU gốc (thường sử dụng một trình biên dịch theo yêu cầu như HotSpot hoặc JIT).

Nó thực chất là một lớp trừu tượng. Việc chuyển các tập lệnh VM thành các kiến ​​trúc bộ xử lý khác nhau thường dễ dàng hơn nhiều, vì một số điểm tương đồng (chẳng hạn như dựa trên ngăn xếp). Việc chuyển các ngôn ngữ lập trình khác nhau sang các hướng dẫn VM cũng dễ dàng hơn nhiều, vì nó thiên về các ngôn ngữ lập trình hiện đại hơn các hướng dẫn CPU nguyên thủy. Nhiều máy ảo như JVM và CLR (.NET) chứa các hướng dẫn để gọi các phương thức ảo và tạo các thể hiện đối tượng.

Vì vậy, hãy lấy một ngôn ngữ làm ví dụ. Gọi nó là MyL Language. Vì nó là ngôn ngữ lập trình, cuối cùng nó biên dịch thành một tập hợp một số hướng dẫn kiến ​​trúc CPU. Vì vậy, điều đó có nghĩa là, được cung cấp một bộ hướng dẫn Máy ảo linh hoạt, tương thích, bạn cũng có thể biên dịch MyL Language thành một bộ các hướng dẫn của VM đó.

Luôn có câu hỏi về hiệu quả, vì bạn có thể cần phải hack một số cách giải quyết trong các tập lệnh VM mà bạn sẽ không phải thực hiện một cách tự nhiên, nhưng vẫn có thể.


3

JVM là một máy tính hoàn chỉnh Turing (ngoại trừ bộ nhớ hạn chế) và bất kỳ máy hoàn chỉnh Turing nào (vật lý hoặc ảo) đều có thể thực thi bất kỳ ngôn ngữ lập trình nào (ngoại trừ các giới hạn về bộ nhớ, hiệu năng và IO vật lý).


Erm .... tại sao chúng ta cần trình biên dịch? ;-)
Péter Török

Bản thân trình biên dịch và trình thông dịch, có thể chạy trên máy Turing (có thể chậm). Có lẽ một số bước biên dịch / biên dịch trước có thể cải thiện hiệu suất chạy một số chương trình nhất định trong một số ngôn ngữ nhất định?
hotpaw2

1
Quan điểm của tôi là tuyên bố của bạn "bất kỳ máy hoàn chỉnh Turing nào (vật lý hoặc ảo) đều có thể thực thi bất kỳ ngôn ngữ lập trình nào" theo nghĩa đen là CPU x86 của máy tính xách tay của tôi có thể thực thi trực tiếp tệp nguồn Java tuyệt vời này mà tôi đang làm việc ngay bây giờ. Hoặc mã máy cho bộ xử lý PowerPC. Không có trình biên dịch - CPU không chứa trình biên dịch phải không? :-)
Péter Török

"Máy" của bạn không chỉ là CPU.
hotpaw2

1
@ PéterTörök Tôi thấy quan điểm của bạn. Anh ấy đã không nói chi tiết về máy ảo như chúng tôi đã làm. Nhưng tôi nghĩ câu trả lời của anh ấy vẫn trả lời ngắn gọn câu hỏi của OP. JVM có thể "chạy" các ngôn ngữ lập trình khác vì nó có thể "chạy" bất kỳ ngôn ngữ lập trình nào, vì nó đã hoàn thành Turing. Không công phu có thể, nhưng vẫn là một điểm ngắn gọn và hợp lệ. :)
Yam Marcovic

2

Trong một lúc, chỉ cần nghĩ về JVM như một bộ xử lý với tập lệnh riêng của nó giống như có thể là x86. Bộ xử lý có thể thực thi mã C đã được biên dịch thành ngôn ngữ máy. Áp dụng tương tự cho JVM, các ngôn ngữ khác có thể được thực thi trên JVM giống như trên các bộ xử lý khác nếu các ngôn ngữ đó được biên dịch theo hướng dẫn máy của JVM. JVM sau đó có thể chạy các hướng dẫn này cho ngôn ngữ X.


sự tương tự của bạn là một điều tốt đẹp
cobi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.