众所周知如何将代码从SSA表示转换为寄存器机器.(基本上,图形着色寄存器分配是这种转换的核心.)
但是从SSA转换为堆栈机器的一般方法是什么?(CIL字节代码,在我看的情况下.)我希望它更简单,因为不需要寄存器分配?
我正在为一个相当标准的堆栈机器编写一个编译器.现在我想添加一个垃圾收集器.我可以看到,我可以生成某种"堆栈映射",以了解哪些变量是每个激活记录中的gc根.但是,我不知道如何处理执行期间在堆栈中推送的中间值.我正在编译的语言是Pascal式的,所以我不需要,我不想使用标签来识别来自其他数据类型的指针.
我会很感激有关如何的任何提示/指示
非常感谢你!萨科
compiler-construction garbage-collection code-generation stack-machine gc-roots
我一直在玩一种简单的基于堆栈的语言,我发现自己反复做的一件事就是手动优化代码块。
我想“嘿,这看起来很像计算机可以做的事情!具有明确目标和语义的重复工作。”。但是环顾四周,我找不到关于优化堆栈机器代码的任何内容。注册机器,是的。但不是基于堆栈的语言。这似乎是对“您如何优化堆栈机器代码?”的普遍回应。是“不要”。
那么:如何优化堆栈机器码?除了简单的窥孔优化之外,还有其他通用方法吗?有没有自动生成窥视孔优化的方法?
我正在构建一个从C语言到堆栈机器的玩具编译器,我正处于需要弄清楚如何处理函数和阻塞局部变量的地方.从抽象的角度思考它看起来我在频谱的两端有两个选项:1)为每个变量预处理和预分配堆栈空间,2)向VM添加特殊指令以遍历堆栈.
这样做的好处是可以提前给我变量的所有地址,这样我就不必非常聪明,或者在虚拟机上添加任何额外的指令来移动堆栈.缺点是它可能非常浪费,因为从不执行但是声明一大堆变量的条件代码将占用大量不必要的空间.例如,
a : t1 = value;
if (test) {
b : t2; c : t3; d : t4; ...;
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,即使test总是为false,我仍然会为条件分支中的所有变量分配空间.
我可以想到的另一种方法是为每个变量声明生成代码,然后添加一些特殊的VM指令以在运行时找出这些变量的地址.这解决了浪费堆栈空间的问题,但随后增加了一些计算开销,我可以通过一些缓存方法来解决这个问题.
那么什么是正确的方法,还有另一种我没想到的方法更好吗?
compiler-construction variables stack-machine vm-implementation
所以我一直在学习堆栈机器,解释器,编译器以及与编程语言及其一般理论相关的一些其他内容.我在书籍和网上找到的大多数东西都非常专业,并且谈论一个特定主题,例如口译员,没有提及它与其他主题的关系,例如部分评估者.是否有任何良好的初学者资源来探索解释器,编译器和部分评估器之间的互连?通过良好的资源,我的意思是解释理论和具体实施.我越了解这些东西,我在日常工作中看到的地方越多,所有这些都可以应用,但缺乏初学者友好资源有点无聊.
compiler-construction interpreter compiler-theory stack-machine computation-theory