奧推網

選單
科技

“我最想要的六種程式語言!”

譯者 | 彎月出品 | CSDN(ID:CSDNnews)

本文記載了我個人對程式語言的一些想法。我認為,這些都是技術上可行的,之所以沒有出現,只不過是“沒那麼多人想要”而已。也許這些功能都已經存在了,畢竟我只知道我學過的語言。

第一種:基於契約的語言

契約就是程式碼中的謂詞,通常以函式的形式出現,並像其他斷言語句一樣處理。從銀行賬戶中取款的示例如下:

method withdraw(amnt: int)requires amnt <= self。balanceensures self。balance >= 0{self。balance -= amnt;}

Eiffel語言曾經是標準的契約語言,但從上世紀九十年代中,就被人們遺棄了。現在唯一的主流契約語言是Clojure。大多數語言都有契約庫,也就是說,這些語言並不能很好地使用契約。例如下面這個 is_sorted(l) 謂詞:

forall i, j in 0。。len(l):i < j => l[i] <= l[j]

大多數語言都有 all 和 any 函式,但並不允許對多個元素進行量化,而且基本上沒有任何語言支援隱含運算子(因為隱含運算子在程式設計中幾乎沒有用處)。我希望看到一種語言,能夠將契約很好地整合到語法中。至少,前置條件、後置條件和內聯斷言都應該有專用的語法。還需要能夠標記和重用謂詞的能力,以及處理“正交”謂詞(只有當A‘的前置為真時,才檢查A的後置),等等。

還有工具的整合!Eiffel的一項很好的功能就是利用契約來推斷測試。如果有契約,就可以透過fuzzer迅速生成整合測試。Clojure的Spec的功能與此類似。

第二種:支援語義關係的語言

繼承和介面是類之間的關係。那麼函式之間有什麼關係?例如下面這兩個函式:

def window1(l, n):if len(l) < n:return []out = []for intervals in range(len(l) - (n - 1)):window = l[intervals:(intervals+n)]out。append(prod(window))return out

def window2(l, n):if len(l) < n:return []out = []val = prod(l[0:n])for i in range(n, len(l)):out。append(val)val *= (l[i] / l[i-n])out。append(val)return out

這兩個函式用於計算列表 l 的滾動乘積,因此 window1([1, 2, 3, 4, 5], 2) == [2, 6, 12, 20]。window2是window1的最佳化版,對於每個輸入,其輸出應該與window1相同。這一點應該能在語言中體現出來,工具也應該能檢查這兩個函式的輸出結果相同,並執行效能測試,看看是否最佳化版確實更快。

我還可以想出其他關係。A’是類A的可測量版本。g 是一個反函式,使得 f(g(x)) == x。P‘是P的正交子型別,但不是里氏子型別。UML有類似於“traces”、“refines”、“generalizes”等關係, 因此程式語言中也可以存在類似的關係。重點是,我希望能在語言層面表達這些關係,從而讓程式語言能利用這些關係。

這些關係也可以用於契約,比如用於保留/轉換/擴充套件契約的關係。很常見的一種就是“繼承的方法有更不嚴格的前置條件和更嚴格的後置條件”。還有什麼其他關係?

第三種:一切都是圖

Lisp:一切都是列表。

Bash:一切都是字串。

Smalltalk:一切都是物件。

APL:一切都是陣列。

圖是一種很常見的資料結構,但並沒有哪種語言是“一切都是圖”的語言。實際上,幾乎沒有哪種語言的標準庫會支援圖!這可能是因為圖是一種非常複雜的資料結構。你知道連結串列有多煩人嗎?圖比連結串列麻煩1000倍。

儘管如此,我還是希望看到有人嘗試一下!比如,鍵值對映用有向圖模擬。

第四種:更好的計算語言

我對於J愛恨交加。語言本身有很多讓我抓狂的地方,但我依然要用它,因為這是唯一接近於桌面計算器的語言。當需要在專案中進行快速計算時,我關心兩點。第一,擊鍵次數。下面是在Python中計算階乘的乘積的方法:

import mathprod([math。factorial(x) for x in l])

太麻煩了!在J語言中非常簡單,只需要 * / ! l,擊鍵次數少一個數量級。在需要試驗各種公式時,擊鍵次數就很重要了。但是J語言中“一切都是陣列”,這就限制了它作為計算器的潛力。它沒辦法很好滴處理字串、JSON、集合或雜湊表,日期操作非常繁瑣,對於組合問題也束手無策,等待。我希望有一種語言能滿足一切需求。最好還能給運算子加上名稱空間。

我希望計算器擁有的另一個特性就是內建的響應式程式設計,大概就是一種文字程式語言和Excel的結合體。我希望能實現下面的功能:

input = 1out1: input + 1#out1 is now 2input = 4#out1 is now 5out2: out1。replace(+, -)#out2 is now 3# let’s pull an APLinput = 4 2#out1 is 5 3#out2 is 3 1

當然,這會非常難學,但我已經續學過了許多奇怪但強大的語言。互動式計算非常常用,我學了很多知識來完成這項工作。

……或許我應該安心使用Excel。

第五種:真正的動態型別語言

(有人會說,Smalltalk就是百分百的動態型別語言)

靜態型別非常好!靜態型別語言有很多很酷的東西,但動態型別語言並非如此。許多研究都在朝著給動態型別語言新增型別的方向努力。我認為,動態型別本身也有許多有趣的方向可以嘗試。例如,可以在執行時生成新的型別!將此功能與契約結合,就可以給變數新增約束,例如:

type Interval(x, y) x <= self <= y;}var i: Interval(1, 10) = 3i += 7 #oki += 1 #error!

很酷吧?我還不知道這個功能是否有用(也許只是類的語法糖),但它依然很有意思。我想看看人們會怎麼用它。

我還希望能夠在執行時更改函式定義。在我看來,一個程式把其他程式作為輸入讀入再執行,然後我還要去實驗該程式在特定狀況下的行為,這簡直就是噩夢。我希望能實現超程式設計。

第六種:將圖形介面作為首要功能來支援的語言

我好懷念VB6。

原文地址:https://buttondown。email/hillelwayne/archive/six-programming-languages-id-like-to-see/