2010世界杯主题曲_世界杯非洲预选赛 - fsyxyy.com

为什么GCC要自己编三遍?

从信息论的角度考虑这个问题,编译器三阶段编译的第一阶段不会产生编译器。它产生了一个需要实验验证的假设。一个好的编译器发行包的标志是,它将在不需要系统管理员或编译器开发人员进一步工作的情况下,立即生成发行版的工作编译器,并具有该版本的编译器所需的特性。

要做到这一点并不简单。考虑目标环境中的变量。

目标操作系统brand

Operating系统version

Operating系统设置

Shell环境variables

Availability为linking

Settings库的头文件传递给构建process

Architecture的目标处理单元

数量处理单元

Bus architecture

Other特征的执行model

Mistakes编译器的开发人员可能会make

Mistakes编译器的开发人员可能会使

f 227

在GNU编译器工具集和许多tarball发行版中,程序“配置”尝试生成一个构建配置,以适应尽可能多的配置。没有配置错误或警告的完成不能保证编译器能够正常工作。此外,更重要的是,对于这个问题,建设的完成也不能保证。

新构建的编译器可以为HelloWorld.c d.c提供功能,但不能用于一个多项目、多存储库的名为“智能星际控制和获取系统”的软件集合中的1000个源文件的集合。

第二阶段和第三阶段是对至少一些编译器功能进行检查的合理尝试,因为编译器源代码本身很方便,并且需要在刚刚构建的假设工作的编译器之外大量使用。

重要的是要认识到,第一阶段的结果和第二阶段的结果是不匹配的。它们的可执行文件和其他构建的工件是两个不同编译器的结果。第一阶段的结果是编译任何在“路径”变量中列出的目录中的构建系统来编译C和C++源代码。第二阶段的结果是用假设工作的新编译器编译的。有趣的概率考虑是:

如果使用第一阶段的结果再次编译编译器的结果与使用第二阶段的结果第三次编译编译器的结果完全相同,那么至少对于编译器的源代码所需的特性,两者都可能是正确的。

最后一句可能需要重读十几遍。这其实是一个简单的想法,但动词编译和名词编译器的冗余可以打结,需要几分钟才能解开,然后就可以退休了。源、目标和执行的动作具有相同的语言根,不仅仅是一次,而是三次。

自2020年5月25日起,编译器的编译指令说明了相反的情况,这很容易理解,但仅仅是轶事,而不是得到克鲁兹的理由三个阶段是重要的。

如果stage2和stage3的比较失败,这通常表示stage2编译器编译GCC不正确,因此可能是一个严重的错误,您应该调查和报告。

如果我们从可靠性评估、测试优先、eXtreme编程、6西格玛或全面质量管理的角度考虑C/C++开发,那么C/C++开发环境中的哪些组件必须比编译器更可靠?不是很多。甚至GNU编译器包从早期就使用的编译器的三阶段引导也是合理的,但不是彻底的测试。这就是为什么包中有额外的测试。

从持续集成的角度来看,在编译和部署新编译器之前和之后,应该对那些即将使用新编译器的软件进行测试。这是确保新编译器不破坏构建的最方便的方法。

在三个可靠性检查点之间,大多数人都感到满意。

确保编译器自己编译的consistently

Other测试编译器开发人员将其放入distribution

The开发人员或系统管理员的源代码域不会被升级

破坏。

在数学方面,要用地球上可用的硅和碳对编译器进行彻底的测试是不可能的。C++语言抽象中递归的界限是无限的,因此测试源代码的每一个排列所需的硅或时间是不现实的。在碳方面,没有一群人能够腾出必要的时间来研究这个源,以保证编译器源不会以某种方式施加某种有限的限制。“

这三个级别的检查,其中只有一个是三个阶段的引导过程,可能足以满足我们大多数人。

三阶段编译的另一个好处是,新编译器是用新编译器编译的,这可能在速度或资源消耗方面都会更好,而且可能两者兼而有之。

平板支撑有12级,你都会做吗?
从一数到十的数字成语


最新发表

友情链接