
自 20 世紀 40 年代以來到現在,程式設計在本質上沒有發生根本性變化。
大多數程式語言仍然遵循馮·諾依曼正規化:編寫順序指令並修改記憶體中的資料。讓我們看一個簡單的程式碼例子:
total = 0
for number in range(1, 6):
total += number
print(total) # Outputs: 15
簡單又熟悉,是不是?但是有一個問題。現代計算機的速度不再像以前那樣緩慢。相反地,它們擁有更多的核心,而我們傳統的程式設計模型並不擅長高效處理多個核心。
多核心的挑戰
我們嘗試使用併發程式語言提供的來適應。以下以 Go 的 goroutines 為程式案例:
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
numbers := []int{1, 2, 3, 4, 5}
for _, n := range numbers {
wg.Add(1)
go func(x int) {
defer wg.Done()
fmt.Printf("Processing %d\n", x)
}(n)
}
wg.Wait()
fmt.Println("All done!")
}
這些解決方案對人們會有幫助,但它們也帶來了像競爭條件、死鎖和複雜狀態管理等問題。
我們建立的正規化並非為並行執行而設計,而控制流語言本身又很難視覺化。
將會有一種不同的方法:資料流程式設計
如果我們可以用以往不同的方式編寫程式會怎麼樣?
想象一下將你的程式描述為一個由獨立節點組成的網路,這些節點相互傳遞資料 – 沒有共享狀態,只有流經系統的資料:
-
預設情況下所有操作並行執行
-
資料不可變,可防止競爭條件
-
程式結構反映資料流
-
跨多個核心的自然擴充套件
進入 Nevalang
Nevalang就是這麼做的。它是一種圍繞資料流構建的現代語言,將程式視為訊息傳遞圖,而不是指令序列:
import { fmt }
def Main(start any) (stop any) {
for_print For{Print}
wait Wait
---
:start -> 1..5 -> for_print -> wait -> :stop
}
這裡我們定義了一個Main接收start訊號和傳送stop訊號的元件。它有兩個節點:(內部帶有for_print)和。啟動時,它會建立一個數字 1-5 的流,透過列印每個數字,等待完成,然後傳送訊號。
For Print wait for_print stop
視覺化:

Nevalang 代表了程式設計的根本轉變,它採用一種自然適合並行性和視覺化的正規化,而不是對抗傳統程式設計的限制。
在 GitHub 上試用 Nevalang
程式設計的未來可能與過去大不相同。
隨著硬體的不斷發展,程式設計模型也需要不斷發展。Nevalang 向我們展示了未來的一種令人興奮的可能性。
警告:Nevalang 目前處於開發階段,尚未投入生產環境。
這是一個很酷的語言,由一小群愛好者維護的雄心勃勃的專案。
地址:https://nevalang.org/
GitHub:https://github.com/nevalang/neva
作者:聆聽音樂的魚
相關閱讀: