问题标签 [hoopl]
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.
haskell - 如何将 CheckingFuelMonad 与 Hoopl 中的 State monad 结合起来?
我正在使用Hoopl库,并希望在重写时携带一些状态。重写函数对于所使用的 monad 是多态的,但我无法弄清楚如何将State
monad 与库的 monad 之一结合起来Fuel
。
下面是一个最小的例子。MyMonad
是 Hoopl'sCheckingFuelMonad
和State
携带旗帜的单子的同义词。Stmt
只是我的中间语言的占位符,并不重要。
但这不会编译——GHC 抱怨rewrite
类型错误:
我想做的事可能吗?如何rewrite
正确编写函数?
haskell - Hoopl 中重写函数内的单子效应示例?
Hoopl中(前向)重写函数的类型由mkFRewrite
函数给出:
该m
类型意味着我可以在重写时使用单子效果。论文“Hoopl: A Modular, Reusable Library for Dataflow Analysis and Transformation”在第 4.3 节“重写函数和客户端的 monad”中说了同样的话。
谁能给我一个重写函数的例子,其中嵌入了非 Hoopl monadic效果?例如,使用 State monad 或执行一些 IO 的重写器。
haskell - 如何合并Hoopl图块/如何通过块
我正在尝试将 Hoopl 引入一些编译器并遇到了一些问题:为 Hoopl 创建一个图形会使节点按照引入的标签的顺序出现。
例如:
“编译”为
由于从 AST 构建递归图的顺序,指令的顺序(按 showGraph 的顺序)很奇怪。为了生成代码,我需要以更自然的方式重新排序块,比如将返回 RETVAL 放置到函数的末尾,像这样合并块
进入一个街区,依此类推。似乎我需要类似的东西:
我对如何用 Hoopl 执行此操作感到非常困惑。当然,我可能会转储所有节点,然后在 Hoopl 框架之外执行转换,但我认为这是个坏主意。
有人可以给我胶水吗?我没有找到任何有用的例子。在 Lambdachine 项目中执行了类似的操作,但似乎太复杂了。
还有一个问题。是否有必要将所有 Call 指令设为非本地指令?考虑到 Call 的实现不会改变任何局部变量并且总是将控制权转移到块的下一条指令,这有什么意义呢?如果调用指令定义为
这导致图表看起来更加奇怪。所以我用
可能是我错了吗?
haskell - 使用 HOOPL 优化数据流
我是 Haskell 程序员(我通常在 Haskell 中实现算法)并试图理解HOOPL库,但我无法对其进行解码。我没有编译器背景(目前正在学习 Coursera 和编译器:原理、技术和工具),如果您能建议我一种系统的方法来继续理解 HOOPL 库(先决条件是什么),那就太好了。假设我有一个小的 Haskell 代码,我想在其上使用 HOOPL 应用数据流优化
如何编写 HOOPL 代码来优化它。如果你能举一个更好的例子,如果我听起来很愚蠢,请原谅我。
haskell - Hoopl:图构建和不可达块的自动删除
我正在使用 Hoopl 库开展一个项目,但我遇到了一个障碍,这表明我并不完全了解引擎盖下发生了什么。简而言之,Hoopl 似乎认为我的图表中的某些块无法到达(IMO)它不应该。我正在实现一个稀疏的条件常数传播,所以我确实希望某些块变得无法访问,但不是所有块!下面是一个示例,取自我用来制作原型的 HUnit 测试套件。该示例使用了几个未在此处定义的函数,但我为那些确认它们独立工作的单独的单元测试,特别是fromHoopl . toHoopl x
按预期工作的函数,等等。
我期望发生的是这block_cprop_out
应该是运行这个 pass 的结果,但实际结果只是 const 折叠版本block_cprop_in_0
:true 和 false 分支都被消除了。HUnit 测试的输出位于代码片段下方。
为了概括我在高层次上所做的事情,我为每个块创建了一个封闭/封闭的 Hoopl 图,然后将这些图与Hoopl.|*><*|
. 我使用一个简单Data.Map
的方法来跟踪 Hoopl 为用户标签分配的唯一标签,这样,当我重写 a 时Branch userlabel
,我可以将 Hoopl 后继标签修改为正确的 Hoopl Label
。然而,Hoopl 似乎认为真假分支块在这里都不可达,因为在我运行这个前向分析和重写之后,我得到一个只包含入口块的图。
block_cprop_out
这里有点奇怪,因为我的fromHoopl
函数只是调用Hoopl.foldGraphNodes
将整个 HooplGraph a
变成一个简单[a]
的检查。
一个单独的测试证实,使用相同的图形构造方法(连接封闭/封闭块)来往返这个块列表可以按预期工作;似乎消除无法访问的块是由Hoopl.analyzeAndRewrite{Fwd,Bwd}
.
像我在这里做的那样拼接一个封闭/封闭块的列表是否正确?如果是这样,任何人都可以在这里看到任何可能导致 Hoopl 认为区块无法访问的可疑内容吗?
HUnit 输出为: