微軟近期推出了一款全新的編程語(yǔ)言 Bosque,該語(yǔ)言參考了 TypeScript 的語(yǔ)法與類型,還有?ML 和 Node/JavaScript 的語(yǔ)義。作者微軟計(jì)算機(jī)科學(xué)家?Mark Marron致力于消除編程過(guò)程中出現(xiàn)的各種復(fù)雜情況,創(chuàng)造出了他認(rèn)為超越主流結(jié)構(gòu)化程序設(shè)計(jì)的?Bosque 這一語(yǔ)言。

結(jié)構(gòu)化程序設(shè)計(jì)現(xiàn)在隨處可見(jiàn),不管你用的是 C/C++,還是 Java、Python 與 Golang 等編程語(yǔ)言,在開發(fā)過(guò)程中使用的基本都是這一程序設(shè)計(jì)思想,它最初是為了替換掉程序中弊大于利的 goto 語(yǔ)法而產(chǎn)生的。研究者使用結(jié)構(gòu)化程序設(shè)計(jì)思想中的循環(huán)、順序與選擇等設(shè)計(jì),最終完全替換掉了 goto 指令,并且這樣的編程思想也一直流行至今。
Bosque 是隨著?Mark 發(fā)表的論文《Regularized Programming with the BOSQUE Language》提出的,論文中,作者指出上世紀(jì) 70 年代興起的結(jié)構(gòu)化程序設(shè)計(jì)和抽象數(shù)據(jù)類型使得開發(fā)者可以屏蔽掉底層硬件架構(gòu)的特征,專注于編寫功能代碼,同時(shí)開發(fā)也變得更加不易出錯(cuò)。而作者在此基礎(chǔ)上,提出了一種新的程序設(shè)計(jì)思想——Regularized Programming(規(guī)范化/正則程序設(shè)計(jì)),通過(guò)避免低級(jí)循環(huán)動(dòng)作的迭代處理、用代數(shù)數(shù)據(jù)轉(zhuǎn)換操作符豐富語(yǔ)言等設(shè)計(jì),超越結(jié)構(gòu)化程序設(shè)計(jì)。
作者同時(shí)為此思想設(shè)計(jì)了全新的編程語(yǔ)言 Bosque。具體來(lái)講,現(xiàn)有的程序設(shè)計(jì)得到簡(jiǎn)化,成為規(guī)范化形式,消除了主要的不確定復(fù)雜性來(lái)源。論文基于一系列分析、運(yùn)行時(shí)與編程器開發(fā)的經(jīng)驗(yàn)與驗(yàn)證,以及針對(duì)開發(fā)人員的采訪,確定了開發(fā)過(guò)程中會(huì)出現(xiàn)的 5 個(gè)主要不確定復(fù)雜性來(lái)源:
可變狀態(tài)和邏輯幀:將可變性引入編程語(yǔ)言破壞了以單調(diào)方式推理程序的能力,這迫使程序員(和任何分析工具)需要去確定在操作之后哪些東西還是有效的,而哪些又已經(jīng)失效。同時(shí)可變代碼返回值和對(duì)參數(shù)(或其它全局狀態(tài))產(chǎn)生副作用影響程序狀態(tài),也使得需要推理每個(gè)操作的邏輯幀。
循環(huán)、遞歸和不變量:循環(huán)和遞歸是推理的最基本挑戰(zhàn),因?yàn)榇a描述了單個(gè)步驟的效果,但理解完整構(gòu)造需要對(duì)一組值的量化屬性進(jìn)行泛化,不變量提供了所需的連接,但是一般來(lái)說(shuō)這樣的計(jì)算通用技術(shù)是無(wú)法實(shí)現(xiàn)的。
不確定的行為:不確定的行為包括未定義的、在指定的或非確定的環(huán)境行為,這需要程序員或分析工具來(lái)推理和解釋所有可能的結(jié)果。例如:排序穩(wěn)定性、地圖/字典枚舉順序等。這些不確定的行為增加了開發(fā)過(guò)程的復(fù)雜性,并且隨著時(shí)間的推移,慢慢地被視為應(yīng)該被刪除的技術(shù)債。
不遵循“數(shù)據(jù)不變”:編程語(yǔ)言通常為數(shù)組/元組中的單個(gè)元素或?qū)ο?記錄中的字段提供訪問(wèn)與更新操作符,這些訪問(wèn)器/更新器在單個(gè)元素的基礎(chǔ)上執(zhí)行,導(dǎo)致程序員在多個(gè)步驟上更新對(duì)象的狀態(tài),此時(shí)通常持有的不變量在恢復(fù)之前暫時(shí)是失效的。在這些情況下,必須跟蹤和恢復(fù)的細(xì)節(jié)數(shù)量會(huì)大大增加錯(cuò)誤發(fā)生的可能性。
相等與別名:編程語(yǔ)言處于數(shù)學(xué)和工程的邊界,雖然語(yǔ)言語(yǔ)義被表述為數(shù)學(xué)概念,但是存在一些常見(jiàn)情況,例如:引用相等、按值、按引用或評(píng)估順序傳遞,這背后其實(shí)是默認(rèn)了底層是馮·諾依曼架構(gòu)。雖然看似微不足道,但這些選擇對(duì)可理解性產(chǎn)生了重大影響,比如引用相等會(huì)導(dǎo)致關(guān)于別名關(guān)系推理的復(fù)雜性,并使其它架構(gòu)的編譯變得非常復(fù)雜。
這些不確定復(fù)雜性是程序各種 bug 的來(lái)源,增加了開發(fā)者理解和實(shí)現(xiàn)應(yīng)用功能的復(fù)雜性,同時(shí)使程序自動(dòng)推理也變得非常復(fù)雜,或完全不可行。
其中,根據(jù)科技媒體?The Register 對(duì) Mark 的采訪,Mark 認(rèn)為可變狀態(tài)、循環(huán)和引用相等這三者的問(wèn)題是最突出的。
以引用相等為例,Mark 指出,當(dāng)兩個(gè)變量指向內(nèi)存中的同一個(gè)對(duì)象時(shí),問(wèn)題的復(fù)雜性就提高了,“看起來(lái)非常簡(jiǎn)單,但是一旦你在語(yǔ)義中出現(xiàn)引用相等,那么就必須不斷地考慮它和它引入的指針別名的關(guān)系。”
而最為熟悉的循環(huán)機(jī)制也帶來(lái)不小的復(fù)雜性,在 Bosque 中它被取消了,下邊是一個(gè)等同于 JavaScript 中 for 循環(huán)的例子:
//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 由規(guī)范化程序設(shè)計(jì)思想而來(lái),正是為了解決當(dāng)前結(jié)構(gòu)化程序設(shè)計(jì)中遇到的這些問(wèn)題,作者把結(jié)構(gòu)化程序設(shè)計(jì)的興起認(rèn)為是編程器與開發(fā)工具的第一個(gè)黃金時(shí)代,他相信此次提出的這規(guī)范化編程模型將大大提高開發(fā)者的工作效率、提高軟件質(zhì)量,并帶來(lái)編譯器和開發(fā)工具的第二個(gè)黃金時(shí)代。
學(xué)習(xí)Python中的小伙伴,需要學(xué)習(xí)資料的話,可以前往我的微信公眾號(hào):速學(xué)Python,后臺(tái)回復(fù):簡(jiǎn)書,即可拿Python學(xué)習(xí)資料
這里有我自己整理了一套最新的python系統(tǒng)學(xué)習(xí)教程,包括從基礎(chǔ)的python腳本到web開發(fā)、爬蟲、數(shù)據(jù)分析、數(shù)據(jù)可視化、機(jī)器學(xué)習(xí)等。送給正在學(xué)習(xí)python的小伙伴!這里是python學(xué)習(xí)者聚集地,歡迎初學(xué)和進(jìn)階中的小伙伴!
詳情查看論文與源碼:
https://www.microsoft.com/en-us/research/uploads/prod/2019/04/beyond_structured_report_v2.pdf