6.1語句與公式
6.2符號的模擬——算術
6.3符號的規則操作——計算
6.4二進位的應用——現代計算機
所有進位的位置記數法原理上等價,實踐中不同進位的記數法有不同的適用性。二進位是用0、1這兩個數字,以及逢二進一的規則來表示所有的數。十進位與二進位相比,十進位的數字長度更短,更容易辨識書寫,另一方面十進位的應用需要掌握比二進位應用更複雜的加法表與乘法表。
二進位的發明追溯至萊布尼茨。萊布尼茨對二進位情有獨鍾,用法國數學家、物理學家拉普拉斯(Laplace,1749.3-1827.3)的話說:「萊布尼茨在他的二進位算數中看到了宇宙創始的原象。他想像1表示上帝,0表示虛無。上帝從虛無中創造出所有實物,恰如在他的數學系統中用1和0表示了...」。這倒是暗合了二進位在現代神奇的應用之旅。二進位的基礎符號0、1,正好可對應邏輯真值的假、真表示,在「邏輯與語法」一節,布爾代數中的與、或、非運算是通過真值表定義,抽象地看,二進位個位上加法運算可以看作與布爾代數同系列的運算,只是算子不一樣且有進位問題。
0、1與現代電子技術裡的電路與電子器件的特性相匹配。1、0可正好對應電路的開與關,電脈衝的有與無,電平的高與低,利用這一特性,技術上可由繼電器實現與門、或門、非門的數字邏輯電路,實現布爾代數運算。利用異或門的數字電路可以模擬出二進位的加法運算,理論上減法是加法的逆運算,乘法運算是連加運算,除法是乘法的逆運算,技術上通過補碼等方法,可以將四則運算都歸為加法運算。
人類神經系統是神經元(神經細胞)通過突觸相互連接成的神經網絡,單個神經元與突觸工作機制也符合二進位的方式:輸入一個信號,神經元或者激活,或者抵制;激活的神經元或者通過突觸向連接臨近神經元輸出一個信號,或者不輸出。這是一個刺激人工智慧研究的描述,這樣概括神經元與突觸的工作,是否漏了其它的要點,是否能支持起神經網絡整體複雜性的解釋,下不了肯定的結論。
二進位的二個基礎符號:0、1,形成了一個基礎的對立,利用這一對立以及線性空間理論上不受限制的位數,我們可以對任意信息用二進位來編碼,比如英文的26個字母或中文的每個字都可以通過ASCII (American Standard Code for Information Interchange)碼或Unicode碼與一個8位或16位的二進數對應,從而每一英文單詞,或中文詞對應一個二進位的編碼。這些信息的二進位編碼,也稱為內碼,同樣可以由電子器件物理地實現,存放於計算機的存儲器
現代計算機由存儲器、運算器、控制器、輸入設備和輸出設備5部分組成,構成下圖的結構:
這個系統經常稱為馮·諾依曼系統((Von Neuman,1903.12-1957.2,美籍匈牙利數學家)。系統實現的是「存儲程序計算機」的思想:
將程序與數據預先輸入存放在存儲器
控制器從存儲器裡逐條取出程序,解析後送入運算器執行
這裡的程序是一個指令集,每一條指令可分為二個部分
· 操作碼
· 操作數地址碼
操作碼就是對應計算機的基本操作,主要就是運算器的運算操作,操作數的地址碼是存儲器的一個地址,對應地址裡存放有操作碼要操作的數。操作碼、操作數地址、地址裡操作數,所有這些最終是以二進位形式告知計算機,再譯成對應的電信號,驅動硬體運行。
運算器又稱算術邏輯單元ALU(Arithmetic Logic Unit),原理上就是前面所說繼電器的數字邏輯電路發展來的,所完成的就是算術四則運算與邏輯運算,配套上還有移位、比較與傳輸操作,以及更多技術實現上的細節。今天計算機的應用遍及各行各業,所處理的問題也越來越複雜,很多領域的程序複雜度與可靠性是人類難以預測與控制的,所有這些應用中計算機主要做的處理最後都是編譯為算術邏輯單元的邏輯、數學計算。
可存儲運行不同的程序,處理不同的問題,體現的是通用圖靈機的概念。實現通用圖靈機還要滿足圖靈完備的要求,簡單地說就是要支持分支與循環的流程處理以及具備足夠的內存。
我們之前說的都是符號,現在說到的是物理的過程與狀態,這是由人設計實現的。設計實現這些物理過程與狀態,起源是對符號操作過程與結果的一種模仿與表現。你也可以把這看作是一種語言形式,符號是繼電器、句型是門電路,語句則是電脈衝經過門電路過程。相對的,原來的語言符號也只是另一種人造的物理過程與狀態,二者區別在於:後者是面向人的理解與操作的,前者是面向機器自動操作,由此細節上二者有更多的不同。如果一個符號表達及其演算過程,可以反映實際的物理的現象A,也可以反映實際的物理過程B,那麼我們也可以利用B的過程來模擬A,忽略可能的誤差,這與符號的過程等價。甚至沒有符號與演算可以用來表現,能確定A與B過程的相似,就可以用B來表現A,實際的例子如風洞。
繼電器、門電路替換了更早的石子、繩結、木珠、繩網、算盤等,計算也從手動機械的操作進步為機器自動的操作,這是一個大的跨越。操作是機器自動執行的,要進行什麼操作還得人告訴計算機。機器本身只懂得二進位,沒人願意輸入二進位碼告訴計算機做什麼,這樣的工作太枯燥,於是人們發展了高級程式語言用來編寫程序。高級程式語言是更接近於自然語言,或接近領域原生的表示方式的程式語言,高級語言編寫的程序通過編譯器或解釋器的解析,翻譯為機器可執行的二進位目標代碼。程式語言是真實在用的人工語言,且數量眾多。高級語言的編程回到用一種人工語言符號來模擬機器物理過程,因此每一實用的高級語言也會要求滿足圖靈完備,即支持分支、循環的語句。各類計算機程式語言的通用語法採用的是巴斯克範式(BNF範式),BNF範式等價喬姆斯基的第2型文法,即上下文無關文法,前面說過,這型語法對應的自動機就是圖靈機。
再來看編譯器的工作。編譯器所做的是分析程式語言編寫的程序,包括詞法、語法的分析,語義的分析(這是常見的說法,是否正確先忽略),其中所用的方法很多與自然語言分析中所用的方法類似。比如將語句分析為語法樹,分析基於給定的文法:G=(N,∑,P,S),從結果來看:語法樹的每一葉子節點對應了終結符集中的一個,每一中間節點對應了非終結符集中的一個,中間節點到中間節點或葉子節點會對應一個產生式規則。編譯器完成分析後,經過優化後生成目標代碼。在這些領域的設計工作,喬姆斯基的形式文法是基礎的理論與工具,並有著良好的應用效果,相比較,它們在自然語言的應用沒有太多的進展。
(作者(LQS)註:連續地閱讀會發現,系列的文章不是對各個問題的解釋,而是新的理解視角)
·