迄今最簡潔的系統級程式語言:Nolang 全面解析
今天為大家介紹一款極簡的系統級程式語言——Nolang。其設計哲學只有一個字:「簡」。
Nolang 是一款沒有垃圾回收機制(GC)、具備記憶體安全性、且語法極度簡潔的系統級程式語言。

不多說廢話,直接看程式碼範例。
Hello Word 範例:無需 main 函數
print('hello word')
無需撰寫 main 函數,print 會自動換行。字串使用單引號,無需按 Shift 鍵,直接按鍵即可輸出。此設計完全考量了開發效率。
變數定義:簡潔的語法
// 定義一個名為a,類型為str的變量a = 'abc'// 定義一個名為i64,類型為i64的變量i64a u32
變數名稱若與型別一致,可省略型別宣告;若為零值,甚至可省略賦值。這些設計乍看違反常規,但熟練後極為順手。
字串拼接:使用連字號
// 定義一個名為a-b-c,類型為str的變量a-b-c = 'abc'// 字符串拼接a-b-c-d = 'abc' - 'c'
變數名稱以連字號 - 連接,在許多系統中被視為一個單詞,便於 TAB 自動補全。字串拼接同樣使用 -,回歸連字符的本意。此設計思路清晰明確。
模組引用:極簡的 # 語法
// 標準庫不用顯式引用// # std/math// 本地模塊# /src/utils.greet// 網絡模塊# github.com/lizongying/nolang/test2/utils.greet greet2greet('World')greet2('World')// 標準庫的函數可以直接使用b = sin(1.0)
# 符號既不佔用關鍵字,又極為簡便。別名只需一個空格即可指定。相比那些動輒 import 一長串的語言,Nolang 的模組引用顯得格外清爽。
套件設定:約定優於配置
nolang.jsonc
{"name": "test1","version": "0.1.0","description": "A new Nolang project","keywords": ["nolang"],"author": "lizongying","email": "lizongying@msn.com","organization": "lizongying","repository": "https://github.com/lizongying/nolang","homepage": "https://lizongying.github.io/nolang","license": "MIT","workspace": "../../","dependencies": {"github.com/lizongying/nolang/test1": "v0.1.0","github.com/lizongying/nolang/test2": "v0.1.0",},"compiler": {"version": "0.1.0",},"output": "./dist","ignore": [],}
配置檔極簡,約定優於配置。開箱即用,學習負擔極低。
工作空間:多套件管理
workspace.jsonc
{"test1": "./example/test1","test2": "./example/test2",}
輕鬆實現多套件管理。測試與開發本地套件非常方便,workspace.jsonc 可上傳至 Git 版本控制。
流程控制:統一語法
// 一直循環執行! {}// 限定執行次數10 * {}// 遍歷i <- (a..b] { }// 內部無條件執行x == 1 {b = 2}i <- (a..b] { // continue *}i <- (a..b] { // break**}i <- (a..b] { // return...}
for、while 等迴圈語法統一,不佔用任何關鍵字。此設計讓迴圈與條件判斷顯得異常簡潔清爽。
區間語法:視覺化範圍
以vec為例
[]t[..][]t[..)[]t(..][]t(..)[]t[n0..][]t[n0..)[]t(n0..][]t(n0..)[]t[..n1][]t[..n1)[]t(..n1][]t(..n1)[]t[n0..n1][]t[n0..n1)[]t(n0..n1][]t(n0..n1)
同時支援陣列、向量、字串、數字,以及 for、match 等語句。例如 i <- [a..b) 清楚表示包含 a 但不包含 b。視覺化的區間語法一目了然。
列舉:特殊語義
// red=0, green=1, blue=2color {red,green,blue,}// 在普通方法中,a,b,c 實際是定義的a=0,b=1, c=2... 這是和其他語言不一致的地方。// 所以正常不能用逗號的方式定義多個變量// 這是一個特殊枚舉, 可以有類型,有逗號, 有別名enum-name {a t,b u,c v,}// 注意這是一個普通的struct,多個字段沒有逗號struct-name {a tb uc v}
請注意:普通列舉中的逗號具有特殊含義,不能用來定義多個變數。此為一個小陷阱,但一旦熟悉,邏輯便非常清晰。列舉與結構體的區別一目了然:列舉使用逗號,結構體則否。
介面:精妙的多型設計
```nolang
// 定義接口
json {
to-json()
}
// 接口默認實現
json.to-json() {
}
// 接口實現
user json {
name str
age i64
}
// 重寫 調用父實現
user.to-json() {
// 父實現
..to-json()
}
user.other() {
// 當前實現
.to-json()
// 父實現..to-json()
}
介面的設計極為精妙:定義介面、提供預設實作、衍生實作,最後還能重新覆寫。這種多型的實現方式,既保持了語言的簡潔性,又提供了極強的擴充能力。
