Julia ---- 有没有类型检查?

 

Julia 目前没有用于类型检查的工具,语言本身也没有特别的类型检查的机制。但它是有类型注释的。但类型注释可能是一个红鲱鱼问题,类型注释无法实现类型检查。添加类型注释也非常简单:只需在任何字段、参数或表达式上加上::Any,它就会有一个类型注释,这也是Julia隐式地做的。但这不能告诉编译器关于该对象的实际类型的任何有用信息。它给人一种假象,好像是有类型检查 但实际没有添加任何信息。

这里有一个问题,需要具体的类型注释怎么办?这就没有办法在任何函数上添加::Any。然而,抽象类型还是非常有用的,如果不用很多情况下是非法的。例如,identity函数的定义是

identity(x) = x

在这中情况下,你会在x上添加什么具体的类型注释?这个定义适用于任何x,唯一正确的类型注释是x::Any。这并不是一个异常现象:有许多函数定义需要抽象类型才能正确,因此,在使用Julia编写代码,并强迫使用具体类型将是相当有限的。

Julia 经常提到“类型稳定性”的概念。这个术语似乎起源于Julia社区,但也被其他动态语言社区(如R)所接受。它的定义有点棘手,但它大致意味着,如果您知道方法参数的具体类型,那么您也知道其返回值的类型。即使一个方法是类型稳定的,这也不足以保证它会进行类型检查,因为类型稳定并没有讨论任何规则来决定是否进行类型检查。但这也是一种正确的方式:您希望能够检查每个方法定义的类型是否稳定。

但有可能你不想要求类型稳定性。自从Julia 1.0以来,可以定义一个小的类型集合(Union{Nothing,T}),并且这种方式已经很普遍了。这是从重新设计迭代协议开始的,该协议现在不使用任何方式来指示迭代已经完成,而在有更多的值要迭代时,返回(值、状态)元组。标准库中的find*函数也使用返回值nothing来表示没有找到值。这些都是技术上的类型不稳定性,但是它们是有意的,编译器非常擅长在这种不稳定性的情况下,对代码进行优化。因此,小的类型集合在现在的代码编写中是被允许的,而且,没有明确的界限。虽然可以说Union{Nothing,T}的返回类型是可以接受的,但是没有比这更不可预测的了。

可能有些人需要的既不是类型注释 也不是 类型稳定性,而是一个有效的工具来检查代码是不是会抛出异常,或者更广泛地说,检查代码会不会抛出任何类型异常的错误。Julia的编译器通常可以精确地确定应该调用哪个方法,或者至少将其缩小到几个方法的范围。这也是它为什么能生成快速执行的代码,而完全动态调度却非常慢(例如,在C++中比VTABLE慢得多)。另一方面,如果您编写了不正确的代码,编译器直到运行时才告诉你出错,但这些是语言的语义。

编译器能够确定在每个调用点可以调用正确的方法:这将保证代码将是快速的,并且没有方法错误。某种程度上说,Julia 编译器已经做了很多工作,并且是作为代码生成过程的一部分,这也有点类似类型检查的功能吧。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

October-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值