從真實機器到「由指令構成」的機器#
真實的機器由會運動的實體零件構成,而且通常以它所做的工作來命名。除草機、開罐器、磨豆機各有多種設計,有的甚至運作在不同的物理原理上,但同名的機器在某個描述層次上做的是同一件事。有些機器很多用途:換上不同的配件,就能把電鑽變成鋸子或砂磨機。
電腦也是這樣,只是它能做的事不是十幾種,而是天文數字般多;而且不必為每項任務換配件,你只要打開一支不同的程式——一長串的零與一——它就會把所有必要的內部開關撥到剛好能完成該任務的設定。
- 每一組不同的設定,就是一台不同的機器——一台不同的虛擬機(virtual machine),一台「由指令構成」的機器,而非由齒輪、軸承、電線、滑輪構成。
- 電腦處理的是資訊,而資訊永遠能翻譯成二進位碼(零與一),這是電腦唯一能、也唯一需要「讀」的碼。
- 硬體上數以百萬計、可處於 0 或 1 兩種狀態的微小位置,是這台機器唯一的「運動零件」。一台電腦在任一瞬間是「哪一台機器」,取決於這幾千、幾百萬個小元件的設定。
當你把一組特定的指令模式(更精確地說,是「傾向」)加諸在一台具有高度可塑性、零件能處於許多不同狀態的真實機器上,你得到的就是一台虛擬機。
虛擬機為何能「以想像代替實作」#
虛擬機做的是資訊工作,因此它能靠「在對這些運動零件的表徵上」執行所有狀態變化,來完成一台以硬體狀態變化為運動零件的電腦所做的工作。
你可以用鉛筆在紙上做長除法;如果你夠強,也可以「在腦中」做——只是把想像中的紙或黑板上的記號表徵出來。兩種方式產出一樣好,因為那是資訊:一個答案。相對地,如果你餓了,「想像做一個火腿三明治」可就無法替代真的做一個。
正因為電腦太擅長「在腦中」做資訊工作(藉由表徵那台真正做工的機器),有時幾乎無法分辨:你正在使用的到底是一台「專用、硬接線」的資訊處理機,還是一台跑在通用晶片上的虛擬機。
如今嵌在電梯、冷氣、汽車、冰箱、電視遙控器裡的廉價小晶片,大多其實是通用電腦,有能力執行你在筆電上跑的各種程式;卻註定一輩子只執行燒錄在 ROM 裡的一支簡單程式(點火控制、除霜循環等),把它們宏大的才能凍結成一兩招。這比特製只做這些簡單任務的專用晶片更便宜。
這個詞的原意#
虛擬機是電腦科學帶給我們最有用的「想像力延展器」之一。丹尼特(Daniel Dennett)自陳是在稍微擴展的意義上使用這個詞,因此值得先知道它原本(有人說是「正確」)的意思。
電腦科學家波佩克(Gerald Popek)與戈德堡(Robert Goldberg)於 1974 年提出此詞,原意是「一台真實機器的高效、隔離的複製品」——一份用……指令做成的複製品。
- 真實機器(稱它為 A)是實際硬體:矽晶片、電線等等。
- 虛擬機是一支跑在另一台不同的真實機器 B 上的程式,它完美模仿 A 硬體:因為必須用 B 自身的基本操作拼出 A 的所有基本操作,跑起來可能稍慢,但能跑一樣的程式。
- 為 A 硬體寫的程式,在跑著「A 之虛擬模仿」的 B 硬體上也能毫無障礙地執行。
延伸案例:默劇演員的「虛擬石膏」
假設你沒有 Mac,卻堆了一堆只能在 Mac 上跑的珍貴軟體。那就寫一個能在你 PC 上跑的 Mac 虛擬機;只要 PC 跑起這個 Mac VM,就能跑所有 Mac 軟體。PC 會「假裝」自己是 Mac,而軟體渾然不覺。
想像一個手臂打石膏的人,石膏嚴重限制手臂的動作,重量與形狀也逼得身體其他部位跟著調整。再想像一位默劇演員(比方馬歇.馬叟,Marcel Marceau)模仿「手臂打石膏」;若演得夠好,他的身體動作會被限制在完全相同的方式上——他手臂上有一個「幾乎看得見」的虛擬石膏。一台跑著 Mac VM 來模仿 Mac 的 PC,對其上運行的軟體、對外部觀察者而言,都應與真正的 Mac 無從分辨。
(現實其實大致相反:Mac VM 跑在 PC 上多屬噱頭,Mac 上跑 Windows 的 VM 才可靠好用。)
為什麼要擴展這個概念#
擴展「虛擬機」概念有幾個理由:
- 作業系統本身就是一種虛擬機。 現在的程式多半不是為特定硬體而寫,而是為特定作業系統而寫(作業系統再跑在各種硬體上)。作業系統只是軟體,它不模仿任何實際硬體,而是憑「規定」造出一台遵守某些規則、接受某些輸入的想像機器。
- Java 虛擬機(JVM) 是今日最普及的虛擬機之一。它和作業系統一樣,不模仿任何實體硬體,只以軟體形式存在。網站設計者用 Java 寫程式時,不必知道使用者用的是 Mac、PC 還是 Linux,因為 Java applet 永遠跑在為各平台特製的 JVM 上;適當的 JVM 會自動下載安裝,然後 applet 就「像變魔術一樣」跑起來。
在這個擴展意義下,幾乎任何電腦程式都可視為虛擬機:它是軟體——一份有系統的指令清單——一旦運行,就把通用電腦變成一台「本可以設計成硬體並接線做出來」的專用機器。
圖靈的通用機器:一台硬體就夠#
圖靈(Alan Turing)最傑出的貢獻之一,是「通用」電腦的構想(今日稱為通用圖靈機(Universal Turing machine)):只要在它上面安裝並運行一支程式,它就能變成任何設計清楚的其他電腦。
你不必打造所有可想像的硬體電腦;一台硬體電腦就夠了,其餘全交給軟體。拿一堆具有高度可塑性的東西——可調的「記憶」格或暫存器——把一組指令放進去,執行後就能把它變成任何你能清楚想像的電腦。
一台圖靈機(或一台筆電)一次執行一條指令再跳到下一條,但這概念可推廣到能同時執行數百萬條指令的「平行」電腦。暫存器(register) 是硬體中任何能維持自身於某一狀態、直到有東西命令它改變的位置。任何能在這些狀態上執行基本操作的暫存器系統,都能被設定來「計算一個函數」或「運行一支程式」——因此都能運行一台利用這些基本步驟的虛擬機。
而且,能做一次的把戲就能做兩次、三次:於是有了虛擬機之中還有虛擬機、之中還有虛擬機……最底層才是硬體。
層層堆疊:見樹又見林#
考慮一支用 Common Lisp(高階語言)寫、跑在 Windows 7(作業系統)、又跑在 PC 上的下棋程式。這是一台 PC 假裝成 Windows 機器、假裝成 Lisp 機器、假裝成下棋機器。
- 在最高層次看程式細節,懂電腦又懂棋的觀察者大致能理解(「啊,這個子程式生成移動主教後所有合法應手,再呼叫評估子程式……」)。
- 若去看同一支程式實際的機器碼——餵進硬體指令暫存器的那串零與一——則是讓人抓狂或看瞎的好辦法。
- 在每一層,我們都能見樹又見林,因為更低層的細節被方便地隱藏了。
電腦上「虛擬機的層層堆疊」與心靈的「同源人(homunculi)層層堆疊」(即同源功能論,homuncular functionalism)之間的對應,絕非巧合。正是虛擬機在幫我們創造並理解那些過去令人費解之任務(訂機票、下棋、預測天氣、聽寫等)的物質實現上大獲成功,才點燃了一個希望:當我們逆向工程大腦時,或許能玩出一個類似(也僅止於類似)的把戲。
借鏡到大腦:法語虛擬機與英語虛擬機#
或許,說法語的人腦之間的相似性(儘管解剖上差異可見),最好在虛擬機層次來描述:所有說法語的人,腦中都有某個版本的 FVM(法語虛擬機)——一套由互鎖的傾向或微習慣構成、以某種方式儲存在大腦數十億個暫存器裡的系統。說英語者的腦則由類似的可靠模式系統來區分,即 EVM。
對法語者說「Donnez-moi le sel, s’il vous plaît」,FVM 會可靠地控制出與你餵給英語者腦中 EVM「Please pass me the salt」時所引出的同一行為。問題是:我們要怎麼在大腦裡打造出這樣一台能運行的 FVM 或 EVM?
我們還不知道如何描述下棋或說法語的大腦活動中的這些不同層次。這裡幾乎不會有那種讓程式設計師能在最高層次充滿信心地設計、並確信一支能跑的程式會從編譯器裡湧現出來的精確映射。
不過我們如今確實握有一個重要的概念驗證(proof of concept):我們至少知道一種辦法,能理解一台擁有數兆個運動零件的機器所展現的高層能力——而完全不必祈靈於任何「神奇組織」。
補充:認知神經科學 vs. 計算神經科學
嘗試釐清這些層次的研究,是認知神經科學與計算神經科學。兩者之別主要在側重點:計算神經科學家更堅持要造出實際能運作的(電腦)模型;認知神經科學家則常滿足於勾勒出「任何低層模型都必須實現」的高層能力與互動模式。
電腦科學裡也有類似的拉鋸戰:一端是連程式都不寫、只證明「任何成功程式的規格必然具有某些事實」的 AI 願景家;另一端是不看到真能跑、真能做事的程式碼就不服氣的硬派工程師——後者譏諷前者做的不是軟體,是「空氣軟體(vaporware)」。
而不同層次的神經科學家之間的敵意更甚於此。丹尼特引述一位(專攻神經軸突鈣離子通道的)實驗室主任的話:「我們實驗室有句話:研究一個神經元是神經科學,研究兩個神經元就是心理學。」——而且他並非稱讚之意。由於認知神經科學搶走大部分媒體目光(人人著迷於視錯覺、記憶、意識、語言的新發現,卻沒多少人為上百種神經調節物、星狀膠細胞與神經元的互動、或鈣離子通道而興奮),計算神經科學家對鄰居常懷有一股職業性的妒意。