cod*_*ons 7 typechecking rakudo raku
目前(截至 2020 年 8 月)Rakudo 不会在编译时对函数的返回值进行类型检查;也就是说,它不提供函数满足其返回约束的静态保证。具体来说,以下两个函数都编译为 Raku:
sub get-int(--> Int) { 'bug' }
Run Code Online (Sandbox Code Playgroud)
sub get-int($a --> Int) {
when $a == 5 { 'Rare bug' }
default { 42 }
}
Run Code Online (Sandbox Code Playgroud)
我有两个相关的问题:
有没有办法知道当前在编译时发生了什么(如果有)类型检查?(通过某人编写的列表,文档中的某处,或 Rakudo 源中的中心位置)还是比这更临时?
缺乏编译时类型检查是否是有意的设计决策?或者正在添加更多静态类型检查的东西,有一天会很高兴,但还没有实现?
(我熟悉 Johnathan 对Raku 中类型/约束的性能惩罚?的精彩回答,其中指出“Raku 要求写入程序的类型约束最迟在运行时强制执行。”该答案描述了避免运行的各种方法- 类型检查的时间成本,但没有描述在编译时完成的类型检查(如果有的话)(这肯定会避免运行时成本!)。
Jon*_*ton 12
目前在编译时很少进行类型检查;这主要是作为静态优化器的副作用发生的。今天的检查主要是关于子程序调用,其中:
这是静态优化器进行更多内联工作时遗留下来的。现在,它只在编译时内联本机操作符,而将其余部分留给 VM 的动态优化器,后者在内联和取消内联方面的能力要强得多(允许推测优化,但也意味着可以恢复原始堆栈跟踪,而静态优化器丢失了此信息)。
在编译时做更多的事情被认为是可取的,但是有一些实际问题需要考虑。
当前的编译器前端大修完成后,很可能会引入更多编译时检查(但仅在下一个语言版本中启用)——至少,只要有人致力于它。
然而,在这个领域还有一个更令人兴奋的机会:因为将有一个 Raku 程序的 API,并且随着定制编译器传递的计划一起出现,很快也可以将类型检查器作为模块来实现!其中一些可能会导致检查,使其成为未来的 Raku 语言版本。其他的可能是特定于领域的,旨在更正确地使用给定的模块。其他人可能会强制执行不符合基本语言精神的严格要求,但某些语言用户可能希望选择加入。