陳凱
維特根斯坦有一個著名的且引發(fā)了廣泛討論的論斷:“世界是所有事實的總和,而不是所有事物的總和。”這句話可能離普通人的日常經驗有一些距離,當人們看待世界的時候,往往自然而然地傾向于把事物進行分解:從某個物體還原到分子,再還原到原子,進而到各種基本粒子,于是可能覺得這整個世界就是由這些基本粒子組成的。一些哲學家覺得這樣看待世界的方式是不全面的,世界上的事物之間是有著普遍聯(lián)系的,當談論事物的時候,實際上總是無法割裂事物之間的關系來談論事物本身。這里不考慮哲學家們各不相同的世界觀,若撇開現(xiàn)實世界的情況,將目光集中在所謂的“元宇宙”上,那么,“元宇宙”中的世界的特征的確與維特根斯坦所說的“事實的總和”有相當程度的契合。想象一下,某人在“元宇宙”中喝咖啡,這個過程中咖啡的實體實際是不存在的,咖啡的味道可能是一系列信息對你頭腦神經元的沖擊,也就是說,只有喝咖啡這件事存在而已。
“元宇宙”是一個在極短時間里就火爆起來的詞語,它其實指的是一種與人腦高度融合的虛擬世界(而不只是把腦袋罩在一個產生立體影像和聲音的頭盔里),這讓人聯(lián)想起電影《黑客帝國》《頭號玩家》,或動畫片《刀劍神域》之類。當前,“元宇宙”尚未進入到日常生活中,但不妨以“元宇宙”的視角來看待許多事實,如程序語言的語法為何是當前所看到的樣子?
什么是“元宇宙”的視角?“元(meta)”這個字本身有著自我指涉的意味,如元數(shù)學是用數(shù)學的技術來研究數(shù)學本身,元數(shù)據(jù)是用數(shù)據(jù)來描述數(shù)據(jù),元規(guī)則是思考如何制定規(guī)則去制定某個規(guī)則。然而,“元宇宙”不能簡單理解為“用宇宙的方法來描述宇宙”,“元宇宙”的“元”更接近于“元編程”的“元”,對照在編程過程中對編程行為本身的理解和改變的“元編程”,那么“元宇宙”其實就是在虛擬空間的體驗中理解和改變虛擬空間自身?!霸钡母拍钐崾玖诵畔⒓夹g學科教學中一種獨特的“真實情境”,那就是以我們所使用的各種信息技術工具(尤其是編程工具)本身為情境,自反性地去思考它們何以如此,并且將會如此。
● 積木式編程環(huán)境里的事物和關系
當目光凝視在編程本身,而不是用編程的語句解決某個現(xiàn)實問題的時候,就會由這種凝視產生出具有自反性特征的思考。本文主要圍繞積木式編程環(huán)境中的積木組裝與日常所用的以文字、符號組成的編程語句這兩者間的差異來展開思考。
積木式編程環(huán)境中提供了各種各樣形狀的零件,如果僅僅是將它們分散地拖拽到編輯空間中,那么它們只是看上去存在著,卻沒有任何意義,除非這些積木能被合理地相互拼接起來,這樣,每一塊積木似乎就有了特定的價值。這讓人想起了“意義即存在”的哲學議題,至少在積木式編程環(huán)境中,那些未被合理組裝到一起而是散落在編輯空間中的積木塊,就直接被忽略掉了。一段合理的、表達程序代碼的組裝積木圖形是一系列表達事物和表達關系的積木拼接嵌合而成,沒有事物的關系與沒有關系的事物,都是無法用來正確描述出某個功能的。
盡管存在很多種積木式編程平臺,但它們的使用方法是大同小異的。以下活動應當在學生們對積木式編程環(huán)境有初步了解和應用后開展,希望學生們不要過多糾結于積木組裝后的實際用途,而以純粹拼圖的方式來審視每一塊積木自身的形狀,審視積木之間的拼接關系,并在一些方面開展實驗并作總結:
哪些拼圖可以用在語句起始?
哪些拼圖可以和上面或下面的語句連接?
哪些拼圖可以嵌入到其他拼圖中去?哪些總是必須嵌入到其他拼圖中?
哪些拼圖既可以嵌入到其他拼圖中,也可以在其中嵌入其他拼圖?
哪些拼圖的縱向寬度會發(fā)生變化?為什么這種變化是必須的?
……
積木拼接的形式是需要考慮的重點。與借由鍵盤輸入文字、符號的形式來編程的方式對比,積木式編程實現(xiàn)了對語句的輸入行為的較為嚴格限定,這樣就大大提高了編程初學者完成任務的成功率。如圖1所示,如果說一段普通的用文字、符號的形式寫就的程序代碼表達了某一系列的計算機的計算行為,那么積木式編程環(huán)境中組裝成功的積木就是對某段用文字、符號的形式寫就的程序代碼的表達,也就是一種表達的表達。正是這種二階的表達對表達的方式進行了限定。
在拼接積木的過程中,有兩個方向不同的問題值得更深入地思考:其一,是否編程者想要描述的合理的功能,都能夠被這些積木拼出來?其二,任意采用積木拼接出來的圖形,都能對應某個合理的功能嗎?類似這樣的問題,就是元編程問題。
● 形式結構的生成和檢驗
從積木式編程的體驗中帶來的一個啟發(fā)是,可以通過限定性的規(guī)則來約束語句的結構。這個思想可以遷移到其他編程環(huán)境中,對于借由鍵盤輸入文字、符號的形式來編程的大部分環(huán)境,可以鼓勵學生們自行創(chuàng)設限定性規(guī)則來實現(xiàn)某種拼接游戲,并檢驗其可行性,圖2是其中的一個例子。
以下是拼接規(guī)則:所有非字母符號和數(shù)字的符號不能當作最左面第一塊積木;等于號后可以接括號;當相鄰左右括號內部無物時,可以在其中放置其他積木,但必須滿足要么兩側都是同類型括號相連,要么兩側都是括號與井號相連的形式;拼接完成后刪除井號和句號,并試著運行代碼。
如果只通過復制和粘貼來產生語句(除了數(shù)字需要通過鍵盤輸入),則上述實驗其實模擬了積木式編程產生賦值語句的方法。例如,先放置:
a=
接下來可以放置帶括號的積木:
a=()
接下來可以往括號內放置數(shù)字:
a=(#12#)
到這里,就不再有繼續(xù)拼接的可能了。將井號刪除后,得到賦值語句a=(12)。
在a=()這一步后也可以放置其他積木,如:
a=(()*())
只要相鄰左右括號是空的,就可以繼續(xù)按規(guī)則放置,如:
a=((#3#)*(()+()))
……
通過這樣的方式能得到規(guī)范的賦值語句。這樣,就能體驗到形式在結構生成中的作用。
換一種角度,假設積木式編程里的積木并沒有設定這些規(guī)則,而是允許隨意拼接,那怎樣才能知道,拼接后的哪一些圖案是合理的?如果說,先前的問題是怎么限定規(guī)則,使得拼接過程必然生成合法的語句,而現(xiàn)在的問題是,怎么設定規(guī)則,使得在任意生成的語句的集合中,檢驗哪些語句符合規(guī)則而留存,哪些不符合規(guī)則而被過濾掉。
這個問題涉及形式文法的檢驗,撇開相關專業(yè)知識,可利用網絡上現(xiàn)成的工具來做直觀的實驗。網站http://web.stanford.edu/class/archive/cs/cs103/cs103.1156/tools/cfg/上提供有一個形式文法的檢驗機,如圖3所示。這里舉兩個簡單的例子,如有下面的生成規(guī)則:
S →SD | a | b | c | d
D→| a | b | c | d | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
這兩條規(guī)則說明這一類變量名需要以a或b或c或d開頭,后面可以跟上a或b或c或d,也可以跟上某個數(shù)字符號,長度不限。很容易利用這個工具檢驗某個符號串是否符合以上的文法規(guī)則。規(guī)則中,“ε”符號表示空,“|”符號表示或,大寫字母表示可被其他大寫字母、小寫字母或數(shù)字替代。
而如圖4所示的這些規(guī)則,就能生成合法的賦值語句,為了避免過于復雜,這里沒有考慮括號的使用。
可以僅像對待一個智力玩具那樣對待這個形式文法檢驗工具,將任意的符號組合而成的字符串都交由這個工具進行檢驗,如果字符串被接受,那就說明這個字符串是通過預設的規(guī)則合法地產生出來的。
● 規(guī)則與自相似
審視積木式編程環(huán)境中的積木組裝方式,可以清晰地看出復雜的結構是如何借助重復和嵌套的模式生成的。運算表達式里嵌套的運算表達式、雙分支結構里的雙分支結構、循環(huán)結構里的循環(huán)結構等,都具有自相似的特點,如圖5所示。
在Python中,分支或循環(huán)結構中語句塊的縮進,首要的目的當然是為了能夠正確解析代碼。在教學中,可以強調這種縮進來產生一種具有自相似結構的圖形化美感。如下頁圖6所示,這段拼接而成的代碼,展現(xiàn)了分支結構語句具有創(chuàng)設自相似結構迷宮的可能性。
如下頁圖7、圖8所示,下面這段代碼的作用,是通過輸入布爾值來實現(xiàn)將二進制編碼轉換為十進制數(shù)字的功能,顯然,僅有的這幾行代碼只能轉換一位二進制數(shù)字,通過自相似的拼接,它就能擴展自己的功能,處理更多位二進制的數(shù)字。拼接的規(guī)則也很簡單,就是將“#begin”和“#end”中的所有內容,復制粘貼到只有“#”的區(qū)域。這個自相似的拼接游戲可以反復進行下去。
在拼接過程中,每一個基本的語句塊都是簡單的,拼接過程也是簡單的。但最終拼接而成的代碼,卻有著能讓旁觀者仿佛陷入迷宮的繁雜結構,這其實也是對現(xiàn)實世界運作規(guī)律的一種隱喻。最具有濃厚的自相似特征的程序語言大概就是LISP之類的表處理語言,所有的表達式都是以括號括起的函數(shù)名和數(shù)據(jù)的形式呈現(xiàn)的,圖9就是一個用與非邏輯來實現(xiàn)異或邏輯的LISP代碼。
這種風格的代碼似乎并不是為人類閱讀準備的,但正是這種仿佛強迫癥一樣的自相似結構,為一個按照程序代碼運行的計算機器能夠在運行代碼過程中改寫自身的代碼提供了方便。LISP的出現(xiàn)曾經是人工智能研究里程中的一座高峰,它展現(xiàn)了依靠極少的運算符和極其簡單的結構來實現(xiàn)復雜運算的能力,與自然世界的復雜事物的構成方式具有某種程度的相似性。但運行LISP程序的計算機器,仍然與人的思維能力相去甚遠。在這里,回顧本文開始時提出的問題,如果說“元宇宙”是在虛擬空間的體驗中理解和改變虛擬空間自身,那么LISP等表處理語言的能力已經為實現(xiàn)這樣的理想提供了某種保證。但若要問“元宇宙”能否具有在虛擬的宇宙中理解和改變現(xiàn)實中的宇宙的能力,這個問題的答案卻還十分模糊。
本文從積木式編程的特征談論到普通程序語言中的自相似結構,再談論到具有嚴格自相似特點的LISP語言,從歷史的時間軸看,這是從現(xiàn)今向過往的回溯,從認識的深度看,這是從現(xiàn)象到本質的還原。