日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

程序语言的自我意识与仿他意识

發(fā)布時(shí)間:2023/12/20 编程问答 228 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序语言的自我意识与仿他意识 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

注:本篇博文為重發(fā)稿件,“CSE腳本世界”曾被清空過(guò),現(xiàn)已找回原文。


這本寫(xiě)于兩年前(注:指2006年),網(wǎng)上早就盛傳開(kāi)來(lái),當(dāng)然,大部分轉(zhuǎn)載都把我的大號(hào)隱掉了,標(biāo)為“來(lái)源:互聯(lián)網(wǎng),作者:佚名”。這里重發(fā)一下,一是因?yàn)楫?dāng)時(shí)寫(xiě)這篇文章確實(shí)花了些時(shí)間,還修訂過(guò)幾次,二是為了正本清源,本文乃Wayne chan所作,有人想轉(zhuǎn)載請(qǐng)標(biāo)明出處。

一年前有人將本文推薦給某大學(xué)的學(xué)術(shù)期刊,有編輯找到我,問(wèn)我想不想在他那里發(fā)表,我尋思,愿發(fā)就發(fā)吧,本人不圖稿費(fèi),也樂(lè)于為人捧場(chǎng)。然后這個(gè)扯著嘶啞口音的編輯給我指出一些文字上要改進(jìn)的地方,我一一記下來(lái)了,末了,老先生告訴我,如果想發(fā)表,請(qǐng)交xx元費(fèi)用。我的熱心勁一下子消失了,禮貌性回絕了他的要求,這世道怎么老跟錢(qián)掛鉤,不要稿費(fèi)也就罷了,怎么還拉贊助呢?他們期刊的質(zhì)量想必好不到哪兒去。


程序語(yǔ)言的自我意識(shí)與仿他意識(shí)

2006-4-8, by wayne chan

?

從浮點(diǎn)數(shù)說(shuō)起

昨天有一位網(wǎng)友問(wèn)我一個(gè)問(wèn)題,為什么表達(dá)式“1.9 + 2.3 == 4.2”在Python中計(jì)算結(jié)果是FALSE?我回答說(shuō),計(jì)算機(jī)模擬浮點(diǎn)數(shù)時(shí)會(huì)失真,網(wǎng)友說(shuō)這個(gè)他明白,但為什么“1.9 == 1.9”結(jié)果卻是TRUE,機(jī)器看1.9也同樣失真呀?實(shí)際上,兩個(gè)表達(dá)式是有差別的,前者在比較之前運(yùn)算了,而后者沒(méi)有。

這是一個(gè)很有趣的問(wèn)題,如果我們把電腦看成有感知的生物,上述問(wèn)題反映了人腦與電腦是按不同方式認(rèn)識(shí)事物的。首先,電腦總是以2進(jìn)制表達(dá)數(shù)值的,而人腦習(xí)慣使用10進(jìn)制,比方被人腦標(biāo)識(shí)為0.125的數(shù)據(jù),到電腦中就被看作0.001,即“0/2 + 0/4 + 1/8”。這兩種方式都能唯一表達(dá)浮點(diǎn)值,本例中,兩個(gè)浮點(diǎn)值能在10進(jìn)制與2進(jìn)制之間順利轉(zhuǎn)換,但不幸的是,大部分10進(jìn)制浮點(diǎn)數(shù)無(wú)法準(zhǔn)確的轉(zhuǎn)化成2進(jìn)制,比如上面的1.9,在Python程序中,它顯示為1.8999999999999999。當(dāng)然,這個(gè)數(shù)值還不是電腦自己認(rèn)為的值,它經(jīng)過(guò)兩次轉(zhuǎn)換,第一次是我輸入1.9后,電腦把它轉(zhuǎn)換成它認(rèn)識(shí)的2進(jìn)制格式,第二次是電腦要告訴我它接收到的值是多少,又把2進(jìn)制數(shù)據(jù)轉(zhuǎn)化成10進(jìn)制打印出來(lái)。

其次,電腦總嘗試以最精確的形式表達(dá)一個(gè)數(shù)據(jù),而人腦往往以簡(jiǎn)單形式表達(dá)復(fù)雜數(shù)據(jù)。比方,老板告訴你,“好好干活,這事成了分你三分之一利潤(rùn)”,如果老板長(zhǎng)一個(gè)CPU腦袋,又很有偏執(zhí)狂精神,他可能告訴你,“好好干活,這事成了分你0.3333333333333333...”,幸好本人還不太偏執(zhí),否則,我一輩子不用干別的,把這句話(huà)轉(zhuǎn)述完就安息吧。

在Python中計(jì)算“1.0 / 3”得到結(jié)果值是0.33333333333333331,這是32位電腦對(duì)現(xiàn)實(shí)認(rèn)知的最精確形式,而我們拿“1/3”來(lái)表達(dá),為什么既省事,又精確?這里“1/3”不只是數(shù)值,還隱含了一種計(jì)算:先3等分再取走1份。之所以精確,因?yàn)樗亲悦枋龅?#xff0c;我們還原了它的本來(lái)面目,就像宋玉在《好色賦》中形容東家美女,“增之一分則太長(zhǎng),減之一分則太短”,如果提高浮點(diǎn)精度,不論32位、64位,還是128位CPU,存貯1/3最終都要截除尾數(shù),都無(wú)可避免的要失真。

我們先確立兩個(gè)概念,其一,某種形式化的計(jì)算過(guò)程,等價(jià)于靜態(tài)數(shù)據(jù);其二,自我描述的數(shù)據(jù)可以不失真。

表達(dá)式是不是數(shù)據(jù)?

1/3是自描述的數(shù)據(jù),同時(shí)它還是一個(gè)可計(jì)算的表達(dá)式,我們推而廣之,是不是所有表達(dá)式都是數(shù)據(jù)?這是一個(gè)見(jiàn)仁見(jiàn)智的問(wèn)題,應(yīng)該沒(méi)有標(biāo)準(zhǔn)答案。

應(yīng)用程序本來(lái)就是對(duì)現(xiàn)實(shí)世界一種模仿,編程語(yǔ)言只是實(shí)施模仿的輔助手段,要不要把表達(dá)式看成數(shù)據(jù),完全在乎你——編程主體,以及當(dāng)前依賴(lài)的環(huán)境——開(kāi)發(fā)工具,需要采用哪種方式會(huì)更好達(dá)成目標(biāo)。這句話(huà)有兩層含義,首先,編程環(huán)境可以影響一個(gè)表達(dá)式該不該成為數(shù)據(jù),比如,在C語(yǔ)言中,表達(dá)式是表達(dá)式,它最終編譯成運(yùn)行代碼,數(shù)據(jù)是數(shù)據(jù),編程中可直接讀寫(xiě)。而在LISP語(yǔ)言中,表達(dá)式也是數(shù)據(jù),既用于運(yùn)算,也支持直接讀寫(xiě)。此外第二層含義,即使開(kāi)發(fā)語(yǔ)言很大程度上決定表達(dá)式該不該成為數(shù)據(jù),卻不絕對(duì),還與應(yīng)用相關(guān),比如某些防跟蹤軟件,即使用C語(yǔ)言開(kāi)發(fā),也局部的將運(yùn)行代碼看成數(shù)據(jù),運(yùn)行中動(dòng)態(tài)修改,讓它在反編譯工具變成花指令。

表達(dá)式是不是數(shù)據(jù),是函數(shù)式編程(Functional Programing,FP)區(qū)別于命令式編程(Imperative Programming)的重要差異,也是根本性差異。按嚴(yán)格定義,函數(shù)式編程把程序的輸出定義為其輸入的一個(gè)數(shù)學(xué)函數(shù),只有把函數(shù)調(diào)用也看成數(shù)據(jù),中參數(shù)中層層串接,最后才組裝出完整的程序。比如:if..else句式,使用函數(shù)式語(yǔ)言表達(dá)如下:

else(if(expr,TRUE_branch),FALSE_branch);

外層調(diào)用else函數(shù)時(shí),先計(jì)算第一個(gè)參數(shù)(即if函數(shù)調(diào)用),如果if條件成立,執(zhí)行TRUE_branch語(yǔ)句并返回TRUE,否則直接返回FALSE,接著else函數(shù)分析if調(diào)用的返回值,決定FALSE_branch語(yǔ)句是否要執(zhí)行。這個(gè)例子我們看到,把函數(shù)用作參數(shù),可以連接多個(gè)運(yùn)算。

按嚴(yán)格FP定義,函數(shù)式編程沒(méi)有內(nèi)部狀態(tài)的概念,而命令式編程要頻繁使用賦值語(yǔ)句,用變量保存內(nèi)部運(yùn)行狀態(tài),比方if..else在命令式語(yǔ)言(如C語(yǔ)言)中實(shí)現(xiàn)時(shí),兩條語(yǔ)句看似無(wú)關(guān),但實(shí)際是按固定格式框定了的,前后必定相連,計(jì)算中系統(tǒng)還隱式的使用臨時(shí)變量記錄if條件值。

我們常見(jiàn)的語(yǔ)言,包括C、C++、Pascal、Java等都是函數(shù)式語(yǔ)言,函數(shù)式語(yǔ)言主要有LISP、Haskell、Scheme、ML等,除了這兩者,還有一類(lèi)邏輯式編程(Logic Programming,LP)文獻(xiàn)中通常也將它看成獨(dú)立分支。因?yàn)?#xff0c;大部分函數(shù)式語(yǔ)言都很容易構(gòu)造出邏輯式程序,LP與FP實(shí)際是比較近似的。

所以,大致而言,命令式與函數(shù)式代表當(dāng)前編程語(yǔ)言的兩大流派,本文嘗試從根源上探究?jī)烧卟町惖脑?#xff0c;借用摩爾根(美國(guó)生物學(xué)家,1866—1945)的話(huà),基因決定性狀,我們嘗試從基因分析入手,分析兩者內(nèi)在機(jī)制的差異性,理出脈絡(luò)后,再將他們的外在差異貫穿起來(lái)講述。

高階函數(shù)與惰性求值

高階函數(shù)(High-Order function)與惰性求值(Lazy evaluation)是函數(shù)式編程的重要特征,這兩者都直接起源于運(yùn)算式的形式化描述,也直接促使FP具有廣泛的多態(tài)性。

所謂高階函數(shù)是指以函數(shù)作為參數(shù)或返回值是函數(shù)的函數(shù),比如Python中的apply函數(shù):

apply(pow,[1.9,2])
8

pow是Python一個(gè)內(nèi)嵌函數(shù),把它當(dāng)作一個(gè)參數(shù)傳給apply,apply函數(shù)運(yùn)行中,先把pow及兩個(gè)參數(shù)組織成可計(jì)算對(duì)象(即Python中CodeType類(lèi)型的數(shù)據(jù)),然后完成pow(1.9,2)求平方數(shù)運(yùn)算。

下面,我們?cè)倏纯炊栊郧笾凳窃趺椿厥?#xff0c;比如我們定義一個(gè)函數(shù)handover,它的功能是把一個(gè)表達(dá)式從一臺(tái)機(jī)器傳遞到另一臺(tái)機(jī)器再計(jì)算,如:

handover(pow,[1.9,2],’Machine_B’)

惰性求值可以讓我們?cè)谛枰臅r(shí)候才做計(jì)算,特定場(chǎng)合下惰性求值能產(chǎn)生奇異功能。比如,本例類(lèi)似于前面提到1/3,我們知道,在異構(gòu)系統(tǒng)中傳遞數(shù)值會(huì)失真,如果我們把“1.9 ** 2”這種自描述的數(shù)據(jù)傳遞給更高精度的CPU,比起算出浮點(diǎn)數(shù)再傳遞,結(jié)果肯定更加精確。再如,某些樹(shù)狀結(jié)構(gòu)下實(shí)現(xiàn)快速搜索,遍歷樹(shù)節(jié)點(diǎn)時(shí)我們附帶算法(當(dāng)作數(shù)據(jù)被傳遞),在特定節(jié)點(diǎn)或特定情況下,才將它看成表達(dá)式進(jìn)行計(jì)算。
讓程序操縱它自身代碼,將形成比面向?qū)ο笳Z(yǔ)言更為廣泛的多態(tài)性,不只程序的伸縮性增強(qiáng)了,也讓軟件具備某種自我感知的能力。

比如,1971年鮑布.托馬斯編寫(xiě)了一個(gè)叫“爬行者”的程序,這個(gè)程序能自我復(fù)制,能從網(wǎng)絡(luò)一個(gè)節(jié)點(diǎn)爬到另一個(gè)節(jié)點(diǎn),還出乎意料的在每一臺(tái)機(jī)器的屏幕寫(xiě)上“I’m creeper! Catch me if you can!”。沒(méi)過(guò)多久,整個(gè)局域網(wǎng)就布滿(mǎn)了爬行者,它們消耗很多資源。為了清理這些淘氣包,另一個(gè)程序員設(shè)計(jì)出一個(gè)叫“收割者”的程序,它可以搜尋并刪除爬行者,當(dāng)系統(tǒng)中再也找不到爬行者時(shí),收割者就執(zhí)行程序中最后一項(xiàng)指令:毀滅自己,然后從電腦中消失。

這種爬行者與收割者實(shí)際上是病毒軟件與反病毒軟件的雛形,把自身代碼也當(dāng)成數(shù)據(jù)來(lái)處理,就輕松實(shí)現(xiàn)自我繁殖。當(dāng)然,自我繁殖還只是一種簡(jiǎn)單的復(fù)制拷貝,后面章節(jié)我們將進(jìn)一步討論程序語(yǔ)言的更高形態(tài)——自我演進(jìn)。


二元世界

下面再看另一個(gè)函數(shù)式語(yǔ)言特征:lambda演算。形式上我們可以把lambda看作動(dòng)態(tài)定義的匿名函數(shù),比如在Python中:

>>> apply(lambda x: x * x, [3])
9
>>> iValue = 4
4
>>> apply(lambda x: x * iValue, [3])
12

lambda運(yùn)算深刻的表現(xiàn)出FP獨(dú)有特征,實(shí)際上,lambda演算先于函數(shù)式語(yǔ)言就存在了,1930年Alonzo Church和Stephen Kleene為推論構(gòu)造性證明與非構(gòu)造性證明,建立起lambda數(shù)學(xué)基礎(chǔ),后來(lái)lambda引入LISP等語(yǔ)言,成為函數(shù)式編程的基礎(chǔ)。

lambda演算克服了命令式語(yǔ)言的非構(gòu)造性缺陷,也即,運(yùn)算過(guò)程沒(méi)有告訴我們,如何獲得“針對(duì)任一輸入得到確定輸出”的計(jì)算方法。所謂構(gòu)造性證明是指能具體的給出某對(duì)象,或某對(duì)象的計(jì)算方法,當(dāng)能證實(shí)“存在一個(gè)X滿(mǎn)足性質(zhì)A”的證明時(shí),我們稱(chēng)它是構(gòu)造性的,反之,非構(gòu)造性證明主要通過(guò)反證法實(shí)現(xiàn)。lambda演算中所有東西都是函數(shù),例如自然數(shù)就可以表達(dá)成一個(gè)可分辨的零函數(shù)(通常用恒等函數(shù)表示),和一個(gè)后繼函數(shù)(用于得到下一個(gè)自然數(shù)),其構(gòu)造性特征成為數(shù)理推論的基礎(chǔ)。

如康德所說(shuō),“數(shù)學(xué)知識(shí)是從概念的構(gòu)造得出來(lái)的理性知識(shí)。構(gòu)造一個(gè)概念,意即先天的提供出來(lái)與概念相對(duì)應(yīng)的直觀”,后來(lái),19世紀(jì)德國(guó)的克羅內(nèi)克又進(jìn)一步指出:“上帝創(chuàng)造了整數(shù),其余都是人做的工作”。主張自然數(shù)與數(shù)學(xué)歸納法,是數(shù)學(xué)最根本的和直觀上最可信的出發(fā)點(diǎn),其它一切數(shù)學(xué)對(duì)象都必須能在有限步驟內(nèi),從自然數(shù)中構(gòu)造出來(lái),否則就不能作為數(shù)學(xué)對(duì)象。

lambda演算完美的結(jié)合了作為表達(dá)式的動(dòng)態(tài)運(yùn)算特征,以及作為數(shù)據(jù)的靜態(tài)存在特征,其描述形式(指匿名申明與即時(shí)定義)非常適合推導(dǎo)事物的本原,下面我們換一個(gè)角度詮釋lambda的存在意義。

按照我們的生活經(jīng)驗(yàn),認(rèn)識(shí)一個(gè)物體首先要從靜態(tài)角度觀察,高速運(yùn)動(dòng)中的物體是很難識(shí)別的。編程語(yǔ)言中的數(shù)值、變量,以及已定義的函數(shù),都是這一類(lèi)靜態(tài)物體。另外,靜態(tài)物體若不與其它物體交互作用,就不能展現(xiàn)其功能,它的存在僅僅是概念,編程語(yǔ)言中的表達(dá)式,或者說(shuō)函數(shù)調(diào)用,實(shí)際就是這種交互作用的形式化描述。lambda將兩者合二為一,如上面Python例子,“l(fā)ambda x: x * iValue” 定義是上下文相關(guān)的(否則會(huì)找不到iValue), 在參數(shù)傳遞期間,lambda函數(shù)是靜態(tài)存在,以數(shù)據(jù)形成傳遞,而同時(shí)它又是匿名的,該函數(shù)并不對(duì)他人產(chǎn)生影響。當(dāng)這種沒(méi)有副作用的演算方法,用于獲得“針對(duì)任一輸入得到確定輸出”的計(jì)算方法時(shí),我們說(shuō)它具備自我描述能力。

自描述在眾多FP語(yǔ)言中很容易找到例證,比如有人曾用LISP語(yǔ)言自身,開(kāi)發(fā)出LISP解釋器,下面我們用Python腳本再舉一個(gè)淺顯例子:

def PrintEval(s,Global,Local):if s == 'exit': return 1else: try: print eval(s,Global,Local)except: from traceback import print_exc; print_exc()def test():iValue = 99dbLoop = lambda d1,d2:PrintEval(raw_input('DB>'),d1,d2) or dbLoop (d1,d2)dbLoop(globals(),locals())

本例定義一個(gè)標(biāo)識(shí)為dbLoop的lambda函數(shù),lambda函數(shù)中使用or連接它自身,由此構(gòu)造出循環(huán)邏輯。調(diào)用dbLoop后系統(tǒng)進(jìn)入交互調(diào)試狀態(tài),循環(huán)執(zhí)行用戶(hù)鍵入的命令直至輸入exit退出。這個(gè)例子盡管簡(jiǎn)單,我們顯然做到交互執(zhí)行器自我描述了。

本文中自我描述是指對(duì)于所有表達(dá)式E,在新構(gòu)造的解釋器I下計(jì)算E得到的結(jié)果,與直接計(jì)算E得到的結(jié)果值相同,這不是說(shuō)拿構(gòu)造物替代原有功能。

受限于Python的語(yǔ)言能力,上述自描述代碼沒(méi)有用純粹的FP方式實(shí)現(xiàn),其中PrintEval函數(shù)定義及dbLoop變量是命令式的。命令式風(fēng)格讓自描述過(guò)程無(wú)法自包含,會(huì)遺留一些影響(如上例PrintEval與dbLoop定義),比如交互調(diào)試中,用戶(hù)可能修改dbLoop的屬性,而dbLoop要提供正常的調(diào)試功能,須保證它在使用過(guò)程不受影響。

按照自描述的定義,所有表達(dá)式E在自描述前后執(zhí)行是等同的,所以,從嚴(yán)格意義上講,上述代碼還沒(méi)實(shí)現(xiàn)真正的自描述,產(chǎn)生該問(wèn)題的根本原因是引入了命令式風(fēng)格。我們把代碼改造成如下形式,可以消除dbLoop變量的影響。

def LoopEval(Global,Local):while 1:s = raw_input('DB>')if s == 'exit': returntry: print eval(s,Global,Local)except: from traceback import print_exc; print_exc()yield sdef test():iValue = 99apply( lambda d1,d2: [item for item in LoopEval(d1,d2)],[globals(),locals()] )

從理論上說(shuō),某系統(tǒng)如果是自描述的,它需要支持完整的lambda演算,以及,該系統(tǒng)中至少能找出一個(gè)不動(dòng)點(diǎn)。大家不妨進(jìn)一步練習(xí),看看上面例子中,LoopEval函數(shù)定義是否也可消除(提示一下,請(qǐng)大家分析print與yield兩個(gè)命令式語(yǔ)句,看看能不能找到可替換函數(shù))。

前面講到構(gòu)造性證明與非構(gòu)造證明,如果覺(jué)得不好理解,建議大家結(jié)合上面例子再細(xì)琢磨。命令式編程與函數(shù)式編程反映兩種截然不同的世界觀,命令式從已然經(jīng)驗(yàn)推導(dǎo)行為規(guī)則,而函數(shù)式從非確定經(jīng)驗(yàn)推導(dǎo)與源頭可能等價(jià)的規(guī)則;前者反映了一種靜態(tài)的、先驗(yàn)性的認(rèn)知,而后者是動(dòng)態(tài)的、后天學(xué)習(xí)的、尚在成長(zhǎng)中的認(rèn)知。

命令式語(yǔ)言好比是無(wú)所不知、無(wú)所不能的上帝,憑他自己的能力與意愿,制造出精美絕倫的亞當(dāng)與夏娃。而函數(shù)式語(yǔ)言則是人類(lèi)自身,任何個(gè)體都不是全能的,但通過(guò)自我演進(jìn)直至最終趨于完美。

還有一個(gè)比較恰當(dāng)?shù)碾[喻,拿人工生命科學(xué)中常用的兩個(gè)術(shù)語(yǔ)概括:命令式風(fēng)格是生命如我所識(shí)(life-as-we-know-it),而函數(shù)式風(fēng)格是生命如其所能(lift-as-it-could-be),前者拿一種經(jīng)驗(yàn)套用另一種經(jīng)驗(yàn),是仿他意識(shí),而后者表現(xiàn)出一種自我意識(shí)。再通俗一點(diǎn)來(lái)講,針對(duì)同一功能實(shí)現(xiàn),命令式語(yǔ)言會(huì)說(shuō):“這事我看如何如何...”,而函數(shù)式語(yǔ)言會(huì)說(shuō):“這事本來(lái)如何如何...”。


不能兩次踏進(jìn)同一河流,還是一次也不能

早期算法研究表明,基于自動(dòng)機(jī)、符號(hào)操作、遞歸的函數(shù)定義和組合學(xué),都具等備等價(jià)的描述能力,盡管命令式與函數(shù)式的語(yǔ)言風(fēng)格存在很大差異,但他們的計(jì)算能力是同等的,也即符合著名的丘奇論題:任何符合直觀理解的計(jì)算模型都具有相同的計(jì)算能力。隨著時(shí)間推移,人們已經(jīng)形式化的證明了各個(gè)算法之間具有等價(jià)性,其中包括圖靈自動(dòng)機(jī)與lambda演算。

圖靈機(jī)是一種由一個(gè)無(wú)限長(zhǎng)紙帶、一個(gè)讀寫(xiě)頭組成的機(jī)器,它具備訪問(wèn)紙帶上任一單元的能力,由內(nèi)部程序驅(qū)動(dòng)不斷的修改存儲(chǔ)帶上各單元的值,最終完成各項(xiàng)運(yùn)算。圖靈機(jī)是一種非常簡(jiǎn)潔的計(jì)算模型,具備完整的計(jì)算能力,我們只要改變它的內(nèi)部程序,完全可以勝任現(xiàn)代計(jì)算機(jī)能做的工作。

大家知道,計(jì)算程序如果有Bug可能會(huì)造成死機(jī),圖靈機(jī)具有等價(jià)能力,它如果運(yùn)行特定控制邏輯,會(huì)不會(huì)也出現(xiàn)類(lèi)似情況呢?下面我們分析Alan Turing提出的圖靈停機(jī)問(wèn)題:

存不存在一個(gè)圖靈程序,比如說(shuō)P能夠判斷出任一程序X是否會(huì)在輸入Y的情況下陷入死循環(huán)?若有死循環(huán)P將返回TRUE,否則返回FALSE。
我們嘗試一勞永逸的構(gòu)造出這種檢查死循環(huán)的程序P,該程序同樣可作用于自身,即,將P自身作為輸入,運(yùn)行P最后上報(bào)檢查結(jié)果。如果假定P在某種輸入情況下不存在死循環(huán),那它最終上報(bào)結(jié)果是FALSE,但此時(shí)如果P存在死循環(huán),那它應(yīng)該上報(bào)TRUE,現(xiàn)在問(wèn)題出來(lái)了,此條件下P程序有死循環(huán),那它能否上報(bào)結(jié)果呢?

圖靈停機(jī)是個(gè)悖論,它嘗試在P程序尚不存在,或定義尚未完成時(shí),就要求自身能被分析,這好比一條巨兇猛的蟒蛇,它有能力吞吃世界上任一條蛇,現(xiàn)在我們發(fā)出指令讓它吞吃自己,于是蛇頭咬蛇尾,有一半下肚了,另一半還能不能繼續(xù)吞咽下去?!

圖靈停機(jī)反映出一個(gè)深刻問(wèn)題:自我演進(jìn)的系統(tǒng)能否始終處于自我否定狀態(tài)?GCC用來(lái)編譯C代碼,而它自身也是用C語(yǔ)言開(kāi)發(fā)的,我們拿GCC編譯自身源碼,一次編譯造就GCC一次自我演進(jìn),把圖靈停機(jī)問(wèn)題套用到GCC,就是GCC停機(jī)問(wèn)題:

存不存在一個(gè)現(xiàn)成GCC版本,它總能順利編譯因自身語(yǔ)法調(diào)整而修改的源碼?

當(dāng)然,答案是否定的,我們先討論一個(gè)更為廣泛的命題——不動(dòng)點(diǎn)定理,之后回頭分析GCC停機(jī)的原因。

一維布勞威爾不動(dòng)點(diǎn)定理:設(shè)f(x)是定義在[0,1]上的連續(xù)函數(shù),且滿(mǎn)足0≤f(x)≤1,則必存在x0∈[0,1],使f(x0) = x0。

由于f(x)是連續(xù)函數(shù),當(dāng)x在0到1的區(qū)間連續(xù)變化時(shí),f(x)曲線必然跨越下圖A區(qū)與B區(qū),或者與分隔線(y = x)的端點(diǎn)重合,交叉點(diǎn)(或重合的端點(diǎn))就是不動(dòng)點(diǎn)x0,重合點(diǎn)既滿(mǎn)足y = f(x),也滿(mǎn)足y = x,即f(x0) = x0。


上面f(x)是指定區(qū)間內(nèi)的連續(xù)函數(shù),如果應(yīng)用到FP編程,函數(shù)可以成為f(x)的傳入?yún)?shù),也可以是它的返回值,在自我描述的系統(tǒng)中,Y是這樣的運(yùn)算符,它作用于任何一個(gè)函數(shù) F,就會(huì)返回一個(gè)函數(shù)X,再把F作用于這個(gè)函數(shù)X,還是得到X。即“(Y F) = (F (Y F))”,由于Y作用于F返回的X,在其操作前與操作后維持穩(wěn)定,我們稱(chēng)它為F的不動(dòng)點(diǎn)。

X代表了F中的某種穩(wěn)定的本質(zhì)性的東西,而Y操作的目的是要發(fā)現(xiàn)這種本質(zhì)特征。從上圖我們還可以看出,一個(gè)系統(tǒng)的不動(dòng)點(diǎn)可能有多個(gè),前面提到的編程語(yǔ)言等價(jià)性,不同計(jì)算模型等價(jià)性,都側(cè)面驗(yàn)證了這一情況。

即使是同一編程語(yǔ)言,完成一次自我演化都可以憑借不同的不動(dòng)點(diǎn),比如,if、else語(yǔ)句可以用帶短路功能的與或邏輯代替,循環(huán)語(yǔ)句能用遞歸調(diào)用構(gòu)造,如前面舉例的Python代碼,用OR連接自身后調(diào)用就構(gòu)造出完整的循環(huán)處理。條件選擇與循環(huán)處理還可以用更低層次的匯編指令去實(shí)現(xiàn),一個(gè)條件跳轉(zhuǎn)指令就夠了。

我們回到GCC停機(jī)問(wèn)題,這個(gè)命題是說(shuō)GCC“總能”編譯自身變化中的代碼,原理上說(shuō)它的變化是指定區(qū)間內(nèi)的連續(xù)函數(shù),如果GCC基礎(chǔ)語(yǔ)法調(diào)整了(比方刪除if、else,改用其它表達(dá)方式),必然可能破壞已有不動(dòng)點(diǎn)。盡管一次演化可選擇不同的不動(dòng)點(diǎn),但這是普遍意義上講的,針對(duì)GCC特例,本命題的前提是:當(dāng)前編譯器與被編譯代碼都還是GCC,并不變成其它語(yǔ)言(如匯編語(yǔ)言),不動(dòng)點(diǎn)不存在了,就無(wú)法支持自我重構(gòu)。什么叫GCC還是GCC?請(qǐng)大家體會(huì)一下,這句話(huà)是不是很有嚼頭。

在一次編程中,我們把無(wú)副作用的lambda演算歸結(jié)為函數(shù)式風(fēng)格,把有靜態(tài)規(guī)格定義的變量或命令語(yǔ)句,歸結(jié)為命令式風(fēng)格。推而廣之,局部演化特征必然反映到整體,自描述系統(tǒng)的一次演進(jìn)過(guò)程中,存在不動(dòng)點(diǎn)可認(rèn)為是命令式風(fēng)格,而規(guī)格平滑演進(jìn)屬函數(shù)式風(fēng)格。

這種動(dòng)靜結(jié)合、交互輪替的規(guī)則,遍布于有機(jī)體各個(gè)角落,及其發(fā)展進(jìn)程的每一時(shí)刻。映證了辯證法觀點(diǎn),運(yùn)動(dòng)是絕對(duì)的,靜止是相對(duì)的,而且是必須的,否則導(dǎo)致不可知論。比如GCC演進(jìn),按照赫拉克利特的說(shuō)法,“人不能兩次踏進(jìn)同一條河流”,GCC演化中仍具有暫態(tài)的穩(wěn)態(tài)性狀,所以,GCC還可以看成GCC,而按赫拉克利特的學(xué)生克拉蒂魯?shù)恼f(shuō)法,人連一次也不能踏進(jìn)同一條河流,程序經(jīng)過(guò)修改就不再是GCC,GCC停機(jī)無(wú)從談起了。

無(wú)論圖靈停機(jī),還是GCC停機(jī),提出問(wèn)題者是以靜態(tài)角度,命令方式提出質(zhì)疑的,如果換成函數(shù)式思維去觀察,這兩個(gè)命題是不是還存在?

假定我們自身就是萬(wàn)能的圖靈機(jī),如果真要檢查自身邏輯處理是否有死循環(huán),現(xiàn)實(shí)一點(diǎn),我們會(huì)再造一臺(tái)圖靈機(jī),讓那一臺(tái)圖靈機(jī)做檢查,因?yàn)楫?dāng)自身還不能運(yùn)轉(zhuǎn)時(shí),不可能檢查自身的。對(duì)于迭代中的GCC,假定我們自身就是GCC程序,哪部分改了就是修改了,如涼水澆背,冷暖自知,并不是我們非得要給個(gè)概念,前一刻叫啥,后一刻又叫啥。

下面我們輕松一下,欣賞一段禪宗公案,《大慧普覺(jué)禪師語(yǔ)錄.卷二一》中記錄:

僧問(wèn)趙州:“狗子還有佛性也無(wú)?”州云:“無(wú)。”看時(shí)不用博量,不用注解,不用要得分曉,不用向開(kāi)口處承當(dāng),不用向舉起處作道理,不用墮在空寂處,不用將心等悟,不用向宗師說(shuō)處領(lǐng)略,不用掉在無(wú)事甲里。但行住坐臥時(shí)時(shí)提撕“狗子還有佛性也無(wú)?”,“無(wú)。”提撕得熟,口議心思不及,方寸里七上八下,如咬生鐵橛,沒(méi)滋味時(shí),切莫退志。

(注:提撕是指佛教徒參究古公案)

注意,這里“無(wú)”并非“有”的對(duì)立面:沒(méi)有,而是踏殺了“有”、“沒(méi)有”、“有且沒(méi)有”、“有或沒(méi)有”、“非有且沒(méi)有”、“非有或沒(méi)有”...,直到言亡慮絕才悟得的道理。


總結(jié)

命令式與函數(shù)式是編程語(yǔ)言的兩大流派,它們擁有各自的優(yōu)勢(shì)與劣勢(shì)??傮w上說(shuō),命令式語(yǔ)言更加符合人們的思維習(xí)慣,人總是習(xí)慣以自我為中心觀察世界的,以靜態(tài)的、有差別的(一個(gè)個(gè)對(duì)象)方式認(rèn)識(shí)周邊事物。而函數(shù)式語(yǔ)言,在某種意義上說(shuō),有點(diǎn)違反人性,它無(wú)時(shí)不刻都以函數(shù)為中心,用括號(hào)串接各個(gè)表達(dá)式(稱(chēng)作劍橋波蘭記法),其風(fēng)格讓大多數(shù)編程人員范暈。所以,單憑這一點(diǎn),命令式語(yǔ)言占據(jù)現(xiàn)實(shí)應(yīng)用的絕對(duì)地位并不奇怪。

事實(shí)上,真正純凈的FP語(yǔ)言并不多,函數(shù)式語(yǔ)言也往往增加命令式特征,象LISP,盡管被公認(rèn)為函數(shù)式編程的鼻祖,但它還不是純正的函數(shù)式編程,在LISP中可以用let指令賦值,其它的,如Scheme、ML等都不是純正FP語(yǔ)言。

函數(shù)式語(yǔ)言除不夠友好,運(yùn)算效率低下外,他的優(yōu)點(diǎn)非常鮮明,動(dòng)態(tài)定義、無(wú)副作用、良好伸縮性、強(qiáng)大的演進(jìn)能力等,都是命令式語(yǔ)言難以企及的。由于命令式與函數(shù)式各有優(yōu)勢(shì),兩者走向融合是近些年來(lái)編程技術(shù)的發(fā)展趨勢(shì),尤其隨著Python、Ruby等動(dòng)態(tài)語(yǔ)言逐步深入人心,FP編程漸漸流行開(kāi)來(lái)。目前像Java、C#等新興語(yǔ)言,已經(jīng)融入了不少FP編程要素,借助反射等機(jī)制,命令式語(yǔ)言也擁有很強(qiáng)的動(dòng)態(tài)編程特性。

?

參考資料:
  • 《Programming Language Pragmatics》,美國(guó),Michael L.Scott著,《程序設(shè)計(jì)語(yǔ)言----實(shí)踐之路》,裘宗燕譯,電子工業(yè)出版社
  • 《皇帝新腦》牛津大學(xué),羅杰.彭羅斯著,湖南科技技術(shù)出版社,許明賢、吳忠超譯
  • 《數(shù)字創(chuàng)世紀(jì):人工生命的新科學(xué)》,李建會(huì)、張江編著,科學(xué)出版社
  • Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I,John McCarthy, Massachusetts Institute of Technology,April 1960,
  • Why Functional Programming Matters,John Hughes paper, dates from 1984
  • Charming Python: Functional programming in Python, David Mertz, 01 Mar 2001

  • 總結(jié)

    以上是生活随笔為你收集整理的程序语言的自我意识与仿他意识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 免费欧美| 国产自在线| 亚洲男人精品 | 老熟女高潮喷水了 | 污污免费视频 | 欧美www | 狠狠躁夜夜躁av无码中文幕 | 日本性猛交 | 毛片在线免费观看网址 | 欧美一区三区三区高中清蜜桃 | 波多野结衣视频一区二区 | h视频在线看| 一级一毛片 | 日本中文字幕视频在线 | 国产精品久久免费视频 | 日韩一二三四五区 | 天天操婷婷 | 丰满女人又爽又紧又丰满 | 国产成人精品无码片区在线 | 真人毛片97级无遮挡精品 | 日本一区不卡视频 | 人妻 日韩 欧美 综合 制服 | 人人做| 久草福利在线观看 | 玖草在线| 91精品国产色综合久久不卡粉嫩 | 成人h片 | 国产精品探花视频 | 粉嫩av网 | 91麻豆精品一区二区三区 | 国产精品久久久久久久久 | 人妻一区二区三区在线 | 免费看黄视频的网站 | 五月天婷婷在线观看 | 99啪啪| 久久99一区 | 久久中文字幕视频 | 成人精品视频在线 | 免费在线观看亚洲 | 日韩特级片 | 污污视频在线观看网站 | 日本黄色网络 | 四虎成人精品永久免费av九九 | 一区二区三区四区视频在线观看 | 日本一区二区不卡在线观看 | 91福利视频在线观看 | 综合色婷婷 | 放荡的少妇2欧美版 | 极品少妇网站 | 欧美大片黄 | 亚洲国产精彩视频 | 日本少妇bbb | 国产肥白大熟妇bbbb视频 | 日韩有码中文字幕在线 | 不卡二区| 黑人大群体交免费视频 | 爱啪啪av | 色呦呦在线观看视频 | 欧美日韩a√ | 亚洲黄色录像 | 亚洲性猛交xxxx乱大交 | 亚洲第一页中文字幕 | 久久资源总站 | 欧美aaa大片 | 国产福利视频一区二区三区 | 日韩精品网| 美女av网址 | 成人看片在线观看 | 在线免费观看黄色小视频 | 欧美性受xxxx黑人xyx | 男女做那个的全过程 | jizz在线播放 | 99视频国产精品 | 在线免费黄 | 国产高清无密码一区二区三区 | 欧美第二页 | 吸咬奶头狂揉60分钟视频 | 高清久久久 | 少妇特黄一区二区 | 中文字幕第一页在线 | 国产精品2 | 三级黄色av| 亚洲av综合色区无码一区 | 国内精品国产三级国产aⅴ久 | 国产男男gay网站 | 西西人体做爰大胆gogo直播 | 欧美一级精品 | 日本无遮羞调教打屁股网站 | 中文字幕一区2区3区 | 国产三级三级在线观看 | 精品国产99久久久久久 | 草女人视频 | 激情五月色综合国产精品 | 爱如潮水3免费观看日本高清 | 噜噜色网 | www.婷婷.com| 亚洲天堂一二三 | 人人射人人爱 | 最新中文字幕在线播放 |