日韩欧美国产精品免费一二-日韩欧美国产精品亚洲二区-日韩欧美国产精品专区-日韩欧美国产另-日韩欧美国产免费看-日韩欧美国产免费看清风阁

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

來(lái)自C#之父的編程語(yǔ)言趨勢(shì)預(yù)測(cè)

admin
2010年8月18日 13:47 本文熱度 4173
程序設(shè)計(jì)離不開(kāi)編程語(yǔ)言,但是編程語(yǔ)言在國(guó)內(nèi)的大環(huán)境中似乎一直是個(gè)二等公民,許多人也認(rèn)為,語(yǔ)言的討論完全是不入流的,但其實(shí)編程語(yǔ)言與工具、框架或開(kāi)發(fā)方法等一樣,都對(duì)生產(chǎn)力有著重要的影響。
[p]  事實(shí)上,語(yǔ)言的發(fā)展歷史比其他方面更為悠久,并且在過(guò)去十幾年,甚至最近幾年中都依然在不斷的碰撞和演變。期間一些新的語(yǔ)言誕生了,而另一些在當(dāng)時(shí)看來(lái)陽(yáng)春白雪的語(yǔ)言和編程范式也重新獲得了重視。[/p]
[p]  anders hejlsberg是微軟的technical fellow,擔(dān)任c#編程語(yǔ)言的首席架構(gòu)師,也參與了.net framework、vb.net和f#等語(yǔ)言的設(shè)計(jì)與開(kāi)發(fā),《delphi與c#之父:技術(shù)理想架構(gòu)開(kāi)發(fā)傳奇》一文詳細(xì)介紹了anders hejlsberg在微軟的編程傳奇之路。[/p]
[p]  幾個(gè)月前,anders在比利時(shí)techdays 2010及荷蘭devdays 2010分別作了一場(chǎng)演講,闡述了他眼中的編程語(yǔ)言的發(fā)展趨勢(shì)及未來(lái)方向,本文便對(duì)他的觀點(diǎn)進(jìn)行了總結(jié)。[/p]
[p]  大約25~30年前,anders開(kāi)發(fā)了著名的turbo pascal,這是一套集語(yǔ)言、編譯器及開(kāi)發(fā)工具于一體的產(chǎn)品,也是anders進(jìn)入編程語(yǔ)言領(lǐng)域的起點(diǎn)。anders談到,當(dāng)年turbo pascal所用的z-80和如今的計(jì)算機(jī)已經(jīng)不可同日而語(yǔ)。與那時(shí)相比,如今的機(jī)器已經(jīng)有大約10萬(wàn)倍的外部存儲(chǔ)容量,1萬(wàn)倍的內(nèi)存大小,cpu速度也有大約1000倍的提高。但是,如果我們比較如今的java代碼及當(dāng)年的pascal代碼,會(huì)發(fā)現(xiàn)它們的差別其實(shí)并不大。[/p]
[p]  anders認(rèn)為編程語(yǔ)言的發(fā)展非常緩慢,期間當(dāng)然出現(xiàn)了一些東西,例如面向?qū)ο蟮龋沁h(yuǎn)沒(méi)有好上1000倍。事實(shí)上,近幾十年來(lái)的努力主要體現(xiàn)在框架及工具等方面(如圖1)。例如.net framework里有超過(guò)一萬(wàn)個(gè)類(lèi)和十萬(wàn)個(gè)方法,與turbo pascal相比的確有了超過(guò)1000倍的增長(zhǎng)。類(lèi)似的,現(xiàn)在的ide包含了無(wú)數(shù)強(qiáng)大的功能,例如語(yǔ)法提示、重構(gòu)、調(diào)試器等。與此相比,編程語(yǔ)言的改進(jìn)的確很不明顯。[/p]
[p]  在過(guò)去50~60年的編程歷史中,編程語(yǔ)言的抽象級(jí)別不斷提高,人們都在努力讓編程語(yǔ)言更有表現(xiàn)力,這樣就可以用更少的代碼完成更多的工作。我們一開(kāi)始使用匯編,然后使用面向過(guò)程的語(yǔ)言(如pascal和c),然后是面向?qū)ο笳Z(yǔ)言(如c++),隨后便進(jìn)入了托管時(shí)代,語(yǔ)言運(yùn)行于受托管的執(zhí)行環(huán)境上(如c#和java),它們的主要特性有自動(dòng)垃圾收集、類(lèi)型安全等。anders認(rèn)為這樣的趨勢(shì)還會(huì)繼續(xù)下去,還會(huì)有抽象級(jí)別越來(lái)越高的語(yǔ)言。另一方面,編程語(yǔ)言往往都傾向于構(gòu)建于現(xiàn)有的工具上,而不會(huì)從頭寫(xiě)起。現(xiàn)在出現(xiàn)的編程語(yǔ)言,例如f#、scala和clojure等,都是基于現(xiàn)有框架構(gòu)建的,每次從頭開(kāi)始的代價(jià)實(shí)在太高。[/p]
[p]  在anders眼中,如今影響力較大的趨勢(shì)主要有三個(gè)(如圖2),分別是聲明式的編程風(fēng)格(包括領(lǐng)域特定語(yǔ)言、函數(shù)式編程)、動(dòng)態(tài)語(yǔ)言(最重要的方面是元編程能力)以及多核環(huán)境下的并發(fā)編程。此外隨著語(yǔ)言的發(fā)展,原本常用的面向?qū)ο笳Z(yǔ)言、動(dòng)態(tài)語(yǔ)言或是函數(shù)式等邊界也變得越來(lái)越模糊,例如各種主要的編程語(yǔ)言都受到函數(shù)式語(yǔ)言的影響。因此,多范式程序設(shè)計(jì)語(yǔ)言也是一個(gè)愈發(fā)明顯的趨勢(shì)。[/p]
[p]  [b]聲明式編程與dsl[/b][/p]
[p]  目前常見(jiàn)的編程語(yǔ)言大都是命令式(imperative)的,例如c#、java或c++等。這些語(yǔ)言的特征在于,代碼里不僅表現(xiàn)了“做什么(what)”,而更多表現(xiàn)出“如何(how)完成工作”這樣的實(shí)現(xiàn)細(xì)節(jié),例如for循環(huán)、i += 1等,甚至這部分細(xì)節(jié)會(huì)掩蓋我們的最終目標(biāo)。[/p]
[p]  在anders看來(lái),命令式編程通常會(huì)讓代碼變得十分冗余,更重要的是由于它提供了過(guò)于具體的指令,這樣執(zhí)行代碼的基礎(chǔ)設(shè)施(如clr或jvm)沒(méi)有太多發(fā)揮空間,只能老老實(shí)實(shí)地根據(jù)指令一步步地向目標(biāo)前進(jìn)。例如,并行執(zhí)行程序會(huì)變得十分困難,因?yàn)橄瘛皥?zhí)行目的”這樣更高層次的信息已經(jīng)丟失了。因此,編程語(yǔ)言的趨勢(shì)之一,便是能讓代碼包含更多的“what”,而不是“how”,這樣執(zhí)行環(huán)境便可以更加聰明地去適應(yīng)當(dāng)前的執(zhí)行要求。[/p]
[p]  關(guān)于聲明式的編程風(fēng)格,anders主要提出了兩個(gè)方面,第一個(gè)方面是dsl(domain specific language,領(lǐng)域特定語(yǔ)言)。dsl不是什么新鮮的玩意兒,我們平時(shí)經(jīng)常接觸的sql、css、正則表達(dá)式等都屬于dsl。有的dsl可能更加專(zhuān)注于一個(gè)方面,例如mathematica、logo等。這些語(yǔ)言的目標(biāo)都是特定的領(lǐng)域,與之相對(duì)的則是gppl(general purpose programming language,通用目的編程語(yǔ)言)。[/p]
[p]  martin fowler將dsl分為外部dsl和內(nèi)部dsl兩種。外部dsl有自己的特定語(yǔ)法、解析器和詞法分析器等,它們往往是一種小型的編程語(yǔ)言,甚至不會(huì)像gppl那樣需要源文件。與之相對(duì)的則是內(nèi)部dsl。內(nèi)部dsl其實(shí)更像是種別稱(chēng),它代表一類(lèi)特別api及使用模式。[/p]
[p]  xslt、sql等都可以算作是外部dsl。外部dsl一般會(huì)直接針對(duì)特定的領(lǐng)域設(shè)計(jì),而不考慮其他方面。james gosling曾經(jīng)說(shuō)過(guò):每個(gè)配置文件最終都會(huì)變成一門(mén)編程語(yǔ)言。一開(kāi)始你可能只會(huì)用它表示一點(diǎn)點(diǎn)東西,慢慢地你便會(huì)想要一些規(guī)則,而這些規(guī)則則變成了表達(dá)式,后來(lái)你可能還會(huì)定義變量,進(jìn)行條件判斷等,而最終它就變成了一種奇怪的編程語(yǔ)言。這樣的情況屢見(jiàn)不鮮。現(xiàn)在有一些公司也在關(guān)注dsl的開(kāi)發(fā)。[/p]
[p]  例如以前在微軟工作的charles simonyi提出了intentional programming的概念,還有jetbrains公司提供了叫做mps(meta programming system)的產(chǎn)品。最近微軟也提出了自己的oslo項(xiàng)目,而在eclipse世界里也有xtext,所以如今在這方面已經(jīng)有不少嘗試。由于外部dsl的獨(dú)立性,在某些情況下也會(huì)出現(xiàn)特定的工具,輔助領(lǐng)域?qū)<一蚴情_(kāi)發(fā)人員編寫(xiě)dsl代碼。還有一些dsl會(huì)以xml方言的形式提出,利用xml方言的好處在于有不少現(xiàn)成的工具可用,這樣可以更快地定義自己的語(yǔ)法。[/p]
[p]  內(nèi)部dsl往往只代表一系列特別的api及使用模式,例如linq查詢語(yǔ)句及ruby on rails中的active record聲明代碼等。內(nèi)部dsl可以使用一系列api來(lái)“偽裝”成一種dsl,利用一些流暢化的技巧,例如像jquery那樣把一些方法通過(guò)“點(diǎn)”連接起來(lái),而另一些也會(huì)利用元編程的方式。內(nèi)部dsl還有一些優(yōu)勢(shì),例如可以訪問(wèn)語(yǔ)言中的代碼或變量,以及利用代碼補(bǔ)全、重構(gòu)等母語(yǔ)言的所有特性。[/p]
[p]  dsl的可讀性往往很高。例如,要篩選出單價(jià)大于20的產(chǎn)品,并對(duì)所屬種類(lèi)進(jìn)行分組,降序列出每組的分類(lèi)名稱(chēng)及產(chǎn)品數(shù)量。如果是用命令式的編程方式,可能是這樣的:[/p]
  var groups = new dictionary(); foreach (product p in products) { if (p.unitprice >= 20) { if (!groups.containskey(p.categoryname)) { grouping g = new grouping(); g.name = p.categoryname; g.count = 0; groups[p.categoryname] = g; } groups[p.categoryname].productcount++; } } var result = new list(groups.values); result.sort(delegate(grouping x, grouping y) { return x.count > y.count ? -1 : x.count < y.count ? 1 : 0; });
[p]  顯然這些代碼編寫(xiě)起來(lái)需要一點(diǎn)時(shí)間,且很難直接看出它的真實(shí)目的,換言之,“what”幾乎完全被“how”所代替了。這樣,一個(gè)新的程序員必須花費(fèi)一定時(shí)間才能理解這段代碼的目的。但如果使用linq,代碼便可以改寫(xiě)成:[/p]
[p]  var result = products where(p => p.unitprice >= 20) groupby(p => p.categoryname) orderbydescending(g => g.count()) select(g => new { name = g.key, count = g.count() });[/p]
[p]  這段代碼更加關(guān)注的是“how”而不是“what”,它不會(huì)明確地給出過(guò)濾的操作方式,也沒(méi)有涉及到創(chuàng)建字典這樣的細(xì)節(jié)。這段代碼還可以利用c# 3.0中內(nèi)置的dsl,即linq查詢語(yǔ)句來(lái)改寫(xiě):[/p]
[p]  var result = from p in products where p.unitprice >= 20 group p by p.categoryname into g orderby g.count() descending select new { name = g.key, count = g.count() };[/p]
[p]  編譯器會(huì)簡(jiǎn)單地將linq差距語(yǔ)句轉(zhuǎn)化為前一種形式。這段代碼只是表現(xiàn)出最終的目的,而不是明確指定做事的方式,這樣便可以很容易地并行執(zhí)行這段代碼,如使用pinq則幾乎不需要做出任何修改。[/p]
[p]  [b]函數(shù)式編程[/b][/p]
[p]  anders提出的另一個(gè)重要的聲明式編程方式便是函數(shù)式編程。函數(shù)式編程歷史悠久,如當(dāng)年的lisp便是函數(shù)式編程語(yǔ)言。除了lisp以外還有其他許多函數(shù)式編程語(yǔ)言,如apl、haskell、ml等。函數(shù)式編程在學(xué)術(shù)界已經(jīng)有過(guò)許多研究,大約在5~10年前許多人開(kāi)始吸收和整理這些研究?jī)?nèi)容,想要把它們?nèi)谌敫鼮橥ㄓ玫木幊陶Z(yǔ)言。現(xiàn)在的編程語(yǔ)言,如c#、python、ruby、scala等,都受到了函數(shù)式編程語(yǔ)言的影響。[/p]
[p]  使用命令式編程語(yǔ)言寫(xiě)程序時(shí),我們經(jīng)常會(huì)編寫(xiě)如x = x + 1這樣的語(yǔ)句,此時(shí)我們大量依賴的是可變狀態(tài),或者說(shuō)是變量,它們的值可以隨程序運(yùn)行而改變,可變狀態(tài)非常強(qiáng)大,但隨之而來(lái)的便是“副作用”問(wèn)題,例如一個(gè)無(wú)需參數(shù)的void方法,它會(huì)根據(jù)調(diào)用次數(shù)或是在哪個(gè)線程上進(jìn)行調(diào)用對(duì)程序產(chǎn)生影響,它會(huì)改變程序內(nèi)部的狀態(tài),從而影響之后的運(yùn)行效果。而在函數(shù)式編程中則不會(huì)出現(xiàn)這個(gè)情況,因?yàn)樗械臓顟B(tài)都是不可變的。事實(shí)上對(duì)函數(shù)式編程的討論更像是數(shù)學(xué)、公式,而不是程序語(yǔ)句,如x = x + 1對(duì)于數(shù)學(xué)家來(lái)說(shuō),似乎只是個(gè)永不為真的表達(dá)式而已。[/p]
[p]  函數(shù)式編程十分容易并行,因?yàn)樗谶\(yùn)行時(shí)不會(huì)修改任何狀態(tài),因此無(wú)論多少線程在運(yùn)行時(shí)都可以觀察到正確的結(jié)果。假如兩個(gè)函數(shù)完全無(wú)關(guān),那么它們是并行還是順序執(zhí)行便沒(méi)有什么區(qū)別。[/p]
[p]  當(dāng)然,現(xiàn)實(shí)中的程序一定是有副作用的,例如向屏幕輸出內(nèi)容,向socket傳輸數(shù)據(jù)等,因此真實(shí)世界中的函數(shù)式編程往往都會(huì)考慮如何將有副作用的代碼分離出來(lái)。函數(shù)式編程默認(rèn)是不可變的,開(kāi)發(fā)人員必須做些額外的事情才能使用可變狀態(tài)或是危險(xiǎn)的副作用,與之相反,c#或java必須使用readonly或final來(lái)做到這一點(diǎn)。此時(shí),使用函數(shù)式編程語(yǔ)言時(shí)的思維觀念便會(huì)有所不同。[/p]

該文章在 2010/8/18 13:47:16 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 狂处让老二爽18p | 日本一区二区三区免费播放 | 国产日产亚洲系列最新 | 精品国产欧美在线小说区 | 日韩在线精品成人v在线 | 一本一道日韩一二三四区免费 | 国产成a人 | 国产精品永 | 国产区日韩精品一区二区三区 | 香港特级| 精品一区二区三区免费观看 | 亚洲va综合va国产产va中文 | 亚洲精品色午夜 | 精品精品国产免费看不卡 | 日本乱理伦片在线观看中文字幕 | 夜夜爽一区二区三区精品 | 国产亚州视频在线八a | 天堂mv在线mv免费mv香蕉 | 亚洲一区二区三区人人 | 欧美一区二区成人午夜在线观看 | 国产精品自在线拍国产下载 | 日本中文字幕一区二区有码在线 | 亚洲欧美一区二区三区日产 | 伊人大相蕉在线看青青 | 日本免费高清视频不卡 | 小小水蜜桃高清电视剧观看 | 国产熟女熟女 | 亚洲国产激 | 最新国产一区二区三区在线 | 涩涩国产精 | 大陆精大陆国产国语精品 | 欧美日韩一区观看 | 国产凸凹视频 | 手机免费在线日韩电影大片 | 国产乱对白刺激视频 | 国产日韩a视频在线播放视频 | 国产欧美一区二区三区综合野 | 91精品国产亚洲爽啪在线观看 | 午夜国产 | 午夜嘿嘿嘿在线观看 | 一区二区三区亚洲综合 |