您的位置:首页 > IT > 正文

环球新动态:Crystal 1.8.0 发布,语法类似 Ruby 的编译型编程语言

来源:OSCHINA     时间:2023-04-15 10:28:57

Crystal 是一种通用的、面向对象的编程语言,由 Ary Borenszweig、Juan Wajnerman、Brian Cardiff 和 300 多名贡献者设计开发。Crystal 的语法受到 Ruby 的启发,属于编译语言,具有静态类型检查功能,但一般不需要指定变量或方法参数的类型,可实现接近 C/C++ 的性能。它的类型由一个先进的全局类型推理算法来解决。


(相关资料图)

Crystal 1.8.0 已发布,此版本的一些修改:

正则表达式:PCRE2

此版本中一个重大且必要的更改是 PCRE2 成为 Regex ( #12978 ) 的默认引擎。 1.7 中添加了对 PCRE2 的支持,并在 1.7.3 中稳定下来。我们认为默认使用它是安全的。仍然可以回退到 PCRE,如果 PCRE2 在编译时不可用则自动回退,或者通过编译器标志 -Duse_pcre 回退。

从 1.8 开始,Crystal 编译器应使用 PCRE2 构建以确保一致性。

作为简化向 PCRE2 迁移的措施,Regex::Options获得了更多可在两个引擎版本中工作的命名成员。为了容纳额外的值,枚举基类型从Int32更改为UInt64(#13223)。

此外,添加了一个新的枚举Regex::MatchOptions来保存特定于匹配操作的选项,Regex::Options现在别名为Regex::CompileOptions(#13248)。不推荐使用匹配方法的Regex::Options重载。

正则表达式:无效的 UTF

与升级无关,此版本包含影响两个引擎版本的错误修复。 Crystal 的String类旨在成为有效的 UTF-8,但并未强制执行,完全可以接受包含无效的 UTF-8。字符串传递给 PCRE 或 PCRE2 时,有必要确保其内容有效。

之前没有这样做,库可能会崩溃。现在Regex.new和所有匹配方法都会验证字符串,并在它们包含无效的 UTF-8 时引发异常。如果已知字符串是有效的 UTF-8,则Regex::CompileOptions::NO_CHECK_UTFRegex::MatchOptions::NO_CHECK_UTF会跳过验证以提高性能。

语言

此版本增加了对 LLVM 15 ( #13173 )的支持,其中包括迁移到 LLVM 的不透明指针。这已证明可以显着提高编译速度。

建议使用 LLVM 15 构建 Crystal 以提高编译性能。此版本放弃了对旧 LLVM 版本的支持。 Crystal 现在需要 LLVM 8 或更高版本 (#12906)。 LLVM 16 支持正在开发中 (#13181)。

平台支持

此版本支持 Android,并在 Windows 中取得了重大进步

AArch64 安卓

现在可以使用 Bionic C 运行时 (aarch64-linux-android) 以 Android 为目标。有关如何实现此工作的详细信息,请参阅相关 PR (#13065)。

Windows

在实现 Windows 的完整 stdlib 功能覆盖方面取得了进展。 此版本包括一些与符号链接(#13141、#13195)相关的改进 此版本还为 Windows 信号 (#13131) 添加了一个完整的存根。 接受了一个补丁来支持 Windows 7 版本 (#11505)。

信号

在 Unix 系统中,进程间通信(例如终止进程和响应中断)是基于信号的, Crystal 中的SignalAPI 用于此。为了支持使用不同机制的操作系统(例如 Windows),有必要使用可移植的 API,从实现中抽象出意图。

Process.on_interrupt处理中断:SIGINT(Unix) 和Ctrl+CCtrl+Break(Windows) (#13034)。 Process#terminate获得了一个graceful参数。在 Unix 上,它会在SIGTERMSIGKILL之间进行选择,而它对 Windows 没有影响,并且不管怎样(#13070),其行为都类似于taskkill/fProcess::Status#exit_reasonProcess::ExitReason以可移植的方式提供有关程序退出状态的信息 (#13052)

标准库

修复了LibC的一些函数定义,它们在#13242和#13249中使用了错误的类型(例如Int而不是SizeT)。这会影响在*-linux-gnu目标上发送大量网络数据包的错误。

http

HTTP::StaticFileHandler现在支持Range请求(#12886)。

Spec

spec结果使用pretty_inspect(#11635) 格式化,规范运行器支持--color选项 (#12932)。

Enum

Enum#includes?现在需要设置所有位 (#13229)。 Enum.[]是一个新的便捷构造函数,对标志枚举特别有用。它取代了现在已弃用的Enum.flags(#12900)。Enum#inspect使用Enum.[](#13004) 的简洁语法。

Range

当泛型参数为Nil时,Range#size#each#sample在编译时不再出错。例如,(..4).each{}现在在运行时引发而不是编译失败 (#13278)。

Indexable

Indexable的实现应该是稳定的,即除非显式突变 (#13061),否则不会改变行为。

更新公告:https://crystal-lang.org/2023/04/14/1.8.0-released/

相关文章