小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

編程語(yǔ)言漫談

 jnstyle 2016-06-01

寫在前邊:我們知道現(xiàn)有語(yǔ)言的編程范式有:過(guò)程式,面向?qū)ο?,函?shù)式,邏輯式。隨著軟件工業(yè)化程度的普及,以及軟件的復(fù)雜度越來(lái)越高,編程語(yǔ)言的發(fā)展歷程也是從最初的過(guò)程式(命令式)語(yǔ)言c,發(fā)展到以java語(yǔ)言為代表的面向?qū)ο缶幊陶Z(yǔ)言。而邏輯編程語(yǔ)言(以prolog為代表)和函數(shù)式語(yǔ)言(lisp系列)還多用在學(xué)術(shù)和人工智能領(lǐng)域中。近幾年,隨著多核,云計(jì)算時(shí)代的到來(lái)。函數(shù)式編程語(yǔ)言逐漸浮出水面,最經(jīng)典的語(yǔ)言以scheme,common-lisp,ml,clojure,go為代表.而且最近的jdk8也逐步加入了functional,closure,lambda等語(yǔ)法,而且scala的作者也越來(lái)越推崇編碼者以函數(shù)式語(yǔ)言的思維來(lái)coding??梢娋幊陶Z(yǔ)言的發(fā)展也是滿足時(shí)代的變化不斷變化著。從其中的發(fā)展歷程中我們可以看到:技術(shù)的發(fā)展都是在圍繞著解決“軟件的復(fù)雜度”這個(gè)基本的需求而發(fā)展的。

一、 編程語(yǔ)言概述

編程語(yǔ)言是計(jì)算機(jī)的符號(hào),是人和計(jì)算機(jī)交流的語(yǔ)言。我們學(xué)習(xí)一門新的編程語(yǔ)言時(shí),應(yīng)該觀察這門語(yǔ)言的那些特性呢?《SICP》一書的作者列舉了一下三點(diǎn): * primitive elements. (基本元素) * means of combination. (組合手段) * means of abstraction. (抽象手段) 以上3個(gè)特性,基本上涵蓋了所有編程語(yǔ)言的特性,并且也是一個(gè)語(yǔ)言設(shè)計(jì)者從開始就要考慮的。我對(duì)這三點(diǎn)的理解:primitive elements表示語(yǔ)言的基本符號(hào)(基本數(shù)據(jù)類型,關(guān)鍵字等)也就是詞法部分。means of combination利用基本元素通過(guò)組合的過(guò)程構(gòu)建大型程序的手段,不同的語(yǔ)言提供的組合手段是不同的。means of abstraction表示抽象,抽象是解決軟件復(fù)雜度的重要手段,讓軟件的可讀性,可擴(kuò)展,可重復(fù)利用等得到提升。下邊會(huì)從組合元素和抽象手段來(lái)對(duì)比語(yǔ)言特性。

二、 組合手段

匯編語(yǔ)言:算是最簡(jiǎn)單的詞法和語(yǔ)法形式了,被稱作低級(jí)語(yǔ)言。匯編器通過(guò)直譯的過(guò)程將匯編代碼翻譯為native code(cpu指令集)。 提供的primitive elements有:數(shù)字,字符,-,+,*,/ , case,if, break, go,指令等基本元素;通過(guò)這些元素組合成計(jì)算機(jī)執(zhí)行序列符號(hào)。 c語(yǔ)言相比匯編語(yǔ)言更高級(jí),讓程序員脫離和cpu,寄存器,內(nèi)存直接打交道的工作,提供了更多的組合手段:比如數(shù)組,結(jié)構(gòu)體等數(shù)據(jù)結(jié)構(gòu)。 java語(yǔ)言自稱是面向?qū)ο笳Z(yǔ)言,所以比c語(yǔ)言更進(jìn)一步,通過(guò)強(qiáng)大的類型系統(tǒng)手段來(lái)組合屬性和方法。 go語(yǔ)言和ML語(yǔ)言非常相仿,“接口”,"高階函數(shù)“,”閉包“,"duck type","返回多值”,并提供goroutine等來(lái)組合。 prolog語(yǔ)言完全是模式匹配的邏輯語(yǔ)言。他的思想基于:世間所有的定理都給予一個(gè)最簡(jiǎn)單的定理推理而來(lái),就像數(shù)學(xué)的基礎(chǔ)是“1+1=2”,然后才能推導(dǎo)出“萬(wàn)有引力”,“相對(duì)論”等定律。 lisp方言以s-expression(著名的S表達(dá)式)來(lái)組合數(shù)據(jù)和函數(shù)。在lisp中不區(qū)分?jǐn)?shù)據(jù)和函數(shù),一切皆為數(shù)據(jù)。 題外話:lisp方言是和圖靈機(jī)的思想一脈相承的,編碼的時(shí)候完全感受不到計(jì)算機(jī)體系結(jié)構(gòu)。而其他語(yǔ)言更多的是馮·洛伊曼的計(jì)算,存儲(chǔ)思想而設(shè)計(jì),要么是“堆棧”結(jié)構(gòu),要么是“寄存器”結(jié)構(gòu);

三、 抽象手段

從c語(yǔ)言開始,以函數(shù)為單元提供了對(duì)程序的抽象。這樣大大的提高了程序的可復(fù)用,模塊化等。讓團(tuán)隊(duì)合作編碼也成為可能。 面向?qū)ο缶幊蹋夯旧想[藏了計(jì)算機(jī)的細(xì)節(jié),開發(fā)者通過(guò)對(duì)象來(lái)抽象具體業(yè)務(wù)。但嚴(yán)格意義上來(lái)說(shuō)java也屬于imperative-lang的范疇而且都是傳值調(diào)用。相比來(lái)說(shuō),python,ruby更面向?qū)ο笠恍?font color="#ff0000">,python融合了面向?qū)ο蠛秃瘮?shù)式編程范式,更接近自然語(yǔ)言些。 以lisp為代表的函數(shù)式語(yǔ)言:以函數(shù)為基本和唯一的抽象;common-lisp也基于宏開發(fā)了一套o(hù)bject-oriented的編程方式。我比較傾向于函數(shù)式編程理念:函數(shù)的無(wú)副作用(不用考慮線程安全,特別是對(duì)于變態(tài)的Haskell),高階函數(shù),閉包,lambda等。四、 類型系統(tǒng)大家平時(shí)經(jīng)常會(huì)說(shuō):javascript是一個(gè)弱類型的語(yǔ)言,java語(yǔ)言是強(qiáng)類型的語(yǔ)言。將編程語(yǔ)言從類型系統(tǒng)的角度區(qū)分語(yǔ)言也很有趣。一般來(lái)說(shuō)弱類型語(yǔ)言更偏向自然語(yǔ)言一些,語(yǔ)法也很自由活潑些。而現(xiàn)今語(yǔ)言的走勢(shì)也趨向與弱類型方向. 計(jì)算機(jī)是結(jié)構(gòu)化很強(qiáng)的,堆棧上一個(gè)二進(jìn)制位的錯(cuò)誤就會(huì)導(dǎo)致溢出,bus等錯(cuò)誤。所以語(yǔ)言層面的自由得益于編譯器或者解釋器的功勞。比如java,c等語(yǔ)言有很強(qiáng)的編譯時(shí)類型檢測(cè)機(jī)制,強(qiáng)類型的好處驅(qū)使編碼人員寫出很少有語(yǔ)法,語(yǔ)義錯(cuò)誤的代碼,對(duì)IDE的支持也便捷,是大型技術(shù)團(tuán)隊(duì)的合作基石。 弱類型語(yǔ)言讓我們獲取了自由(不需要類型信息),讓程序員少敲了許多鍵盤。自由是有代價(jià)的,編譯器或解釋器中內(nèi)含類型推理(infer type); (類型推理是利用歸一方法,基于上下文中的變量顯式類型,操作符,返回值等信息,利用棧和逐漸替換的過(guò)程來(lái)推到出類型。) 弱類型雖然可以輕松編譯通過(guò)(或者不需要編譯而是解釋執(zhí)行),但也是有類型檢查過(guò)程的,只是將此過(guò)程延遲到運(yùn)行時(shí)了。所以弱類型語(yǔ)言結(jié)構(gòu)化不強(qiáng),編碼時(shí)很難確保類型無(wú)誤,IDE支持較難。但是通過(guò)一些分析器可以不斷的檢測(cè)語(yǔ)法,語(yǔ)義錯(cuò)誤,相當(dāng)于達(dá)到了強(qiáng)類型語(yǔ)言的IDE效果。近幾年語(yǔ)言的方向朝著逐漸脫離計(jì)算機(jī)體系結(jié)構(gòu),向自然語(yǔ)言方向在演進(jìn),程序員像藝術(shù)家一樣用代碼自由描繪。

五、編譯/解釋

java語(yǔ)言是解釋型還是編譯型的呢? 這個(gè)很難說(shuō),從java source code -> class byte code 的過(guò)程式j(luò)avac編譯器的過(guò)程。但是byte code 在jvm上執(zhí)行的過(guò)程可能是解釋執(zhí)行也可能是編譯執(zhí)行的。解釋型和編譯型的內(nèi)部都遵從編譯原理的過(guò)程:詞法分析-> 語(yǔ)法分析->語(yǔ)義解析 -> 編譯器后端-> native code的過(guò)程。 但有各自的優(yōu)點(diǎn): 解釋器:加載code速度快;解釋器需要維護(hù)運(yùn)行時(shí)上下文等信息。所以加載必要的代碼,片段解釋執(zhí)行。但是對(duì)于相同的代碼都經(jīng)過(guò)編譯過(guò)程就很多余,造成時(shí)間浪費(fèi)。 編譯器:執(zhí)行速度快。而且編譯器后端也更容易優(yōu)化中間代碼,因?yàn)閮?yōu)化過(guò)程式一個(gè)結(jié)構(gòu)化過(guò)程:往往需要遍歷整個(gè)中間代碼,整體優(yōu)化代碼,提高運(yùn)行效率。 runtime:一般來(lái)說(shuō)解釋型語(yǔ)言需要在內(nèi)存維護(hù)運(yùn)行時(shí)上下文信息,服務(wù)于運(yùn)行過(guò)程中變量的查找,綁定,scope等。 而編譯語(yǔ)言基于寄存器堆棧模型執(zhí)行代碼,基本上數(shù)據(jù)綁定都在棧結(jié)構(gòu)中完成,運(yùn)行速度稍微快一些; hotspot-jvm結(jié)合了解釋和編譯的各自優(yōu)點(diǎn);最先解釋執(zhí)行過(guò)程,如果方法被頻繁執(zhí)行,而且達(dá)到熱點(diǎn)(hotspot),jvm會(huì)啟動(dòng)編譯過(guò)程,將次代碼編譯為native-code,然后緩存起來(lái),下一次的調(diào)用直接執(zhí)行即可。hotspot-jvm執(zhí)行基于堆棧指令bytecode, 這一點(diǎn)也是基于跨平臺(tái)的考慮而犧牲了寄存器指令; (而基于android操作系統(tǒng)上的dalvik虛擬機(jī)是基于寄存器指令的); 所以說(shuō),語(yǔ)言的設(shè)計(jì)往往是一個(gè)權(quán)衡過(guò)程;獲取的“自由”越多,"犧牲“也更大。最初從圖靈為了解決萊布尼茨提出的:是否存在一個(gè)通用模型來(lái)解決一切計(jì)算任務(wù)這個(gè)命題,發(fā)明了圖靈機(jī)理論。到馮洛伊曼仿真人腦神經(jīng)元思考過(guò)程產(chǎn)生第一臺(tái)基于存儲(chǔ)器,運(yùn)算器的計(jì)算機(jī)ENIAC,至今,計(jì)算機(jī)硬件技術(shù)并沒(méi)有實(shí)質(zhì)性的變化,只是隨著摩爾定律的破滅,人們發(fā)展了多級(jí)高速緩存,多核,多cpu技術(shù)來(lái)支撐越來(lái)越大的計(jì)算任務(wù)。 在這個(gè)過(guò)程中,隨著人們對(duì)邏輯學(xué),符號(hào)學(xué),算法的不斷研究,用來(lái)和計(jì)算機(jī)交互的語(yǔ)言也越來(lái)越抽象和豐富。我們通過(guò)這個(gè)形象的符號(hào)來(lái)抽象時(shí)間和空間,通過(guò)這個(gè)形象的符號(hào)來(lái)解決軟件的復(fù)雜性問(wèn)題,通過(guò)這個(gè)符號(hào)來(lái)和計(jì)算機(jī)傳達(dá)我們的思想。
舉報(bào) 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多