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

时间:2009-02-26 02:41:22

标签: c++ c performance compilation language-design

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

8 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:14)

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

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

(暂且没有链接。)

当然,这需要一些时间用于较长的课程。

答案 2 :(得分:8)

预编译的头文件 way 更快,至少自1988年以来就已为人所知。

C编译器或C ++编译器花费很长时间的常见原因是它必须#include,preprocess,然后才能使用gzillions of tokens。

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

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

答案 3 :(得分:6)

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

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

答案 4 :(得分:6)

编译 需要长时间:tcc编译ANSI c足够快,可用作解释器

要考虑一些事情:

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

答案 5 :(得分:3)

他们需要花费的时间,这通常取决于你注入编译单元的多少外来东西。我希望你能更快地手工编译它们: - )

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

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

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

答案 6 :(得分:1)

运行Idera RAD Studio(有一个免费版本)。它带有C ++和Delphi。与执行相同操作的C ++代码相比,Delphi代码的编译时间很少。这是因为C ++在过去的几十年中经历了可怕的发展,并没有考虑到编译器的复杂性,因为它是由上下文确定的复杂宏,并且在某种程度上称为“ .hpp”地狱。艾达(Ada)也有类似的问题。 Pascal的Delphi方言从一开始就被设计为一种有效的编译语言。因此,编译器和运行程序只需花费几秒钟而不是几分钟,从而使迭代调试变得轻松快捷。调试缓慢以编译语言会浪费大量时间,而且您会痛苦不已!顺便说一句,安德斯(Anders)也曾在M $偷走Delphi之前就写了它!

答案 7 :(得分:0)

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

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

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

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

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