类型化球拍优化器
Posted
技术标签:
【中文标题】类型化球拍优化器【英文标题】:Typed Racket Optimizer 【发布时间】:2017-06-10 23:22:03 【问题描述】:我现在正在学习一些 Typed Racket,我有一个哲学上的困境:
Racket 声称是一种语言开发框架,Typed Racket 就是在它之上实现的一种语言。文档提到,由于使用了类型,编译器现在可以进行更多/更好的优化。
具体问题:
这些优化发生在哪里?
1) 在编译/扩展部分(作为语言构建框架的一部分“可编程”)
-或-
2) 在(字节码)优化器(它是用 C 语言编写的,不能通过框架直接修改)中更进一步。
如果 2) 为真,这是否意味着类型信息在编译/扩展阶段之后丢失,随后由优化器“重建/猜测”,或者中间表示已更改为适应类型信息并通知后续阶段关于他们?
我问这个特定问题的原因是因为我想了解 Racket 语言框架的真正通用性,即对于静态类型语言也是可行的,而无需在后端进行任何修改,而类型系统只是一个前端的东西,而运行时的代码仍然是动态类型的(但当然是静态检查的)。
谢谢。
【问题讨论】:
【参考方案1】:Typed Racket 的优化发生在宏扩展期间。要亲自查看,您可以将 #lang typed/racket
更改为 #lang typed/racket #:no-optimize
,这表明 Typed Racket 完全控制应用了哪些优化。
优化包括使用类型信息将某些过程的各种用途替换为their unsafe equivalents。不安全的过程不会对其参数的类型执行运行时检查,如果使用不当会导致未定义的行为(阅读:segfaults)。您可以在标题为 Optimization in Typed Racket 的文档部分中找到更多信息。
程序的不安全变体的暴露是真正使用户定义的语言能够实现这些优化的原因。例如,如果您使用类型系统编写自己的语言,该类型系统可以证明向量从未使用越界索引访问,您可以将 vector-ref
的使用替换为 unsafe-vector-ref
。
在字节码级别也有类似的优化,但这些优化主要适用于 JIT 可以推断在宏扩展时不可见的类型信息的情况。这些不受用户控制,但您不必依赖它们。
【讨论】:
这回答了我想知道的一切!谢谢!以上是关于类型化球拍优化器的主要内容,如果未能解决你的问题,请参考以下文章