为什么汇编需要这么长时间?

我正在设计一种编程语言,我想到的问题之一就是为什么编程语言需要很长时间才能编译。 假设c ++需要很长时间,因为它需要在每次编译文件时解析并编译头文件。 但是i -heard-预编译的头文件需要多长时间? 我怀疑c ++不是唯一有这个问题的语言。

一个C ++特定的问题使得它非常慢,与几乎任何其他语言不同,你不能独立于语义分析来解析它。

编译是一个复杂的过程,涉及很多步骤:

  • 扫描/乐星
  • 解析
  • 中间代码生成
  • 可能是中间代码优化
  • 目标机器代码生成
  • 可选择与机器相关的代码优化

(暂且没有链接。)

当然,这需要一些时间用于更长的计划。

预编译的标题更快,至少自1988年以来就已为人所知。

C编译器或C ++编译器花费很长时间的常见原因是它必须#include,preprocess,然后lex gazillions of token。

作为练习,您可能会发现在典型的头文件集合上运行cpp需要多长时间 – 然后测量输出的lex所需的时间。

gcc -O使用由Chris Fraser和Jack Davidson开发的非常有效但有些慢的优化技术。 大多数其他优化器可能很慢,因为它们涉及对相当大的数据结构的重复迭代。

编译不需要花费很长时间: tcc足够快地编译ANSI c以用作解释器

要考虑一些事情:

  1. 扫描和解析过程中的复杂性。 据推测,需要长时间预测会受到伤害,因为语境(而不是无语境)语言也会受到伤害。
  2. 内部代表。 构建和处理大型且function强大的AST需要一些时间。 大概你应该使用最简单的内部表示来支持你想要实现的function。
  3. 优化。 优化是挑剔的。 你需要检查很多不同的条件。 你可能想要多次传球。 所有这些都需要时间。

语言设计确实会影响编译器性能。 C ++编译器通常比C#编译器慢,后者与语言设计有很大关系。 (这也取决于编译器实现者, Anders Hejlsberg实现了C#并且是最好的之一。)

C ++的简单“头文件”结构有助于降低其性能,尽管预编译头文件通常可以提供帮助。 C ++是一种比C语言复杂得多的语言,因此C编译器通常更快。

它们只需要花费时间,它通常取决于你注入编译单元的多少外来物质。 我希望看到你手动编译它们更快:-)

第一次编译文件时,根本没有标题。 然后根据需要添加它们(并在完成时检查是否仍然需要它们)。

减少时间的其他方法是保持编译单元的小型化(即使是每个文件的一个函数,在极端情况下),并使用类似make的工具来确保只构建所需的内容。

有些编译器(IDE真的)在后台进行渐进式编译,这样它们(几乎)总是接近完全编译。

我认为这里的其他答案已经错过了缓慢C ++编译的一些重要部分:

  • .obj / .o文件保存到磁盘,将其读回,然后链接它们的编译模型
  • 特别是连接一般和不良的慢连接器
  • 过于复杂的宏预处理器
  • 任意复杂的图灵完整模板系统
  • 嵌套和重复包含源文件,即使使用#pragma once
  • 用户造成的碎片,将代码拆分成太多的文件(即使是每个文件只有一个函数,在极端情况下)
  • 编译器中的膨胀或低功耗内部数据结构
  • Overbloated标准库,模板滥用

相比之下,这些并不会减慢C ++编译速度:

  • 扫描/乐星
  • 解析
  • 中间代码生成
  • 目标机器代码生成

顺便说一下,优化是最大的减速之一,但它是这里唯一的减速,实际上是必要的一些措施,而且它完全是可选的。