Compiler construction 在编译的哪个阶段,句法上的糖分通常变成“糖分”;“脱糖”;

Compiler construction 在编译的哪个阶段,句法上的糖分通常变成“糖分”;“脱糖”;,compiler-construction,abstract-syntax-tree,syntactic-sugar,Compiler Construction,Abstract Syntax Tree,Syntactic Sugar,我很好奇编译器如何以及何时将语法糖“去糖化”为它的最终形式。syntactic sugar的一个例子是increment语句i++转变为assign语句i=i+1,或支持运算符重载的语言 我知道许多不同的编译器将以不同的方式在不同的阶段实现“去糖化”过程,因此我很乐意使用任何语言的粗略示例 我指的是编译过程的各个不同阶段,如解析、语义分析、中介、代码生成等 我特别感兴趣的是对AST的影响(如果有的话)以及可能发生的任何转换。我将采用不同的方法来回答这个问题。我将重点关注中间语言,而不是阶段 正如

我很好奇编译器如何以及何时将语法糖“去糖化”为它的最终形式。syntactic sugar的一个例子是increment语句
i++
转变为assign语句
i=i+1
,或支持运算符重载的语言

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

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


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

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

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

  • 高级中级代表(前端和“中间”)
  • MIR(中级中级中级代表)(中端和后端)
  • LIR(低级中间表示)(后端)
  • 这些不同的中间表示可以再细分,例如,HIR-1(含糖)HIR-2(含糖)

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


    在语法糖的情况下,它要么在解析后保留,从而成为某些HIR表示的一部分,要么设计者可能选择直接将其去糖化。解析后保留它的优点是,它可以用于为用户提供提示的工具中,或者可以用于某些HIR优化中的语法糖。

    这肯定发生在代码生成之前:-)。除此之外,我认为没有比“视情况而定”更好的答案了。至少,我不会试一个。(后缀
    ++
    比简单的替换
    (x=x+1)
    要复杂得多,因为替换表达式的返回值是
    x
    的新值,但后缀增量的语义要求返回值是旧值。)@rici虽然我理解你为什么回复一条评论,在这种情况下,因为这个问题更主观而不是客观,我认为你应该把它作为一个答案发布,这样其他人就可以看到这个问题有答案。如果我是OP,我会投赞成票作为答案,并接受它。