微軟推出新編程語言 Bosque,超越結構化程序設計

微軟近期推出了一款全新的編程語言 Bosque,該語言參考了 TypeScript 的語法與類型,還有 ML 和 Node/JavaScript 的語義。作者微軟計算機科學家 Mark Marron 致力於消除編程過程中出現的各種複雜情況,創造出了他認爲超越主流結構化程序設計的 Bosque 這一語言。

結構化程序設計現在隨處可見,不管你用的是 C/C++,還是 Java、Python 與 Golang 等編程語言,在開發過程中使用的基本都是這一程序設計思想,它最初是爲了替換掉程序中弊大於利的 goto 語法而產生的。研究者使用結構化程序設計思想中的循環、順序與選擇等設計,最終完全替換掉了 goto 指令,並且這樣的編程思想也一直流行至今。

Bosque 是隨着 Mark 發表的論文《Regularized Programming with the BOSQUE Language》提出的,論文中,作者指出上世紀 70 年代興起的結構化程序設計和抽象數據類型使得開發者可以屏蔽掉底層硬件架構的特徵,專注於編寫功能代碼,同時開發也變得更加不易出錯。而作者在此基礎上,提出了一種新的程序設計思想——Regularized Programming(規範化/正則程序設計),通過避免低級循環動作的迭代處理、用代數數據轉換操作符豐富語言等設計,超越結構化程序設計。

作者同時爲此思想設計了全新的編程語言 Bosque。具體來講,現有的程序設計得到簡化,成爲規範化形式,消除了主要的不確定複雜性來源。論文基於一系列分析、運行時與編程器開發的經驗與驗證,以及針對開發人員的採訪,確定了開發過程中會出現的 5 個主要不確定複雜性來源:

  • 可變狀態和邏輯幀:將可變性引入編程語言破壞了以單調方式推理程序的能力,這迫使程序員(和任何分析工具)需要去確定在操作之後哪些東西還是有效的,而哪些又已經失效。同時可變代碼返回值和對參數(或其它全局狀態)產生副作用影響程序狀態,也使得需要推理每個操作的邏輯幀。
  • 循環、遞歸和不變量:循環和遞歸是推理的最基本挑戰,因爲代碼描述了單個步驟的效果,但理解完整構造需要對一組值的量化屬性進行泛化,不變量提供了所需的連接,但是一般來說這樣的計算通用技術是無法實現的。
  • 不確定的行爲:不確定的行爲包括未定義的、在指定的或非確定的環境行爲,這需要程序員或分析工具來推理和解釋所有可能的結果。例如:排序穩定性、地圖/字典枚舉順序等。這些不確定的行爲增加了開發過程的複雜性,並且隨着時間的推移,慢慢地被視爲應該被刪除的技術債。
  • 不遵循“數據不變”:編程語言通常爲數組/元組中的單個元素或對象/記錄中的字段提供訪問與更新操作符,這些訪問器/更新器在單個元素的基礎上執行,導致程序員在多個步驟上更新對象的狀態,此時通常持有的不變量在恢復之前暫時是失效的。在這些情況下,必須跟蹤和恢復的細節數量會大大增加錯誤發生的可能性。
  • 相等與別名:編程語言處於數學和工程的邊界,雖然語言語義被表述爲數學概念,但是存在一些常見情況,例如:引用相等、按值、按引用或評估順序傳遞,這背後其實是默認了底層是馮·諾依曼架構。雖然看似微不足道,但這些選擇對可理解性產生了重大影響,比如引用相等會導致關於別名關係推理的複雜性,並使其它架構的編譯變得非常複雜。

這些不確定複雜性是程序各種 bug 的來源,增加了開發者理解和實現應用功能的複雜性,同時使程序自動推理也變得非常複雜,或完全不可行。

其中,根據科技媒體 The Register 對 Mark 的採訪,Mark 認爲可變狀態循環引用相等這三者的問題是最突出的。

以引用相等爲例,Mark 指出,當兩個變量指向內存中的同一個對象時,問題的複雜性就提高了,“看起來非常簡單,但是一旦你在語義中出現引用相等,那麼就必須不斷地考慮它和它引入的指針別名的關係。”

而最爲熟悉的循環機制也帶來不小的複雜性,在 Bosque 中它被取消了,下邊是一個等同於 JavaScript 中 for 循環的例子:

//Functor (Bosque)   var a = List[Int]@{...};  //Pre: true   var b = a.map[Int](fn(x) => x*2);  //Post: List[Int]::eq(fn(x, y) => y == x*2, a, b) 

Bosque 由規範化程序設計思想而來,正是爲了解決當前結構化程序設計中遇到的這些問題,作者把結構化程序設計的興起認爲是編程器與開發工具的第一個黃金時代,他相信此次提出的這規範化編程模型將大大提高開發者的工作效率、提高軟件質量,並帶來編譯器和開發工具的第二個黃金時代。

詳情查看論文與源碼:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章