虛擬機概念(virtual machine machine)是一種說明計算機硬體和軟體關係的有效方法。
在安德魯 · 塔嫩鮑姆(Andrew Tanenbaum)的書《結構化計算機組織》(Structured Computer Organization)中可以找到對這個模型廣為人知的解釋。要說明這個概念,先從計算機的最基本功能開始,即執行程序。
計算機通常可以執行用其原生機器語言編寫的程序。這種語言中的每一條指令都簡單到可以用相對少量的電子電路來執行。為了簡便,稱這種語言為 L0。
由於 L0 極其詳細,並且只由數字組成,因此,程式設計師用其編寫程序就非常困難。如果能夠構造一種較易使用的新語言 L1,那麼就可以用 L1 編寫程序。有兩種實現方法:
與只使用語言描述相比,把每一層都想像成有一臺假設的計算機或者虛擬機會更容易一些。通俗地說,虛擬機可以定義為一個軟體程序,用來模擬一些其他的物理或虛擬計算機的功能。
虛擬機,將其稱為 VM1,可以執行 L1 語言編寫的指令。虛擬機 VM0 可以執行 L0 語言編寫的指令:
每一個虛擬機既可以用硬體構成也可以用軟體構成。程式設計師可以為虛擬機 VM1 編寫程序,如果能把 VM1 當作真實計算機予以實現,那麼,程序就能直接在這個硬體上執行。否則,用 VM1 寫出的程序就被翻譯 / 解釋為 VM0 程序,並在機器 VM0 上執行。
機器 VM1 與 VM0 之間的差異不能太大,否則,翻譯或解釋花費的時間就會非常多。如果 VM1 語言對程式設計師來說還不夠友好到足以用於應用程式的開發呢?
可以為此設計另一個更加易於理解的虛擬機 VM2。這個過程能夠不斷重複,直到虛擬機 VMn 足夠支持功能強大、使用方便的語言。
Java 程式語言就是以虛擬機概念為基礎的。Java 編譯器把用 Java 語言編寫的程序翻譯為 Java 字節碼(Java byte code)。
後者是一種低級語言,能夠在運行時由 Java 虛擬機(JVM)程序快速執行。JVM 已經在許多不同的計算機系統上實現了,這使得 Java 程序相對而言獨立於系統。
與實際機器和語言相對,用 Level 2 表示 VM2,Level 1 表示 VM1,如下圖所示。計算機數字邏輯硬體表示為 Level 1 機器。其上是 Level 2,稱為指令集架構(ISA, Instruction Set Architecture) 。通常,這是用戶可以編程的第一個層次,儘管這種程序包含的是被稱為機器語言的二進位數值。
指令集架構(Level 2)計算機晶片製造商在處理器內部設計一個指令集來實現基本操作,如傳送、加法或乘法。這個指令集也被稱為機器語言。每一個機器語言指令或者直接在機器硬體上執行,或者由嵌入到微處理器晶片的程序來執行,該程序被稱為微程序。
彙編語言(Level 3)在 ISA 層,程式語言提供了一個翻譯層,來實踐大規模軟體開發。彙編語言出現在 Level 3,使用短助記符,如 ADD、SUB 和 MOV,易於轉換到 ISA 層。彙編語言程序在執行之前要全部翻譯(彙編)為機器語言。
高級語言(Level 4)Level 4 是高級程式語言,如 C、C++ 和 Java。這些語言程序所包含的語句功能強大,並翻譯為多條彙編語言指令。比如,查看 C++ 編譯器生成的列表文件輸出,就可以看到這樣的翻譯。彙編語言代碼由編譯器自動彙編為機器語言。