Gleam v1.14 版本发布解析:编译器、构建工具与语言服务器的新特性与修复全览

发布时间:2026/11/7 17:01:34

Gleam v1.14 版本发布解析:编译器、构建工具与语言服务器的新特性与修复全览 Gleam v1.14 版本发布解析编译器、构建工具与语言服务器的新特性与修复全览【免费下载链接】gleam⭐️ A friendly language for building type-safe, scalable systems!项目地址: https://gitcode.com/GitHub_Trending/gl/gleam本篇文章围绕 Gleam 语言编译器 v1.14 的官方发布说明见 changelog/v1.14.md展开系统梳理该版本在编译器、构建工具、语言服务器与格式化器四大模块的新特性、行为变更与 Bug 修复并结合本仓库Cargo.toml 工作区下的 compiler-core、compiler-cli、language-server 等 crate的源码实现进行印证。读完本文你将掌握 v1.14 中external外部类型注解、gleam deps outdated新命令、常量中的记录更新语法等关键能力并了解代码生成、类型推断、代码动作等底层实现细节。版本背景与发布节奏v1.14.0 正式版本发布于 2025-12-25发布日期前经历三轮候选版本Release Candidate迭代从 changelog 可以看出其演进节奏v1.14.0-rc12025-12-15集中引入绝大部分新特性包括编译器、构建工具、语言服务器与格式化器的各项增强v1.14.0-rc22025-12-19修复格式化器误删自定义类型external属性、无标签字段记录更新产生非法代码等问题v1.14.0-rc32025-12-21修复 JavaScript 目标上使用限定语法对无字段变体做相等比较时生成非法代码的问题v1.14.02025-12-25修复 JavaScript 目标上 guard 子句中使用 bit array 段可能导致错误代码生成的问题。从源码结构看本仓库是一个包含 compiler-core、compiler-cli、language-server、compiler-wasm 等多个 crate 的 Cargo 工作区v1.14 的每项变更都能在上述模块中找到对应实现与测试如 compiler-core/src/erlang/tests、compiler-core/src/javascript/tests 下的快照测试。编译器核心改进1.external注解支持外部类型v1.14 最值得关注的特性之一是external注解从函数扩展到外部类型external types。它允许用户将一个 Gleam 外部类型定义直接映射到特定的 Erlang 或 TypeScript 类型上例如标准库中的dict.Dict现在可以写作external(erlang, erlang, map) external(javascript, ../dict.d.mts, Dict) pub type Dict(key, value)这意味着Dict类型在 Erlang 目标上对应erlang:map在 JavaScript 目标上对应dict.d.mts模块导出的Dict类型。该特性的实现贯穿分析阶段在 compiler-core/src/analyse.rs 中可以看到对外部实现的解析与校验逻辑如external_erlang、external_javascript的读取与assert_valid_javascript_external校验并在 Erlang 代码生成的测试中提供了对应用例见 compiler-core/src/erlang/tests/custom_types.rs 中的annotated_external_type与annotated_external_type_used_in_function测试以及快照 annotated_external_type.snap。注意该特性也带来了相关修复——此前格式化器会误删自定义类型上的external属性rc2 修复因此在使用时需确保 formatter 版本为 v1.14 及以上。2. 常量类型推断的容错性类型推断现在对常量是容错的fault tolerant当编译器在为常量做类型标注时不会再在第一个错误处停止而是尽量继续分析后续内容。同样的容错改进也应用到了自定义类型变体的字段定义出现错误时的分析流程保证一次编译能收集到更多诊断信息。3. bit array 模式匹配的优化与修复v1.14 对 bit array 做了多项工作字符串前缀别名的优化在 Erlang 目标上对字符串前缀做别名的模式pattern aliasing会生成更快的代码干扰剪枝interference-based pruning扩展v1.13 引入的干扰剪枝优化原文档中链接了官方博客说明在 v1.14 中扩展到int 段。除了性能提升这还让编译器能标记更多分支为不可达例如case bits { a - 0 97 - 1 // ^- This branch is unreachable because its equal to a. 0b1:1, _:1 - 2 0b11:2 - 3 // ^- This branch is unreachable because the branch before it already covers it. _ - 99 }Bug 修复修复了 JavaScript 目标上 guard 子句使用 bit array 段时可能生成错误代码的问题修复了编译器在 JavaScript 目标上错误优化掉带计算尺寸如_:size(wibble - wobble)的 bit array 模式中的运行时尺寸检查修复了浮点字面量中十进制点后跟下划线时在 JavaScript 目标生成非法代码的问题。4. 穷尽性检查Exhaustiveness增强int 与 float 的穷尽性检查现在能正确处理带下划线的数字如10与1_0实际相等导致的不可达分支float 的穷尽性检查还能识别科学计数法与尾随零导致的不可达情况如100与1e2错误消息中的缺失模式与“添加缺失模式Add missing patterns”代码动作不再按字典序排序而是遵循变体定义的声明顺序——由于程序员通常把“相关”变体写在一起这能减少插入缺失模式后的重排。5. 错误诊断体验提升模式数量不匹配的错误定位当 case 匹配的模式数量错误时编译器现在精确定位到错误位置而不是标记整个分支case wibble { 0, _ - 1 ^^^^ Expected 1 pattern, got 2 0 | - 1 ^ I was expecting a pattern after this }小写 bool 模式true/false写错为True/False这类错误不再是语法错误而是进入分析阶段处理从而让整个模块都能被分析而不是停在语法错误处detached doc comment 警告当 doc 注释与定义之间隔着一条普通注释时编译器会发出警告/// This documentation is not attached // This is not a doc comment /// This is actual documentation pub fn wibble() { todo }会产生如下警告信息提示“将普通注释移到 doc 注释上方”warning: Detached doc comment ┌─ src/main.gleam:1:4 │ 1 │ /// This documentation is not attached │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This is not attached to a definition This doc comment is followed by a regular comment so it is not attached to any definition. Hint: Move the comment above the doc comment该警告的实现在 compiler-core/src/warning.rs 与 compiler-core/src/parse.rs 中并有对应的快照测试 detached_doc_comment.snap。空模块发布拦截当模块不包含任何公开定义时编译器会发出警告并阻止包含空模块的包发布到 Hex。6. 记录构造函数比较与常量中的记录更新记录构造函数比较恒为False由于非零元数的记录构造函数在代码生成时被实现为匿名函数比较它们恒为False编译器也随之移除了此前可能产生的误报“冗余比较”警告pub type Wibble { Wobble(String) } pub fn main() { echo Wobble Wobble // False }常量中的记录更新语法记录更新record update语法现在可用于常量定义非常适合“基础配置 派生配置”的场景pub const base_http_config HttpConfig( host: 0.0.0.0, port: 8080, use_tls: False, log_level: Info, ) pub const dev_http_config HttpConfig( ..base_http_config, port: 4000, log_level: Debug, ) pub const prod_http_config HttpConfig( ..base_http_config, port: 80, use_tls: True, log_level: Warn, )7. JavaScript 目标性能与代码生成与!性能提升对无字段的自定义类型变体fieldless variants编译器生成针对该类型的专用比较代码而非通用相等检查从而提升性能函数/类型比较语义一致化比较记录构造函数恒为False的行为变更也属于这一类修复若干非法代码生成问题包括 rc3 修复的“无字段变体限定语法相等比较生成非法代码”、guard 中模式变量错误遮蔽外层作用域变量、空参数长名称变体构造函数生成非法 TypeScript 定义等。8. 其他编译行为修复字面浮点数超出可表示范围时两个目标都会报告错误此前仅 Erlang 目标修复未使用的 opaque 类型引用私有类型时生成非法 Erlang 与 TypeScript 代码的问题修复大量函数互相递归时类型检查器放行非法程序的问题修复数千分支的 case 表达式类型检查时的栈溢出返回类型误用:而非-声明时提供更清晰的错误信息修复“无效模式数量”错误消息的拼写错误修复 float 与字面字符串比较的“无用比较”误报如声称1.0 1.恒为 false修复重命名交替模式变量时未重命名所有出现位置的问题。构建工具Build Tool改进1. 新命令gleam deps outdatedv1.14 为构建工具新增了gleam deps outdated命令用于展示依赖的过期版本$ gleam deps outdated Package Current Latest ------- ------- ------ wibble 1.4.0 1.4.1 wobble 1.0.1 2.3.0其实现位于 compiler-cli/src/dependencies.rs 的outdated函数它读取 manifest只统计来自 Hex 的包ManifestPackageSource::Hex通过dependency::check_for_version_updates检查更新再由pretty_print_outdated_versions生成表格并附带汇总信息如“2 of 5 packages have newer versions available.”。CLI 入口在 compiler-cli/src/lib.rs 中注册注释为 “List all outdated dependencies”相关表格格式化测试见 compiler-cli/src/dependencies/tests.rs 中的test_pretty_print_outdated_versions。2.gleam deps tree选项互斥--invert与--package现在互斥同时给出时命令直接报错。此前--invert会被静默忽略行为不透明。3. 帮助文本与输出格式改进gleam dev --help、gleam test --help、gleam run --help现在各自明确说明将要运行的函数gleam deps list的输出格式与“可用主版本升级”提示得到改进gleam new在用户接受建议的重命名后使用确认后的项目名创建目录。4. Git 依赖错误信息构建 Git 依赖时若未安装 Git错误信息从晦涩的Shell command failure/Could not find the stdio stream改进为清晰的Program not founderror: Program not found The program git was not found. Is it installed? Documentation for installing Git can be viewed here: https://git-scm.com/book/en/v2/Getting-Started-Installing-Git5. 其他修复更新到最新的 Elixir API编译 Gleam 项目中的 Elixir 文件时不再出现告警修复两个导致 manifest 未正确更新、使每次操作都访问 Hex 解析版本、在大项目中迅速触达请求上限的 Bug安装不存在包时的错误消息拼写错误已修正修复试图运行没有 main 函数的模块时错误消息中的拼写错误。语言服务器Language Server增强v1.14 的语言服务器实现位于 language-server/src代码动作集中在 language-server/src/code_action.rs带来了大量代码动作与体验改进1. 新增“合并 case 分支”代码动作当多个 case 分支拥有相同函数体时可以合并它们。选中以下两个分支case user { Admin(name:, ..) - todo //^^^^^^^^^^^^^^^^^^^^^^^^ Guest(name:, ..) - todo //^^^^^^^^^^^^^^^^^^^^^^^^ Selecting these two branches you can // trigger the Merge case branches code action _ - todo }触发后得到case user { Admin(name:, ..) | Guest(name:, ..) - todo _ - todo }该动作的实现在 code_action.rs 中CodeActionBuilder::new(Merge case branches)并在 language-server/src/tests/action.rs 中有测试覆盖。2. “生成函数”代码动作增强对使用记录访问语法的参数能选取更好的名称。例如为下面的authenticate(user.id, user.name)生成缺失函数时pub type User { User(id: Int, name: String) } pub fn go(user: User) { authenticate(user.id, user.name) todo }会生成pub fn authenticate(id: Int, name: String) { todo }现在也可作用于常量值修复了在调用当前目标不支持的函数时仍错误地提供该动作、导致接受后生成非法代码的问题修复了对变体variant错误弹出该动作的问题。3. “内联变量”与“添加省略标签”增强“inline variable”代码动作现在可以作用在要内联变量的let关键字上触发“add omitted labels”代码动作可用于已提供部分标签的函数调用中同时它不再为通过管道传入的参数或use的回调参数添加标签。4. 类型注解代码动作新增“为所有顶层定义添加类型注解Annotate all top level definitions”代码动作。对以下代码pub const answer 42 pub fn add(x, y) { x y } pub fn add_one(thing) { // ^ Triggering Annotate all top level definitions code action here let result add(thing, 1) result }在add_one名称上触发该动作后得到pub const answer: Int 42 pub fn add(x: Int, y: Int) - Int { x y } pub fn add_one(thing: Int) - Int { let result add(thing, 1) result }5. 补全、重命名与诊断改进自动补全时优先推荐与期望类型匹配的值重命名时若新名称非法会生成错误消息而不是静默无动作相关诊断的分组在更多编辑器中生效警告与提示会一起显示不再连续出现两次“go to next diagnostic”该改进对 Zed 用户尤其明显“pattern match on variable”代码动作在元组上能选取更好的名称并修复了应用于列表尾部时生成非法代码、以及重复使用同名模式变量的问题“collapse nested case”代码动作修复了在列表尾部模式上产生非法代码的问题限定与取消限定qualify / unqualify代码动作现在也可以作用于常量值。格式化器与杂项修复v1.14 的格式化器format相关变更以 Bug 修复为主修复格式化器误删自定义类型上的external属性rc2修复格式化器误删常量上的deprecated属性修复格式化器未正确移除整数字面量中多余数量的双重否定修复“Invalid number of patterns”错误的拼写错误。此外还包括Prelude 的 TypeScript 定义补充了缺失的 BitArray 构造器返回类型修复了 BEAM 程序成功运行结束后会被突然关闭的问题修复了文档搜索数据格式错误、导致 Hexdocs 搜索无法使用的问题。小结Gleam v1.14 是一次“稳健性 体验”并重的版本external外部类型让 FFI 边界更清晰常量容错推断与记录更新语法提升了编译期体验gleam deps outdated补全了依赖治理工具链而语言服务器的一批新代码动作合并分支、全量注解、更聪明的生成函数则显著提升了编辑器的生产力。配合 changelog/v1.14.md 中的完整记录与本仓库各 crate 的源码与快照测试开发者可以据此评估升级影响并针对compiler-core、compiler-cli、language-server等模块深入研读实现细节。【免费下载链接】gleam⭐️ A friendly language for building type-safe, scalable systems!项目地址: https://gitcode.com/GitHub_Trending/gl/gleam创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/5 8:03:42

Ubuntu上用Docker部署Databaseus:轻量Web数据库管理工具实践

在一台 Ubuntu 机器上折腾数据库管理工具的人,应该都经历过这种纠结:桌面客户端功能全,但每台机器都要装一遍环境;phpMyAdmin 老牌但界面和体验总差点意思;命令行最自由,可团队里不是每个人都愿意敲 SQL。直…

2026/11/4 14:44:46

微信小程序外卖Demo:从页面跳转到购物车的完整链路解析

简介:这是一份面向微信小程序初学者与进阶开发者的外卖应用实战Demo源码,聚焦小程序核心架构、API调用与交互逻辑实现,帮助开发者快速掌握从页面搭建到功能落地的完整链路。资源包含45个文件,涵盖7个JS逻辑文件(含app.…

2026/11/4 8:07:34

PHP财经直播聊天室源码架构:WebSocket、Redis与审核实战

简介:一套基于PHP开发的财经直播聊天室程序源码,主要面向金融直播运营团队、投教平台开发者,以及需要搭建带互动聊天与多房间管理直播系统的个人或企业。它解决的问题是如何在同一套直播间系统中拆分出多个独立加密房间,并配合聊天…

2026/11/7 16:59:56

宁波哪里有电工证培训 电工证含金量真的高吗

宁波哪里有电工证培训 电工证含金量真的高吗 你是不是正在找电工证培训,却发现信息太乱、真假难辨?很多刚入行的朋友都遇到过这种情况:急需特种作业证才能上岗找工作,可电工证到底在哪里考?含金量到底如何?今天就带你一针见血讲明白,宁波哪里有电工证…

2026/11/7 16:59:56

低压电工证评定机构哪家靠谱?全国通用证书怎么考不踩坑

低压电工证评定机构哪家靠谱?全国通用证书怎么考不踩坑 怕考不过白交培训费,我给你说句实话,现在市面上太多打着“保过”旗号的培训机构,光看宣传单就交了钱,结果考试一塌糊涂,培训费打水漂,这事儿谁没经历过?特别是你要是想在河南本地劳务班组干电工…

2026/11/7 16:59:56

建筑电工证查询网官网在哪考?实操考试心里没底怕挂科怎么办?

建筑电工证查询网官网在哪考?实操考试心里没底怕挂科怎么办? 实操考试心里没底怕挂科,这几乎是每个准备考建筑电工证的人都会有的想法。尤其是对于郑州金水区应届工程类毕业生来说,这不仅是找工作的一道门槛,更是未来职业发展的关键。建筑电工证查询网官…

2026/11/7 16:59:56

澄迈电工证培训,外省证能转过来吗?郑州报考避坑指南来了

澄迈电工证培训,外省证能转过来吗?郑州报考避坑指南来了 之前考的证在外省能不能转过来?这几乎是每个打算从事电工工作的人都会遇到的问题,特别是在澄迈本地想考电工证的人,很多人可能之前在别的地方拿过证,但不清楚能不能在本地继续使用,甚至不知道如…

2026/11/7 16:54:55

低压电工证几年审证,真实经历告诉你怎么转证不迷路

低压电工证几年审证,真实经历告诉你怎么转证不迷路 之前考的证在外省能不能转过来?这几乎是所有在外地打工的电工从业者都问过的问题,我自己就亲身经历过一次证书异地转移的波折,从一开始的迷茫到后来的顺利办理,中间踩过不少坑。这篇文章就结合我的…

2026/11/7 14:54:47

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/7 14:50:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/7 0:03:08

郑州报考避坑指南:电工证和钳工证怎么选?实操考试心里没底怕挂科

郑州报考避坑指南:电工证和钳工证怎么选?实操考试心里没底怕挂科 实操考试心里没底怕挂科?你不是一个人。特别是在郑州这样的城市,很多施工企业负责人和一线作业人员在报考电工证和钳工证时都面临着同样的困惑。到底该考哪个证?哪个更适合自己?哪个证书…

2026/11/7 0:03:08

广西电工证办理流程全解析:外省证怎么转?在哪考最靠谱?

广西电工证办理流程全解析:外省证怎么转?在哪考最靠谱? 之前考的证在外省能不能转过来?这个问题我遇到太多了,今天就拿广西电工证办理流程来具体说说,别再走弯路了。广西电工证的报考、复审、继续教育这些环节,如果你不了解,真的会吃大亏,尤其对于从…

2026/11/7 0:03:08

电气电工证都有哪些保姆级教程

电气电工证都有哪些保姆级教程 你是不是正愁不知道去哪报名,怕被中介坑?别急,这篇保姆级教程专为河南初次报考人员准备,帮你搞清楚 电气电工证都有哪些 ,以及如何避开那些坑。 电气电工证都有哪些?别被五花八门的证书搞懵了…

2026/11/7 14:54:47

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/7 14:50:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑