編程觀:從黑客帝國談起

    在電影黑客帝國中,網絡黑客尼奧發現自己身處的看似正常的世界實際上被某種力量控制。他在網絡上探求真相時,遇到了黑客組織的崔妮蒂和組織首領墨菲斯,得知他身處的世界實際上是由一個名爲“矩陣”的人工智能系統構造的虛擬世界,而現實中的每個人則被豢養在培養液中,只是意識被接入到了虛擬世界。尼奧從此走上了抗爭“矩陣”的道路。

編程觀:從黑客帝國談起-f94ff8242c37cae77870138efed1b9bf.jpg
黑客帝國1海報

    黑客帝國1於1999上映,是一部經典的科幻片。其中,關於我們身處的現實是否是虛擬的思考,充滿着濃厚的哲學意味。特別是,我們身處的現實可能由程序模擬的思想,從某種角度講,展現了計算機編程具有的獨特特性。如果有模擬城市、虛擬人生等類似遊戲的體驗,或許能夠理解這中間所包含的看似荒誕、實則發人深思的假設。     同樣類似的情節出現在哲學啓蒙性書籍《蘇菲的世界》這本書中。但書中情節與電影黑客帝國不同是,《蘇菲的世界》提出的一種假設是我們身處的世界可能是某本書中描繪的內容,這種假設本身也是一種不可證僞的觀點。好在這裏並不是爲了討論哲學命題,而是想要探求爲什麼會有不同載體的虛擬世界和這些假設的基礎。
編程觀:從黑客帝國談起-5bfd3554b7533f98031dfc4ff548b2c1.jpg
蘇菲的世界中文版封面

    《蘇菲的世界》認爲世界可能是由文字所描述的,而電影黑客帝國假設世界可以由計算機程序模擬。這是因爲無論是文字還是程序都具有一個相同的屬性--抽象。所謂抽象可以簡單理解爲描述世界、模擬世界的能力。在描述或者模擬的過程中,也會存在着簡化和提煉。同樣的,我們學習過的各種學科,包括數學、物理、生物等等,也是將現實世界中的事物或者問題抽象簡化爲數學表達式或者物理公式,最終經過假設和推演獲得事物的狀態、變化的結果或者說問題的解。從這種角度講,我們的知識都是對世界的認知,本身就是抽象後的結果。

    比較樸素的編程思想其實和數學、物理學科的基本思想是一致的,即認爲世界可以由某一時刻的狀態和狀態改變的操作所描述。舉個比較淺顯的例子:小明有1個糖,吃掉1個,還剩幾個?這個問題,“某一時刻的狀態"是“有1個糖”,狀態改變的操作是“吃掉1個”,那麼就能夠推導出執行“狀態改變操作”之後所處的狀態是"0個糖”。這個例子雖然簡單,但是需要知道複雜問題其實也是由簡單思想有邏輯的結合在一起來解決的。上述例子可以引申出新的問題,小明有100個糖,每1小時吃掉一個,43個小時後還剩多少個?(對,小明就是一個沒有感情的吃糖機器)這個問題如果從數學思維講,就是簡單的100-43.但是從對現實世界計時的角度來說,就包含了狀態的隨時間的連續變化,一個狀態通過狀態的改變達到一個新的狀態,然後新狀態作爲新的起始狀態繼續通過-1的狀態變化達到一個新的狀態,直到43小時這個問題的終結。綜合上述,這就是面向過程編程的基本思想。其中某一時刻的狀態能夠由數據來描述,而狀態改變的操作即爲算法。

編程觀:從黑客帝國談起-91c3620eb7c1980966db2819eb3e36cc.jpeg
電子躍遷:狀態改變--實現電子從一個狀態到另一個狀態的變化

    面向過程編程面臨的基本問題是分類與分步。     分類需要處理狀態維度和狀態改變的操作維度的問題。由於整個流程中狀態和狀態變化操作的不確定性,需要對新狀態的可能結果進行分類,而接下來可又能由於新狀態的不同,對應的狀態改變的操作也不同,所以也需要對狀態的操作也進行分類。分類思想體現在編程語言的if else基本語句,這也是爲什麼無論編程語言怎樣變化,if else基本語法永遠會存在的原因。     分步就相對沒有那麼複雜,每一個狀態通過狀態改變到達新狀態的過程的粒度,就是分步需要解決的問題。比如100個糖的問題,最直接的數學思想100-43,即100是初始狀態,狀態的變化的操作是“吃了43個小時”,所以新狀態是57。我在舉例時介紹的情景想要要表達的是用更細的分步粒度,簡單表述是100-1-1···-1,每一小時減去1,連續減43小時。看上去在這種情景下,這種細粒度的算法像是初學數學的小學生扳指頭算數,但是在一些複雜情景下,如何切分算法的分步的粒度,是一個很高深的學問。在編程中,順序語句和循環就對應着分步的思想。

    面向對象編程並不像面向過程編程那樣容易理解。電影黑客帝國中,有一個情節是說指導尼奧和黑客組織的精神導師"先知"實際上只是一段程序。在“矩陣”模擬的世界中,存在許多沒有現實實體、只是人工智能編寫的程序的“虛擬人”,這裏把這些人稱爲有思想的(遊戲中的)NPC可能更容易被理解。不止有人,“矩陣”世界所有的物體都是程序的模擬,包括高樓大廈、食用的牛肉紅酒等。

編程觀:從黑客帝國談起-580892cec6d7a1157417dac111d7bd8d.png
黑客帝國中用來表現世界是由程序模擬的劇照

    面向對象編程一部分可以理解爲將一些實體的概念封裝成了類。比如,可以將人類認爲是具有“人”的共通屬性的類,而每個具體的人就是這個類”實例化“的對象。通用的屬性對應到每個具體“人”的對象身上,就是用來代表某種人的狀態,這個狀態可以是靜態的、不隨時間變化的,也可以是動態的、可以通過狀態操作改變的。類中不僅有狀態,還有狀態改變的操作--類自身定義的方法。根據這兩個特徵,其實可以察覺出面向對象編程似乎只是面向過程編程的一個變體。面向過程編程中,所有的狀態數據的有效區間只能是全局的或者函數內部的。但是面向對象編程實現了一種中間態,即既不是全局的能被所有函數訪問的,也不是函數內部僅供函數自身訪問的,而是可以實現在類的內部多個函數間進行狀態共享。這種封裝可以認爲是在面向過程編程的基礎上進行了模塊化改造,每個類都是一個"子系統",“子系統”和全局、"子系統"和“子系統”可以通過外部方法的接口形式進行交互,子系統的內部又實現了局部狀態的變化。     既然是面向過程編程的變體,面向對象編程同樣需要解決基本問題分類與分步。當然,在面向對象編程過程中,仍然可以使用面向過程編程的分類和分佈的思想,很多時候也逃不開使用它們解決問題。但是,更好的解決方法是使用面向對象編程的分類分步思想,這一部分知識主要就是設計模式想要解決的問題。

思索

    面向過程編程中目前普遍使用的分類,都是基於一個“有限”的前提,即狀態不會無限多,狀態對應的操作也不會無限多。在分步這個維度,可以構造“假”死循環來實現形式上的類“無限”,很多web服務器也是這樣實現的。但是在分類維度,if else的分類總是有限的。有人可能會反駁說,我們不可能預想出所有的情景,特別是無窮又該如何定義?我這裏之所以考慮這個點,是從程序智能的角度思考,如果在編程語言底層實現上能夠允許程序的自我編寫,比如自行實現情景預測,編寫自己if else邏輯,這是否就算作程序具有了學習能力,能夠實現真正的人工智能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章