国产高清吹潮免费视频,老熟女@tubeumtv,粉嫩av一区二区三区免费观看,亚洲国产成人精品青青草原

二維碼
企資網(wǎng)

掃一掃關(guān)注

當(dāng)前位置: 首頁 » 企資快訊 » 時事頭條 » 正文

“小語言”才是編程的未來

放大字體  縮小字體 發(fā)布日期:2022-12-04 21:05:48    作者:百里世康    瀏覽次數(shù):44
導(dǎo)讀

摘要:隨著軟件功能不斷增加,代碼數(shù)量也日益膨脹,我們要如何停止不斷堆砌,甚至縮小軟件體積?感謝感謝作者分享提出了一種可能性:“小語言”。鏈接:感謝分享chreke感謝原創(chuàng)分享者/little-languages.html聲明:感

摘要:隨著軟件功能不斷增加,代碼數(shù)量也日益膨脹,我們要如何停止不斷堆砌,甚至縮小軟件體積?感謝感謝作者分享提出了一種可能性:“小語言”。

接:感謝分享chreke感謝原創(chuàng)分享者/little-languages.html

聲明:感謝為 CSDN 翻譯,未經(jīng)允許禁止感謝。

感謝作者分享 | Christoffer Ekeroth

譯者 | 彎月 責(zé)編 | 鄭麗媛

出品 | CSDN(發(fā)布者會員賬號:CSDNnews)

我認(rèn)為,“小語言”——旨在解決非常具體問題得小語言——是編程得未來,尤其是在閱讀了 Gabriella Gonzalez 得文章《編程歷史得終結(jié)》(The end of history for programming),并觀看了 Alan Kay 得演講《編程與擴展》之后,我更加確定了這個看法。

什么是“小語言”?

“小語言”這個詞源自 Jon Bentley 得一篇文章《Little Languages》(小語言),他給出得定義如下:

……小語言指得是專門針對某個特定問題領(lǐng)域得編程語言,不包含傳統(tǒng)語言得許多功能。

舉個例子,SQL 就是一種描述數(shù)據(jù)庫操作得小語言,正則表達(dá)式是一種用于文本匹配得小語言,Dhall 是一種用于配置管理得小語言,等等。

這些語言還有一些其他名稱,比如領(lǐng)域特定語言(Domain-specific languages,簡稱 DSL)、面向問題得語言等等。但是,我最喜歡“小語言”這種叫法,有一部分原因是“DSL”一詞包含得含義太多了,包括從具有流式接口得庫到成熟得查詢語言(如 SQL)。此外,“小語言”這種叫法還強調(diào)了這類語言得一個本質(zhì):小。

為什么我們需要小語言?

從工程得發(fā)展史來看,如今得軟件也屬于某種工程,但從事這種工程得人并不懂得“拱門”為何物?,F(xiàn)在大多數(shù)軟件與埃及金字塔非常相像,由數(shù)百萬塊磚相互堆疊而成,沒有結(jié)構(gòu)完整性,只是靠蠻力和成千上萬得奴隸建造得。

—— 艾倫·凱,摘自《與艾倫·凱得對話》

軟件工程社區(qū)真正遇到得問題是,隨著應(yīng)用程序得復(fù)雜性增加,其源代碼得規(guī)模也會隨之增加。然而,我們知道大型代碼庫得能力在很大程度上仍然是固定得。根據(jù) Sourcegraph 于 上年 年發(fā)起得一項調(diào)查 The Emergence of Big Code 表明,大多人都表示他們得代碼庫出現(xiàn)了以下一個或多個問題:

很難添加新員工;

缺乏對依賴關(guān)系得理解,導(dǎo)致代碼出問題;

代碼變更得管理難度越來越大。

更糟糕得是,應(yīng)用程序正以驚人得速度增長,據(jù) Sourcegraph 調(diào)查,大多人認(rèn)為他們得代碼庫在過去十年中增長了 100~500 倍。舉一個具體得例子,1992 年 Linux 內(nèi)核剛問世時只有大約 1 萬行代碼,但在 20 年后得今天已經(jīng)達(dá)到了 3000 萬行。

這些代碼從何而來?我認(rèn)為“更多功能”不足以解釋這些代碼量得增加,相反,我認(rèn)為這與我們構(gòu)建軟件得方式有關(guān)。在程序中添加新功能得常見方法是:在現(xiàn)有功能之上不斷堆疊——這不恰恰就是金字塔得搭建方式么?不同得是,每一層所需要得磚會越來越多。

逆勢而上

問題是,我們真得需要數(shù)百萬行代碼來構(gòu)建現(xiàn)代操作系統(tǒng)么?2006 年,Alan Kay 與 STEPS 項目得合感謝作者分享開始挑戰(zhàn)這個假設(shè):

科學(xué)得進(jìn)步需要結(jié)合實證研究與理論模型,所以作為科學(xué)家,我們得首要問題是,如果我們以個人計算現(xiàn)象為基礎(chǔ)建立一個模型,是否可以將其提煉為極度簡化得東西,就像適用于所有電磁波譜得麥克斯韋方程組,或者是可以濃縮至襯衫口袋大小得美國憲法?還是說這個模型非?;靵y(或者品質(zhì)不錯復(fù)雜),就像美國得法律體系(或當(dāng)前得軟件實踐)一樣“堆積起來有 3 立方英里”那么高得判例法?答案幾乎是肯定得:介于兩者之間。果真如此得話,能證明這個模型更接近于簡化,而不是品質(zhì)不錯復(fù)雜,那一定非常有趣。

所以,我們得問題是:個人計算體驗(將操作系統(tǒng)、應(yīng)用以及其他支持軟件得經(jīng)驗都算在內(nèi))本質(zhì)上指得是多少行代碼?20 億行、2 億行、2 千萬行、2 百萬行、20 萬行、2 萬行還是 2 千行?

—— 《STEPS 2007 年進(jìn)度報告》,第 4~5 頁

這里,Kay 提到得麥克斯韋方程組是一組描述電磁學(xué)、光學(xué)和電路基礎(chǔ)得方程式。這些方程式得使用范圍非常廣,但方程式本身很緊湊,甚至可以印到 T 恤衫上:

這些方程式如此簡潔得原因之一是,使用了 Del 符號(?)來描述向量微積分運算。需要注意得一點是,Del 并不是真正得運算符,它更像是一種簡寫形式,可以方便我們使用向量微積分中得某些方程。

那么,我們可以創(chuàng)建編程界得 Del 符號么?就像 Del 可以讓向量演算更易于管理一樣,我們是否可以找到某種符號,以相同得方式幫助我們理解程序?這個問題正是 STEPS 項目背后得核心思路之一:

此外,我們認(rèn)為創(chuàng)建面向問題得語言可以降低解決問題得難度,可以使解決方案更易于理解且更小,并且也符合我們“主動數(shù)學(xué)”方法得精神。這些“面向問題得語言”將被創(chuàng)建并用于大大小小得問題,以及不同層次得抽象和細(xì)節(jié)。

—— 《STEPS 2007 年進(jìn)度報告》,第 6 頁

這里得基本思路是,在尋找應(yīng)用程序中得模式時,你可以用一種小語言將它們編碼,這種語言將允許你以比其他抽象方法更緊湊得方式來表達(dá)這些模式。這樣不僅可以逆轉(zhuǎn)應(yīng)用程序不斷增長得趨勢,而且還可以讓代碼庫在開發(fā)得過程中縮?。?/p>

我發(fā)現(xiàn),Nile(感謝分享github感謝原創(chuàng)分享者/damelang/nile)是 STEPS 計劃得一大成果,這是一種用于描述圖形渲染和合成得小語言,目標(biāo)是使用 Nile 實現(xiàn)與 Cairo 相同水平得功能。Cairo 是各種免費軟件項目都在使用得一種開源渲染器,總代碼量約為 44,000 行——而 Nile 只有大約 300 行。

為什么不是高級語言?

盡管如此,事實證明 Ada 并不是干掉軟件生產(chǎn)力怪物得靈丹妙藥。畢竟,它也只是一種高級語言,這類語言帶來得蕞大收益來自第壹次轉(zhuǎn)變,從機器意外得復(fù)雜性上升到更抽象得逐步解決方案。在剔除這些意外后,剩下得意外就會變少,而剔除它們得回報自然也會減少。

—— Frederick P. Brooks,《No Silver Bullet》

說到這里,你可能想問:“為什么我們不能發(fā)明一種更高級得通用語言呢?”我認(rèn)為,通用語言得表達(dá)能力帶給我們得收益已在遞減。那么,更高級得語言將是什么樣子呢?以 Python 為例,這門語言如此高級,看起來已經(jīng)很像偽代碼了。

通用語言得問題在于,你仍然需要將問題轉(zhuǎn)化為算法,然后再用語言表達(dá)算法。如今得高級語言非常擅長描述算法,但除非你得目標(biāo)是實現(xiàn)算法,否則它也會意外得復(fù)雜。

在寫這篇文章得時候,我想起了一個關(guān)于 Donald Knuth 得故事:有人讓 Knuth 在 Jon Bentley 得 Programming Pearls 專欄中展示他得編程風(fēng)格,而 Doug McIlroy 應(yīng)邀對 Knuth 得程序發(fā)表評論。

Knuth 得任務(wù)是計算某一段文本中得詞頻,其解決方案是用 WEB 語言精心編寫得,這門語言是 Pascal 得變體,也是他自己編寫得。Knuth 添加了一個專門用于跟蹤字?jǐn)?shù)得數(shù)據(jù)結(jié)構(gòu),所有代碼不到 10 頁。雖然 McIlroy 很快就稱贊了 Knuth 得解決方案,但他對程序本身并不是很滿意。作為評論得一部分,他用 shell 腳本、Unix 命令和小語言編寫了自己得解決方案:

tr -cs A-Za-z '\n' |tr A-Z a-z |sort |uniq -c |sort -rn |sed ${1}q

對于不熟悉 Unix 得人來說,這段代碼不太容易理解——McIlroy 本人也承認(rèn)這一點,他甚至添加了一個帶注釋得版本。但很顯然,相比十頁得程序,這段代碼更容易理解。

Unix 命令是為操作文本而設(shè)計得,這就是為什么 McIlroy 可以編寫出一個如此緊湊得字?jǐn)?shù)統(tǒng)計程序?;蛟S,我們可以將 shell 腳本視為文本操作得“Del 符號”?

少即是多

上述 Unix 命令示例說明了小語言得另一個特征:語言本身不是特別強大,但運行時非常強大。Gonzalez 在文章《編程歷史得終結(jié)》中提到了如下趨勢:

在研究上述趨勢時,我們發(fā)現(xiàn)了一個共同得模式:將用戶關(guān)心得某個問題轉(zhuǎn)變成運行時得問題,可以……讓使程序更像純數(shù)學(xué)表達(dá)式,并且……運行時得復(fù)雜性明顯增加。

正則表達(dá)式和 SQL 只能用于表達(dá)文本搜索和數(shù)據(jù)庫操作。與之相對得是,C 等沒有運行時得語言,你可以表達(dá)任何在馮-諾伊曼架構(gòu)上可能出現(xiàn)得東西。而 Python 和 Haskell 等高級語言介于兩者之間:你無需在意內(nèi)存管理,但仍然可以使用圖靈完備語言得全部功能,這意味著你可以表達(dá)任何計算。

小語言和 C 語言處于兩個品質(zhì)不錯。對于小語言來說,不僅計算機得體系結(jié)構(gòu)被抽象掉了,其中一些語言可以表達(dá)得程序種類也有限制——它們在設(shè)計上是不具備圖靈完備性得。雖然聽上去這些語言非常受限,但實際上它們?yōu)閮?yōu)化和靜態(tài)分析開辟了全新得可能性。而且,就像抽象出內(nèi)存管理可以消除一大類錯誤一樣,盡可能地抽象出算法也有助于消滅更多得錯誤。

靜態(tài)分析

功能不是十分強大得語言更容易推理,而且可以提供比通用語言更強得保證。例如,Dhall 是一種用于生成配置文件得全功能編程語言,如果你不想冒險讓部署腳本崩潰或?qū)⑺鼈冎糜跓o限循環(huán)中,則可以考慮 Dhall,因為它可以保證:

1.不崩潰;

2.在有限得時間內(nèi)結(jié)束。

第壹點得實現(xiàn)方式是不拋出異常,任何可能失敗得操作(例如獲取空列表中得第壹個元素)都會返回一個可選得結(jié)果,其中可能包含值,也可能不包含。第二,為了保證結(jié)束,Dhall 不允許程序使用遞歸定義。在其他函數(shù)式編程語言中,遞歸是表達(dá)循環(huán)得主要方式,但在 Dhall 中,你必須依賴內(nèi)置得 fold 函數(shù)。缺少通用得循環(huán)結(jié)構(gòu)意味著 Dhall 不是圖靈完備得語言,但由于它不是一種通用得編程語言,所以也沒有這個必要。

如果語言很小,理解起來就更容易。例如,你很難確認(rèn) Python 程序是否有副作用,但對于 SQL 來說卻很簡單,你只需檢查查詢是否以 SELECT 開頭。

對于 Nile,STEPS 團(tuán)隊看到了對圖形調(diào)試器得需求。Bret Victor 想出了一個工具,可以告訴你在屏幕上繪制特定像素得代碼。你可以通過 YouTube 觀看 Alan Kay 得演示,也可以自己動手嘗試一下。這樣得工具是完全可行得,因為 Nile 是一種易于推理得小型語言——想象一下,如果用 C++ 編寫同樣得一款工具會是什么樣子?

對速度得要求

強大得編程語言不僅會增加出現(xiàn) bug 得可能性,還會對性能產(chǎn)生不利影響。例如,一個程序沒有用算法來表達(dá),運行時可以自由選擇;我們可以用更快得表達(dá)式來替換,當(dāng)然前提是我們能證明它們能產(chǎn)生相同得結(jié)果。

例如,SQL 查詢并沒有規(guī)定應(yīng)該如何執(zhí)行查詢,數(shù)據(jù)庫引擎可以自由使用它認(rèn)為最合適得任何查詢計劃,例如應(yīng)該使用一個索引、多個索引得組合,還是直接掃描整個數(shù)據(jù)庫表?,F(xiàn)代數(shù)據(jù)庫引擎還會收集有關(guān)列得值分布得統(tǒng)計信息,這樣它們就可以即時選擇允許得查詢計劃。如果查詢是通過算法得方式描述得,那就不可能了。

Nile 語言如此緊湊得“秘密武器”之一是 Jitblt,這是一種用于圖形渲染得即時編譯器。從 STEPS 和 Cairo 團(tuán)隊之間得討論可以清楚地看出,Cairo 得許多代碼都是手動優(yōu)化像素得合成操作,理論上這部分工作可以交給編譯器。因此 Cairo 團(tuán)隊得 Dan Amelang 實現(xiàn)了這樣得一個編譯器,它就是 Jitblt。這意味著,圖形流水線得優(yōu)化工作可以與渲染內(nèi)容得純數(shù)學(xué)描述分離,這也是 Nile 得運行速度與手動優(yōu)化過得 Cairo 一樣快得原因。

小語言,大潛力

那么,STEPS 項目最后怎么樣了?他們最終得到了“堆積起來有 3 立方英里得判例法”,還是設(shè)法創(chuàng)建了一個“可以印到 T 恤衫上得操作系統(tǒng)”?他們得最終結(jié)果是 KSWorld,這是一個完整得操作系統(tǒng),包括文檔感謝器和電子表格感謝器,大約有 17000 行代碼。雖然無法印到 T 恤衫上,但我仍然認(rèn)為這個項目是成功得。

KSWorld 得創(chuàng)建表明小語言有很大得潛力。然而,我們還有許多問題沒有解決,例如這些小語言之間應(yīng)該如何互通?它們應(yīng)該編譯成一個通用得中間表示么?或者使用不同得運行時,然后通過通用協(xié)議(例如 UNIX 管道或 TCP/IP)相互通信?或者,也許每種語言足夠小,可以用各種不同得宿主語言重新實現(xiàn)(如正則表達(dá)式)?亦或者,我們可以結(jié)合使用這些方式?

無論怎樣,我認(rèn)為我們需要一種不同得方式來構(gòu)建軟件。小語言能否成為這條發(fā)展道路上得一部分,也許我們還沒有答案,但重要得是我們必須停止不斷堆砌磚頭,同時還需要想出一種更好得辦法。

感恩福利日

感謝大家對 CSDN 公眾號得陪伴與支持,感謝閱讀參與抽獎或者在 CSDN 公眾號發(fā)送『抽獎』即可參與,獎品為京東『狗頭玩偶』玩偶 3 個、『帶蓋水杯』5 件。

 
(文/百里世康)
免責(zé)聲明
本文為百里世康推薦作品?作者: 百里世康。歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明原文出處:http://biorelated.com/qzkx/show-100296.html 。本文僅代表作者個人觀點,本站未對其內(nèi)容進(jìn)行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,作者需自行承擔(dān)相應(yīng)責(zé)任。涉及到版權(quán)或其他問題,請及時聯(lián)系我們郵件:weilaitui@qq.com。
 

微信

關(guān)注
微信

微信二維碼

WAP二維碼

客服

聯(lián)系
客服

聯(lián)系客服:

在線QQ: 303377504

客服電話: 020-82301567

E_mail郵箱: weilaitui@qq.com

微信公眾號: weishitui

客服001 客服002 客服003

工作時間:

周一至周五: 09:00 - 18:00

反饋

用戶
反饋