編程會有“歷史終結”的一天嗎?

{"type":"doc","content":[{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本文作者對編程歷史的終結作了一番暢想,這是作者的一家之言,我們無法準確判斷未來編程將會轉向何處,但是我們可以根據其發展軌跡,就像本文作者一樣,做出大概的判斷(未必準確)。"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic"},{"type":"strong"}],"text":"本文最初發表於作者個人博客,經原作者 Gabriel Gonzalez 授權,InfoQ 中文站翻譯並分享。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我花了不少時間思考這個問題:"},{"type":"text","marks":[{"type":"strong"}],"text":"編程"},{"type":"link","attrs":{"href":"https:\/\/en.wikipedia.org\/wiki\/End_of_history?fileGuid=H2TBGtSx56EjErDS","title":"","type":null},"content":[{"type":"text","text":"歷史的終結"}]},{"type":"text","marks":[{"type":"strong"}],"text":"可能是什麼樣子的。我所說的“歷史的終結”,就是編程範式不再有重大發展的時候。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"對於編程的“命運”我很關心,因爲我更願意參與那些讓我們接近終極編程模式的開源項目。從我的經驗來看,這類工作壽命更長,影響更大,有助於推動整個編程領域的發展。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"那麼,對於編程而言,歷史的終結會是怎樣的呢?是不是:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"已經到來了?"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一些人將編程視爲已經解決的問題,並將所有新的語言和範式視爲舊語言或範式的翻版。在他們看來,剩下的工作就是慢慢地優化事物,排除錯誤,或者解決非技術性的問題(比如人事管理或者資金),從而完善我們的工藝。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這一觀點我個人並不認同,因爲我相信,至少,函數式編程範式將逐漸取代面向對象和命令式編程範式(雖然函數式編程未必就是終極編程範式)。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"人工智能?"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"或許機器可以將我們的自然語言指令翻譯成代碼,從而減輕了我們準確表達意圖的負擔。或許一些足夠智能的、人工智能驅動的 IDE 可以爲我們自動地完成大多數程序。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"同樣,我也不相信這一觀點,而且我認爲 Dijkstra 在他的文章《"},{"type":"link","attrs":{"href":"https:\/\/www.cs.utexas.edu\/users\/EWD\/transcriptions\/EWD06xx\/EWD667.html?fileGuid=H2TBGtSx56EjErDS","title":"","type":null},"content":[{"type":"text","text":"論“自然語言程序設計”的愚蠢性"}]},{"type":"text","text":"》("},{"type":"text","marks":[{"type":"italic"}],"text":"On the foolishness of \"natural language programming"},{"type":"text","text":"*\"*)中很好地推翻了這一觀點。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"老實說,我不能肯定什麼是正確答案,但是我會給出我自己關於編程的歷史終結的猜測。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"數學 DSL"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我的觀點是,編程的下一個邏輯步驟是分成兩個沒有重疊的編程領域:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"運行時構建"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"數學編程語言"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"具體地說,我預期編程語言在本質上將發展成爲更具數學特性的語言,讓用戶編寫的程序像純粹的數學表達式一樣表達其意圖。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"舉例來說,考慮下列布爾邏輯“和”運算符和函數合成運算符的數學規範:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"haskell"},"content":[{"type":"text","text":"True && x = x\nx && True = x\nFalse && False = False\n(f . g)(x) = f(g(x))\n"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這些數學規範也是可執行的 Haskell 代碼(儘管使用了額外的括號來與主流函數語法相似)。Haskell 是編程語言的一個例子,它的代碼希望類似於純數學表達式和定義。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"由於現實世界是混亂的,因此任何呈現這種理想化數學界面的語言都需要在幕後引入大量的複雜性,在這裏,運行時構建可以用來掩蓋這些“醜陋”的細節。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"換言之,我預言編程的歷史終結將是連接純數學表達式和現實世界的接口。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"過去和現在"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"請允許我舉幾個例子,說明這種將用戶空間(userland)代碼數學化的趨勢已經開始顯現:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"內存管理"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"手動內存管理曾經是大多數編程語言的“用戶空間”問題,但新語言的總體趨勢是自動內存管理(Rust 除外)。以前,內存管理是程序員必須關心的一個明顯的副作用,現在,把內存管理下推到運行時(通過垃圾收集或其他方式),使編程語言更加純粹,使它們更接近於理想化的數學表達式。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"事實上,Rust 是證明這一規則的例外,因爲人們普遍認爲 Rust 更適合於構建運行時,而非用於意圖的高級規範。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"函數式編程(尤其是純函數式編程)"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"函數式編程是向更傾向於數學化的編程方向邁進的一個重要步驟:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以表達式代替語句;"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以純函數代替副作用;"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以代數數據類型代替非對象;"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以遞歸代替循環。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"關於這一點,我在《"},{"type":"link","attrs":{"href":"https:\/\/www.haskellforall.com\/2020\/10\/why-i-prefer-functional-programming.html?fileGuid=H2TBGtSx56EjErDS","title":"","type":null},"content":[{"type":"text","text":"爲什麼我更喜歡函數式編程"}]},{"type":"text","text":"》("},{"type":"text","marks":[{"type":"italic"}],"text":"Why I prefer functional programming"},{"type":"text","text":")一文中詳細討論過。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"但是,函數式編程並非自由的勝利。有效地支持高階函數和閉包並非易事(特別是對於編譯語言來說),這就是爲什麼那些較不復雜的語言實現通常更傾向於命令式而非函數式。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"評估順序(特別是懶惰)"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"對於 Haskell 的評估模型,我一直認爲“懶惰評估”並不適合推廣其優點。但我更傾向於認爲,Haskell 擁有“自動評估管理”(注:這一解釋與實際情況相差不大,因爲 Haskell 標準只規定了一個非嚴格的評估策略。GHC 是懶惰的,但是 Haskell 這一預言標準並沒有要求懶惰實現。詳情請參閱《"},{"type":"link","attrs":{"href":"https:\/\/wiki.haskell.org\/Lazy_vs._non-strict?fileGuid=H2TBGtSx56EjErDS","title":"","type":null},"content":[{"type":"text","text":"懶惰與不嚴格"}]},{"type":"text","text":"》("},{"type":"text","marks":[{"type":"italic"}],"text":"Lazy vs. non-strict︎"},{"type":"text","text":")。換句話說,程序員將表達式指定爲依賴於計算的圖,而運行時則找出最有效的順序來減少圖。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這裏還有一個例子,我們把過去用戶空間問題(評估順序)推進到了運行時。忽略評估順序可以讓我們用更數學的方法來指定事物,因爲評估順序在數學上同樣是不相關的。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"現在與未來"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在研究上述趨勢時,出現了一種常見的模式:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"下面是把用戶空間問題推送到運行時問題:"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"使程序更接近純數學表達式,並且:"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"顯著地增加了運行時的複雜性。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"你可能會想:在不遠的將來,還有哪些用戶空間問題可能會被推送到運行時問題上呢?我能想到的例子如下:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"包管理"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這次是如此的接近未來,以至於它已經發生了(見:Nix 和 Dhall)。這兩種語言都爲獲取代碼提供了內置支持,而沒有使用獨立的包管理工具來處理帶外包。這一語言級別的支持允許程序嵌入外部代碼,就好像它是一個純粹的子表達式,更接近於數學化的理想。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"錯誤處理"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這個問題需要更多的解釋:我認爲,類型系統是一個邏輯結論,它把錯誤處理推入“運行時”(實際上是推到了類型檢查器而非運行時)。在 Dhall 語言中,這種想法得到了充分的體現:Dhall 不能用來引發或捕捉錯誤的用戶空間支持,因爲所有的錯誤都是類型錯誤。(注:這有點過於簡化,因爲 Dhall 支持 Optional 值,你可以使用 unions 在 Dhall 中模擬錯誤,但是它們不常以這種方式出現,而且通常 Dhall 代碼使用類型檢查器捕獲錯誤。Dhall 是一種完全函數式編程語言,它做了很多工作來防止運行時出錯,例如,禁止比較文本是否相等。另外,該語言在技術上依賴於類型,並且支持在類型檢查時測試任意代碼,以便靜態地捕捉錯誤。)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/en.wikipedia.org\/wiki\/Dependent_type?fileGuid=H2TBGtSx56EjErDS","title":"","type":null},"content":[{"type":"text","text":"依賴類型"}]},{"type":"text","text":"和"},{"type":"link","attrs":{"href":"https:\/\/en.wikipedia.org\/wiki\/Total_functional_programming?fileGuid=H2TBGtSx56EjErDS","title":"","type":null},"content":[{"type":"text","text":"完全"}]},{"type":"text","text":"函數式編程語言的發展使我們與把錯誤處理推到運行時的目標更加接近。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"日誌"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"事實上,我感到驚訝的是,尚未完成對大量日誌記錄的語言支持(或者,也許發生了,但是我沒有注意到)。在語言中,這似乎是一件可以實現的很普通的事情,特別是在性能不敏感的應用領域中。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"很多語言已經支持分析了,如果用戶願意爲日誌花費性能預算,那麼將分析支持轉變爲日誌支持看起來並不是一個什麼大的飛躍。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"日誌是典型的副作用之一,它是一種“醜陋”的細節,“破壞”了本來是純粹的、數學的代碼。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"服務"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"面向服務的架構是另一種傾向,它會阻礙純無副作用代碼的編寫。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我並不清楚面向服務的語言運行時是什麼樣子,但是我認爲,目前的“無服務器”解決方案並不是我心中所想的那樣。諸如 AWS Lambda 之類的東西還是太低級了,無法提升本質上是數學化的代碼。舉例來說,如果編程過程中有任何部分需要使用獨立的工具來部署或管理無服務器的代碼,那麼這與編寫純數學表達式大相徑庭。必須有與“無服務器代碼的 Nix 或 Dhall”類似的東西。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"結語"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"你可以批評我的預言,說它是不可證僞的。看起來我可以將編程中的新進展解釋爲屬於運行時構建或數學表達式範疇。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"正因爲如此,我想強調預言中的一個關鍵支柱:運行時和數學表達式的劃分會隨着時間而變得更明顯。它是預言的實際內容,我們可以從語言中推斷出一些證據。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當前,許多主流編程範式和工程組織混淆了這兩種職責,因此,你最終會發現,人們編寫的軟件項目是操作邏輯(運行時問題)和“業務邏輯”(數學意圖)的混合體。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在我的預言中,工程領域將會對擁有編程語言理論或編程語言工程經驗的人產生強烈的需求。這些人將負責構建專用語言和運行時,將盡可能多的操作問題抽象出來,以支持各自企業的純數學領域特定語言。這些語言將會被另一組人所使用,其目的是將人們的意圖轉化爲數學表達式。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這個預言的一個結果就是,在不遠的將來,你會看到編程語言的“"},{"type":"link","attrs":{"href":"https:\/\/en.wikipedia.org\/wiki\/Cambrian_explosion?fileGuid=H2TBGtSx56EjErDS","title":"","type":null},"content":[{"type":"text","text":"寒武紀大爆發"}]},{"type":"text","text":"”。當語言工程師把更多的操作問題推到運行時中時,當然,他們需要根據特定的目標或組織需求對運行時進行定製,而非嘗試編寫一種通用語言。換言之,隨着每種新語言適應其各自的利基市場,在語言運行時(和類型檢查器)中會出現明顯的碎片化現象。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"雖然存在一些運行時碎片,但你在用戶空間代碼中看到與此相反的趨勢:用這些不同的語言編寫的程序將開始更接近於彼此,因爲他們本質上變得更數學化了。數學表達式在某種意義上將成爲用戶空間代碼的可移植“通用語言”,尤其是當非數學問題被推到相應語言的運行時。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這種預言更容易被證僞。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"原文鏈接:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"https:\/\/www.haskellforall.com\/2021\/04\/the-end-of-history-for-programming.html"}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章