40

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

引用温和但坚持的执行摘要:如果你不知道编译器是如何工作的,那么你就不知道计算机是如何工作的。如果你不能 100% 确定你是否知道编译器是如何工作的,那么你就不知道它们是如何工作的。

本来觉得是一篇很有意思的文章,应用领域很有用(帮自己一个忙,看一下) 不过话说回来,我见过成功的高级sw工程师,对编译器不是很了解,或者内部机架构,但确实知道以下列表中每个项目的一两件事:

  • 编程范式(OO、函数式……)
  • 一个编程语言 API(C#、Java ..)和至少 2 个非常不同的人说!(Java/哈斯克尔)
  • 一个编程框架(Java、.NET)
  • 一个让您更有效率的 IDE(Eclipse、VisualStudio、Emacs ......)
  • 编程最佳实践(例如,参见 fxcop 规则)
  • 编程原则(DRY、高内聚、低耦合……)
  • 编程方法(TDDMDE
  • 设计模式(结构、行为……)
  • 架构基础(层、层、流程模型(瀑布、敏捷……)
  • 测试工具(单元测试、模型测试……)
  • 一种 GUI 技术(WPF、Swing)
  • 文档工具(Javadoc、Sandcastle..)
  • 一种建模语言(可能还有工具)(UML、VisualParadigm、Rational)
  • (无疑在这里忘记了非常重要的东西)

并非所有这些工具都是成为一名优秀程序员所必需的(就像您不需要它时的 GUI),但大多数都是。编译器从何而来,它们真的那么重要吗,因为,正如我所提到的,许多程序员似乎在不了解它们的情况下做得很好,特别是,成为一名优秀的程序员被视为众多知识领域几乎是一生的成就:- ) ,所以即使编译器非常重要,难道不是总有更重要的东西吗?

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

对于那些已经阅读文章并想立即开始学习的人:

解析器、解释器和编译器的学习资源

4

9 回答 9

47

如果你只是想成为一个普通的编码员,然后写一些东西……你不需要编译器。

如果你想学习计算机科学并欣赏并真正成为一名计算机科学家,你必须学习编译器。

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

你会看到很多计算机科学以惊人的方式融合在一起。您不仅会更多地了解为什么编程语言会以它们的方式工作,而且您将成为更好的编码员,因为有了这种理解。你将学会理解低层次,这有助于高层次。

作为程序员,我们经常喜欢将事物称为“黑盒子”……但是当您对盒子中的内容有所了解时,事情就会变得更加顺畅。即使你不构建一个完整的编译器,你也一定会学到很多东西。您将看到解析背后的形式(并意识到这不仅仅是一堆特殊情况的组合),以及一堆 NP 完全问题。您将了解为什么计算机科学理论对于理解实际事物如此重要。(毕竟,编译器非常实用……如果没有形式主义,我们今天的编译器就不会存在)。

我真的希望您考虑了解它们...它将帮助您作为计算机科学家进入下一个层次:-)。

于 2009-04-09T07:31:07.227 回答
10

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

于 2009-04-09T07:16:38.120 回答
5

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

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


那么什么时候应该学习编译器呢?

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

于 2009-04-09T06:59:34.790 回答
4

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

尽管有一些技术可以派上用场,比如词法分析和解析。

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

于 2009-04-09T07:01:04.163 回答
4

如果您要在一个足够高的水平上工作,并且担心 UML 和自描述代码,那么您可以轻松地完成整个职业生涯,而无需或不需要编译器如何工作的详细信息。

但是,如果你是一名底层编码人员并且没有管理你朋友的愿望,那么很可能有一天,你会意识到你正在与你的编译器进行战争。这可能是随机出现的错误,也可能是关于 while-verses-for 循环的走廊对话。你会意识到组装(或 IL,很可能,在未来几年)只是在你需要的东西的左边一点,另一个宇宙将会展开。

所以,我想我的答案是,现在只注意编译器,它做了很多事情,但不要太担心它。

于 2009-04-09T07:20:21.497 回答
3

如果您打算编写对时间要求极高的实时代码,您将从了解编译器如何优化您的代码中受益。但是,您实际上将从了解硬件的底层架构中受益更多。

根据我的经验,如果您了解硬件的工作原理以及编译器如何解释您的代码,您将能够编写出完全符合您预期的代码。我曾多次被抓到,编写的代码被编译器优化掉,并使硬件做一些我不打算做的事情。

总而言之,了解整个软硬件堆栈对于编写好的算法和代码并不是必不可少的,但它肯定会有所帮助!

于 2009-04-09T07:55:04.160 回答
2

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

所以我宁愿说你应该知道一种汇编语言(我的意思是一种架构的汇编语言的有限子集)来理解计算机是如何工作的,而后者对于有能力的程序员来说绝对是必需的,这样他才能理解什么是分段错误,何时优化,何时不优化等类似的低级事物。

于 2009-04-09T07:02:19.370 回答
2

从实践的角度来看,一般编译器理论比特定平台的汇编器、链接器和加载器更受关注。例如,我只是将 GCC 编译器视为 x86 平台上从我的高级 C 语言到低级汇编语言的翻译器。而且通常情况下,我会手动优化;) 编译器生成的代码。

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

于 2012-05-02T09:17:46.467 回答
0

只是我的意见,但我相信编译器在 CS 课程中没有得到足够的关注,在我的课程中没有,在其他任何 afaik 中都没有。我认为任何 CS 专业的学生在休假或完成专业后都应该做两件事:必要时重新学习有限自动机和形式方法语言。应用它。用这些知识编写一个简单的编译器。Alex Aiken 有一个非常有用的在线教程,介绍如何为 COOL(面向对象的课堂语言)编写编译器,它是 Scala 的子集,截至 2013 年版本。至少在撰写本文时。

于 2014-04-01T13:55:44.510 回答