
對應moonc版本:v0.8.0
一、MoonBit 0.8.0發布
我們很高興正式發布MoonBit 0.8.0。MoonBit是一門AI原生的編程語言,它的主要特點是高可靠,易讀和高性能。這是 MoonBit 邁向穩定、可用于生產環境的重要里程碑版本。
這次發布并非一系列零散改動的簡單集合。MoonBit 0.8 標志著項目從實驗性語言,明確邁入工程級語言與工具鏈階段:在調試能力、錯誤處理、包管理以及開發者工具等方面都有了顯著提升,尤其更適合支撐大規模代碼庫和以 Agent 為核心的開發工作流。
為什么 MoonBit 0.8 很重要?
正如許多開發者所觀察到的,Rust 通過其嚴格的語義和可驗證性,為 AI 輔助開發提供了堅實的基礎。MoonBit 在繼承類似可靠性目標的同時,更加注重顯著更快的編譯速度(在實際使用中通常比rust快一個到兩個數量級),以及面向 Agent工作流深度集成的開發工具體系。
隨著 0.8 版本的發布,這些設計目標已不再停留在抽象理念層面,而是在語言、編譯器、運行時以及IDE等各個層面得到一致體現。
重點更新:
WasmGC/LLVM/Native后端Backtrace 支持
MoonBit 的 WasmGC/native/LLVM 后端現支持在程序崩潰時,自動打印崩潰處的調用棧。并且能直接輸出對應的 MoonBit 源碼的位置,極大改善了調試體驗(以下是Native后端的調用棧示例):
RUNTIME ERROR: abort() called
/path/to/moonbitlang/core/array/array.mbt:187 at @moonbitlang/core/array.Array::at[Int]
/path/to/pkg/main/main.mbt:3 by @username/hello/out_of_idx.demo
/path/to/pkg/main/main.mbt:9 by mainAI 原生的面向 specification 支持
MoonBit 新增了declare關鍵字,可以用于聲明需要實現的類型、函數、方法等。如果declare的聲明沒有對應的實現,MoonBit 編譯器會報一個警告。declare關鍵字提供了面向 AI 的原生 specification 支持:可以用declare的形式指定需要 AI 實現的接口,并根據接口提前編寫測試。只需要把declare和測試所在的文件標記為只讀,就能防止 AI “作弊”。隨后,MoonBit 編譯器的警告信息能輔助 AI 正確地實現所有必要的接口。由于沒有實現declare只是一個警告,AI 可以漸進式地編寫、測試代碼。
社區動向:
? MoonBit 社區正在在快速增長,目前核心用戶數接近20萬(以插件下載為統計指標),生態包的數量達到4295 個,并且最近幾周增速都超過 10%。
? MoonBit 軟件工廠受到關注:,我們正在發起 「,期待社區用戶可以做出優質的大型軟件。
? 我們持續,特別期待擁有多語言背景的國際地區大使。
二、0.8更新正式內容
語言更新
1.suberror Err PayloadType語法被廢棄
用戶需要將這種定義修改成類似enum的形式:
suberror Err {
Err(PayloadType)
}
這一改動的動機是suberror Err PayloadType語法容易產生Err和PayloadType有相同 ABI 的誤解,但實際上 error type 都有自己特殊的 ABI。這一改動可以通過moon fmt自動完成遷移
2. 廢棄了推導內建 error 構造器(目前主要是Failure)的行為。
類型未知時,需要將raise Failure(..)替換成raise Failure::Failure(..),catch時同理
3. 支持了在 MoonBit 中直接調用FuncRef[_]類型的值。
這一功能可以用于在 native 后端實現動態加載函數或 JIT
4. WasmGC/LLVM/Native 后端Backtrace 支持
現在,使用wasm-gc, native后端或者llvm后端時,如果觸發panic,例如數組下標越界,對為None的Option[T]進行unwrap,try!一個會拋出錯誤的函數,或者手動調用panic函數時,在debug模式下會打印出調用棧,例如下方的函數:
fn demo(a: Array[Int], b: Array[Int]) -> Unit {
let _ = a[1]
let _ = b[2]
}fn main {
let a = [1, 2]
let b = [3]
demo(a, b)
}
以native后端為例,使用moon run main --target native,將會看到下面的調用棧:
RUNTIME ERROR: abort() called
/path/to/moonbitlang/core/array/array.mbt:187 at @moonbitlang/core/array.Array::at[Int]
/path/to/pkg/main/main.mbt:3 by @username/hello/out_of_idx.demo
/path/to/pkg/main/main.mbt:9 by main注:目前Windows系統上native和LLVM后端暫不支持此項功能。
5.新增了declare關鍵字,用于替代原本的#declaration_only屬性。declare新增了 trait 實現的支持。比如:
declare type T // declare a type to be implemented
declare fn T::f(x : T) -> Int // declare a method to be implementedstruct S(Int)
declare impl Show for S // declare an impl relation
declare impl和直接寫impl的主要區別在于declare impl在缺少 implementation 的情況下只會報警告,不影響代碼執行,所以可以跑其他功能的測試。
6. 新增了反向的 range 表達式x>..y和x>=..y
用于在for .. in循環中進行反向的迭代:
///|
test "reversed range, exclusive" {
let result = []
for x in 4>..0 {
result.push(x)
}
debug_inspect(result, content="[3, 2, 1, 0]")
}///|
test "reversed range, inclusive" {
let result = []
for x in 4>=..0 {
result.push(x)
}
debug_inspect(result, content="[4, 3, 2, 1, 0]")
}
為了讓語法更一致,正向的兩側閉合的 range 表達式的語法從x..=y遷移至x..<=y。這一改動可以通過moon fmt自動遷移
7. 禁用了在外部使用{ ..old_struct, field: .. }語法更新一個帶有priv字段的結構體的行為
8.lexmatch表達式 first match 下新增 guard 支持。
包含 guard 的 lexmatch 性能會有損失,因此推薦在快速開發過程中使用,之后再考慮是否改寫。其語法和 match 表達式中的 guard 一致
查看 https://github.com/moonbitlang/lexmatch_spec 了解更多:
lexmatch input {
("#!" "[^\n]+") if allow_shebang => ...
...
}
9.struct新增了自定義構造器的支持,語法如下:
struct S {
x : Int
y : Int
// 為 `struct` 聲明一個構造器
fn new(x~ : Int, y? : Int) -> S
}
// 實現 `struct` 的構造器
fn S::new(x~ : Int, y? : Int = x) -> S {
{ x, y }
}// 使用 `struct` 的構造器
test {
let s = S(x=1)
}
語義上:
?struct中聲明fn new即可給這個struct定義自動構造器。除了必須返回struct自身之外,自定義構造器的簽名沒有其他限制。可以使用 optional argument、拋出錯誤等。struct中的fn new(..)的參數不能寫默認值,但可以省略參數名字
? 對于有類型參數的struct,fn new可以特化類型參數,也可以給類型參數 添加trait約束。語法和普通的頂層函數聲明一樣
? 如果在struct中聲明了fn new, 則必須定義一個方法fn S::new來實現這個構造器。S::new的簽名必須和struct中的fn new完全相同
? 使用struct構造器的方式和使用一個enum構造器完全一樣。比如,在類型已知的時候,可以直接寫S(..),無需寫成@pkg.S(..)或 者@pkg.S::S(..)。不過,struct的構造器不能用于模式匹配
?struct構造器的可見性和struct字段相同。也就是說,pub struct和pub(all) struct的構造器可以在當前包外調用 ,struct和priv struct的構造器則是私有的
10.using聲明上現在可以添加標注來廢棄using創建的別名。
11. 增加了Debug特征和自動 derive 相關支持。
///|
struct Data {
pos : Array[(Int, Int)]
map : Map[String, Int]
} derive(Debug)///|
test "pos" {
debug_inspect(
{
pos: [(1, 2), (3, 4), (5, 6)],
map: { "key1": 100, "key2": 200, "key3": 300 },
},
content=(
#|{
#| pos: [(1, 2), (3, 4), (5, 6)],
#| map: {
#| "key1": 100,
#| "key2": 200,
#| "key3": 300,
#| },
#|}
),
)
}
Debug 特征是Show 特征的改進版本,用于提供更結構化和可讀的打印信息。
derive(Debug) 支持額外的 ignore 參數,它接受一個或者多個類型構造器名。在實現類型本身的打印邏輯時,它會過濾語法上相同的類型構造器,相關部分將會打印成...。 這在內部類型來自第三方包,并且沒有提供 Debug 特征的實現時非常有用。
///|
struct Data1 {
field1 : Data2
field2 : Double
field3 : Array[Int]
} derive(Debug(ignore=[Data2, Array]))
///|
struct Data2 {
content : String
}///|
test "pos" {
debug_inspect(
{ field1: { content: "data string" }, field2: 10, field3: [1, 2, 3] },
content=(
#|{
#| field1: ...,
#| field2: 10,
#| field3: ...,
#|}
),
)
}
@moonbitlang/core/debug包還提供了專門的assert_eq(a,b),在斷言失敗時,找出 a 和 b 的差異并打印在命令行中。
在未來我們將逐步遷移到Debug并棄用derive(Show),Show 特征則專注于手動實現特殊的打印邏輯,如Json::stringify。
12. 移除了將帶參數的構造器直接當作高階函數使用的行為,如果需要把構造器用作高階函數,需要寫一個匿名函數:
test {
let _ : (Int) -> Int? = Some // 已被移除
let _ : (Int) -> Int? = x => Some(x) // 正確的寫法
let _ : Int? = 42 |> Some // 管道不受影響
}
這一行為之前已通過警告的形式廢棄。注意管道運算符右側依然可以直接寫構造器,不受影響
13. 廢棄了fn上的副作用推導。
如果一 個fn實際上可能拋出錯誤或者調用async函數,就必須加上raise/async標記,否則編譯器會報一個警告。箭頭函數語法(..) => ..不受影響。因此,未來對于回調函數類的匿名函數,建議使用箭頭函數而非fn。fn可以在需要顯式標注以改善可讀性的時候使用
14. 調整了x..f()的語義,將其調整回最簡單的語義:x..f()等價于{ x.f(); x }。
之前,x..f()表達式的結果(x)可以被直接忽略。現在,編譯器會對這種情況報一個警告,需要把最后一個..f()替換成.f()或者顯式忽略結果
15. 循環的else塊關鍵字改為nobreak
for/foreach/while 循環中此前可以用elseblock 來寫明在循環正常退出時的計算結果為了更加直觀,這一關鍵字被改成了nobreak,比如:
fn f() -> Int {
for i = 0; i < 10; i = i + 1 {} nobreak {
i
}
}
這一改動可以使用moon fmt自動遷移
16. 新增了一個默認關閉的警告unnecessary_annotation
它會標記出代碼中的結構體字面量和構造器上不必要的類型標注,即那些編譯器可以通過上下文推斷出正確的類型、無需顯式指定類型的代碼
工具鏈更新
1. 正式啟用 moon.pkg 。
在對 moon.pkg 進行了一段時間的測試和改進后,我們正式啟用了 moon.pkg。舊的項目在執行 moon fmt 時將會被自動遷移到新的格式。新的項目也會直接使用 moon.pkg 作為包的配置。下面是常用配置的例子:
import {
"path/to/pkg1",
"path/to/pkg2" @alias,
}warnings = "+deprecated-unused_value"
更多詳細信息請見 moonbit 語言文檔。
2.moon test支持通過-j參數并行地運行測試。
3.moon test支持通過--outline列出所有待運行的測試。
4.moon test --index支持指定特定范圍的測試(左閉右開)
如moon test --index 0-2會運行前兩個測試(--index需事先指定測試的文件)。
5.moon install的 支持從 MoonBit 項目全局安裝可執行程序
因為moon check與moon build都可以自動安裝依賴。
moon install 的新行為類似cargo install或go install,支持用戶從包管理平臺、git 源或者本地安裝一個或多個二進制文件到全局(對應包需要支持 native 后端且 is-main 為 true),如:
moon install username/package (root 為 package 時)
moon install username/cmd/main (安裝某一個包)
moon install username/... (前綴開始所有的包)
moon install ./cmd/main (local path)
moon install https://github.com/xxx/yyy.git (自動識別 git 鏈接)更多用法可以使用moon install --help查看。
6. 現在可以在 moon.pkg 中配置
regex_backend選項來指定 lexmatch 表達式的正則使用什么后端:
options(
// 默認為 "auto",其他可選項分別為 "block", "table", "runtime"
// auto 由編譯器自主決定采用哪個后端
// block 后端性能最好,但代碼體積可能產生膨脹
// table 后端生成查表解釋執行的代碼,兼顧代碼體積和性能
// runtime 后端生成依賴標準庫中 regex_engine 的代碼,在大量使用正則的情況下,能大幅減少生成的代碼體積
regex_backend: "runtime",
)
7. moon -C 改為改變工作目錄
moon -C
以前會從對應路徑開始查找 MoonBit 項目,但是不會改變工作目錄;這與一般構建系統傳統不符。現在moon -C
會改為改變工作目錄,并且需要出現在任何子命令或參數前;同時添加了--manifest-path指向moon.mod.json用于運行路徑與源代碼路徑不同的情況
8.moon run和moon build默認使用--debug
9. 更新了.mbt.md文件在 front matter 聲明依賴的形式。
之前在 front matter 中只能聲明 module dependency,并且會將被依賴的 module 中的 package 全部導入,這會導致無法更細粒度地寫明 import 以及 package alias 會沖突的問題。在新版本中,front matter 聲明依賴的形式改成了直接寫明具體依賴的包,并且可以聲明 alias,并且需要在 module 后面寫明版本號,多次出現的 module 只需寫一次版本號即可,對標準庫的依賴不需要寫版本號。
---
moonbit:
import:
- path: moonbitlang/async@0.16.5/aqueue
alias: aaqueue
backend:
native---
10.moon new簡化了模板,更新了關于 skills 的簡單介紹。
11.moon fetch提供了一個簡單的獲取已發布包源代碼的方式
默認會保存至項目根目錄或當前路徑下的.repos,方便 Agent 閱讀源代碼學習使用方式。
12.moon fmt支持保留和折疊{ statement1; statement2 }語句之間的空行。
例如:
// 格式化前
fn main {
e()
// comment
f()g()
h()
}
// 格式化后
fn main {
e()
// comment
f()g()
h()
}
13.```moonbit現在會被自動格式化成```moonbit nocheck
在*.mbt.md文件或者文檔注釋中,對于被設置為跳過檢查的```moonbit代碼塊,格式化器會自動加上更顯式的 nocheck 標記 。
標準庫&實驗庫 更新
1.moonbitlang/async改動:
? 新增了@process.spawn,可以直接在一個TaskGroup中創建一個外部進程,并獲取該進程的 PID。TaskGroup在默認狀態下會等待該外部進程結束,在需要提前退出時會自動中止這個外部進程
? 新增了@fs.File::{lock, try_lock, unlock}方法,提供文件鎖的支持。普通的文件 IO 不受文件鎖的影響
? 新增了@fs.tmpdir(prefix~),提供創建臨時文件夾的支持
? 新增了@async.all和@async.any,語義類似Promise.all和Promise.any
? 在examples文件夾下新增了更多簡單示例和對每個示例的介紹
2.@json.inspect遷移至json_inspect
IDE 更新
1. 優化alias定義跳轉
查找alias定義時,現在除了會顯示alias定義的位置外,還會一并顯示 alias target 定義的位置:
![]()
2.moon ide hover:
moon ide新增hover子命令,用于顯示源代碼中某個符號的類型和文檔:
$ moonide hover -no-check filter -loc hover.mbt:14
test {
let a: Array[Int] = [1]
inspect(a.filter((x) => {x > 1}))
^^^^^^
```moonbit
fn[T] Array::filter(self : Array[T], f : (T) -> Bool raise?) -> Array[T] raise?
```
---
Creates a new array containing all elements from the input array that satisfy
the given predicate function.
Parameters:
* `array` : The array to filter.
* `predicate` : A function that takes an element and returns a boolean
indicating whether the element should be included in the result.
Returns a new array containing only the elements for which the predicate
function returns `true`. The relative order of the elements is preserved.
Example:
```mbt check
test {
let arr = [1, 2, 3, 4, 5]
let evens = arr.filter(x => x % 2 == 0)
inspect(evens, content="[2, 4]")
}
```
}3.moon ide rename:
moon ide新增rename子命令,用于生成符合codex apply_patch 工具格式的重命名patch,方便agent更準確快速地重構代碼。例如:
$ moon ide rename TaskGroup TG
*** Begin Patch
*** Update File: /Users/baozhiyuan/Workspace/async/src/async.mbt
@@
/// and will result in immediate failure.
("use `async fn main` or `async test` instead")
(target="native")
-pub fn with_event_loop(f : async (TaskGroup[Unit]) -> Unit) -> Unit raise {
+pub fn with_event_loop(f : async (TG[Unit]) -> Unit) -> Unit raise {
@event_loop.with_event_loop(() => with_task_group(f))
}
*** Update File: /Users/baozhiyuan/Workspace/async/src/task_group.mbt
@@
///
/// The type parameter `X` in `TaskGroup[X]` is the result type of the group,
/// see `with_task_group` for more detail.
-struct TaskGroup[X] {
+struct TG[X] {
children : Set[@coroutine.Coroutine]
parent : @coroutine.Coroutine
mut waiting : Int
@@
pub suberror AlreadyTerminated derive(Show)///|
-fn[X] TaskGroup::spawn_coroutine(
+fn[X] TG::spawn_coroutine(
- self : TaskGroup[X],
+ self : TG[X],
f : async () -> Unit,
...
關于 MoonBit :
MoonBit (https://www.moonbitlang.cn/)國內首個工業級編程語言及其配套工具鏈, 由粵港澳大灣區數字經濟研究院(簡稱“IDEA 研究院”)基礎軟件中心打造的AI原生的編程語言以及開發者平臺。通過創新框架在程序語言界形成后發優勢,在編譯速度、運行速度、體積大小上已成功領先傳統語言。
官方平臺賬號,歡迎掃碼關注
有任何事宜添加小助手微信
官網|moonbitlang.cn
知乎|@張宏波 / @MoonBit
小紅書|MoonBit月兔
Twitter|@Moonbitlang
Bilibili|MoonBit月兔
抖音|MoonBit月兔
MoonBit用戶交流群|添加小助手moonbit_helper
?關注分享在看一鍵三連 ~
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.