Một máy ảo là không chính xác một thay thế cho trình biên dịch hoặc thông dịch viên. Tôi nghĩ rằng bạn đang nghĩ đến một trình biên dịch JIT, đó là bao nhiêu máy ảo được thực hiện.
Một máy ảo chính nó là chính xác những gì tên nói - đó là một máy (bộ xử lý) mà không thực sự tồn tại. Ví dụ, hầu hết các bộ vi xử lý không có bất kỳ cách thức nội tại để xử lý việc phân bổ bộ nhớ, hoặc bất kỳ kiến thức nào về các loại. Mặc dù máy ảo Java có một lệnh new
phân bổ một cá thể của một lớp nhất định. Các nhà thiết kế của VM đã quyết định rằng đây là một khái niệm đủ quan trọng trong ngôn ngữ để xứng đáng với mã opcode của riêng nó, đó là đơn vị hoạt động cơ bản trong VM.
Ưu điểm của việc tạo tập lệnh của riêng bạn thường là thu hẹp khoảng cách giữa thời gian biên dịch/tối ưu hóa dài và phiên dịch chậm. Ví dụ, khi bạn biên dịch một lớp Java, bạn không phải thực hiện bất kỳ phân bổ đăng ký hoặc nội tuyến hoặc bất kỳ công cụ biên dịch truyền thống nào. JIT sẽ làm điều đó sau, nhưng chỉ cho các phần của mã mà bạn chạy đủ thời gian, và trải ra trong quá trình chạy chương trình. Tập lệnh hướng dẫn của JVM đủ gần với Java để biên dịch ban đầu nhanh chóng, và nó đơn giản và nhanh chóng để đọc cho máy ảo, không giống như mã nguồn Java.
Đối với thông dịch viên so với trình biên dịch JIT, sự cân bằng thường xung quanh hiệu suất thời gian chạy so với thời gian phát triển.Một JIT mất rất nhiều thời gian để phát triển, nhưng một thông dịch viên chậm hơn rất nhiều trong khi chạy. Trong nhiều trường hợp, như kịch bản và các trang web có kích thước vừa và nhỏ, chương trình không chạy đủ lâu để bạn có thể thấy được lợi ích của việc sử dụng JIT.
Tôi cũng nên đề cập đến phần mềm như VMware. Đây cũng là một máy ảo, nhưng nó sử dụng một bộ hướng dẫn cũng xảy ra được sử dụng trên phần cứng thực. Đó là khái niệm cơ bản giống như một máy ảo ngôn ngữ, ở chỗ nó giả vờ là một cỗ máy không có mặt vật lý, nhưng trong thực tế nó khác và rất phức tạp.
Top Notch Mate, chỉ cần những gì tôi cần – DodoSerebro
"không thực sự tồn tại" không phải là biểu thức chính xác. Điều gì là đúng là có thể không có một bộ xử lý máy sản xuất có thể tiêu thụ cùng một ngôn ngữ bytecode của một VM nhất định. Nó không có nghĩa là một bộ xử lý máy như vậy không thể được sản xuất. – amirouche