Compiler construction 开始编译器项目前的自述

Compiler construction 开始编译器项目前的自述,compiler-construction,compiler-development,Compiler Construction,Compiler Development,基本上,这首先是一个梦想。。。也许有一天我会有自己的编程语言!,但在你寻找如何构建编译器之后,它很快就会变成一场噩梦 和你们大多数人一样,我花了太多的时间去阅读龙之书,还有很多其他的文章,资源,论坛,我最终得出的结论是,我知道了很多不必要的事情,比如所有主要的解析技术,甚至编译器优化,但我仍然没有清楚地了解我的编译器项目最终需要做什么 问题在于你需要在一开始就理解(并掌握)整件事的所有书籍和其他资源!您需要理解和实现解析器,而您仍然不知道接下来应该做什么。顺便说一句,我假设你在这个话题上是一个真

基本上,这首先是一个梦想。。。也许有一天我会有自己的编程语言!,但在你寻找如何构建编译器之后,它很快就会变成一场噩梦

和你们大多数人一样,我花了太多的时间去阅读龙之书,还有很多其他的文章,资源,论坛,我最终得出的结论是,我知道了很多不必要的事情,比如所有主要的解析技术,甚至编译器优化,但我仍然没有清楚地了解我的编译器项目最终需要做什么

问题在于你需要在一开始就理解(并掌握)整件事的所有书籍和其他资源!您需要理解和实现解析器,而您仍然不知道接下来应该做什么。顺便说一句,我假设你在这个话题上是一个真正的初学者,但是我知道你有些人不是这样的

总有一天我会停止阅读这些材料。我说了解每一个细节就足够了,我想做一些真实的事情。所以,我开始问这样的问题:编译器的目标是什么?我的答案是为处理器生成可理解的二进制代码。那么,我说应该怎样呢?嗯,类似于
语句1;声明2
0xAABBCCDD
,仅此而已

然后我从头开始。我从最简单的语法和机器代码开始。那天结束时,我得到的是一个可以工作的编译器,它能够为英特尔生成纯二进制代码。它只理解一些指令,但它是一个真正的工作编译器,尽管它非常简单

后来我改进了解析器,等等。从那时起,我感到非常高兴。现在,我在需要的时候使用所有这些材料。我的问题是,我一直在努力理解和掌握每一件事,因为我认为(大多数人都这么说),如果不阅读所有这些书籍和文章,我就无法制作一个编译器,即使是一个简单的编译器

在这里,我想请您列出您认为在开始任何编译器项目之前必须了解的想法和概念。您认为它们足够简单,初学者可以阅读和理解,更好地描绘整个项目,并继续编写实际代码,感受真正的编译器是如何工作的

作为一个例子,请看我的答案


顺便说一句,在你否决这个问题之前,让我再次澄清,我并不是说这些材料不好。我只是说这个话题非常模糊。错误的做法是一次完成所有任务。更聪明的解决方案是从Hello World开始!例如,与具有GCC等相同功能的项目不同,最重要的是了解处理器是如何工作的。您首先需要选择一个特定的目标,但很明显,您可以在以后扩展它。制造商的文档也将为您提供很多帮助

热身视频

  • 演示通过
  • 不是英文版,但值得一看:
  • 文章

  • 硬件手册

  • 和手册给出了一些编写基本解释器的非常简单的示例:

    我可以分别使用“info flex”和“info bison”命令在本地计算机上访问这两个命令


    编辑:刚刚看到并认为我会分享一个类似问题的答案:

    当你的编译器可以编译“Hello World”时,你已经构建了几乎所有的扫描仪、一个好的解析器和相当多的代码生成器。编译器的构造肯定没有什么含糊不清的地方,它只是其中一个非常大而且研究得很好的部分,可能是继硬件之后研究得最多的部分。你的方法论没有真正意义,这不是一个真正的问题。@EJP我们如何学习一种新的编程语言?通过一个Hello World节目,对吗?我们一开始并不研究如何制作一个巨大的软件。对于编译器项目,我们也应该这样做,这就是我的意思,我们的编译器不需要制作hello world应用程序……这不是我学习它的方式。我研究了筛选、扫描、解析、符号表、名称表、语义分析、代码生成、寄存器分配和链接,我可能遗漏了一些东西。我们得到了一个现有的解析器,并要求以小的方式修改它。编译器本身并没有那么庞大,但有很多东西需要学习。世界上当然没有“你好!”编译器。最接近这一点的可能是递归下降表达式解析器。要求提供“想法和概念列表”不是建设性的,也不符合本网站的问答风格。@AustinHenley谢谢,我同意你的意见,但我不知道如何重新表述。如果你们中有人能把它改成更好的格式,请随意编辑。顺便说一句,我认为这个问题本身可能对其他人有用,即使没有人使用它,但是我同意它没有足够的建设性,因为它应该是…我不会说这是最重要的事情。你需要了解很多事情,它们都同样重要。@EJP我仍然认为这是最重要的事情,因为这也是计算机中最重要的事情。还有其他重要的事情你需要知道,我同意这一点,但它们并不是同样重要的。