2010-08-09 10 views
11

Tôi đã nghe mọi người nói rằng "một JVM nhất thiết phải là một trình thông dịch Java nhưng một trình thông dịch Java không nhất thiết phải là một JVM". Điều đó có đúng không?Sự khác biệt giữa trình thông dịch Java và JVM

Tôi có nghĩa là có sự khác biệt giữa trình thông dịch Java và JVM không?

Trả lời

15

Có, có sự khác biệt.

máy ảo Java:

Một phần mềm "động cơ thực hiện" một cách an toàn và compatibly thực thi các mã byte trong tập tin lớp Java trên một bộ vi xử lý (cho dù trong một máy tính hoặc trong một thiết bị điện tử).

Java thông dịch viên:

Một mô-đun mà luân phiên giải mã và thực hiện tất cả các tuyên bố trong một số cơ quan của mã. Trình thông dịch Java giải mã và thực hiện bytecode cho máy ảo Java.

Trình thông dịch Java thực sự là một phần của JVM. Máy ảo không chỉ thực thi các bytecode, nó còn có nhiều nhiệm vụ cần làm. Môi trường chính thức đó được gọi là JVM.

Kiểm tra:

+0

"Trình thông dịch Java thực sự là một phần của JVM." Bạn có nghĩa là thông dịch viên Java * bytecode * là một phần của JVM ... bởi vì JVM thậm chí không thấy mã Java. – flow2k

+0

Mặc dù, điều đó sẽ không hoàn toàn chính xác, bởi vì, giống như bạn đã nói, JVM không chỉ là một trình thông dịch - nó tối ưu hóa với trình biên dịch JIT của nó mà nếu không sẽ làm cho Java không thể truy cập được đối với các ứng dụng có hiệu năng. – flow2k

0

Đối với một, mã từ (về mặt lý thuyết) bất kỳ ngôn ngữ nào cũng có thể được biên dịch xuống bytecode JVM để cho phép thực hiện trong môi trường đó. Một thông dịch viên Java chỉ có thể chạy mã Java.

+0

Tôi nghĩ điều đó không chính xác. Theo như tôi biết, một trình thông dịch Java không bị ràng buộc với Java nhiều hơn JVM. Mã ngôn ngữ Java thực tế được biên dịch theo truyền thống, sau đó là mã byte, được giải thích và/hoặc được thực thi khác trong/bởi JVM. –

0

Gọi điện cho JVM là trình thông dịch Java không chính xác. JVM là trình biên dịch JIT biên dịch và chạy mã byte. Các ngôn ngữ khác có thể được biên dịch thành mã byte được nhắm mục tiêu cho JVM. Wikipedia article detailing such languages.

+1

Điều đó không đúng. JVM sẽ chạy mã trong chế độ diễn giải trong một thời gian trước khi quyết định bit cần biên dịch. Vì vậy, vâng, JVM là một trình thông dịch Bytecode của Java (lớp tệp). – dty

+0

@Danny: Không có "JVM". Có nhiều triển khai JVM từ các nhà cung cấp khác nhau trên các nền tảng khác nhau không nhất thiết phải hoạt động giống nhau. –

+1

Xin chào, tôi không phải là người đầu tiên đề cập đến "JVM"! Phụ thuộc vào ý bạn bằng cách "làm việc giống nhau". Tất cả chúng đều thực thi bytecode, và cung cấp ánh xạ tới các hàm hệ điều hành bên dưới như luồng, tệp, vv. Một số không có JIT (có thể thêm vào đối số của tôi là "JVM là trình biên dịch JIT" không chính xác) trong số họ có các mô hình chủ đề khác nhau (mô hình m: n của JRockit), một số có các thuật toán GC khác nhau, nhưng tất cả chúng đều thực hiện tương tự. Nhưng nó không chính xác để nói "JVM là một trình biên dịch JIT". – dty

0

Theo tôi được biết ...

Một trình thông dịch Java thực hiện các dòng mã byte như các lệnh được thực thi. Mã byte được thực thi.

JVM lấy mã byte và tạo mã máy. Mã byte được biên dịch thành mã máy và mã máy được thực thi.

+0

** Một JVM ** không nhất thiết phải bao gồm trình biên dịch JIT. Một số trong số đó bao gồm một trình biên dịch JIT có một tùy chọn để vô hiệu hóa nó. '-Xint' trên tôi. – JeremyP

0

java máy ảo là một bộ xử lý ảo và một thông dịch java là java tool.thanks

+3

Chỉnh sửa câu trả lời của bạn để bao gồm một số thông tin và tham khảo có giá trị. –

8

một cách đơn giản, một JVM dịch bytecode và một thông dịch Java giải thích Java. Chúng khác nhau bởi vì bytecode và Java là các ngôn ngữ khác nhau.

Bytecode là ngôn ngữ cấp thấp, như mã máy. Bytecode có nghĩa là được chạy bởi một chương trình được gọi là thông dịch viên bytecode, còn được gọi là máy ảo . Mục đích của bytecode là phải là dễ diễn giải.

Java là ngôn ngữ cấp cao hơn, như C hoặc Python. Các ngôn ngữ này cũng có thể được diễn giải: bạn chỉ cần viết một chương trình có thể chạy mã của chúng. Nó không phải liên quan đến bytecode. Chỉ là các ngôn ngữ cấp cao khó hiểu trực tiếp hơn.

Java thường được "diễn dịch" bằng cách dịch chương trình Java thành chương trình bytecode trước. Sau đó, Máy ảo Java (JVM) chạy bytecode.

Nhưng bạn có thể diễn giải bất kỳ ngôn ngữ nào theo cách này. JVM có thể giải thích các ngôn ngữ khác nếu bạn dịch chúng sang bên phải bytecode.

Bạn cũng có thể diễn giải trực tiếp ngôn ngữ lập trình mà không cần bất kỳ bytecode nào. Một số phiên dịch BASIC chỉ cần tìm các chỉ dẫn BASIC trong mã nguồn và thực thi chúng. Họ không làm cho một chương trình mới trong một ngôn ngữ khác nhau đầu tiên. Nếu bạn đã làm điều tương tự cho Java, nó sẽ là một trình thông dịch Java nhưng không phải là một JVM.