了解编译器的最佳方式是什么?



我想了解编译器、操作系统和计算机系统是如何内部工作的。这是我目前的计划:

  1. 用C编写一个简单的虚拟机,它可以接受用机器语言(我的规范的自定义语言)编写的输入。
  2. 为虚拟机编写一个汇编程序。
  3. 为机器编写一个非常基本的编译器,使用类似基本的语言。
  4. 扩展虚拟机的交互性,包括一个屏幕(我想我会使用SDL)和一个通过显存连接到该屏幕的接口。我还可以添加鼠标/键盘功能。

任何提示或建议都很好。提前感谢!

我的第一个建议是阅读有关该主题的高级书籍。也就是说,我假设你还没有这样做,并计划简单地与一些在线教程或其他东西一起工作。至少对我来说,我倾向于想要首先投入到像这样的事情中,但很快我就会感到不知所措,然后就放弃了这个项目。在开始之前确保我对项目有一个非常好的高层次的理解对我有很大的帮助。

我可能会推荐的一个系列是写伟大的代码书。我不能保证整个系列都是正确的,因为我还没有全部读过,但我的办公室在工作中有它们,我已经用了很多次,在我一头扎进某件事之前,我已经很好地掌握了这个主题。例如,一个可能与您的计划直接相关的例子是,我需要了解GCC编译器如何组织它生成的ELF二进制文件,每个部分是什么,以及在那里存储了什么。(这是一个嵌入式系统,我们正在扩大我们的RAM,所以我不得不重新组织一些东西…)

你说"没什么难的"…在我看来,我认为您的步骤已经相当困难了,特别是如果您的最终目标是学习编译器和操作系统的话。我将跳过整个虚拟机,至少现在是这样。实际上,处理器非常简单,基于你已经知道它只是处理一种"机器语言"的事实,你可能已经有了一个很好的开始把握。

我会从步骤3开始,编写你自己的编译器。我在大学里上了一门编译器课,到学期末,我已经有了一个可以工作的Pascal编译器,它是我使用LEX和YACC从头开始构建的。这很有启发性。您还可以将Bison与yacc一起用于此类事情。我从来没用过。

同样,在空闲时间做一些简单的练习,比如弄清楚如何操纵GCC将hello world编译成小于X字节数,将教会你比你想象的更多的东西是如何工作的。(顺便说一下,网上有很多这样的例子)

玩得开心!

你已经知道多少编程知识了?

编写FORTH解释器是一个很好的练习。它相对简单,并且语言和语义已经定义良好,因此您不需要从头开始设计自己的系统。FORTH通常还具有编译器(尽管它与C编译器完全不同),并且可能具有内置的汇编器,因此您也可以研究这些。它将为您提供管理内存、处理指针、解析引用等方面的心理工具。

查看现有的简单编译器也会有所帮助。一旦您内化了编译器所做的事情——将一组符号转换为另一组符号——那么您可能希望开始研究解析语法和相关主题。网上有很多信息,每次只看一点点,否则你会很容易被淹没。

这是一个伟大的目标清单。有些人上了4年大学才学会这个。我不知道你的背景,但我可以假设你做过一些基本的编程(basic编程?)和汇编语言。如果你没有,这是一个开始的地方。学习一些关于语法和正则表达式的知识,然后用它来开发一个对于具有简单语法的简单语言(如Pascal)的部分,解析器和解释器将是学习前端的一种方式。然后继续并添加生成汇编的代码…后端

最新更新