键入的球拍优化器

时间:2017-01-25 17:01:17

标签: compiler-optimization typed-racket

我正在学习一些Typed Racket,我有一个哲学上的困境:

Racket声称是一个语言开发框架,Typed Racket就是在其上实现的一种语言。文档提到由于使用的类型,编译器现在可以做更多/更好的优化。

具体问题:

这些优化在哪里发生?

1)在编译/扩展部分(作为语言构建框架的一部分“可编程”)

- 或 -

2)在(字节码)优化器中进一步向下(用C语言编写,而不是通过框架直接修改)。

如果2)为真,那是否意味着类型信息在编译/扩展阶段之后丢失,稍后由优化器“重建/猜测”或者中间表示被更改为容纳类型信息并通知后续阶段关于他们?

我问这个具体问题的原因是因为我想要了解一下Racket语言框架的真实性,即对于静态类型语言也是可行的,而后端没有任何修改,而类型系统只是一个前端的东西,而运行时的代码仍然是动态类型的(当然是静态检查)。

谢谢。

1 个答案:

答案 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可以推断在宏扩展时不可见的类型信息。这些不是用户控制的,但您不必依赖它们。