← 返回信息流
AI 资讯Hacker News·1 天前

Gleam 发布 v1.17.0 版本

原标题:Gleam v1.17.0 Released

速览

Gleam 是一个运行在 Erlang 虚拟机上的函数式编程语言,旨在提供类型安全和并发优势。此次发布的 v1.17.0 版本带来了新的功能更新和改进。该版本主要面向开发者群体,用于提升代码质量和开发体验。

AI 深度解读

Gleam v1.17.0 发布解读:EScript 支持、智能提示增强与性能优化

背景

Gleam 是一门专为 Erlang 虚拟机(BEAM)和 JavaScript 运行时设计的类型安全、可扩展的编程语言。它旨在结合 BEAM 的并发优势与 JavaScript 的广泛生态,同时提供编译时类型检查带来的安全性。

在 Gleam v1.17.0 发布之际,社区还迎来了首届全 Gleam 会议(Gleam Gathering)的视频回顾。该活动取得了巨大成功,被视为社区发展的重要里程碑,组织者表示下一届会议预计将于 2027 年举行。

本次 v1.17.0 版本的核心更新聚焦于提升开发体验、优化代码生成质量以及增强命令行工具的实用性,特别是针对 BEAM 平台的分发便利性进行了重大改进。

核心内容

1. BEAM 平台的 Escript 支持

在 Erlang 虚拟机上,Gleam 代码通常被编译为一系列 .beam 字节码文件。对于通过包管理器、容器或系统级工具分发的程序,这种多文件结构是标准的;但对于需要快速分享或运行的小型命令行程序而言,分发多个文件显得不够便捷。

在 JavaScript 生态中,这一问题通过“打包器”(Bundler,如 Webpack、Vite 等)解决,它将多个模块合并为单个文件,可在任何安装了 JS 运行时的环境中运行。Erlang 社区也有类似的解决方案,即 Escript。Escript 是一个包含所有预编译字节码的单文件,只要目标机器安装了 Erlang 即可直接运行。

此前,虽然 Erlang 构建工具提供了创建 Escript 的命令,但 Gleam 开发者缺乏直接的支持。v1.17.0 引入了 gleam export escript 命令,简化了这一流程:

  • 自动化流程:该命令会自动编译项目,验证是否存在有效的 main 函数,并基于编译后的字节码生成 Escript 文件。
  • 使用示例
    $ gleam export escript
    Compiling gleam_stdlib
    Compiling my_project
    Compiled in 0.48s
    Your escript has been generated to /home/louis/src/my_project/my_project.
    
    $ ./my_project
    Hello from my_project!
    
    这一功能极大地降低了 Gleam 命令行工具的分发门槛,使其更易于在用户环境中直接执行。

2. 语言服务器功能增强

本次更新显著提升了 IDE 体验,主要涉及以下三个方面的改进:

  • 高亮引用(Highlight References): 支持 textDocument/documentHighlight 功能。当光标悬停在变量上时,IDE 会高亮显示该变量的所有引用位置。例如,在函数 to_cartesian 中,悬停 vec 将高亮所有对 vec 的访问,帮助开发者快速理解数据流向。

  • 常量 Todo 表达式(Constant Todo Expressions)todo 关键字用于标记未完成但需通过类型检查的代码。过去,todo 仅用于运行时表达式;现在它支持在常量表达式中使用。

    • 编译时行为:由于常量在编译时求值,包含 todo 的常量会导致程序无法运行,但仍可进行类型检查和静态分析。
    • 代码补全增强:配合“Fill labels”代码操作,开发者可以快速补全记录构造函数中缺失的标签参数。例如,对于 Pokemon(number: 173),触发补全后会自动生成 Pokemon(number: 173, name: todo, hp: todo)
  • 记录更新悬停提示(Record Update Hovering): Gleam 使用 ..record 语法创建基于现有记录的更新副本。当在编辑器中悬停于记录更新表达式时,语言服务器现在会显示未被修改的字段列表。这避免了开发者需要跳转至类型定义才能查看剩余字段的麻烦。

    • 示例:悬停 Person(..mom, age: 61) 时,IDE 会提示未更改的字段为 name

3. 智能错误修复建议

  • 未知值导入建议(Unknown Value Import Suggestions): Gleam 鼓励使用限定名称(如 dict.fold)来明确函数来源。如果开发者忘记添加模块限定符(如直接写 fold),编译器会报错。 v1.17.0 改进了错误处理逻辑:编译器现在会在已导入的模块中搜索同名值,并给出修正建议。

    • 场景:若代码中写了 println("Hello") 但忘记加 io. 前缀,编译器会提示:Did you mean one of these: - io.println
  • 上下文感知类型打印(Context Aware Type Printing): 之前的警告信息中,类型名称仅显示其规范名称(Canonical Name),可能与代码中的别名或限定名不一致。新版本会根据代码上下文正确显示类型的限定名或别名。

    • 示例:若代码中 import user as visitor,警告信息中的类型提示将显示为 visitor.User 而非原始的 user.User,使错误信息更贴合开发者视角。

4. JavaScript 模式匹配优化

Gleam 的 case 表达式在编译为 JavaScript 时,会生成高效的决策树(Decision Tree),而非简单的线性搜索。v1.17.0 由 Daniele Scaratti 和 Gavin Morrow 进一步优化了 JS 后端代码生成:

  • 检测并移除了处理位数组(bit arrays)长度时的冗余检查。
  • 使赋值相关的代码更加紧凑。 这些优化旨在减少生成的 JavaScript 代码体积并提升运行效率。

5. 构建工具细节改进

  • 静默开发模式gleam dev 命令新增 --no-print-progress 标志。启用后,构建过程中的编译进度信息将被抑制,仅输出最终运行结果。这对于脚本集成或追求简洁输出的场景非常有用。
  • 过时依赖计数gleam deps outdated 命令现在会在输出顶部显示摘要,告知有多少个包存在新版本。
    • 示例输出1 of 12 packages have newer versions available. 这解决了以往开发者面对大量输出时难以快速判断更新数量的痛点。

关键要点

  • 分发便利性提升:新增 gleam export escript 命令,使 Gleam 程序能像 JavaScript 打包文件一样,以单文件形式在 BEAM 环境中分发和运行。
  • IDE 体验智能化
    • 支持变量引用高亮。
    • 记录更新时悬停显示未修改字段。
    • 错误提示中自动建议缺失的模块限定符。
    • 警告信息中的类型名称与代码上下文(别名/限定名)保持一致。
  • 开发工作流优化
    • todo 关键字支持常量表达式,配合代码补全功能加速原型开发。
    • gleam dev 支持静默模式,减少日志干扰。
    • 依赖检查命令提供过时包数量的摘要统计。
  • 性能优化:JavaScript 后端的模式匹配代码生成经过优化,减少了冗余检查并压缩了代码体积。

意义与影响

Gleam v1.17.0 的发布标志着该语言在工程化落地和**开发者体验(DX)**方面迈出了重要一步。

  1. 降低 CLI 工具门槛:通过引入 Escript 支持,Gleam 解决了 BEAM 平台应用程序分发“最后一公里”的问题。这使得 Gleam 作为系统级工具或 CLI 框架的竞争力显著增强,开发者可以像使用 Node.js 工具一样轻松分享和运行 Gleam 编写的命令行程序。
  2. 缩小与主流语言 DX 差距:本次更新在语言服务器功能上的投入(如上下文感知提示、智能纠错建议)表明 Gleam 团队致力于提供与 Rust、TypeScript 等现代语言相媲美的 IDE 体验。这有助于
查看原文 →gleam.run