(何时)我应该学习编译器吗?

时间:2009-04-09 06:55:14

标签: compiler-theory

根据这篇http://steve-yegge.blogspot.com/2007/06/rich-programmer-food.html文章,我绝对应该这样做。

  

引用温柔但坚持不懈的执行官   总结:如果你不知道如何   编译器工作,然后你不知道   电脑如何运作。如果你不是100%   确定你是否知道如何编译器   工作,然后你不知道他们是怎么回事   工作

我认为这是一篇非常有趣的文章,应用领域非常有用(帮自己一个忙,看看吧) 但话说回来,我看到成功的高级sw工程师不熟悉编译器,或内部机器架构, 但确实知道以下列表中每个项目的一两件事:

  • 编程范例(OO,功能性,......)
  • 编程语言API(C#,Java ..)和至少2个非常不同的人说! (Java / Haskell)
  • 编程框架(Java,.NET)
  • 提高工作效率的IDE(Eclipse,VisualStudio,Emacs,...)
  • 编程最佳实践(例如,参见fxcop规则)
  • 编程原则(DRY,高内聚,低耦合......)
  • 编程方法(TDDMDE
  • 设计模式(结构,行为,......)
  • 建筑基础知识(层,层,过程模型(瀑布,敏捷,...)
  • 测试工具(单元测试,模型测试,......)
  • GUI技术(WPF,Swing)
  • 文档工具(Javadoc,Sandcastle ..)
  • 建模语言(可能是工具)(UML,VisualParadigm,Rational)
  • (毫无疑问,这里忘记了非常重要的东西)

并非所有这些工具都是成为优秀程序员所必需的(如果您不需要它就像GUI一样) 但大多数都是。编译器在哪里进来,它们真的那么重要,因为正如我所提到的那样 许多程序员似乎在不知情的情况下做得很好,特别是,成为一名优秀的程序员可以看到众多知识领域几乎是终身成就:-),所以即使编译器非常重要,也不是总有一些东西更重要?

或者我今天应该订购'The Unleashed Compilers Unlimited Bible(24H ..)))?

对于那些阅读过该文章,并希望立即开始学习的人:

Learning Resources on Parsers, Interpreters, and Compilers

9 个答案:

答案 0 :(得分:39)

如果你只想成为一个普通的编码器,并写东西......你不需要带编译器。

如果您想学习计算机科学并欣赏并真正成为计算机科学家,那么必须选择编译器。

编译器是计算机科学的缩影!它包含每个问题,包括(但不限于)AI(贪婪算法和启发式搜索),算法,理论(形式语言,自动机),系统,架构等。

你会看到许多计算机科学以惊人的方式汇集在一起​​。您不仅可以更好地理解为什么编程语言以他们的方式工作,而且您将成为更好的理解者。您将学习如何理解低级别,这有助于高级别。

作为程序员,我们经常喜欢谈论事物是一个“黑匣子”......但是当你对框中的内容有所了解时,事情就会变得更加顺畅。即使你没有构建一个完整的编译器,你一定会学到很多东西。您将看到解析背后的形式(并且意识到它不仅仅是一堆特殊案例被黑客攻击),还有一堆NP完全问题。你会明白为什么计算机科学理论对于实际事物的理解是如此重要。 (毕竟,编译器非常实用......如果没有形式,我们就没有今天的编译器。)

我真的希望你考虑学习它们......这将有助于你作为计算机科学家进入下一阶段: - )。

答案 1 :(得分:9)

你应该学习编译器,原因很简单,实现编译器会让你成为更好的程序员。编译器肯定会很糟糕,但在此过程中你会学到很多东西。这是改进(或练习)编程技巧的好方法。

答案 2 :(得分:4)

您不需要了解编译器是一名优秀的程序员,但它可以提供帮助。我在学习它们时意识到的一件事是,编译只是一种翻译。

如果您曾经从一种语言翻译成另一种语言,那么您刚刚完成了编译。


那么你何时应该学习编译器?

当您想要或需要它来解决问题时。

答案 3 :(得分:4)

如果您打算在高级别的工作中担心UML和自我描述的代码,那么您可以轻松地完成整个职业生涯,而不需要或需要编译器工作原理的详细信息。 / p>

但是,如果你是一名在战壕中并且没有愿意管理你的朋友,那么很可能有一天,你会发现你正在与你的编译器发生战争。它可能是随机出现的错误,也可能是关于while-verses-for循环的走廊对话。你会意识到集会(或IL,可能在未来几年)只是你需要的左边,另一个宇宙将会展开。

所以,我想我的答案是,现在只要知道编译器,它已经做了很多,但不要太担心它。

答案 4 :(得分:3)

编译器理论很有用,但不是必需的。

虽然有一些技巧可以派上用场,比如词法分析和解析。

另一个是错误处理。编译器需要很多这些。用户输入可以包含任何内容,甚至是意外的。你需要处理所有这些。

答案 5 :(得分:3)

如果您打算编写非常时间关键的实时代码,您将从了解编译器如何优化代码中受益。但是,实际上,通过了解硬件的底层架构,您将获益更多。

根据我的经验,如果您了解硬件的工作原理以及编译器如何解释您的代码,您将能够编写完全符合您要求的代码。我已经被抓了几次,编写了被编译器优化掉的代码,并让硬件做了我不想要的事情。

总而言之,理解整个软件 - 硬件堆栈并不是编写优秀算法和代码所必需的,但它肯定会有所帮助!

答案 6 :(得分:2)

编译器课程通常侧重于如何分析高级代码并将其转换为机器代码。这非常有趣,但并不重要。更重要的是要了解编译器生成的这个机器代码是什么,以便您了解计算机的工作原理以及每种语言构造的成本。

所以我宁愿说你应该知道汇编语言(我的意思是一个架构的汇编语言的有限子集)来理解计算机是如何工作的,而后者对于一个称职的程序员来说肯定是必需的,这样他就能理解什么分段故障是,什么时候优化,何时不和其他类似的低级事物。

答案 7 :(得分:2)

从实际角度来看,一般编译器理论比特定平台的汇编程序,链接器和加载器 更少。例如,我只是将GCC编译器视为从高级C语言到x86平台上的低级汇编语言的翻译器。我经常手动改进;)编译器生成的代码。

从科学的角度来看,我强烈建议你学习编译器理论,它将帮助你理解计算机所依赖的伟大的想法。更重要的是,你将对世界有不同的看法。

答案 8 :(得分:0)

只是我的观点,但我认为编制者在CS课程中没有给予足够的重视,而不是在我的课程中,而不是在任何其他方面。我认为任何CS专业都应该在休假或完成专业后做两件事:重新学习必要的有限自动机,也许是正式的方法语言。应用它。 用这些知识编写一个简单的编译器。 Alex Aiken有一个非常有用的在线教程,为COOL(课堂面向对象语言)编写编译器,这是Scala的子集,截至2013版。至少在撰写本文时。