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