我正在设计一种编程语言,我正在思考的问题之一就是为什么编程语言需要很长时间才能编译.假设c ++需要很长时间,因为它需要在每次编译文件时解析并编译头文件.但是i -heard-预编译的标题需要多长时间?我怀疑c ++不是唯一有这个问题的语言.
一个C++特定的问题使得它非常慢,与几乎任何其他语言不同,你不能独立于语义分析来解析它.
编译是一个复杂的过程,涉及很多步骤:
扫描/乐星
解析
中间代码生成
可能是中间代码优化
目标机器代码生成
可选择与机器相关的代码优化
(暂且没有链接.)
当然,这需要一些时间用于更长的计划.
预编译的头是方式速度更快,因为自从1988年以来,至少知道.
C编译器或C++编译器花费很长时间的常见原因是它必须#include,preprocess,然后才能使用令牌.
作为练习,您可能会发现在典型的头文件集合上运行cpp需要多长时间 - 然后测量输出的lex所需的时间.
gcc -O使用了由Chris Fraser和Jack Davidson开发的非常有效但有些慢的优化技术.大多数其他优化器可能很慢,因为它们涉及对相当大的数据结构的重复迭代.
语言设计确实会对编译器性能产生影响.C++编译器通常比C#编译器慢,后者与语言设计有很大关系.(这也取决于编译器实现者,Anders Hejlsberg实现了C#并且是最好的之一.)
C++的简单"头文件"结构有助于降低其性能,尽管预编译头文件通常可以提供帮助.C++是一种比C语言复杂得多的语言,因此C编译器通常更快.
编译不需要花费很长时间:tcc足够快地编译ANSI c以用作解释器.
要考虑一些事情:
扫描和解析过程中的复杂性.据推测,需要长时间预测会受到影响,因为语境(而不是无语境)语言也会受到影响.
内部代表.构建和处理大型且功能强大的AST需要一些时间.大概你应该使用最简单的内部表示来支持你想要实现的功能.
优化.优化是挑剔的.你需要检查很多不同的条件.你可能想要多次通过.所有这些都需要时间.