關於函數式語言的隻言片語

1. 函數式語言可以合理的看作是泛函分析思想的一種體現,從歷史發展的時間上看大概也是具有這種可能性的。在Backus的論文中對函數式語言的一種樂觀的情緒甚至擴大到functional algebra can be used to tranform programs and to solve equations whose "unknowns" are programms in much the same way one transform equations in high school algebra。這種信心只能來源於泛函分析和方程論,來自於數學分析學的發展。將函數的函數作爲分析對象就構成泛函分析。泛函分析的最核心的思想當然不等價於它所研究的那些無窮維空間,不等價於種種正交基的構造。它的思想核心在於函數的函數具有獨立的分析價值,具有脫離數量空間的具體的結構。這也是函數式語言試圖推銷的一種理念。


2. 最近這些年來一種稱爲"範疇"(Category)的東西在計算機理論研究中頻頻出現。範疇論是從同調代數發展而來的一種較新的代數語言,但它顯然也不是可以解決任何問題的靈丹妙藥。多一種表達方式當然在某種程度上可以增進我們的理解。但是範疇本身只是研究一種基礎結構,它本身並沒有承載所有的物理事實,基於它不可能對所有的規律一網打盡。不是明白了範疇,就懂了程序。範疇論是一種基礎性的語言,有些人致力於基於範疇論來構建數學的其他分支,取代集合論的地位。將計算的本質重新歸結於範疇論是無意義的,它不過是對事實的另一種陳述方式。說“函數式語言是基於範疇”是無意義的,因爲這和說“所有現代數學都基於集合論”一樣。無法發現新的相互作用關係,所有的概念都只是同義反復。不是一拿起數學,就找到了組織。

3. 我對函數式語言並沒有什麼反對意見。它是非常重要也非常優美的一種技術思想。但是現在一些函數式語言的狂熱支持者似乎對函數世界充滿了烏托邦式的幻想,一種大一統的世界觀讓人迷醉,但是它卻解決不了現實的問題。所以我說無法認同函數式編程的世界觀。作爲一種具體的技術工具,問題不在於函數式語言是否體現了計算的本質,而在於它是否向我們提供了稱手的兵器。現在我要計算兩個小球相互碰撞的問題,我可以操起廣義相對論,量子力學啥的開始大幹一場,也可以用個牛頓力學小試牛刀,甚至可以只用反射關係擺個等式。但是在絕大多數情況下我們都會說這裏面的物理是彈性反射而不是相對論。在理論分析中我們經常使用平面波假設,但只要實際關心的對象不在波包的邊緣,沒有人會認爲平面波不是真實的物理機制。理論物理不是理想物理。在具體的參數設定下,我們只會使用特定的物理學。

對世界的認識並不是非此即彼的。並不是說函數式語言好它就永遠都好,要把所有對立面都滅掉。也不是說函數式不好,命令式就必然的好,就必然的能夠解決問題。函數式語言的世界觀過分單純而排他,這是我反對的,我同樣無法認同面向對象的本體論論調。就像CISC和RISC架構之爭一樣,最終我們在現實的物理約束下,運行的最好的芯片是兩者思想的結合。這是我們面對物理世界的基本態度。

4. 函數式語言中時間是個有趣的概念。命令式語言中因爲賦值語句的存在,使得我們可以觀測到狀態的變化,因此必然要定義時間。而函數式語言是無狀態的,可以是無時間概念(對Lazy Caculation的依賴是否體現了深層次上對時間概念的需求?)。有些人認爲函數可以看作是相空間中的遷移函數,是與相對論協調的,因而反映了時間的本質等等。相對論主要是解決了物理規律的協變性的問題,在此過程中它使人們認識到了時空之間奇異的對稱性。但是廣義相對論的表述中時間也是可逆的。真正定義了時間之箭的是熱力學第二定律。根據Landauer's principle: 擦除(erase)1比特信息,耗散到環境中的能量至少是k*T*ln2, 或者說熵增至少是k*ln2. 這意味着只要我們對眼前的黑板不停的寫了擦,擦了寫,就必然無法回到過去。物理世界是複雜的。

5. 如果將狀態看作是可以附着在某個對象上的標記,顯然狀態的存在性便於我們識認概念的唯一性。對象還是那個對象,只是狀態標記發生了變化。而如果系統中沒有狀態,則必然產生了一個新的概念。這在很多情況下是不必要的負擔。狀態的存在使得系統在局部結構上允許出現非常複雜的變化,函數式編程的擁躉們對此多有詬病。但是從另一個方面上說,狀態使得我們可以基於局部信息處理很多問題而不需要把它擴大化爲一個全局匹配問題。

6. 函數構成函數似乎是很完備統一的世界。 但是在物理世界中發生的一切卻複雜的多。雖然世界可以還原爲原子,但是原子構成分子,分子構成宏觀物質時,系統的基本性狀發生了本質性的變化,並不再是統一的形式。每一個層面上都會產生獨立的結構規律。

7. 函數式語言和命令式語言的計算能力相同(可以相差一個任意長度的多項式時間),但是在具體的情形下它們的描述能力是不同的。我所關心的不是語言層面的問題,因爲語言本身的能力並不足以解決現實開發中的所有問題。即現實開發中所需要處理的結構問題並不是在語言層面得到充分解決的,這是我們需要做工作的地方。

關於現實中的結構問題,我無意去定義什麼萬能的描述能力。你可以用微分幾何,積分幾何,廣義變分等等手段去證明圓盤是某種意義下的周長最短的東西,但是這一切對你發明輪子並無本質上的助益。不過可以說說現實中的結構。這裏不是要證明某種語言中無法描述這些結構,而是說結構是客觀存在的,它並不是要在基礎語言層面得到充分解決的。實際上現在的通用語言也是無法有效承載Domain Specific Structure的。

A. ErLang大概是目前世界上應用最爲深入的函數式語言了。它確實發揮了函數式語言無顯式狀態變量的優勢。但是它對程序構建本質上的幫助更多的來源於無共享的超輕量級進程模型,相當於定製了一般操作系統所提供的基本服務。微軟的一個實驗性操作系統項目Singularity, 其中也定義了只通過消息傳遞發生數據關聯的超輕量級進程模型,它使用C#的一個擴展語言,額外增加的功能是消息管道上定義的規格狀態機,對消息交互的時空模式進行額外的規約。這裏對我們真正有價值的是隔離的單元結構。

B. AOP是程序結構空間中的定位和組裝技術。在Witrix中我們規範化了切點處的狀態空間,並對AOP進行了偏置處理.這種結構調整大大提高了AOP的可用性,使得它成爲Witrix中的核心技術手段之一。

C. 面向對象的繼承關係從結構觀點上看是兩個一維集合之間的覆蓋關係。在Witrix中擴展了extends所對應的結構操作,創造了新的結構融合手段。
發佈了1 篇原創文章 · 獲贊 2 · 訪問量 6071
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章