写点什么

Rust 编写的 Borgo 语言带来了代数数据类型和更多功能

  • 2024-06-04
    北京
  • 本文字数:1920 字

    阅读完需:约 6 分钟

Rust 编写的 Borgo 语言带来了代数数据类型和更多功能

Borgo 是一种静态类型的语言,可以编译成 Go 语言,并在努力与现有的 Go 生态系统实现互操作。Borgo 语言为 Go 语言添加了代数数据类型、模式匹配、Option 和 Result 类型,以及很多受 Rust 启发的语法。Borgo 的编译器本身是用 Rust 实现的。


Borgo 的主要贡献者对 Borgo 的主要特征进行了解释:


我想要一种编写应用程序的语言,它比 Go 更具表现力,但比 Rust 更简单。

Go 虽然简单明了,但我经常希望它能提供更多的类型安全性。Rust 非常好用(至少对于单线程代码来说是这样),但它过于宽泛和复杂,有时甚至让人感到痛苦。

Borgo 是一种新的语言,可以转换成 Go 语言。它与现有的 Go 软件包完全兼容。

Borgo 语法类似于 Rust,带有可选的分号。


Go 因其简单、高效和对并发性的处理而迅速受到许多开发人员的欢迎。Go 的设计也有利于快速编译。截至 2024 年 5 月,该语言在 TIOBE 指数中排名第 8 位。然而,开发人员经常指责 Go 在设计上是弱类型语言的缺点。Ian Lance Taylor 是 Go 的主要贡献者,他将弱类型视为一种特性而非缺陷:


Go 故意使用弱类型系统,并且有很多可以用其他语言表达但不能用 GO 表达的限制。Go 通常鼓励通过编写代码来进行编程,而不是通过编写类型来进行编程。


然而,许多经验丰富的 Go 开发人员已经表示了对丰富类型系统的兴趣。例如,一位 Reddit 用户提到:


错误作为值是好的,但是缺少求和(sum)类型却会造成伤害。

缺少返回错误的语法糖会导致样板代码。

缺乏适当的类型定义意味着我不能随心所欲地使用类型安全性。


Borgo 语言的语法似乎在很大程度上受到了 Rust 的启发,在努力保持与现有 Go 库兼容性的同时,Borgo 为 Go 添加了关键的语言特性。下面的代码演示了 Borgo 的代数数据类型和模式匹配:


use fmtenum NetworkState<T> {    Loading,    Failed(int),    Success(T),}struct Response {    title: string,    duration: int,}fn main() {    let res = Response {        title: "Hello world",        duration: 0,    }    let state = NetworkState.Success(res)    let msg = match state {        NetworkState.Loading => "still loading",        NetworkState.Failed(code) => fmt.Sprintf("Got error code: %d", code),        NetworkState.Success(res) => res.title,    }    fmt.Println(msg)}
复制代码


下面的代码示例演示了 Borgo 受 Rust 启发的 ResultOption 类型( strconv.Atoi 返回 Option<int>  类型,Reader.ReadString返回 Result<string, error> ):


use bufiouse fmtuse math.randuse osuse strconvuse stringsuse timefn main() {    let reader = bufio.NewReader(os.Stdin)    let secret = rand.Intn(100) + 1    loop {        fmt.Println("Please input your guess.")        let text = reader.ReadString('\n').Unwrap()        let text = strings.TrimSpace(text)        let guess = match strconv.Atoi(text) {            Ok(n) => n,            Err(_) => continue,        }        fmt.Println("You guessed: ", guess)        if guess < secret {            fmt.Println("Too small!")        } else if guess > secret {            fmt.Println("Too big!")        } else {            fmt.Println("Correct!")            break        }    }}
复制代码


Borgo 还允许使用 操作符:


use fmtuse iouse osfn copyFile(src: string, dst: string) -> Result<(), error> {    let stat = os.Stat(src)?    if !stat.Mode().IsRegular() {        return Err(fmt.Errorf("%s is not a regular file", src))    }    let source = os.Open(src)?    defer source.Close()    let destination = os.Create(dst)?    defer destination.Close()    // 忽略复制的字节数    let _ = io.Copy(destination, source)?    Ok(())}
复制代码


由于 Borgo 的编译器是用 Rust 编写的,开发人员需要用 cargo 来编译 Borgo 的源文件:


$ cargo run -- build
复制代码


编译器将生成.go 文件,这些文件可以使用常用的 Go 工具链来运行:


# 如果需要,生成一个 go.mod 文件# $ go mod init foo$ go run .
复制代码


最近,来自 Reddit 上的开发者的反应总体上是积极的,其中一位开发者 表示:


这几乎解决了我在工作中编写 Go 代码时最不喜欢的事情,我希望——至少——这些压倒性的积极回复(按照 HN 的标准——甚至考虑到典型的 Rust 偏见!)能够激励 Go 的维护人员考虑 / 优先考虑其中的一些特性。


Borgo 语言特性的完整列表可以在在线文档和 Borgo 的游乐场中找到。


原文链接:

https://www.infoq.com/news/2024/05/borgo-adds-types-to-go/

2024-06-04 08:004912

评论

发布
暂无评论
发现更多内容

文盘Rust -- 领域交互模式如何实现

TiDB 社区干货传送门

开发语言

TiDB Lightning在数据迁移中的应用与错误处理实践

TiDB 社区干货传送门

迁移 管理与运维 6.x 实践

TiDB与MySQL的模糊查询大小写

TiDB 社区干货传送门

开发语言

6.0体验:TiKV 重启后 Leader 均衡加速

TiDB 社区干货传送门

管理与运维 新版本/特性解读 6.x 实践

TiDB Sysbench 性能对比测试报告 - v5.1.4 对比 v6.0.0 DMR

TiDB 社区干货传送门

6.x 实践

TiDB 集群一次诡异的写入慢问题排查经历

TiDB 社区干货传送门

故障排查/诊断

TiDB 冷热存储分离解决方案

TiDB 社区干货传送门

管理与运维 版本测评 6.x 实践 大数据场景实践

TiDB 6.0 Book Rush | TiDB 和 Python 的 CRUD 应用开发实践

TiDB 社区干货传送门

6.x 实践

一次SSD磁盘寿命耗尽导致的TiDB集群写入变慢问题处理

TiDB 社区干货传送门

故障排查/诊断

一次断电故障引起TiDB无法启动的问题带来的几点思考

TiDB 社区干货传送门

管理与运维 故障排查/诊断

TiCDC系列分享-02-剖析同步模型与基本架构

TiDB 社区干货传送门

迁移 备份 & 恢复 大数据场景实践 实时数仓场景实践 数据中台场景实践

基于 TiDB v6.0 部署两地三中心

TiDB 社区干货传送门

实践案例 6.x 实践

TiDB 生态工具 -- TiUniManager(原 TiEM)v1.0.0 体验

TiDB 社区干货传送门

6.x 实践

MySQL正常执行的SQL在TiDB中变慢了

TiDB 社区干货传送门

管理与运维 故障排查/诊断

基于tidbV6.0探索tiflash在多标签组合场景下的使用

TiDB 社区干货传送门

实践案例 6.x 实践

论分布式数据库TiDB架构的“存”与“算”

TiDB 社区干货传送门

数据库架构设计

TiDB v5.4.0 与 v6.0.0 的 sysbench 性能对比

TiDB 社区干货传送门

性能测评 6.x 实践

TiCDC系列分享 Open API与业务系统集成

TiDB 社区干货传送门

应用适配 6.x 实践

tiflash 6.0 on K8s 扩容与新特性实践

TiDB 社区干货传送门

版本测评 安装 & 部署 新版本/特性解读 扩/缩容 6.x 实践

TiKV 节点重启后业务恢复速度(leader 平衡速度)v6.0 vs v5.1.2对比测试

TiDB 社区干货传送门

版本测评 6.x 实践

TiDB 6.0: 统计信息优化改进

TiDB 社区干货传送门

管理与运维 新版本/特性解读 6.x 实践

TiDB 6.0 新特性解读 | 离线包变更

TiDB 社区干货传送门

6.x 实践

排查分析Empty regions 较大原因

TiDB 社区干货传送门

性能调优 实践案例 集群管理 管理与运维

TiDB HTAP特性的应用场景简析

TiDB 社区干货传送门

数据库架构设计

关于HTAP与HSAP

TiDB 社区干货传送门

数据库架构设计

基于tidbV6.0探索索引优化思路

TiDB 社区干货传送门

实践案例 6.x 实践

TiDB库表设计和使用规范

TiDB 社区干货传送门

管理与运维

TiDB 6.0: 让 TSO 更高效

TiDB 社区干货传送门

实践案例 性能测评 新版本/特性解读 6.x 实践

初体验之rawkv learner recover灾备切换

TiDB 社区干货传送门

内存悲观锁原理浅析与实践

TiDB 社区干货传送门

版本测评 新版本/特性解读 6.x 实践 TiKV 底层架构

TiCDC系列分享-01-简述产生背景及使用概况

TiDB 社区干货传送门

迁移 安装 & 部署 扩/缩容 应用适配 大数据场景实践

Rust 编写的 Borgo 语言带来了代数数据类型和更多功能_编程语言_Bruno Couriol_InfoQ精选文章