<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 176, comments - 240, trackbacks - 0, articles - 7

    關于函數式語言的只言片語

    Posted on 2007-12-05 22:09 canonical 閱讀(4327) 評論(9)  編輯  收藏 所屬分類: 設計理論
    1. 函數式語言可以合理的看作是泛函分析思想的一種體現,從歷史發(fā)展的時間上看大概也是具有這種可能性的。在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。這種信心只能來源于泛函分析和方程論,來自于數學分析學的發(fā)展。將函數的函數作為分析對象就構成泛函分析。泛函分析的最核心的思想當然不等價于它所研究的那些無窮維空間,不等價于種種正交基的構造。它的思想核心在于函數的函數具有獨立的分析價值,具有脫離數量空間的具體的結構。這也是函數式語言試圖推銷的一種理念。


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

    3. 我對函數式語言并沒有什么反對意見。它是非常重要也非常優(yōu)美的一種技術思想。但是現在一些函數式語言的狂熱支持者似乎對函數世界充滿了烏托邦式的幻想,一種大一統(tǒng)的世界觀讓人迷醉,但是它卻解決不了現實的問題。所以我說無法認同函數式編程的世界觀。作為一種具體的技術工具,問題不在于函數式語言是否體現了計算的本質,而在于它是否向我們提供了稱手的兵器。現在我要計算兩個小球相互碰撞的問題,我可以操起廣義相對論,量子力學啥的開始大干一場,也可以用個牛頓力學小試牛刀,甚至可以只用反射關系擺個等式。但是在絕大多數情況下我們都會說這里面的物理是彈性反射而不是相對論。在理論分析中我們經常使用平面波假設,但只要實際關心的對象不在波包的邊緣,沒有人會認為平面波不是真實的物理機制。理論物理不是理想物理。在具體的參數設定下,我們只會使用特定的物理學。
       對世界的認識并不是非此即彼的。并不是說函數式語言好它就永遠都好,要把所有對立面都滅掉。也不是說函數式不好,命令式就必然的好,就必然的能夠解決問題。函數式語言的世界觀過分單純而排他,這是我反對的,我同樣無法認同面向對象的本體論論調。就像CISC和RISC架構之爭一樣,最終我們在現實的物理約束下,運行的最好的芯片是兩者思想的結合。這是我們面對物理世界的基本態(tài)度。
      
    4. 函數式語言中時間是個有趣的概念。命令式語言中因為賦值語句的存在,使得我們可以觀測到狀態(tài)的變化,因此必然要定義時間。而函數式語言是無狀態(tài)的,可以是無時間概念(對Lazy Caculation的依賴是否體現了深層次上對時間概念的需求?)。有些人認為函數可以看作是相空間中的遷移函數,是與相對論協(xié)調的,因而反映了時間的本質等等。相對論主要是解決了物理規(guī)律的協(xié)變性的問題,在此過程中它使人們認識到了時空之間奇異的對稱性。但是廣義相對論的表述中時間也是可逆的。真正定義了時間之箭的是熱力學第二定律。根據Landauer's principle: 擦除(erase)1比特信息,耗散到環(huán)境中的能量至少是k*T*ln2, 或者說熵增至少是k*ln2. 這意味著只要我們對眼前的黑板不停的寫了擦,擦了寫,就必然無法回到過去。物理世界是復雜的。

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

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

    7. 函數式語言和命令式語言的計算能力相同(可以相差一個任意長度的多項式時間),但是在具體的情形下它們的描述能力是不同的。我所關心的不是語言層面的問題,因為語言本身的能力并不足以解決現實開發(fā)中的所有問題。即現實開發(fā)中所需要處理的結構問題并不是在語言層面得到充分解決的,這是我們需要做工作的地方。
       關于現實中的結構問題,我無意去定義什么萬能的描述能力。你可以用微分幾何,積分幾何,廣義變分等等手段去證明圓盤是某種意義下的周長最短的東西,但是這一切對你發(fā)明輪子并無本質上的助益。不過可以說說現實中的結構。這里不是要證明某種語言中無法描述這些結構,而是說結構是客觀存在的,它并不是要在基礎語言層面得到充分解決的。實際上現在的通用語言也是無法有效承載Domain Specific Structure的。
    A. ErLang大概是目前世界上應用最為深入的函數式語言了。它確實發(fā)揮了函數式語言無顯式狀態(tài)變量的優(yōu)勢。但是它對程序構建本質上的幫助更多的來源于無共享的超輕量級進程模型,相當于定制了一般操作系統(tǒng)所提供的基本服務。微軟的一個實驗性操作系統(tǒng)項目Singularity, 其中也定義了只通過消息傳遞發(fā)生數據關聯的超輕量級進程模型,它使用C#的一個擴展語言,額外增加的功能是消息管道上定義的規(guī)格狀態(tài)機,對消息交互的時空模式進行額外的規(guī)約。這里對我們真正有價值的是隔離的單元結構。
    B. AOP是程序結構空間中的定位和組裝技術。在Witrix中我們規(guī)范化了切點處的狀態(tài)空間,并對AOP進行了偏置處理.這種結構調整大大提高了AOP的可用性,使得它成為Witrix中的核心技術手段之一。
    C. 面向對象的繼承關系從結構觀點上看是兩個一維集合之間的覆蓋關系。在Witrix中擴展了extends所對應的結構操作,創(chuàng)造了新的結構融合手段。

    Feedback

    # re: 關于函數式語言的只言片語  回復  更多評論   

    2007-12-05 22:26 by POPPC
    講的不錯,支持一下

    # re: 關于函數式語言的只言片語  回復  更多評論   

    2007-12-05 22:47 by 翻譯公司
    看不懂,但鼓勵一下。
    http://www.xinhua001.com北京翻譯公司

    # re: 關于函數式語言的只言片語  回復  更多評論   

    2007-12-06 08:39 by bonny
    我來看以下什么牛人能寫這樣的文章

    深刻暫時還不能論定
    廣博倒是有的

    # re: 關于函數式語言的只言片語[未登錄]  回復  更多評論   

    2007-12-06 08:54 by dennis
    其他不敢講,不過函數式語言無時間概念值的商榷,通過延時求值實現的stream本質上也是種時間概念。再說Erlang,在函數式語言里,會自動分析函數并找出適合并行執(zhí)行的候選函數簡單的像自動進行的函數內聯化,也就是說函數式語言天生就是適宜并行的,如果僅僅是輕量級進程結構,這也達不到Erlang的無鎖結構。

    # re: 關于函數式語言的只言片語  回復  更多評論   

    2007-12-06 21:09 by canonical
    1. 語言中的時間觀念這個論題絕對不是我的原創(chuàng)
    2. 我一直強調思維的連續(xù)性。不是說"B這樣搞來搞去還是達不到A的高度", 而是說我們如果把系統(tǒng)的特征逐個分解,到底需要做哪些工作才能逐步增加最有價值的部分,特征聚集產生的增值部分又是如何顯現的。
    3. 一種實現總是包容了太多的思想。思想錯了,實現對了。實現死了,思想活著。

    # re: 關于函數式語言的只言片語  回復  更多評論   

    2009-08-06 17:23 by forrestju
    理想的編程語言 鞠文廣

    以下純粹是個人觀點, 不代表任何組織或社團.

    現在流行的編程語言如Java和C#, 大多是面向對象的, 程序的各部分是通過方法調用連在一起, 其編程范式是命令編程, 即使支持其他范式也包裝得很難理解和使用.

    面向對象實際上只適合實現抽象數據類型, 讓它去完成除此之外的任務確實是勉為其難, 即便能完成也給人不倫不類的感覺, 既不像面向對象編程, 也不像它的前任(過程編程). 這些語言中的對象與物質世界的物質(或對象)很不一致, 它使用方法調用的方式與其他對象進行相互作用, 而這與物質之間的(通過通信或媒介)相互作用是截然不同的, 因此用面向對象無法很確切地模擬現實世界(面向對象思想的初衷), 更不用說準確地為現實世界建立模型.

    這幾年流行的web服務和SOA雖使程序間交互更方便, 但它從本質上說還是使用”面向對象+命令編程+方法調用”的思路, 在編程方法論上并沒有實質的進步.

    用現在流行的語言實現的完成復雜功能的程序邏輯不清晰, 原因在于”命令編程+方法調用”的設計機制. 這使程序很難模塊化, 副作用無所不在, 因此很難正確實現復雜功能.

    現實世界的發(fā)展變化是通過事物間的相互作用實現的, 而這種相互作用用計算機科學的語言來說就是并發(fā)(concurrency). 軟件的本質是什么? 我覺得:軟件總是完成某種功能的,歸根到底是對現實世界的事物間相互作用進行建模. 因此軟件的組成部分間自然就是并發(fā)的關系, 而不是過程調用的關系. 用通信進程來對現實世界的事物間相互作用進行建模是比較合理的. 所以進程應該作為語言的基礎成分, 是軟件的基本組成部分, 而不是只為了提高效率才采用的.

    為了使程序能準確地為現實世界建立模型, 從而正確性更高, 結構更合理, 模塊化程度更高, 因此在幾種編程思想或語言的基礎上(見references), 我提出一種新的編程方法論: 面向進程+函數編程+進程間通信+邏輯編程+約束編程+其他合理的范式(命令編程除外)和一門編程語言ProcessLog (全稱process logic).

    ProcessLog只支持一種并發(fā):通信進程. 它就是計算機科學家在上世紀70年代為了克服現在的Java中仍采用的那種并發(fā)方式的缺點而提出的. 它是經過充分研究得到的一種理想并發(fā)方式, 看了并發(fā)理論(concurrency)和進程代數(Process algebra), 就會明白這種并發(fā)方式可解決實際中的各種并發(fā)問題, 用它足夠了.

    這里的進程是進程代數的進程,不是過程,也不是Java中的線程. 看看jcsp或Hoare的CSP(http://www.usingcsp.com/)就明白了.推薦網址:
    http://www.cs.kent.ac.uk/projects/ofa/jcsp/,
    其中有兩個ppt說得很明白:
    "Process Oriented Design for Java: Concurrency for All",
    "Communicating Processes, Components and Scaleable Systems".

    ProcessLog的語法概要如下:

    1 運算符
    (1) ? 輸入; c ? x 從輸入端口c或通道c上接收輸入值放到變量x中
    (2) ! 輸出; c ! v 把v的值從輸出端口或通道c上輸出
    (3) -> 順序進行的事件的先后關系
    (4) | b : s 分支
    (5) || 進程并行
    (6) // 附屬進程
    (7) and, or, not 邏輯運算符
    (8) 算術運算符和關系運算符 與Java中相同

    2 程序的組成成分
    (1) Unit 程序單元
    (2) Process 進程
    (3) Function 函數
    (4) Predicate 謂詞
    (5) Channel 通道, 有兩個端口: in 輸入端口, out 輸出端口
    (6) OutPort 輸出端口
    (7) InPort 輸入端口

    3 數據結構
    (1) List (函數編程中的List類型, 對List的操作函數與函數編程中相同);
    (2) Tuple 元組, 同Clean.
    (3) Set 集合
    沒有數組

    4 進程的定義
    Process p1 (OutPort pt1, InPort pt2 ){
    pt2?x -> pt1! compute(x) -> p1
    }

    5 進程間相互作用
    (1) 進程并行 process1( c1.out, c2.in)|| process2(c1.in, c2.out)
    (2) 附屬進程 (getE: getElements || getR: getReleasedVersion) // X.(in?method -> getE ! method ? elems -> getR ! em ? rem-> … ->X)

    6 函數
    [Function] compute(double x)=
    | x<=0: x*x+3
    | x>0: compute(x-5)* compute(x-3)
    函數只能以事件的方式在進程中使用或在其他函數中使用, 不能獨立使用.

    7 謂詞
    /* 建圖 */
    Predicate createGraph(t, graph):-
    addNode(t, null, ({},{}), graph1),
    getDS(t, graph1.ns, tlist),
    addList(tlist, t, graph1, graph).
    /* 加節(jié)點 */
    Predicate addNode(t, null, (ns, es), (ns1, es):-
    merge(ns, {t}, ns1).
    Predicate addNode(t, upper, (ns, es), (ns1, es1)):-
    merge(ns, {t}, ns1),
    merge(es, {(upper, t)}, es1).

    8 把謂詞轉換為函數
    create(t)= graph
    where createGraph(t, graph)

    謂詞不能獨立使用也不能在進程中直接使用, 要在進程中使用需要先轉換為函數.

    9 程序單元: 包含進程和數據類型
    Unit PmethodDAO;
    interface
    Tuple Method;
    Process getLastVersion(OutPort pt1 , InPort pt2);

    implementation
    Method=(String id, String name, String version);
    Process getLastVersion(OutPort pt1 , InPort pt2){

    }

    指導原則: 程序是由通過通道通信的進程組成的. 數據處理和算法用函數編程實現, 如果函數編程不適用于要處理的問題, 就使用邏輯編程或約束編程.

    ProcessLog語言限制了編程的隨意性, 要求只能用進程代數+函數編程+邏輯編程的方式編程, 不允許用Java或c#的命令方式編程.

    ProcessLog 現在還沒有在機器上實現. 我用該語言重寫了實際項目中的一些復雜代碼(原是Java代碼), 證實用它寫的程序確實簡單清晰, 有類似數學的簡潔美. "7 謂詞"就是其中一部分代碼.

    我的想法是: 應先在紙面上規(guī)定它的語法與語義, 再通過使用它編寫一些應用程序來發(fā)現它的不足,再進而改進它, 再實踐, 再改進, 直到它基本完善再在機器上實現. 另外, 大家不要把語言分為中國人提出的還是外國人提出的, 科學無國界, 這里不存在狹隘的愛國主義. 我不是那種技術高手, 但我自信我是一個能將理論很好地聯系實踐的研究者.

    希望有識之士和我一起共同發(fā)展這種編程方法論和這門語言.
    juwenguang2000@yahoo.com.cn

    References
    1. CSP http://www.usingcsp.com/
    2. JCSP http://www.cs.kent.ac.uk/projects/ofa/jcsp/
    3. Clean http://clean.cs.ru.nl/
    4. Prolog
    5. Delphi

    注: 轉載時請注明作者.

    # re: 關于函數式語言的只言片語[未登錄]  回復  更多評論   

    2009-11-01 16:06 by X
    bingo!

    函數式本質上是邏輯表達,而命令式是狀態(tài)遷移的表達方式。
    函數式中只有符號,沒有變量,每個符號對應一個概念,而概念當然是沒有狀態(tài)的。

    # re: 關于函數式語言的只言片語  回復  更多評論   

    2009-11-12 09:02 by LoongWalker
    我也曾學習過軟件形式化與自動化的一些相關知識,很佩服貼主的勇氣,但正是基于此種欽佩,我不得不說一說自己的一點觀點,如果有一點點道理,那就希望會有點幫助。
    我認為,任何一種真正有生命力,可以流傳開來,并于是能夠解決大量實際問題的工具一定有幾個共同的特點:簡單、條理、一致性、有秩序、雖然有悖論但其作用可以控制在很小的范圍內。
    貼主的這種將幾種現有理論做雜湊,按照問題情況選用不同工具來處理的做法,我實在不敢茍同。如果能夠將各種工具的內部構造圖(其內部概念結構和關系)各自打開,找到其共同邊界,進而做融合而非雜湊,或許效果更佳。
    一點淺論,荒謬之處,望多多交流,LoongWalker@gmail.com

    # re: 關于函數式語言的只言片語  回復  更多評論   

    2013-11-01 11:12 by newskying
    支持,“少談些主義,多解決問題”
    主站蜘蛛池模板: 成年男女免费视频网站| 3344免费播放观看视频| 日本免费一区二区三区最新| 亚洲va成无码人在线观看| 69成人免费视频| 亚洲综合小说另类图片动图| 成全高清视频免费观看| 亚洲av纯肉无码精品动漫| 亚洲人成人无码.www石榴| 破了亲妺妺的处免费视频国产| 亚洲冬月枫中文字幕在线看| 国产片AV片永久免费观看| 亚洲va乱码一区二区三区| 免费无码又爽又刺激毛片| 国产亚洲综合久久| 国产成人A亚洲精V品无码| 国产一级片免费看| 亚洲国产精品日韩在线| 中文在线观看永久免费| 亚洲AV无码成人精品区蜜桃 | 老司机免费午夜精品视频| 亚洲第一区精品观看| 免费无码又爽又刺激网站| 久久精品蜜芽亚洲国产AV| 麻豆一区二区免费播放网站| 亚洲av无码无线在线观看| 国产偷窥女洗浴在线观看亚洲| 免费av片在线观看网站| 亚洲AV无码一区二区三区人| 免费一级e一片在线播放| 中国人免费观看高清在线观看二区| 亚洲AV无码精品色午夜在线观看| 国国内清清草原免费视频99| 美女尿口扒开图片免费| 亚洲AV中文无码乱人伦下载 | 中文字幕亚洲综合小综合在线| 四虎影库久免费视频| 美女视频黄a视频全免费网站色窝 美女被cao网站免费看在线看 | 久久亚洲精品成人无码网站| 午夜成年女人毛片免费观看| 精品国产福利尤物免费|