返回

文章详情

Crystal 1.22.0 发布

Hacker News2026年10月22日 13:20

亮点 标准流模拟 SIGPIPE stdlib/runtime 改进的 DWARF 解析以提升性能 stdlib/runtime 所有目标支持本地事件循环 stdlib/runtime 支持 LLVM 23 和 24 stdlib/llvm aarch64-linux 晋升为 Tier 1 平台/linux 我们宣布发布新的 Crystal 版本 1.22.0,包含若干新功能和错误修复。预构建的包可以在 GitHub Releases 和我们的官方发行渠道获取。请访问 crystal-lang.org/install 获取安装说明。此版本包括自 1.21.1 以来由 33 位贡献者提供的 251 项更改。我们感谢所有贡献者为改进这门语言所付出的努力!❤️ 以下是我们在语言、编译器和标准库中记录的最显著变化。有关更多详细信息,请访问完整的变更日志。 当写入 STDOUT 或 STDERR 失败并返回 EPIPE 时,Crystal 进程会立即退出。这与 SIGPIPE 信号的默认行为非常相似。之前,失败的写入会引发 IO::Error,通常会打印错误消息并退出。现在已删除此错误消息(#17335)。你可以通过设置 STDOUT.exit_on_broken_pipe = false 来选择不使用此行为。感谢,@straight-shoota 常量可以有类型声明(#16951)。它们的工作方式正如你所期望的常量与类型声明的组合。 module Foo BAR : Int32 = 1 BAZ : String = "" QUX : Int64 = 123 # 自动转换 123 为 Int64 end 感谢,@stakach 目标 aarch64-linux-gnu 和 aarch64-linux-musl 从 Tier 2 移动到 Tier 1。唯一缺少的部分是我们缺乏官方构建,但自 1.19 以来我们已经有了。Process.fork 在 1.0 之前就已被弃用,现在我们终于将其删除(#17367)。感谢,@straight-shoota 新宏使得编译时可以进行更多文本操作:StringLiteral#bytesize(#17176)、NumberLiteral#chr(#17169)和 RangeLiteral#each 支持 CharLiteral(#17170)。感谢,@straight-shoota 新常量 Crystal::ALL_FLAGS 和 Crystal::USER_FLAGS 提供对编译时标志的访问(#17392)。感谢,@straight-shoota 我们彻底改进了 DWARF 解析,以增强性能并减少内存使用。DWARF 解析器现在按需扫描节(#17283),并构建高效的索引表(#17410,#17455),从而实现极快的查找。解码的回溯行现在被缓存到 LRU 缓存中(#17285)。同时新增对 DWARF 5 特性 DW_FORM_addrx<n> 和 DW_FORM_strx<n> 的支持(#17445)。感谢,@ysbaddaden 我们为 HTTP 合并了众多改进和错误修复。#remote_address 和 #local_address 从 HTTP::Request 移动到 HTTP::Context(#17196)。添加 HTTP::Headers#merge(#17326)。在 HTTP 正文中序列化 IO::Memory,带有 Content-Length 头(#17388)。错误修复:拒绝未识别的 HTTP Transfer-Encoding 头(#17140)、无效的 Content-Encoding(#17262)和无效的 HTTP trailer(#17337)[重大变更] 修复 HTTP::Request#body= 和 #content_length= 的返回值(#17257,#17273)。修复 HTTP.parse_headers_and_body 以在没有 zlib 时不引发错误(#17272)。验证 HTTP::WebSocketHandler(#17235)、HTTP::Request(#17255、#17304、#17374、#17310、#17312、#17258)、HTTP::Headers 名称的属性(#17317)。在请求期间因 IO::Error 关闭 HTTP::Client(#17318)。修复 Content-Encoding: deflate(#17261)。修复 HTTP::Request.from_io 解析空头名称(#17254)。修复 HTTP::Request#form_params? 以忽略无效的 content-type(#17256)。感谢 @straight-shoota、@hahwul、@jgaskins、@Sija 所有目标都支持直接基于系统选择器的本地事件循环,并默认使用。我们在 Solaris 上启用了 epoll(#17370),并在所有剩余的 BSD 目标上启用 kqueue(#17421、#17420)。libevent 仍然可作为备用,但现在它是严格的选择性使用并逐渐变得技术过时。我们预计在下一个版本中将其弃用。感谢,@ysbaddaden 我们终于启用了对 OpenSSL 绑定中内核 TLS 的默认支持(#17059)。感谢,@ysbaddaden File.exists?(#17307),以及 File::Info.readable?、.writable?、.executable? 现在接收 follow_symlinks: false 参数(#17391)。添加 Char::Reader.new(Bytes)(#17428)。添加 Time::Span#to_nanoseconds 等(#17190)。添加 GC.syscall(&)(#17150)。在使用 musl-libc 的 -static-pie 链接时修复回溯(#17316)。感谢,@straight-shoota、@ysbaddaden 大写实例和类变量(#17160)。HTTP::Request#local_address 和 #remote_address(#17260)。LLVM::Type#size 和 #alignment(#17494)。支持 LLVM 23.1 和 24.0(#17432)。更新 markd 0.6.0(#17269)。感谢,@straight-shoota、@hertzdevil 更新的 distribution-scripts(#17178)带来了包依赖、docker 基础镜像等的升级。感谢,@straight-shoota 这是首个针对 aarch64-windows-msvc 构建的版本。感谢,@hertzdevil Crystal 在 RFC 30 中建立了向前兼容政策:构建 Crystal 1.22 需要使用 1.14 或更高版本的 stage-0 编译器。感谢我们能够完成所有这些感谢。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

☕请我喝杯咖啡