问题标签 [ssa]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
846 浏览

cpu-registers - 基于寄存器+堆栈的虚拟机如何工作?

我知道基于寄存器以及基于堆栈的虚拟机如何独立工作。我知道两者的优点和缺点。我想知道的是有没有人尝试过将两者合并?

我试图在网上搜索是否存在这样的虚拟机,但无济于事。我得到的最好结果是一篇关于混合虚拟机 ( HyVM ) 的文章。如果确实为编程语言创建了这样的虚拟机,我将有兴趣查看它的源代码以了解它的工作原理。

也许有人可以指出我找到这样一个虚拟机的正确方向,或者将我链接到详细阐述该主题的文章或博客文章。

0 投票
1 回答
355 浏览

functional-programming - 如何在 Erlang 中使用 SSA 累积结果?

这是一个完整的功能新手问题。

我正在尝试学习一些 Erlang 并创建了一个(希望是并发的)蒙特卡罗模拟,其中产生了多个进程,它们通过消息传递将它们的本地结果报告给父进程。

所以在父进程中我有类似的东西

假设我想总结从衍生进程收到的所有 Ns 和 Ms。

我知道累积值通常是通过函数式编程中的递归来完成的,但是如何在接收语句中做到这一点..?

0 投票
1 回答
159 浏览

c - 如何标记 SSA

参考How to tokenize String in Lex and Yacc但在这篇文章中我正在寻找整数标记

当我得到输入时

在 lex 文件中我想将 a_2 作为整数类型令牌,我怎样才能得到这个令牌下面是我的 lex 文件

这是在数字中给出一些二进制值

0 投票
0 回答
178 浏览

compiler-construction - 将堆栈推入循环转换为三地址代码基本块

我一直在为一个超级简单的基于堆栈的语言开发一个小型编译器(使用 llvm,但没关系)。

我一直在阅读很多关于将基于评估堆栈的语言转换为 TAC 或 SSA 的论文,一般概述的基本过程是将代码划分为基本块,然后在每条指令处分析堆栈的高度并进行分配使用高度作为名称注册堆栈中的每个位置。然后,分析基本块的网络推送和弹出,并根据需要转发它们之间的注册表。

但是,有了这些信息,我无法理解一个简单的案例。例如下面的伪代码:

假设 READ 是一个从某处获取值并将其压入堆栈的函数,该函数将创建一个带有 READ 指令的简单基本块,可能是减法和最后的分支(假设无论 if 不会从堆栈)。

问题是,如果我只分析堆栈使用情况,没有弹出,只有一次推送,所以我只需要传递一个值。但是,随着循环的进行,由于只有一个注册表用于存储,因此所有读取都将丢失。

我没有找到任何关于此案的文字。是否应该与转换后的程序一起保留一个真正的堆栈?如果是这种情况,找出何时必须从实际堆栈中压入或弹出值似乎并不容易,因为它取决于所有基本块之间的关系。

有什么文章或论文可以阅读吗?任何帮助表示赞赏,谢谢。

0 投票
1 回答
241 浏览

python - R 包 Rssa 不使用 rpy2 importr 导入到 python

当我在 Python 命令中执行时

我得到了 eroor

其他包导入没有问题,例如

我一直在寻找这样的问题,但我找不到任何东西。请提出这个问题的一些决定。

0 投票
1 回答
39 浏览

compiler-construction - 在基本块中包含原子值

将抽象语法树表达式转换为 SSA 基本块需要以线性顺序写出表达式中的所有操作,例如x * y + 1转换为包含*and的操作列表+

通常在操作列表中包含变量和文字提取吗?即上面应该产生一个长度为2或5的列表吗?

一方面,将全局变量或常量的值加载到寄存器中是最终必须安排好的操作。

另一方面,决定哪些值将存在于寄存器中通常是在从 SSA 形式转换期间或之后完成的。

另一方面,在线性序列中包含原子值意味着您可以通过遍历基本块和操作来回答诸如“此函数访问哪些全局变量”之类的问题,而不必遍历每个操作的参数。

还有其他我遗漏的注意事项吗?

澄清一下:局部变量名称通常在 SSA 中消失(不需要它们,您可以直接使用指向生成值的操作的指针)。我正在考虑仍然需要名称的东西 - 常量、全局变量名称、地址已被占用的局部变量等。

0 投票
2 回答
496 浏览

compiler-construction - 快速计算支配者

据说在将中间代码转换为静态单赋值形式时,

  1. 需要计算基本块的支配者

  2. 作为方程的固定点,有些明显的方法是缓慢的

  3. 要快速完成,您需要使用相当复杂的 Lengauer-Tarjan 算法

我可以看到前两点,但我不清楚第三点背后的原因。特别是在计算前序支配树的过程中,有什么理由不能这样做吗?我已经在 J​​avaScript 中实现了一个版本,它似乎可以工作:

这种方法有一些我没有看到的缺点吗?

0 投票
1 回答
254 浏览

compiler-construction - SSA 的语义和多重赋值

在 SSA 形式中,从 phi 分配的变量最终具有适当的值,具体取决于到达它的路径。但是,如果可能通过一些不寻常的路径,对 phi 的两个输入都已分配,会发生什么?例如

它是否被定义为像一个联合一样,使得 c 以值 2 结束,因为那是最后一个赋值?

0 投票
1 回答
409 浏览

llvm - 从 LLVM 获取“最小”SSA

LLVM 的opt -S -mem2reg通行证产生所谓的“修剪”SSA - 删除了所有死phi函数的形式。我想将这些phi指令保留在 IR 中,以获得“最小”的 SSA,但我找不到一个简单的方法来做到这一点。

我注定要从头开始实现整个 SSA 构造算法,还是有办法使用现有工具来实现?

0 投票
1 回答
450 浏览

llvm - phi节点指令中前驱块标签的LLVM IR位置

在基本块中使用 phi 节点时,是否有建议的顺序,如果前驱是某个块的可能性更高,我应该按照该顺序放置标签。例如下面列出的简单阶乘函数。

虽然用户可能会输入@fact(1)它是不可能的,但我希望在大多数情况下 phi 节点的前驱块endcondpost.loop. 我的假设是在这种情况下

好于

正确的?如果是这样,为什么或为什么不呢?