Một cỗ máy, ảo hay không, cần một mô hình tính toán mô tả cách tính toán được thực hiện trên nó. Theo định nghĩa, ngay khi tính toán, nó thực hiện một số mô hình tính toán. Câu hỏi sau đó là: Chúng ta nên chọn mô hình nào cho VM của mình? Máy vật lý bị hạn chế bởi những gì có thể được thực hiện hiệu quả và hiệu quả trong phần cứng. Nhưng, như bạn lưu ý, các máy ảo không có các ràng buộc như vậy, chúng được xác định trong phần mềm bằng các ngôn ngữ cấp cao tùy ý.
Trên thực tế, có những máy ảo có mức độ cao như bạn mô tả. Chúng được gọi là ngôn ngữ lập trình . Ví dụ, tiêu chuẩn C dành phần lớn các trang của nó để xác định mô hình cho cái gọi là "máy trừu tượng C" mô tả cách các chương trình C hoạt động và bằng cách mở rộng (quy tắc as-if) cách trình biên dịch C (hoặc trình thông dịch) tuân thủ) nên cư xử.
Tất nhiên, chúng ta thường không gọi đó là một máy ảo. Một VM thường có nghĩa là một cái gì đó ở cấp độ thấp hơn, gần với phần cứng hơn, không có ý định được lập trình trực tiếp, được thiết kế để được thực thi hiệu quả. Xu hướng lựa chọn này có nghĩa là một cái gì đó chấp nhận mã có thể tổng hợp cấp cao (như những gì bạn mô tả) sẽ không được coi là VM vì đang thực thi mã cấp cao.
Nhưng để đi đến điểm chính, đây là một số lý do để tạo một VM (như trong, một cái gì đó được nhắm mục tiêu bởi trình biên dịch mã byte) dựa trên đăng ký hoặc tương tự. Máy xếp và đăng ký cực kỳ đơn giản. Có một chuỗi các hướng dẫn, một số trạng thái và ngữ nghĩa cho mỗi hướng dẫn (Trạng thái chức năng -> Trạng thái). Không giảm cây phức tạp, không có quyền ưu tiên của nhà điều hành. Phân tích cú pháp, phân tích và thực hiện nó rất đơn giản, vì đó là ngôn ngữ tối thiểu (đường cú pháp được biên dịch) và được thiết kế để đọc bằng máy chứ không phải đọc bằng con người.
Ngược lại, phân tích cú pháp ngay cả những ngôn ngữ giống như C đơn giản nhất cũng khá khó khăn và việc thực thi nó đòi hỏi các phân tích không cục bộ như kiểm tra và truyền bá các loại, giải quyết tình trạng quá tải, duy trì bảng ký hiệu, giải quyết định danh chuỗi , biến văn bản tuyến tính thành AST theo hướng ưu tiên , v.v. Nó được xây dựng trên các khái niệm đến với con người một cách tự nhiên nhưng phải được chế tạo một cách tỉ mỉ bằng máy móc.
Ví dụ, mã byte JVM được phát ra bởi javac
. Nó hầu như không bao giờ cần phải đọc hoặc viết bởi con người, vì vậy việc đưa nó vào tiêu dùng bằng máy móc là điều tự nhiên. Nếu bạn được tối ưu hóa nó đối với con người, JVM sẽ chỉ trên mỗi khởi động đọc mã, phân tích nó, phân tích là, và sau đó chuyển đổi nó thành một đại diện trung gian giống như một đơn giản hóa mô hình máy như thế nào . Cũng có thể cắt bỏ người đàn ông giữa.