JVM là trình biên dịch hay trình thông dịch?


83

Tôi có một câu hỏi rất cơ bản về JVM: nó là một trình biên dịch hay một trình thông dịch?

Nếu nó là một trình thông dịch, vậy còn trình biên dịch JIT tồn tại bên trong JVM thì sao?
Nếu không, thì chính xác thì JVM là gì? (Tôi không muốn định nghĩa cơ bản của jVM về chuyển đổi mã byte thành mã máy cụ thể, v.v.)


16
JVM là một máy ảo. Bytcode đi vào, các hiệu ứng có thể quan sát được của chương trình sẽ xảy ra. Mọi thứ khác là chi tiết triển khai.

1
Có, không có JVM "", có nhiều cách triển khai thông số kỹ thuật.
paxdiablo

@delnan, vui lòng viết câu trả lời đó. Tôi thực sự muốn tán thành câu trả lời như vậy.
aioobe

@aioobe: Tôi sẽ không. Tôi không nghĩ rằng nó trả lời câu hỏi được hỏi ở đây - đó là một quan điểm rất hữu ích, nhưng câu hỏi (được nêu rõ trong tiêu đề và trong bài đăng) yêu cầu rõ ràng các chi tiết triển khai này.

Đủ công bằng. Tôi muốn nói rằng đó câu trả lời cho câu hỏi "Nếu không, thì chính xác thì JVM là gì?" một phần mặc dù. (Là một Java Virtual Machine là chi tiết của một đặc điểm kỹ thuật hơn là một thực hiện.)
aioobe

Câu trả lời:


170

Trước tiên, chúng ta hãy có một ý tưởng rõ ràng về các thuật ngữ sau

Javaclà Trình biên dịch Java - Biên dịch mã Java của bạn thành Bytecode

JVMlà Máy ảo Java - Chạy / Phiên dịch / dịch Bytecode thành Mã máy gốc

JITis Just In Time Compiler - Biên dịch chuỗi lệnh bytecode đã cho thành mã máy trong thời gian chạy trước khi thực thi nguyên bản. Mục đích chính của nó là tối ưu hóa hiệu suất.

Vậy bây giờ, Hãy cùng tìm câu trả lời cho câu hỏi của bạn ..

1) JVM: is it a compiler or an interpreter? - Trả lời: Thông dịch viên

2) what about JIT compiler that exist inside the JVM? - Trả lời: Nếu bạn đọc xong câu trả lời này, bạn có thể biết nó ngay bây giờ

3) what exactly is the JVM? - Trả lời:

  • JVM là một nền tảng ảo nằm trên RAM của bạn
  • Thành phần của nó, Bộ tải lớp tải .classtệp vào RAM
  • Thành phần Trình xác minh mã Byte trong JVM kiểm tra xem có bất kỳ vi phạm hạn chế truy cập nào trong mã của bạn hay không. (Đây là một trong những lý do chính khiến java được bảo mật)
  • Tiếp theo, thành phần Execution Engine chuyển đổi Bytecode thành mã máy thực thi

Hy vọng điều này đã giúp bạn ..


Bạn nói JVM dịch Bytecode thành Native Machine Code. Tôi không chắc liệu thuật ngữ "bản dịch" ở đây có đúng không.
Koray Tugay

Đánh giá cao. bạn đã gần như xóa tan nghi ngờ của tôi về sự khác biệt giữa biên dịch và diễn giải, mã byte và mã m / c. câu trả lời của bạn cho tôi biết rằng mã byte được chuyển đổi thành mã máy bởi một trình thông dịch và trình biên dịch chuyển đổi mã nguồn thành bytecode.
Harsimer

2
Bạn cũng có thể vui lòng cho tôi biết rằng mã gốc là gì? Nó có nghĩa là mã máy? Tôi đang cố gắng học toàn bộ quá trình biên dịch và giải thích này nhưng những thuật ngữ trung gian này rất khó hiểu.
Harsimer

6
Vì vậy, cả JVM và JIT đều chuyển đổi mã byte thành mã máy cụ thể của nền tảng. Vậy sự khác biệt giữa chúng là gì? bạn có thể giải thích nó một cách rộng rãi?
Aditya

6
'Chạy / Phiên dịch / dịch Bytecode thành Mã máy bản địa' là một điều vô nghĩa. Nó hoặc là 'chạy / diễn giải' hoặc 'dịch bytecode vào Native Machine Mã'. Không phải cả hai cùng một lúc.
Marquis of Lorne

32

Nó là một chút của cả hai, nhưng không phải theo nghĩa truyền thống.

Các JVM hiện đại lấy bytecode và biên dịch nó thành mã gốc khi cần thiết lần đầu. "JIT" trong ngữ cảnh này là viết tắt của "đúng lúc". Nó hoạt động như một trình thông dịch từ bên ngoài, nhưng thực sự đằng sau nó đang biên dịch thành mã máy.

Không nên nhầm lẫn JVM với trình biên dịch Java, trình biên dịch này biên dịch mã nguồn thành bytecode. Vì vậy, sẽ không hữu ích nếu coi nó là "một trình biên dịch" mà phải biết rằng trong nền nó thực hiện một số biên dịch.


8
@NaeemShah: Tôi rất vui vì bạn thích câu trả lời này đủ để sao chép nó gần như từng chữ vào một bài đăng trên blog dưới tên của chính bạn. Và bạn có quyền làm như vậy, nhưng theo chương trình cấp phép của StackOverflow, về mặt pháp lý, bạn được yêu cầu cấp phép lại cho đây và bạn phải cấp phép cho bài đăng trên blog của mình theo cùng một giấy phép. Xem phần chân trang của trang web này, liên kết đến giấy phép sau: creativecommons.org/licenses/by-sa/3.0 . Xem thêm bài đăng trên blog này: blog.stackoverflow.com/2009/06/attribution-required
Mark Peters

8

Giống như @delnan đã được nêu trong phần bình luận, nhưng không phải vậy .

JVM là một máy trừu tượng chạy Java bytecode .

JVM có một số cách triển khai:

  • HotSpot (trình thông dịch + trình biên dịch JIT )
  • Dalvik (thông dịch viên + trình biên dịch JIT)
  • ART ( Trình biên dịch AOT + Trình biên dịch JIT)
  • GCJ (trình biên dịch AOT)
  • JamVM (thông dịch viên)

... và nhiều người khác .

Hầu hết các câu trả lời khác khi nói về JVM đề cập đến HotSpot hoặc một số hỗn hợp của các cách tiếp cận trên để triển khai JVM.


1
ART cũng là một trình thông dịch: "Android thực sự có thể chạy .dexmã trực tiếp thông qua phiên dịch hoặc biên dịch Just-In-Time (JIT) ..." ( source.android.com/devices/tech/ota/ab/… )
Irfan Latif

5

Cả hai. Nó bắt đầu bằng cách diễn giải bytecode và có thể (nếu nó quyết định nó có giá trị hay không) sau đó biên dịch bytecode đó thành mã máy gốc.


Bạn có lẽ ám chỉ đến HotSpot
cubuspl42

5

Đó là cả hai. Nó có thể giải mã bytecode và biên dịch nó thành mã gốc.


0

Như những người khác đã nói nó là cả hai! Nếu bạn muốn tham khảo nó một cách chi tiết tốt hơn bạn có thể thấy: Đây Mô tả IBM


0

Javac là một trình biên dịch nhưng không phải là một trình biên dịch truyền thống. Một trình biên dịch thường chuyển đổi mã nguồn sang ngôn ngữ cấp Máy để thực thi và điều đó được thực hiện trong một lần chụp, tức là toàn bộ mã được lấy và chuyển đổi sang ngôn ngữ cấp máy ở ONCE. (thêm về điều này bên dưới). Trong khi, JavaC chuyển đổi nó thành Bytecode thay vì ngôn ngữ cấp máy.

JIT là một trình biên dịch Java nhưng cũng hoạt động như một trình thông dịch. Một trình biên dịch điển hình sẽ chuyển đổi tất cả mã cùng một lúc từ mã nguồn sang ngôn ngữ cấp máy. Thay vào đó, JIT đi từng dòng một (thực thi từng dòng là một tính năng của Trình thông dịch) và chuyển đổi mã bytec do JavaC tạo ra thành ngôn ngữ cấp máy và thực thi nó. JVM có JIT trong đó có nhiều cách triển khai. Hotspot là một trong những điểm chính cho lập trình Java. Việc triển khai Hotspot làm cho JIT tối ưu hóa việc thực thi bằng cách chuyển đổi các đoạn mã lặp lại thành ngôn ngữ cấp Máy cùng một lúc (giống như một trình biên dịch như đã đề cập ở trên) để chúng có thể được thực thi nhanh hơn thay vì chuyển đổi từng dòng mã 1 x 1. Vì vậy, câu trả lời không phải là Đen trắng đối với các định nghĩa điển hình của Trình biên dịch và Trình thông dịch.

Đây là hiểu biết của tôi sau khi đọc một số câu trả lời trực tuyến, blog, v.v. Nếu ai đó có đề xuất để cải thiện sự hiểu biết này, vui lòng đề xuất.


-5

JVM có cả trình biên dịch và trình thông dịch. Bởi vì trình biên dịch biên dịch mã và tạo ra mã bytecode. Sau đó, trình thông dịch chuyển đổi mã bytecode thành mã máy có thể hiểu được.

Ví dụ: Viết và biên dịch một chương trình và nó chạy trên Windows. Đưa tệp .class sang một hệ điều hành khác (Unix) và nó sẽ chạy nhờ trình thông dịch chuyển đổi mã bytecode thành mã máy có thể hiểu được.


1
Bạn đã quên tắt Caps :)
Aleksej Vasinov

7
Sai, trước tiên bạn biên dịch mã nguồn thành bytecode (không liên quan gì đến JVM), sau đó JVM thông dịch bytecode và biên dịch nó thành mã gốc (nhưng có thể không phải mọi phần).
The_Fox
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.