编译器 - 用于定义代码块的内容会影响编译器速度吗?

Compiler - Can what is used to define a code block affect compiler speed?

(请注意,在这个问题中我将比较 PythonC#)

今天想到一个有趣的问题, 在 C# 中,{} 大括号用于定义代码块,在 Python 中,白色 space 缩进用于定义代码块。 我很想知道这是否对编译器速度有任何影响。

Python:

x = 1
if x == 1:
    # indented four spaces
    print("Hello World")

C#

x = 1
 if(x == 1)
{
  Console.WriteLine("Hello World");
}

我知道这两个编译器都是为了处理指定的语法而创建的,但是使用不同的代码块标识会对编译器不利吗?

答案基本上是 "no" 或 "the question doesn't even make any sense"。

现代编译器通常有两个前端部分,一个扫描器(通常是一个简单的基于正则表达式的有限状态机,没有内存除了它的状态,虽然有些语言在它们的解析器和扫描器之间需要一些毛茸茸的反馈)和一个 parser(它使用一种基于堆栈的机器的一些变体,称为 下推自动机).

扫描器执行简单的 lexical analysis and turns the input stream into a series of tokens. The parser then recognizes these tokens according to a grammar (typically a context-free grammar). The output from the parser is an abstract syntax tree 或 AST。 AST代表程序;至此,大括号与缩进等愚蠢的小细节都消失了。

大多数语言的大部分编译时间都发生在这一点之后。但是,对于某些语言,词法分析时间很重要。由于 Python 进行的编译时优化相对较少,因此扫描器的速度相当可观。尽管如此,块的定义方式(通过缩进而不是大括号)对扫描器性能几乎没有影响:它更多地由用于分配令牌的聪明算法以及实现扫描的有限状态机的速度主导。