Borgo 是一个新的编程语言,用Rust语法翻译成Go.
即拥有Rust完美的语法,同时又有Go的简洁性,可以复用Go的生态、协程、跨平台等特性,还不需要Rust复杂的生命周期、所有权等概念。
Go的缺点
Go唯一的缺点就是太简洁,特别是if err != nil这种写法,写起来很繁琐,而且Go的错误处理是通过返回值来处理的,不够优雅。
Rust的缺点
Rust的缺点就是上手门槛极高,所有权、生命周期、借用等概念让很多初学者望而却步,而且Rust的编译速度也很慢,还特别费磁盘
完美的语法+简洁性的组合:Borgo
Rust语法堪称编程语言中的完美形态:
- 类型推导, 哪怕返回值也可以推导
- 模式匹配, match语法非常强大,很适合编写复杂的逻辑,更加严谨
- 宏系统,可以自定义宏,可以实现很多高级的功能
- 无GC,内存安全,线程安全
- async/await内置支持,特别是在select场景下,能完美解决异步编程的协同问题
- 无运行时,可以直接编译成二进制文件,跨平台
Go就是语法过于简单,但是Go的编译和跨平台没有对手,而且Go的协程也是非常好用的。
Borgo就是将Rust的完美语法翻译成Go,引入了几个关键的语法:
代数类型系统和模式匹配
use fmt
enum NetworkState {
Loading,
Failed(int),
Success(string),
}
let msg = match state {
NetworkState.Loading => "still loading",
NetworkState.Failed(code) => fmt.Sprintf("Got error code: %d", code),
NetworkState.Success(res) => res,
}
用Option<T>替代 nil的返回值
Go的写法:
import (
"fmt"
"os"
)
key, ok := os.LookupEnv("HOME")
if ok {
fmt.Println("home dir:", key)
} else {
fmt.Println("Not found in env")
}
Borgo的写法:
// import packages from Go stdlib
use fmt
use os
let key = os.LookupEnv("HOME")
match key {
Some(s) => fmt.Println("home dir:", s),
None => fmt.Println("Not found in env"),
}
用Result<T,E>来替代 if err != nil
go的写法:
import (
"fmt"
"os"
)
f, err := os.Open("filename")
if err != nil {
fmt.Println("error:", err)
return
}
Borgo的写法:
use fmt
use os
let f = os.Open("filename")
match f {
Ok(file) => {
// do something with file
},
Err(e) => fmt.Println("error:", e),
}
用先进的select来控制协程的协同
use fmt
use time
fn main() {
let (tx1, rx1) = Channel.new()
let (tx2, rx2) = Channel.new()
....
select {
// in Go:
// case a := <- rx1:
let a = rx1.Recv() => {
fmt.Println("got", a)
},
let b = rx2.Recv() => {
fmt.Println("got", b)
},
}
}
更多的实例可以参考Borgo的官方文档。
实战一个小项目
为了证明Borgo的实用性,我们来实战一个小项目,实现一个简单的IRC服务器。
Go代码实现
Borgo代码实现
总结
Borgo算是一个很不错的尝试,而且看到未来可能会自己提供编译器,编译成wasm,这样可以降低Rust的上手门槛
缺点就是对go的原生语法支持不够友好,比如要做[]byte的静态初始化, 还有就是match对多个返回值还是处理不正确 。
当前的编译器给出的错误信息也不够友好,不过这些都是可以改进的。
不建议在生产环境中使用,但是可以作为一个学习Rust的一个很好的工具,可以让你更加深入的理解Rust的语法。