Raku 在编译时执行哪些类型检查?未来这种情况会改变吗?

2023-11-22

目前(截至 2020 年 8 月)Rakudo 不会在编译时对函数的返回值进行类型检查;也就是说,它不提供函数满足其返回约束的静态保证。具体来说,以下两个函数都编译为 Raku:

sub get-int(--> Int) { 'bug' }
sub get-int($a --> Int) { 
   when $a == 5 { 'Rare bug' }
   default      { 42 }
}

我有两个相关问题:

  1. 有什么方法可以知道编译时当前进行的类型检查(如果有)? (或者通过某人编写的列表,在文档中的某个位置,或者在 Rakudo 源代码的中心位置)或者它比这更临时?

  2. 缺乏编译时类型检查是有意的设计决策吗?或者添加更多静态类型检查是有一天会很好的事情,但尚未实现?

(我很熟悉乔纳森的精彩回答Raku 中类型/约束的性能损失?,其中指出“Raku 要求写入程序的类型约束在运行时强制执行在最新的该答案描述了避免类型检查的运行时成本的各种方法,但没有描述在编译时进行的类型检查(如果有的话)(这肯定会避免运行时成本!)。)


目前,在编译时很少进行类型检查;这主要是静态优化器的副作用。今天的检查主要是关于子程序调用,其中:

  • 我们可以确定调用的数量,并知道传递的参数数量永远不会匹配
  • 我们有文字参数,并且可以看到它们永远不可能与签名匹配

这是静态优化器执行更多内联工作时遗留下来的。如今,它仅在编译时内联本机运算符,并将其余部分留给虚拟机的动态优化器,该优化器在内联方面的能力要强得多,也可以取消内联(允许推测性优化,但也意味着可以恢复原始堆栈跟踪,而静态优化器丢失了此信息)。

在编译时做更多的事情被认为是可取的,但是有一些实际问题需要考虑。

  1. 引入额外的检查还可能导致之前有效的代码被破坏。考虑一个模块,其代码路径无法通过更严格的编译时检查,但该模块正在从未遇到这种情况的系统中使用。如果它开始无法在较新版本的编译器上进行编译,那么在编译器升级后将无法部署该系统。一般来说,这意味着执行的检查应该随着语言版本的变化而变化。 (注意,这仍然意味着人们在编写代码时应该声明他们正在编写的语言版本。)
  2. 在编译时进行更多检查将“肯定会避免运行时成本”可能是真的,但推理起来并不简单。托管运行时不能盲目相信在给定的字节码中所做的承诺,因为这可能会导致内存安全违规(从而导致 SIGSEGV 或更糟)。这在 Raku 这样的语言中显然是正确的,其中类型检查的语义是可编程的,但在 JVM、CLR 等上也是如此。 Raku 中与类型相关的最大优势来自于使用本机类型,这可以避免大量分配,从而避免垃圾收集工作。
  3. 实施进一步的检查将增加编译器的复杂性以及编译所需的时间。第一个已经是一个问题了;编译器前端在大约十年内没有看到任何重大的架构变化。目前为宏奠定基础的 RakuAST 工作还涉及编译器前端的近乎重写。改进的架构应该可以轻松实现进一步的编译时类型检查,但我们还需要考虑如何并行化编译的各个方面,这可以允许编译器在不增加挂钟编译时间的情况下执行更多操作。

一旦当前的编译器前端检修完成,引入更多编译时检查(但仅从下一个语言版本启用)似乎很有可能 - 至少,只要有人致力于它。

然而,这个领域出现了一个更令人兴奋的机会:由于 Raku 程序将有一个 API,并且随着定制编译器通道的计划一起进行,很快就可以实现类型检查器作为模块!其中一些可能会导致检查,将其纳入未来的 Raku 语言版本中。其他的可能是非常特定于领域的,旨在更正确地使用给定的模块。其他人可能会强制执行不符合基本语言精神的严格要求,但某些语言用户可能希望选择加入。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Raku 在编译时执行哪些类型检查?未来这种情况会改变吗? 的相关文章

随机推荐

  • 在 BlackBerry 上进行开发的最佳 IDE 是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我知道黑莓有一个自定义 I
  • C++11 类 的分布如何转换底层生成器?

    下面的代码看起来并不直观 include
  • java.lang.IllegalArgumentException:spring + hibernate中需要'sessionFactory'或'hibernateTemplate'

    我正在做 spring hibernate 应用程序 当我在 tomcat 服务器上运行应用程序时 出现一些异常 下面是我的代码 这是我的 bean 配置文件
  • 如何在Delphi FireMonkey中调整按钮大小以适合文本?

    我希望按钮尺寸 宽度和高度 尽可能小 但我希望它适合文本 有代码示例吗 Delphi XE4 FireMonkey 移动应用程序 FireMonkey 通过使用的方法呈现文本文本布局 class 我们可以通过类助手访问此方法 然后根据布局提
  • 使用 PHP 发送 Firebase 通知

    每个人 我在使用 PHP 发送 FIRebase 通知时遇到问题 当我从 Firebase 控制台发送它时 我收到通知 但是当我从 PHP 发送它时 我没有收到任何通知 你知道问题出在哪里吗 这是我的 PHP 代码
  • 谷歌选择器和后端文件下载

    我在我的网络应用程序中使用谷歌选择器来允许用户从他的谷歌驱动器中浏览和选择文件 一旦他做出选择 选择器就会返回有关所选文件的各种数据 包括文件 ID 和 URL 我的目标是将选定的文件下载到服务器 如果我将 URL 传递给后端脚本 它将无法
  • mongodb 在更新中设置 null

    我必须交换文档的值 var query id ObjectId 53e1c254382f891cc600076d db properties find query forEach function prop printjson id pro
  • 使用 cte 创建 while 循环

    如何从 while 循环创建 sql server cte我的循环是这样的 declare ind as int declare code as nvarchar set ind 0 while ind lt 884 begin selec
  • 无法使用 ftplib 列出 FTP 目录 – 但 FTP 客户端可以工作

    我正在尝试连接到 FTP 但无法运行任何命令 ftp server ip ftp username username ftp password password ftp ftplib FTP ftp server ftp login ftp
  • 从批处理文件中重定向输出

    我正在使用一些简单的命令创建一个批处理文件来从系统收集信息 批处理文件包含获取时间 IP 信息 用户等的命令 我将所有命令组装在一个批处理文件中 然后运行 但我希望批处理文件在运行时将结果输出到文本文件 日志 是否有一个命令可以添加到批处理
  • Selenium:尝试获取 Firefox 控制台日志会导致“WebDriverError:不允许 HTTP 方法”

    我试图在我的 selenium 测试中捕获控制台错误 具有 selenium webdriver 4 0 0 alpha 5 和最新的 geckodriver 和 chromedriver 的节点环境 我已经为 Firefox 设置了一个驱
  • 查找每行特定值最近出现的时间

    假设我有一个数据表 dt lt data table datetime seq as POSIXct 2016 01 01 00 00 00 as POSIXct 2016 01 01 10 00 00 by 1 hour ObType c
  • Codeigniter CSRF 令牌问题

    我制作了一个简单的注册 新闻通讯网站 但我遇到了一个奇怪的问题 有些人会收到这样的错误 操作遇到错误 您所提出的要求是不允许的 我已经尝试过google 发现当CSRF设置为true时人们也遇到同样的问题 然而 并不是每个人都会发生这种情况
  • 表格列的对齐方式

    我正在尝试将表放在表内 这意味着嵌套表 现在它看起来像这样截屏 但我需要从左对齐 因为我在每行中使用相同的计数列 您可以看到我为获得此输出所做的尝试 提前致谢 report table border collapse collapse wi
  • reinterpret_cast 到函数指针

    这是我为实验编写的代码reinterpret cast
  • 如何在横向模式和纵向模式之间使用 2 种不同的背景

    我有一个 Android 应用程序 我想知道是否可以为横向和纵向模式提供 1 个布局 1 个布局 xml 文件 但我想要每种模式都有不同的背景 那可能吗 我需要 2 个 xml 文件指向不同的背景图像吗 或者我可以使用 1 个 xml 文件
  • iPad Safari IOS 5 window.close() 关闭错误的窗口

    我们有一个 iPad 应用程序可以在我们的旧款 iPad 上运行 我们使用以下方式打开外部链接 var x window open url 一天结束时 当用户关闭应用程序的这一部分时 我们会检查它打开的所有窗口 并对每个窗口执行 x clo
  • 计算 Postgres 中最近的工作日

    我需要根据订单请求的交货日期在 postgres 查询中安排一些项目 例如 订单要求在星期一交货 例如 20120319 并且订单需要在前一个工作日 20120316 准备 想到最直接的方法 我愿意添加日期表 我认为必须有一种比使用一长串
  • R 中的 ImageMagick

    我想在 R 中使用 ImageMagick 但 R 不允许我安装它 install packages ImageMagick Installing package into C Users FSFH 2 Documents R win li
  • Raku 在编译时执行哪些类型检查?未来这种情况会改变吗?

    目前 截至 2020 年 8 月 Rakudo 不会在编译时对函数的返回值进行类型检查 也就是说 它不提供函数满足其返回约束的静态保证 具体来说 以下两个函数都编译为 Raku sub get int gt Int bug sub get