Parsing 有关将语法树转换为程序集的资源?

Parsing 有关将语法树转换为程序集的资源?,parsing,compiler-construction,assembly,abstract-syntax-tree,Parsing,Compiler Construction,Assembly,Abstract Syntax Tree,主要是作为一个学习练习,我从头开始编写一个虚拟机、一个汇编程序和一个编译器,不依赖外部工具 我相信我对虚拟机和汇编器的工作原理以及编译器的某些部分有一个不错的概念性理解 以下是我想知道的: 在编译器中,假设我已将源代码转换为语法树。我需要经过什么过程才能将此语法树转换为汇编? (让我们假设一些简单的语言结构,比如if和while。我在这里寻找一个最小且简单的解释。) 我对复杂的解决方案或基于现有工具的解决方案并不特别感兴趣。更确切地说,我想要的是一页纸的顺序,对从语法树到汇编背后的思想进行全面的

主要是作为一个学习练习,我从头开始编写一个虚拟机、一个汇编程序和一个编译器,不依赖外部工具

我相信我对虚拟机和汇编器的工作原理以及编译器的某些部分有一个不错的概念性理解

以下是我想知道的: 在编译器中,假设我已将源代码转换为语法树。我需要经过什么过程才能将此语法树转换为汇编?

(让我们假设一些简单的语言结构,比如if和while。我在这里寻找一个最小且简单的解释。)

我对复杂的解决方案或基于现有工具的解决方案并不特别感兴趣。更确切地说,我想要的是一页纸的顺序,对从语法树到汇编背后的思想进行全面的描述

有人知道这样的资源吗


谢谢:)

对编译器问题的强制性回答是阅读《龙之书》(编译器:原理、技术和工具)。当你说你已经把源代码变成了一个语法树,你到底是什么意思?通常,解析的第一阶段是创建抽象语法树(AST)。下一步通常是做归因。属性是AST中节点的属性,不一定与源语言有任何关系,但对代码生成至关重要。通常在这里进行某种形式的类型检查,以确定内存大小要求,以及在面向对象语言中,要调用什么函数。例如,如果源代码为obj1=obj2+obj3,则在确定obj2的类型之前,您不知道如何使用加号

所以我想试着回答你的问题。1) 将源代码解析为AST。2) 在AST上做归因。3) 生成中间代码(想象一下您将其称为程序集)


龙书的第5章和第6章详细介绍了这一点。真正棘手的部分是找出代码生成所需的属性。此外,if语句还有一些棘手的问题。例如,如果if条件失败,您知道需要跳过一些代码,但至少在最初,您不知道要跳过多远。背面修补是解决此问题的一种方法

当然。任何编译手册第1章的第2页和第3页。但我想你希望这就是你所需要的,而且不会太久。问题是,将过程语言翻译成好的机器代码(即使对于虚拟机来说)需要大量的机器,虽然这两页将给出所需内容的模糊含义,但如果不阅读编译器手册的其他200页,您将无法构建任何合理的代码生成器。