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

时间:2017-05-19 10:09:44

标签: c# python compilation compiler-construction

请注意,在这个问题中,我将比较 Python C#

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

的Python:

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

C#

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

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

1 个答案:

答案 0 :(得分:1)

答案基本上是“不”或“问题甚至没有任何意义”。

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

扫描程序执行简单lexical analysis并将输入流转换为一系列标记。解析器然后根据语法(通常是context-free grammar)识别这些令牌。解析器的输出是abstract syntax tree或AST。 AST代表该计划;到目前为止,像支撑块和压痕这样愚蠢的小细节已经消失了。

大多数语言的编译时间都发生在此之后。但是,对于某些语言,词法分析时间非常重要。由于Python的编译时优化相对较少,因此扫描程序的速度非常快。仍然,定义块的方式(通过缩进而不是大括号)对扫描仪性能几乎没有影响:它更多地由用于分配令牌的聪明算法和实现扫描的有限状态机的速度支配。