Performance 如何最小化编程语言的编译时间?

Performance 如何最小化编程语言的编译时间?,performance,compiler-construction,language-design,Performance,Compiler Construction,Language Design,我更多地考虑了我正在设计的编程语言。我想知道,有什么方法可以减少它的编译时间 这里有一个镜头 如果您的工具链支持增量编译,请使用增量编译。 (制作、visual studio等) 例如,在GCC/make中,如果要编译多个文件,但只在一个文件中进行更改,则只编译该文件 我有什么方法可以最小化它的编译时间 无编译(解释语言) 延迟(及时)编译 增量编译 预编译头文件 这取决于您的编程语言/平台。对于.NET开发,尽量减少解决方案中的项目数量。在过去,通过设置RAM驱动器并在那里编译,您可以获得显

我更多地考虑了我正在设计的编程语言。我想知道,有什么方法可以减少它的编译时间

这里有一个镜头

如果您的工具链支持增量编译,请使用增量编译。 (制作、visual studio等)

例如,在GCC/make中,如果要编译多个文件,但只在一个文件中进行更改,则只编译该文件

我有什么方法可以最小化它的编译时间

  • 无编译(解释语言)
  • 延迟(及时)编译
  • 增量编译
  • 预编译头文件

这取决于您的编程语言/平台。对于.NET开发,尽量减少解决方案中的项目数量。

在过去,通过设置RAM驱动器并在那里编译,您可以获得显著的加速。不过,我不知道这是否仍然成立 iFiell的分布式编译,有一个不同的冻结状态的概念,而重新编译并不一定意味着整个类被重新编译。 你能把可编译模块分解多少,你有多在乎跟踪它们?

在大多数语言中(除了C++之外,几乎所有语言都可以),编译单个编译单元的速度相当快

绑定/链接通常比较慢-链接器必须引用整个程序,而不仅仅是单个单元

除非使用pImpl习惯用法,否则C++需要每个对象和所有内联函数的实现细节来编译客户机代码

Java(从源代码到字节码)受到影响,因为语法没有区分对象和类-您必须加载Foo类,以查看Foo.Bar.Baz是Foo类的Bar静态字段引用的对象的Baz字段,还是Foo.Bar类的静态字段。您可以在两者之间更改Foo类的源代码,而不更改客户机代码的源代码,但仍然需要重新编译客户机代码,因为字节码在这两种形式之间存在差异,即使语法不存在差异。AFAIK Python字节码不区分这两个模块——模块是其父模块的真正成员

如果包含的头超过了所需的数量,则C++和C将受到影响,因为预处理器必须多次处理每个头,编译器将编译它们。最小化头大小和复杂性会有所帮助,这表明更好的模块化可以缩短编译时间。缓存头编译并不总是可能的,因为在预处理头时出现的定义可能会改变其语义,甚至语法

如果你经常使用预处理器,C语言会受到影响,但是实际的编译速度很快;C代码中的大部分使用了 TyPulf结构x*xyptr>代码>隐藏实现优于C++ + -一个C标头可以很容易地包含Type Debug和函数声明,提供更好的封装。
因此,我建议让您的语言对客户机代码隐藏实现细节,如果您是一种同时具有实例成员和名称空间的OO语言,请明确访问这两个实例的语法。允许真正的模块,因此客户端代码只需要知道接口,而不需要知道实现细节。不要让预处理器宏或其他变体机制改变引用模块的语义。

一个简单的方法:确保编译器可以在本机上利用多核CPU。

您当前的主要问题是I/O。您的CPU比主存快很多倍,而内存比访问硬盘快1000倍左右磁盘

因此,除非对源代码进行大量优化,否则CPU将花费大部分时间等待数据的读取或写入

试试这些规则:

  • 将编译器设计为在几个独立的步骤中工作。目标是能够在不同的线程中运行每个步骤,以便可以利用多核CPU。它还将有助于并行化整个编译过程(即,同时编译多个文件)

    它还允许您提前加载许多源文件并对其进行预处理,以便实际的编译步骤能够更快地工作

  • 尝试允许独立编译文件。例如,为项目创建“缺少符号池”。缺少符号不应导致编译失败。如果在某个地方发现缺少的符号,请将其从池中删除。编译完所有文件后,检查池是否为空

  • 创建包含重要信息的缓存。例如:文件X使用文件Y中的符号。这样,当Y更改时,您可以跳过编译文件Z(它不引用Y中的任何内容)。如果您想更进一步,请将定义的所有符号放在池中的任意位置。如果文件更改为添加/删除符号,您将立即知道哪些文件受到影响(甚至不打开它们)

  • 在后台编译。启动一个编译器进程,检查项目目录中的更改,并在用户保存文件后立即编译这些更改。这样,您每次只需编译几个文件,而不是编译所有文件。从长远来看,您将编译更多的内容,但对于用户来说,转换时间将更短(=用户必须等待的时间,直到更改后可以运行编译的结果)

  • 使用“即时”编译器(即在使用文件时编译文件,例如在导入语句中)。然后以源代码形式分发项目,并在第一次运行时进行编译。Python就是这样做的。要执行此操作,可以在安装编译器期间预编译库

  • 不要使用头文件。将所有信息保存在一个位置,并在必要时从源代码生成头文件。可能只是将头文件保存在内存中,而从不将它们保存到di