黃嘉誠(chéng)
(江南大學(xué),江蘇無(wú)錫 214122)
語(yǔ)言是資源溝通、信息交流的一種重要方式[1]。計(jì)算機(jī)語(yǔ)言問(wèn)世于20世紀(jì)50年代,是計(jì)算機(jī)軟件的一個(gè)重要組成部分,對(duì)于計(jì)算機(jī)發(fā)展具有非常重要的意義。計(jì)算機(jī)語(yǔ)言經(jīng)歷了機(jī)器語(yǔ)言、匯編語(yǔ)言以及高級(jí)語(yǔ)言三個(gè)階段[2]。其中高級(jí)語(yǔ)言提升了對(duì)用戶的友好程度,降低了對(duì)硬件的依賴程度,充分滿足了社會(huì)需求,得到了廣泛的使用與推廣[3]。在計(jì)算機(jī)語(yǔ)言發(fā)展歷史中,編程起源于西方,英文編程成為了主流與規(guī)范,漢字編程卻發(fā)展艱難,而易語(yǔ)言(EPL)則是漢字編程中的典型代表。本文分別通過(guò)易語(yǔ)言以及C++編程語(yǔ)言,來(lái)設(shè)計(jì)與仿真基于元胞自動(dòng)機(jī)的生命游戲,進(jìn)一步討論易語(yǔ)言的特點(diǎn),以及展現(xiàn)中英文編程的差異。
易語(yǔ)言是中國(guó)人發(fā)明的一種計(jì)算機(jī)編程語(yǔ)言,以“易”著稱,早期稱為E語(yǔ)言,是一種以漢字為程序代碼來(lái)展現(xiàn)的語(yǔ)言形式[4]。易語(yǔ)言誕生于國(guó)內(nèi)計(jì)算機(jī)發(fā)展初期,此時(shí)漢化系統(tǒng)與漢語(yǔ)輸入法才步入正軌。為了促進(jìn)漢語(yǔ)編程的發(fā)展,吳濤先生在2000年研發(fā)出了易語(yǔ)言的最早版本。經(jīng)過(guò)20多年的發(fā)展,易語(yǔ)言已經(jīng)具備一定規(guī)模,具有安裝方便、操作簡(jiǎn)單、容易上手等特點(diǎn),不僅支持界面設(shè)計(jì)與程序流程的可視化,還具有即時(shí)幫助系統(tǒng)、語(yǔ)法格式自動(dòng)檢查等功能[5]。在軟件編譯器的設(shè)計(jì)、漢語(yǔ)可視化的編程等方面具有一定的創(chuàng)新,處于國(guó)內(nèi)領(lǐng)先地位,像《中華辦公系統(tǒng)》《紅警2戰(zhàn)網(wǎng)》等軟件都是采用易語(yǔ)言編寫的。易語(yǔ)言的趣味性很強(qiáng),學(xué)習(xí)以及入門門檻較低,為國(guó)內(nèi)非專業(yè)人士、英文基礎(chǔ)薄弱人群以及電腦編程初學(xué)者提供了相對(duì)容易的學(xué)習(xí)環(huán)境與學(xué)習(xí)機(jī)會(huì),可以在較短的時(shí)間內(nèi)進(jìn)入windows程序系統(tǒng)的大門[6]。它的程序?qū)崿F(xiàn)是由窗體設(shè)計(jì)以及代碼編寫組合而成,因此易語(yǔ)言在小游戲和小程序的開發(fā)與實(shí)現(xiàn)上具有顯著的優(yōu)勢(shì)。
易語(yǔ)言是完全面向?qū)ο蟮挠?jì)算機(jī)語(yǔ)言,與VB語(yǔ)言有很多相似之處[7]。易語(yǔ)言的編譯器能夠?qū)⒃创a編譯為易語(yǔ)言類庫(kù)或者可執(zhí)行文件,兼容Windows的所有系統(tǒng),且支持DOS與Linux等不同操作系統(tǒng)。編譯方式主要分為普通編譯、靜態(tài)編譯以及早期的獨(dú)立編譯三種,能夠高效編譯執(zhí)行。易語(yǔ)言屬于模塊化語(yǔ)言,方便直接調(diào)用編寫好的現(xiàn)成模塊,但同時(shí)性能受到一定影響,在傳遞過(guò)程中需要附帶各種庫(kù)文件,整體所占空間較大。
易語(yǔ)言的表達(dá)式包括常量、變量、立即數(shù)、表達(dá)式、方法調(diào)用以及各自的組合。每一行代碼可以由多條語(yǔ)句組成,語(yǔ)句需要以“;”結(jié)尾,按照漢語(yǔ)的邏輯思維進(jìn)行代碼編寫,語(yǔ)義清晰明了。
這里使用的集成開發(fā)環(huán)境是2019年5月發(fā)布的易語(yǔ)言5.9版本。
C++語(yǔ)言完全兼容于C語(yǔ)言,是對(duì)C語(yǔ)言的補(bǔ)充與增強(qiáng),總共融合了3種不同的計(jì)算機(jī)編程傳統(tǒng)。在C語(yǔ)言代表的過(guò)程性傳統(tǒng)的基礎(chǔ)上,C++增加了面向?qū)ο笳Z(yǔ)言的傳統(tǒng)以及通用編程傳統(tǒng)。它首先考慮的是如何建立一個(gè)符合要求的對(duì)象模型,使其能夠解決與之契合的問(wèn)題,然后通過(guò)引進(jìn)對(duì)象的狀態(tài)信息來(lái)實(shí)現(xiàn)對(duì)象的控制過(guò)程,因此它也被稱為“帶類的C”[8]。標(biāo)準(zhǔn)的C++語(yǔ)言有以下三個(gè)重要模塊所構(gòu)成:第一部分是核心語(yǔ)言,負(fù)責(zé)提供變量、數(shù)據(jù)類型等所有構(gòu)件塊[9]。第二部分是C++標(biāo)準(zhǔn)庫(kù),負(fù)責(zé)提供函數(shù)和編程數(shù)據(jù)結(jié)構(gòu)來(lái)傳遞鏈表、數(shù)組等組件。第三部分是標(biāo)準(zhǔn)模板庫(kù)(STL),負(fù)責(zé)標(biāo)準(zhǔn)化組件,便于用戶以后直接使用。此外,配置C++的語(yǔ)言環(huán)境只需要文本編輯器和C++編譯器兩個(gè)基本軟件。相比于易語(yǔ)言,C++語(yǔ)言同等程序大小一般只有幾千字節(jié),運(yùn)行和使用效率大大提高。本文使用的是Visual Studio 2010作為開發(fā)環(huán)境,來(lái)實(shí)現(xiàn)生命游戲的可視化編程。Visual Studio是Windows平臺(tái)中使用最為廣泛的應(yīng)用程序開發(fā)環(huán)境,支持用戶使用各種程序語(yǔ)言進(jìn)行軟件開發(fā),并支持動(dòng)態(tài)編程、多核并行運(yùn)算等功能。
20世紀(jì)80年代,復(fù)雜性科學(xué)被首次提出,便引起了全球科學(xué)家廣泛的關(guān)注與思考,一度被譽(yù)為“21世紀(jì)的科學(xué)”[10]。為了探索復(fù)雜性科學(xué)與復(fù)雜性系統(tǒng),海內(nèi)外學(xué)者提出了各種方法。其中元胞自動(dòng)機(jī)(cellular automaton,CA) 因?yàn)樗暮?jiǎn)單規(guī)則性、并行性以及有效性受到廣泛的關(guān)注與應(yīng)用。
元胞自動(dòng)機(jī)由元胞、規(guī)則與鄰居三部分構(gòu)成,每一個(gè)元胞都有固定的位置與兩種狀態(tài)[11]。假設(shè)初始存在一個(gè)元胞群,每經(jīng)歷一個(gè)時(shí)間單位,每一個(gè)元胞都會(huì)根據(jù)設(shè)定的規(guī)則,在局部也就是鄰居范圍內(nèi)進(jìn)行一次變化,無(wú)數(shù)個(gè)局部共同構(gòu)成一個(gè)大的環(huán)境??此坪?jiǎn)單的規(guī)則卻很難預(yù)測(cè)大環(huán)境下最終元胞的變化,非常具備趣味性[12]。舉個(gè)例子,初始狀態(tài)為規(guī)則劃分好的正方形元胞群,形狀類似于一扇古城墻的大門,其中元胞的狀態(tài)只有黑色或者白色兩種,規(guī)則是如果一個(gè)元胞為白色,而與之相鄰的元胞為黑色,那么顏色將保持白色,否則顏色將變?yōu)楹谏S谑莾H僅改變水平或垂直相鄰的任意元胞,圖形的輪廓便被勾勒出來(lái)。如圖1所示,每一個(gè)元胞對(duì)應(yīng)著局部的信息,都成功地表達(dá)出了整個(gè)環(huán)境狀況。
圖1 元胞演示圖
20世紀(jì)60年代末,康威實(shí)驗(yàn)室推出了一款生命游戲,不僅風(fēng)靡全球,更大大推動(dòng)了元胞自動(dòng)機(jī)的研究。生命游戲是將元胞分布在規(guī)則劃分的網(wǎng)格上,設(shè)置元胞周圍九宮格的大小為鄰居范圍,每一個(gè)元胞的狀態(tài)只有兩種,用二進(jìn)制數(shù)來(lái)表示生或者死。每一個(gè)元胞的生命狀態(tài)由該時(shí)刻自身的狀態(tài)與下一時(shí)刻八個(gè)鄰居的元胞的狀態(tài)共同決定,并按照一定的規(guī)則進(jìn)行變化。
在生命游戲中,簡(jiǎn)單的初始狀態(tài)可以不斷變化,逐漸復(fù)雜,甚至是無(wú)限循環(huán),最終導(dǎo)致了環(huán)境的多樣性與復(fù)雜性。相反,復(fù)雜混沌的初始狀態(tài)在簡(jiǎn)單規(guī)則的作用下,可以逐漸簡(jiǎn)化,甚至虛無(wú)[13]。
在程序設(shè)計(jì)中,采用的基本數(shù)據(jù)結(jié)構(gòu)是二維矩陣,來(lái)模擬大量的元胞狀態(tài)。整個(gè)程序分為子模塊進(jìn)行編寫與調(diào)用,最終按照時(shí)序進(jìn)行排列。本設(shè)計(jì)中主要程序有兩部分:窗口程序集和主程序。窗口程序集主要包括窗口的啟動(dòng)、各個(gè)選項(xiàng)按鈕的設(shè)置、讀入元胞數(shù)據(jù)以及時(shí)鐘設(shè)置等方面。整個(gè)軟件的界面如圖2所示,此狀態(tài)選擇的是隨機(jī)分布初始狀態(tài)且元胞尺寸最大。為了顯示直觀,采用白色方格來(lái)表示狀態(tài)“生”。
圖2 易語(yǔ)言軟件界面
在整個(gè)程序中,共有三種初始方式可供選擇。第一種是手動(dòng)設(shè)置,讓用戶自由發(fā)揮,來(lái)創(chuàng)造獨(dú)特的圖形,例如在生命游戲中存在一種圖形稱為“滑翔機(jī)”,僅僅由5個(gè)元胞構(gòu)成,周期為4,可以每4個(gè)變化就向右下角平移1格,雖然元胞的狀態(tài)已經(jīng)發(fā)生變化,但元胞群還是保持著原來(lái)的形狀。手動(dòng)設(shè)置如圖3所示。
圖3 滑翔機(jī)
第二種是隨機(jī)設(shè)置,可以比較真實(shí)地模擬生命游戲的變化過(guò)程,例如圖2隨機(jī)的初始狀態(tài)看上去十分混亂,經(jīng)過(guò)數(shù)十次變化后,會(huì)形成穩(wěn)定的狀態(tài),如圖4所示。最終狀態(tài)由兩部分組成,一種是以“田”型圖案為代表的穩(wěn)定型,一種是以“1”型圖案為代表的周期型。其中左下角的圖案稱為“脈沖星”,是一種周期為3的對(duì)稱圖形。整個(gè)過(guò)程會(huì)不斷簡(jiǎn)化,趨于穩(wěn)定。
圖4 隨機(jī)設(shè)置下的穩(wěn)定狀態(tài)
第三種是圖案設(shè)置,用txt文本文件對(duì)應(yīng)位置寫好圖形,1表示白色方格,0表示黑色方格,然后插入到程序中,鼠標(biāo)點(diǎn)擊的位置表示插入圖形的左上角元胞位置。在生命游戲中,雖然元胞的變化難以預(yù)測(cè),但是人為地利用規(guī)律也可以設(shè)置出有趣循環(huán)的圖案,筆者設(shè)置了一種初始狀態(tài),將它稱為“八面玲瓏”,如圖5所示。
圖5 一種人為設(shè)置的有趣圖形
在圖5中心區(qū)域共有八個(gè)滑翔機(jī),外圈的四個(gè)滑翔機(jī)按順時(shí)針?lè)较蝻w行,內(nèi)圈的四個(gè)按逆時(shí)針?lè)较蝻w行,互不干擾。在圖形的四周設(shè)置了一些“補(bǔ)給倉(cāng)”,滑翔機(jī)經(jīng)過(guò)它們時(shí)會(huì)損失元胞、補(bǔ)充元胞,在改變行動(dòng)軌跡的同時(shí)形狀不發(fā)生變化,在經(jīng)過(guò)四分之一個(gè)周期以后,圖形中心部分整體旋轉(zhuǎn)了90°,如圖6所示,這就是人類可以利用規(guī)律來(lái)改變與創(chuàng)造事物。
圖6 經(jīng)歷1/4周期變化后的圖形
此外,可以設(shè)置元胞的大小,因?yàn)榄h(huán)境的尺寸是固定的,三種大小的元胞對(duì)應(yīng)的是數(shù)量不同的三種初始狀態(tài)。元胞的演化速率也可以設(shè)定,此刻采取的是520 ms。選擇好狀態(tài)后點(diǎn)擊“開始”,整個(gè)元胞群就會(huì)不斷地發(fā)生變化,點(diǎn)擊“停止”就會(huì)定格在當(dāng)前狀態(tài),點(diǎn)擊“復(fù)位”整個(gè)屏幕就會(huì)清空。整個(gè)軟件的流程圖如圖7所示。
圖7 軟件的流程圖
在整個(gè)程序中局部變量與全局變量都是以表格的形式顯示在代碼的開頭,當(dāng)改變其名稱時(shí),整個(gè)程序中所有的該變量都會(huì)同步變化,十分方便。與英文編程不同,易語(yǔ)言中每一個(gè)分支流程線是可以互相標(biāo)注的,條理十分清晰。以演化規(guī)則來(lái)舉例,相關(guān)的變量、代碼設(shè)置分別如圖8、圖9所示。
圖8 相關(guān)變量的設(shè)置
圖9 元胞規(guī)則的代碼
整個(gè)程序的思路清晰簡(jiǎn)潔,易語(yǔ)言可以在較短時(shí)間內(nèi)編寫出一個(gè)小程序,趣味性足,入門性高。在編寫代碼的過(guò)程中,幫助功能可以提示任務(wù)的流程。同時(shí)可以調(diào)用支持庫(kù)與模塊,集成開發(fā)環(huán)境非常強(qiáng)大。設(shè)置初始狀態(tài)到趨于穩(wěn)定的運(yùn)行時(shí)間在大約為19.8 s,整體運(yùn)行時(shí)間相對(duì)較長(zhǎng)。隨著txt文本的增加和時(shí)鐘、圖片等組件的使用,易語(yǔ)言所占內(nèi)存會(huì)不斷增加,需要進(jìn)行有效地刪減。
這里選用Visual Studio 2010軟件來(lái)仿真生命游戲的整個(gè)演變過(guò)程,大致思路與易語(yǔ)言一樣,核心部分依舊是先判斷周圍狀態(tài)為“生”的元胞個(gè)數(shù),統(tǒng)計(jì)并按照規(guī)則變化,最后再進(jìn)行輸出。與易語(yǔ)言的窗口有所不同,選項(xiàng)設(shè)置在了最上方,第一個(gè)小菜單“State Selection”如圖10所示,通過(guò)鼠標(biāo)選擇來(lái)進(jìn)行初始化,缺少了“圖案設(shè)置”選項(xiàng)。此外,還包括另一個(gè)小菜單“Introduction”,進(jìn)行簡(jiǎn)單的介紹,如圖11所示。
圖10 狀態(tài)選擇菜單
圖11 介紹菜單
整個(gè)仿真的界面如圖12所示,相比于易語(yǔ)言,元胞與元胞之間更加清晰、直觀。利用VS2010進(jìn)行程序的編寫,工作量相對(duì)比較大,主要包括頭文件、源文件以及資源文件三類,每一個(gè)選項(xiàng)都要設(shè)定唯一的地址,比較繁瑣。此外,設(shè)置相同初始狀態(tài),C++的運(yùn)行時(shí)間只有5.8 s,執(zhí)行效率遠(yuǎn)遠(yuǎn)快于易語(yǔ)言。
圖12 VS2010仿真界面
首先漢語(yǔ)歷史悠久,句式、方言、多音字甚至是語(yǔ)調(diào)語(yǔ)氣都會(huì)影響句子本來(lái)的含義。計(jì)算機(jī)語(yǔ)言無(wú)論是漢語(yǔ)還是英文都需要轉(zhuǎn)化成二進(jìn)制代碼傳遞給計(jì)算機(jī),相比于英文字母,一個(gè)漢字占據(jù)兩個(gè)字節(jié),在計(jì)算機(jī)空間與時(shí)間效率上,漢語(yǔ)編程相對(duì)處于劣勢(shì),在易語(yǔ)言內(nèi)存操作數(shù)組進(jìn)行檢索,模塊化調(diào)用的關(guān)系,性能會(huì)有所提升。
其次編程起源于西方,英語(yǔ)編程的流通性、架構(gòu)體系以及開發(fā)環(huán)境都相對(duì)完善。例如在計(jì)算機(jī)中效率最高的表達(dá)形式是三進(jìn)制或者e進(jìn)制,三進(jìn)制更加貼近于人類的思維,是信息表達(dá)的最優(yōu)定義。但是目前人類主流的表達(dá)形式依然是二進(jìn)制,根本原因在于人們不想改變熟悉的環(huán)境,更不想去打破二進(jìn)制的壟斷地位,權(quán)衡利弊之下選擇了維持現(xiàn)狀。而漢語(yǔ)編程走向世界面臨著相同的問(wèn)題,就好比手機(jī)出現(xiàn)故障,調(diào)試時(shí)藍(lán)屏出現(xiàn)的都是英文代碼,此時(shí)用英文去恢復(fù)相對(duì)容易,漢語(yǔ)編程的難度可想而知。
易語(yǔ)言的編程頁(yè)面相對(duì)比較美觀,整體的編程邏輯思維簡(jiǎn)潔,入門性高、學(xué)習(xí)門檻較低,可以在最短時(shí)間內(nèi)進(jìn)行可視化編程,對(duì)于一般初學(xué)者學(xué)習(xí)開發(fā)很有幫助。易語(yǔ)言的初衷是做一臺(tái)輕便的“電動(dòng)車”,是大眾的定位錯(cuò)誤與期望較高。易語(yǔ)言是基于C/C++語(yǔ)言開發(fā),它的部分編譯器也是由C++編寫,因此在高級(jí)模塊上注定是有缺失的。反觀C++語(yǔ)言,不僅繼承了C語(yǔ)言的精華與優(yōu)點(diǎn),更增加了面向?qū)ο蟮忍攸c(diǎn),是企業(yè)級(jí)系統(tǒng)軟件的必備之選。此外,它的運(yùn)行效率也遠(yuǎn)遠(yuǎn)高于易語(yǔ)言,在處理大數(shù)據(jù)運(yùn)算時(shí)優(yōu)勢(shì)明顯[14]。當(dāng)然,編程語(yǔ)言的強(qiáng)大與否,與用戶的個(gè)人能力與算法實(shí)現(xiàn)也有緊密關(guān)聯(lián)。
對(duì)于計(jì)算機(jī)語(yǔ)言,目前關(guān)注點(diǎn)在于可擴(kuò)展性、可書寫性、運(yùn)行效率、簡(jiǎn)易程度以及邏輯思維等。本文進(jìn)行可視化編程對(duì)比,研究結(jié)果表明漢語(yǔ)編程在執(zhí)行程序時(shí),所占計(jì)算機(jī)內(nèi)存空間較大,執(zhí)行速率相對(duì)較慢。相比于英語(yǔ)編程,在可書寫性、簡(jiǎn)易程度以及邏輯思維等都有一定的優(yōu)勢(shì),方便用戶在短時(shí)間上手與操作。對(duì)于編程而言,其本質(zhì)應(yīng)該與生命游戲相同,用最簡(jiǎn)潔的代碼去實(shí)現(xiàn)一個(gè)復(fù)雜而高級(jí)的系統(tǒng),本就應(yīng)該具備語(yǔ)言無(wú)關(guān)性。最后,生命游戲是一種開放式的結(jié)局,暗示著最簡(jiǎn)單的邏輯規(guī)則,也能創(chuàng)造出復(fù)雜有趣的現(xiàn)象,需要進(jìn)行不斷地探索與發(fā)現(xiàn)。