在编译的哪个阶段,语法糖通常会“脱糖”

问题描述

我很好奇编译器如何以及何时将语法糖“脱糖”为最终形式。语法糖的一个例子是增量语句 i++ 变成赋值语句 i=i+1,或支持运算符重载的语言。

我知道许多不同的编译器会以不同的方式在不同的阶段实现“脱糖”过程,所以我很乐意使用任何语言的粗略示例。

按阶段,我指的是编译过程的各个不同阶段,例如解析、语义分析、中间、代码生成等。

我对 AST 的影响(如果有的话)以及它可能发生的任何潜在转换特别感兴趣。

解决方法

我将采用不同的方法来回答这个问题。我将专注于中间语言,而不是专注于阶段。

正如@rici 在对这个问题的评论中提到的,这确实取决于。在许多现代编译器中,使用了不同的中间表示:

  1. HIR(高级中级表示)(前端和“中端”)
  2. MIR(中级中间表示)(Midend & Backend)
  3. LIR(低级中间表示)(后端)

这些不同的中间表示又可以细分,例如,HIR-1(加糖)HIR-2(加糖)

当我们在不同的中间表示之间转换时,我们的中间语言变得不那么特定于语言而更加特定于目标。中级中间表示通常类似于与机器无关的低级语言,而 LIR 通常非常接近目标机器。通常,HIR 的不同变体使循环和数组访问等内容保持明确,例如,它用于检查自动并行化代码的机会或执行与循环构造相关的其他优化。有时可能还会在那里找到更多特定于语言的优化(或检查)。

在语法糖的情况下,它要么在解析后保留,从而成为某些 HIR 表示的一部分,要么设计者可能选择直接对其进行脱糖。在解析后保留它的优点是它可以用于例如向用户提供提示的工具中,或者有一些语法糖可以用于某些 HIR 优化。保留它的缺点是需要对糖进行编码,并且可能会在编译器中引入更多代码和更多检查。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...