目前我正在学习一些类型的球拍,我有一个有点哲学上的两难处境:
Racket声称是一种语言开发框架,类型化的Racket就是在此基础上实现的语言之一。文档提到,由于所使用的类型,编译器现在可以进行更多/更好的优化。
具体问题:
这些优化在哪里发生?
1)在编译/扩展部分(作为语言构建框架的一部分是“可编程的”)
-或者-
(字节码)优化器(它是用C编写的,不能通过框架直接修改)。
如果2)是真的,这是否意味着类型信息在编译/展开阶段之后丢失,然后由优化器“重新构建/猜测”,或者是否修改了中间表示以容纳类型信息并通知后期阶段?
我之所以问这个具体的问题,是因为我想了解Racket语言框架到底有多普遍,也就是说,对于静态类型化的语言来说,不需要对后端进行任何修改,而类型系统只是前端的东西,而运行时的代码仍然是动态类型的(当然是静态检查的)。
谢谢。
发布于 2017-01-25 22:51:13
类型化球拍的优化发生在宏扩展。要自己看看,您可以将#lang typed/racket更改为#lang typed/racket #:no-optimize,这表明类型化的Racket完全控制了应用什么优化。
优化包括使用类型信息用不安全的等价物替换某些过程的各种用途。不安全的过程不对其参数类型执行运行时检查,如果使用不当,则会导致未定义的行为(读取:分段错误)。您可以在题为型球拍的优化的文档部分找到更多信息。
过程的不安全变体的暴露真正使用户定义的语言实现这些优化成为可能。例如,如果您使用类型系统编写了自己的语言,该系统可以证明向量从未通过超出范围的索引访问,那么您可以用vector-ref代替unsafe-vector-ref。
在字节码级别上也有类似的优化,但是当JIT能够推断出在宏展开时不可见的类型信息时,这些优化大多适用。这些不是用户控制的,但你不必依赖它们。
https://stackoverflow.com/questions/41857356
复制相似问题