从简单的编程指令生成抽象机器代码

generate abstract machine code from simple programming instructions

我的问题是我需要学习什么才能完成该任务...任务是根据

等简单的编程指令创建自动代码生成器
(x:=5-z; while x<z do (x:=x*2; z:=z+x) ) 

并将其翻译成抽象机器指令..

PUSH-5:FETCH-z:SUB:STORE-x: LOOP ...etc....

所以我的问题是...从哪里开始?? ,我需要一些解析器,解析器必须使用一些 XML ..但我真的不知道如何定义 XML ..

请帮助从哪里开始..谢谢..

我会在 JAVA swing 中编码 UI

如果您知道自己支持的语法,那么实现您自己的解析器并不难。一个字符一个字符地解析字符串,通过下一个运算符或空白检测运算符、文字终止符或变量名结尾,并获取先前存储的字符作为标记。确定令牌的种类,并在 Java 中构建面向对象的模型。一旦你有了一个面向对象的表达式模型,你就可以使用例如PRETTY-PRINT 的访问者模式、评估甚至转换为机器代码,具体取决于您的访问者实现。

(从角度来看:从你的问题来看,不清楚这个解析器必须如何处理 XML...)

几年前,我实现了这样一个解析器来计算这些表达式(但尚未转换为机器代码)。 My old project 可以让您了解我是如何解决这个任务的。

您需要阅读几本有关编译器编写的书籍。这对 Whosebug 来说是一个太大的问题 - 首先,如果不知道您拥有多少计算机科学知识(例如,您了解堆栈和有限状态自动机吗?),就不可能回答

这方面的经典书籍是Aho和Ullmann,现在已经很古老了,但说实话基本思想没怎么变,我还在用。

基本步骤是:

  1. 指定要实现的编程语言的语法和语义。 (后续的一些细节将取决于它是什么类型的语言,例如它是过程性的还是声明性的,以及它具有什么样的类型系统;但是编译器的整体架构仍然是相同的)。

  2. 为此语言实现一个解析器(和分词器),它将源代码的表示构造为表达式树。

  3. 编写大量测试用例。 (有人会说你应该早点这样做,但我自己的偏好是编写一个测试用例,然后编写足够的代码来通过该测试,然后再编写更多的测试。)

  4. 实现语义阶段,负责绑定变量和函数名称以及类型检查等任务。

  5. 在这个阶段,我建议为该语言编写解释器,因为这比编写代码生成器要容易得多,而且它将帮助您验证前面的阶段是否正常工作。

  6. 在编写代码生成器之前,您需要 (a) 为您的目标(虚拟)机器代码制定规范,并且 (b) 为 run-time 设计内存管理:你打算如何分配堆栈 space 和堆 space,并进行垃圾收集?

  7. 编写代码生成器。最初保持尽可能简单,让它适用于所有测试用例,然后考虑优化。