【问题标题】:Compiler - Can what is used to define a code block affect compiler speed?编译器 - 用于定义代码块的内容会影响编译器速度吗?
【发布时间】:2017-05-19 10:09:44
【问题描述】:

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

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

Python:

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

C#

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

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

【问题讨论】:

    标签: c# python compilation compiler-construction


    【解决方案1】:

    答案基本上要么是“不”,要么是“这个问题甚至没有任何意义”。

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

    扫描器执行简单的lexical analysis 并将输入流转换为一系列令牌。然后解析器根据语法(通常是context-free grammar)识别这些标记。解析器的输出是 abstract syntax tree 或 AST。 AST 代表程序;至此,大括号与缩进等愚蠢的小细节已经消失了。

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

    【讨论】:

    • 感谢您的详细回答,它写得很好,内容丰富,为这个糟糕的问题道歉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 2023-02-07
    • 2012-04-28
    相关资源
    最近更新 更多