模擬/它是如何工作的?
在計算機科學的核心,特別是計算和可計算性的研究中,是丘奇-圖靈論題。該論題指出,任何被認為是可計算的函式都可以透過一種稱為“圖靈機”的理論裝置進行計算。這個定理的自然推論是,任何通用程式語言都足以表達任何演算法。基本上,任何可以被認為是可計算的(在模擬的情況下,涉及機器硬體執行的計算),都可以透過任何通用程式語言來計算。現代模擬器能夠模擬大多數計算機的原因是,大多數現代計算機都基於馮·諾依曼體系結構。這種計算機體系結構最初由已故的約翰·馮·諾依曼在 1950 年代記錄,它規定了現代計算機執行的基本方式(透過從記憶體中獲取和執行指令,這些函式可以在執行過程中將資料寫回計算機記憶體)。所有其他元件,如影片、聲音、鍵盤和滑鼠,都是對這種基本體系結構的擴充套件。在虛擬碼中,一個基本的模擬器迴圈寫成
do fetch the next instruction from emulated memory execute the instruction check for interrupts while WE ARE STILL EXECUTING INSTRUCTIONS
利用這些原理,模擬軟體(模擬器)本質上將為在一臺機器上執行而編寫的二進位制資料轉換為適合在另一臺機器上執行的等效二進位制形式。這種轉換通常是透過獲取原始二進位制指令並將其轉換為一或多個適合在另一臺機器上執行的等效指令來完成的。由於 1:1 指令轉換率通常不可能,模擬器等效於原始程式的規模通常要大得多。
通常,模擬機器所需的某一裝置的精確等效項是不可能的。例如,NES 或 PlayStation 的控制器通常不存在於 PC 上。這就是使用任何可比的等效項的地方,最常見的是鍵盤或操縱桿。這種補償是使模擬變得困難的部分原因,因為必須清楚地瞭解硬體的工作原理才能對其進行模擬。這對於音訊和影片晶片等更具挑戰性的硬體尤為重要。通常有兩種方法可以模擬給定的軟體:解釋和重新編譯。
在解釋中,二進位制資料被讀取,並且在解碼每條指令時,它都會被執行;每條指令在每次遇到時都會被執行。通常這種方法是最容易實現的,但它也是執行時間最慢的。許多較舊的控制檯模擬器使用解釋。
以下是一些使用解釋的模擬器示例
重新編譯,也稱為二進位制轉換,涉及將模擬平臺的二進位制資料直接二進位制轉換為適合在目標平臺上執行的二進位制資料。這種方法通常為模擬軟體提供顯著的效能提升,並且它被大多數針對“下一代”控制檯的模擬器使用。重新編譯通常有兩種形式
- 動態重新編譯
- 在動態重新編譯或動態二進位制轉換中,二進位制資料僅在第一次傳遞時進行轉換,並儲存在快取中,在快取中儲存已轉換的二進位制等效項,並在每次再次執行該部分時進行引用。基本思想是進行一次昂貴的指令轉換和解碼,然後經常引用快取的轉換程式碼。這種方法是最常用的,因為它可以處理所有形式的程式碼,包括自修改程式碼。一些例子
- 靜態重新編譯
- 在靜態重新編譯或靜態二進位制轉換中,二進位制資料在程式碼上進行單次傳遞時進行轉換。要模擬的程式碼可以被掃描,並且可以透過應用各種演算法來最佳化轉換。然後,已轉換的資料通常儲存在檔案或記憶體中,在程式執行時被程式引用。雖然這有時甚至可以提高動態重新編譯的效能,但如果程式碼是自修改的,這種方法通常無法正確轉換可執行檔案,從而迫使回退到動態重新編譯器或直譯器來處理修改後的程式碼。
