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

时间:2011-08-19 02:16:32

标签: assembly compiler-construction vm-implementation

我正在尝试了解编译器,操作系统和计算机系统如何在内部工作。这是我目前的计划:

  1. 在C中编写一个简单的虚拟机,可以接受用其机器语言编写的输入(我的规范的自定义语言。)
  2. 为该虚拟机编写汇编程序。
  3. 为机器的类似基本语言编写一个非常基本的编译器。
  4. 通过包含一个屏幕(我想我将使用SDL)以及通过视频内存到该屏幕的界面来扩展虚拟机的交互性。我还可以添加鼠标/键盘功能。
  5. 任何提示或建议都会很好。提前谢谢!

3 个答案:

答案 0 :(得分:0)

您已经了解了多少编程?

写一个FORTH翻译是一个很好的练习。它相对简单,语言和语义已经定义明确,因此您无需从头开始设计自己的系统。 FORTH通常还有一个编译器(尽管它不像C编译器)并且可能内置了汇编程序,因此您也可以对其进行调查。它将为您提供管理内存,处理指针,解析引用等的心理工具。

查看现有的简单编译器也会有所帮助。一旦你内化了编译器的作用 - 将一组符号翻译成另一组符号 - 那么你可能想要开始研究解析语法和相关主题。那里有大量的信息,一次一点点,或者你很容易被淹没。

答案 1 :(得分:0)

这是一个很棒的目标清单。有些人上大学4年才学到这一点。 我不知道你的背景,但我可能会认为你已经完成了一些基本的编程(BASIC编程?)和汇编语言。如果你还没有,那就是一个开始的地方。 学习一些关于语法和正则表达式的东西,然后用它来开发一个 解析器和解释器,用于简单语言的一部分,具有简单的语法,如Pascal,将是学习前端的一种方法。然后继续并添加生成程序集的代码......后端。

答案 2 :(得分:0)

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

我可能推荐的一个系列是Write Great Code本书。我不能保证整个系列,因为我没有全部阅读,但是我的办公室里有他们在工作,我已经多次使用它们来掌握这个主题,然后我才先去了。例如,一个可能直接与您的计划相关的示例,我需要了解GCC编译器如何组织它生成的ELF二进制文件,每个部分是什么,以及存储在那里的内容。 (这是针对嵌入式系统的,我们正在扩展我们的RAM,所以我不得不重新组织一些东西......)

你说“没什么太难”......在我看来,我认为你的步骤已经相当困难,特别是如果你的最终目标是了解编译器和操作系统。我会跳过整个虚拟机,至少目前是这样。实际上,处理器非常简单,并且基于您已经知道它只是处理“机器语言”的事实,您可能已经掌握了良好的开端。

我会从第3步开始,只编写自己的编译器。我在大学读了一个编译器课,到学期结束时,我有一个工作的Pascal编译器,我使用LEX and YACC从头开始构建。这很有启发性。您也可以将Bison与yacc一起用于此类事情。我从来没用过它。

另外,简单地在空闲时间做一些小练习,比如弄清楚如何操纵GCC将hello world编译成少于X个字节的数量,这比你想想这些东西是如何运作的要多得多。 (顺便提一下,网上有很多例子)

玩得开心!