0

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

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

任何提示或建议都会很好。先感谢您!

4

3 回答 3

0

你已经知道多少编程了?

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

查看现有的简单编译器也会有所帮助。一旦你内化了编译器所做的事情——将一组符号翻译成另一组——那么你可能想要开始研究解析语法和相关主题。那里有很多信息,一次拿一点,否则你很容易不知所措。

于 2011-08-19T02:38:39.563 回答
0

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

于 2011-08-19T02:41:17.003 回答
0

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

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

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

相反,我会从第 3 步开始,然后编写自己的编译器。我在大学上过编译器课程,到学期末,我有一个可用的 Pascal 编译器,我使用LEX 和 YACC从头开始​​构建。这很有启发性。您也可以将Bison与 yacc 一起用于此类事情。不过我从来没用过。

此外,只需在空闲时间做一些小练习,比如弄清楚如何操纵 GCC 将 hello world 编译成少于 X 个字节的字节数,就会比你想象的要多得多。(顺便说一下,网上有很多这样的例子)

玩得开心!

于 2011-08-19T02:52:01.823 回答