标签: stack-machine

将SSA转换为堆栈计算机

众所周知如何将代码从SSA表示转换为寄存器机器.(基本上,图形着色寄存器分配是这种转换的核心.)

但是从SSA转换为堆栈机器的一般方法是什么?(CIL字节代码,在我看的情况下.)我希望它更简单,因为不需要寄存器分配?

compiler-construction cil stack-machine ssa

12
推荐指数
2
解决办法
412
查看次数

堆栈机器代码的SSA

我正在为堆栈机器(特别是CIL)编译器,我已经将代码解析为基本块的图形.从这里开始,我希望将SSA应用于这些方法,但这并不是太顺利.我的第一次尝试(使用平面列表,而不是图形)是迭代代码并保留一堆SSA ID(即,对于分配目标),在我生成赋值时推送它们,当它们弹出时弹出它们他们被使用了.这适用于单个基本块,但我根本无法弄清楚如何处理生成Φ函数.

我一直在徘徊的想法是将堆栈位置附加到SSA ID,然后在代码路径收敛时查看堆栈中仍然存在的内容,但这似乎不是做事的Right Way(TM).

是否有一种简单的算法可以跟踪多个代码路径中的堆栈操作并在收敛时确定冲突?

compiler-construction stack-machine ssa

9
推荐指数
1
解决办法
2043
查看次数

8
推荐指数
0
解决办法
1281
查看次数

如何在堆栈机器中找到gc root?

我正在为一个相当标准的堆栈机器编写一个编译器.现在我想添加一个垃圾收集器.我可以看到,我可以生成某种"堆栈映射",以了解哪些变量是每个激活记录中的gc根.但是,我不知道如何处理执行期间在堆栈中推送的中间值.我正在编译的语言是Pascal式的,所以我不需要,我不想使用标签来识别来自其​​他数据类型的指针.

我会很感激有关如何的任何提示/指示

  1. 在任何时间点在堆栈中查找gc根(即,如何识别已在堆栈中推送的哪些中间值是gc根).
  2. 编码此信息的常用形式(即,如何生成和编码"堆栈映射")

非常感谢你!萨科

compiler-construction garbage-collection code-generation stack-machine gc-roots

7
推荐指数
1
解决办法
250
查看次数

如何优化简单的堆栈机器代码?

我一直在玩一种简单的基于堆栈的语言,我发现自己反复做的一件事就是手动优化代码块。

我想“嘿,这看起来很像计算机可以做的事情!具有明确目标和语义的重复工作。”。但是环顾四周,我找不到关于优化堆栈机器代码的任何内容。注册机器,是的。但不是基于堆栈的语言。这似乎是对“您如何优化堆栈机器代码?”的普遍回应。是“不要”。

那么:如何优化堆栈机器码?除了简单的窥孔优化之外,还有其他通用方法吗?有没有自动生成窥视孔优化的方法?

language-agnostic optimization stack-machine

4
推荐指数
1
解决办法
1528
查看次数

编译堆栈计算机的局部变量

我正在构建一个从C语言到堆栈机器的玩具编译器,我正处于需要弄清楚如何处理函数和阻塞局部变量的地方.从抽象的角度思考它看起来我在频谱的两端有两个选项:1)为每个变量预处理和预分配堆栈空间,2)向VM添加特殊指令以遍历堆栈.

为每个变量预处理和预分配堆栈空间

这样做的好处是可以提前给我变量的所有地址,这样我就不必非常聪明,或者在虚拟机上添加任何额外的指令来移动堆栈.缺点是它可能非常浪费,因为从不执行但是声明一大堆变量的条件代码将占用大量不必要的空间.例如,

a : t1 = value;
if (test) {
  b : t2; c : t3; d : t4; ...;
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,即使test总是为false,我仍然会为条件分支中的所有变量分配空间.

向VM添加特殊指令以遍历堆栈

我可以想到的另一种方法是为每个变量声明生成代码,然后添加一些特殊的VM指令以在运行时找出这些变量的地址.这解决了浪费堆栈空间的问题,但随后增加了一些计算开销,我可以通过一些缓存方法来解决这个问题.

那么什么是正确的方法,还有另一种我没想到的方法更好吗?

compiler-construction variables stack-machine vm-implementation

4
推荐指数
1
解决办法
1002
查看次数

口译员理论,部分评估员和编制者

所以我一直在学习堆栈机器,解释器,编译器以及与编程语言及其一般理论相关的一些其他内容.我在书籍和网上找到的大多数东西都非常专业,并且谈论一个特定主题,例如口译员,没有提及它与其他主题的关系,例如部分评估者.是否有任何良好的初学者资源来探索解释器,编译器和部分评估器之间的互连?通过良好的资源,我的意思是解释理论和具体实施.我越了解这些东西,我在日常工作中看到的地方越多,所有这些都可以应用,但缺乏初学者友好资源有点无聊.

compiler-construction interpreter compiler-theory stack-machine computation-theory

3
推荐指数
1
解决办法
208
查看次数

汇编语言中的PUSH指令是零地址指令还是一地址指令?

我读到,在堆栈中实现时,ADD 和 MUL 指令是零地址指令,但没有任何地方讨论 PUSH 和 POP 指令是一个地址指令还是零地址指令。以下是 Morris Mano 的《计算机体系结构》的摘录: 在此输入图像描述

在我们的考试中被问到并回答为零地址指令,但我很确定它一定是一地址指令。请有人帮忙。

assembly cpu-architecture stack-machine

1
推荐指数
1
解决办法
1062
查看次数