Compiler construction 我们应该了解多少编译器?
为了编写更好的代码,深入了解编译器的功能是否值得 多少钱就够了?我不是一个有点扫兴的人,但我想知道编译器是如何操作的会使我成为一个更好的程序员。我错了吗Compiler construction 我们应该了解多少编译器?,compiler-construction,Compiler Construction,为了编写更好的代码,深入了解编译器的功能是否值得 多少钱就够了?我不是一个有点扫兴的人,但我想知道编译器是如何操作的会使我成为一个更好的程序员。我错了吗 如果是这样,你会推荐什么资源?我认为每个程序员都应该对编译器如何将高级代码转换为机器指令、可以执行的优化、内存如何工作以及代码如何在硬件上执行有基本的了解。我认为意识到这一点有助于您更好地了解程序的性能,并有助于您做出更好的实施选择 能够真正编写机器代码或准确地知道系统使用的虚拟内存体系结构可能并不重要,但我认为这些概念的基本概念很重要 编辑
如果是这样,你会推荐什么资源?我认为每个程序员都应该对编译器如何将高级代码转换为机器指令、可以执行的优化、内存如何工作以及代码如何在硬件上执行有基本的了解。我认为意识到这一点有助于您更好地了解程序的性能,并有助于您做出更好的实施选择 能够真正编写机器代码或准确地知道系统使用的虚拟内存体系结构可能并不重要,但我认为这些概念的基本概念很重要 编辑
例如:C编译器以行主格式存储数组中的数据,因此您应该首先遍历多维数组,从最高维度(最右边的索引)开始,然后再遍历最低维度(最左边的索引)。Fortran正好相反,它以列主格式存储数组。这意味着在Fortran中,您应该先改变最低维度,然后再进行最高维度。这将提高代码的缓存命中率,并显著提高大型多维数组的性能。知道编译器将如何优化代码可能不会有什么坏处,但不要为编译器编写,而是为人们阅读而编写
以一种更适合编译器的方式编写代码可能会使人们阅读代码更加困难,而现在编译器可能更了解如何为您优化代码,而无需任何有效性证明,由于只了解了一点编译器和一点汇编代码,我对理解代码发生了什么感觉更好。通过阅读这本书,你可以学到很多东西 然后,如果您感兴趣,可以研究更复杂的编译器方法
编辑:同样值得注意的是,许多不需要“编译器”的问题仍然最好由编译器方法解决。解析任何稍微复杂的命令语言都是一个编译器问题,即使您不是在编写可执行文件
Edit2:许多常用的文本对编译器问题采取了相当抽象的数学方法,一开始可能会让人感到害怕或困惑。克伦肖教程采用了一种“开始编写代码”的方法,这是由作者更微妙的理解所决定的。很好的介绍,但是如果你是认真的,你应该继续进行更正式的研究。我认为编译器所做的是这里重要的事情(它创建了一个带有x、y、z特征的解释),并转化为了解你的目标平台 它执行该任务的方式无关紧要(当然,除非您正在编写编译器) 关于编译器,我们应该知道的最重要的事情是它显示的错误消息
:)似乎很明显,但我所遇到的许多开发人员甚至没有查看编译器的输出,这让我感到惊讶。不要学习编译器,而是学习它们解决的问题。我认为真正重要的是制作一个解释器:它让你对编程语言有更多的了解,这就是你所使用的。。。在计划中,做一个对讲机其实并不难!但事实上,我会极力鼓励读者阅读本书的部分内容(以获得巨大启示)
关于编译器,它更为复杂,因为这里的重点是获得一些性能/为实际机器执行。作为一名程序员,重要的是至少要知道他们在全局范围内执行什么任务以及何时运行,而不是详细信息,因为现在他们已经发展成为非常复杂的系统,尤其是使用JIT等。至少,您应该在抽象级别上熟悉语言功能。如果您不知道变量名是否区分大小写,或者数字如何转换为布尔值,那么您甚至可能无法可靠地编写简单的“If”子句
大多数情况下,我发现关于编译器内部工作原理的任何其他知识都能帮助我编写更高效的代码。我认为了解编译器的工作原理并不像不断提高编程知识那样必要。现在,学习编写编译器(或其背后的原理)恰好是扩展知识的好方法
如果你感兴趣的话,我建议你买一本龙书,也叫龙书。第一次可能会有点沉重,但它肯定会让你思考。如果你没有一路完成或在某些部分遇到困难,我建议暂时搁置一段时间,稍后再回来——第二次完成要容易得多。我教过编程语言和高级编译器。以下是我认为了解编译器功能的两个最有用的原因:
answer = answer .. strings[i] -- .. is string concatenation
这段代码是二次代码,执行二次数量的分配和复制。坏消息