Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 做一个快速编译器的关键设计选择是什么?_Design Patterns_Performance_Compiler Theory - Fatal编程技术网

Design patterns 做一个快速编译器的关键设计选择是什么?

Design patterns 做一个快速编译器的关键设计选择是什么?,design-patterns,performance,compiler-theory,Design Patterns,Performance,Compiler Theory,我想知道如何设计一个编译速度非常非常快的编译器 首先,让我避免对我的问题产生一些明显的误解: 我不是在谈论编译器生成代码的速度。已经有很多资源可用于学习如何优化生成的代码。我很难找到使编译器快速运行的信息 我也不喜欢讨论为什么C++编译器通常比java编译器慢。我感兴趣的是什么技术可以用来加速任何给定语言的编译器 我也不想听到关于分布式编译系统,比如微软的Incredibuild或Unix的distcc。那些系统不会给你更快的编译器,它们只会给你更多的编译器。这当然很有用,但这不是我要问的问题。

我想知道如何设计一个编译速度非常非常快的编译器

首先,让我避免对我的问题产生一些明显的误解:

  • 我不是在谈论编译器生成代码的速度。已经有很多资源可用于学习如何优化生成的代码。我很难找到使编译器快速运行的信息

  • 我也不喜欢讨论为什么C++编译器通常比java编译器慢。我感兴趣的是什么技术可以用来加速任何给定语言的编译器

  • 我也不想听到关于分布式编译系统,比如微软的Incredibuild或Unix的distcc。那些系统不会给你更快的编译器,它们只会给你更多的编译器。这当然很有用,但这不是我要问的问题。我想知道如何为单个CPU设计一个快速编译器

  • 卡切也不是我想要的答案。这是一个允许您完全避免使用编译器的系统,但它不会使编译器更快。同样,这是有用的;再说一遍,这不是我要问的问题

  • 我希望我的问题现在非常清楚。但也许历史会让它变得更加清晰

    C编译器过去非常慢。然后,在1986年,THINK Technologies为Macintosh引入了Lightspeed C,它几乎在瞬间编译程序。Lightspeed C的速度比其他C编译器快得多,几乎没有什么可比性。(也许Lightspeed C不是新一代闪电般快速的编译器中的第一个,但在我的经验中却是第一个。Turbo Pascal早在[1983]就出现了,但我没有使用它的经验,所以我不知道它在速度方面是如何比较的。)

    从那时起,许多快速编译器已经面世。在20世纪80年代,编译器技术似乎有了某种程度的飞跃,这正是我想要理解的。突破点是什么

    答案可能很简单:有了像Lightspeed和Turbo这样的IDE,集成编辑器已经在RAM中有了源代码。如果编译器使用该数据进行操作,它将消除磁盘I/O,这是任何编译器中最慢的部分。如果源代码的大小相对于内存的大小较小,那么这可能是提高速度的一个非常重要的因素。(当时,RAM的大小要小得多,但典型的程序大小也是如此。)


    是这样吗?或者还有其他重要的创新吗?从那时起,编译器的速度有了重要的提高吗?

    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等

    今天,你肯定会让你的编译器使用所有可用的内核。我写的不是分布式编译,而是并行编译——从头开始设计你的编译器,使用多个内核。一个明显的方法是将编译器的各个阶段流水线化。重新编写AST肯定是并行的我也是

    请不要再打字了,也不要告诉我们你的“规则”排除了这种方法。你的规则可能会阻止使用浮点单元来优化浮点运算,或者禁止使用任何时钟速度高于1GHz的处理器


    如果你想为今天的计算机编写快速的程序,那就为今天的CPU编写,而不是昨天的CPU。今天的计算机使用多核CPU。

    一个问题是生成的代码会产生什么。你可以在优化过程中投入大量的编译时间。简单的生成,甚至看起来有点愚蠢,都可以我给你时间了。当然,当我使用Turbo Pascal和Lightspeed C时,