Design patterns 做一个快速编译器的关键设计选择是什么?
我想知道如何设计一个编译速度非常非常快的编译器 首先,让我避免对我的问题产生一些明显的误解:Design patterns 做一个快速编译器的关键设计选择是什么?,design-patterns,performance,compiler-theory,Design Patterns,Performance,Compiler Theory,我想知道如何设计一个编译速度非常非常快的编译器 首先,让我避免对我的问题产生一些明显的误解: 我不是在谈论编译器生成代码的速度。已经有很多资源可用于学习如何优化生成的代码。我很难找到使编译器快速运行的信息 我也不喜欢讨论为什么C++编译器通常比java编译器慢。我感兴趣的是什么技术可以用来加速任何给定语言的编译器 我也不想听到关于分布式编译系统,比如微软的Incredibuild或Unix的distcc。那些系统不会给你更快的编译器,它们只会给你更多的编译器。这当然很有用,但这不是我要问的问题。
是这样吗?或者还有其他重要的创新吗?从那时起,编译器的速度有了重要的提高吗?C++编译器比Java编译器慢,主要是因为它们(通常)生成优化的本机代码,而Java编译器生成的字节码并没有太多优化,而最终的优化和本机代码生成由JIT编译器完成(在运行时执行)。由于严重的优化需要了解本机代码,因此字节码编译器的功能是有限的 现在,我不能评论Lightspeed(因为我对它一无所知),但在Lattice&Microsoft C(慢速)与Borland TurboC(快速)的案例中,Borland将所有文件保存在内存中并在那里编译(如果您的程序崩溃,它可能会关闭IDE,丢失未保存的源代码!).Micrsoft的IDE总是将文件保存到磁盘,然后启动一个单独的程序来读取并编译磁盘 使用预编译器头文件也有助于加速c/c++编译 另一种有助于加快编译速度的语言是一种允许单次编译的语言。例如,Pascal要求使用的每个函数在使用之前都要定义(而不是像C++那样仅声明)(这就是为什么主函数必须在源文件中最后一个)
- 简单的语法,可以在一次传递中解析
- 简单的目标代码。如果你不直接以机器代码为目标,你可以逃避很多事情
- 根本不需要编译。如果你不需要快速执行或设计一次性脚本,你就不需要浪费时间分析代码
- 我重复一遍,不要尝试智能化操作系统磁盘/缓存管理。Mmap整个该死的文件并像从RAM读取一样读取它。如果你没有虚拟内存,快速编译是你最不担心的
- 避免为AST创建类似XML DOM的臃肿数据结构。您不需要设置运算符优先级的动画。保留指向mmaped数据的指针,而不是四处复制内容
- 如果你想快速地分析你的代码,总是这样
- 学习不同的语法分析方法。如果你对自己的语法分析编写技能不是非常有信心,请使用经过验证的语法分析/词法生成器工具,如antlr、lemon等
如果你想为今天的计算机编写快速的程序,那就为今天的CPU编写,而不是昨天的CPU。今天的计算机使用多核CPU。一个问题是生成的代码会产生什么。你可以在优化过程中投入大量的编译时间。简单的生成,甚至看起来有点愚蠢,都可以我给你时间了。当然,当我使用Turbo Pascal和Lightspeed C时,