2017-01-25 52 views
2

我学习一些类型化的球拍的那一刻,我有几分哲学的两难境地:类型化的球拍优化

球拍宣称自己是语言发展的框架和类型化的球拍是在它的基础上实现的一个这样的语言。该文档提到,由于正在使用类型,编译器现在可以做更多/更好的优化。

的具体问题:

在哪里这些优化发生?

1)在编译/扩大部分(其是“可编程”作为语言建筑物框架的一部分)

- 或 -

2)进一步向下的(字节码)优化器的线(这是用C编写的,不能通过框架直接修改)。

如果2)为真,那么这是否意味着类型信息在编译/展开阶段后丢失,并在稍后由优化器“重新生成/猜测”,或者中间表示已被更改为适应类型信息并稍后通知关于他们的阶段?

我问这个具体问题的原因是因为我想知道Racket语言框架的真实性如何,也就是说,对于静态类型语言也是可行的,而不需要在后端进行任何修改,而只对类型系统进行修改一个前端的东西,而在运行时的代码仍然是动态类型的(但当然静态检查)。

谢谢。

回答

2

类型球拍的优化发生在宏展开期间。要亲自看看,可以将#lang typed/racket更改为#lang typed/racket #:no-optimize,这表明类型化球拍完全控制了应用哪些优化。

优化包括使用类型信息来替换their unsafe equivalents的某些过程的各种用途。如果使用不正确,不安全的过程不会对其参数的类型进行运行时检查并导致未定义的行为(阅读:segfaults)。您可以在标题为Optimization in Typed Racket的文档部分找到更多信息。

程序的不安全变体的暴露是真正使用户定义的语言实现这些优化的可能性。例如,如果您使用类型系统编写自己的语言,可以证明载体从未被超出边界索引访问,您可以用vector-ref替换unsafe-vector-ref的使用。

在字节码级别有类似的优化,但这些优化主要适用于JIT可以推断在宏扩展时不可见的类型信息。这些不是用户控制的,但你不必依靠它们。

+0

这回答我想知道的一切!谢谢! – Lazarus535