gpt4 book ai didi

.net - 将基于堆栈的语言编译为 CIL

转载 作者:行者123 更新时间:2023-12-02 14:04:20 29 4
gpt4 key购买 nike

我有一个基于自定义堆栈的语言,我正在尝试将其编译为 CIL,以便可以对其进行 JIT 编译。该语言本身相当简单,因为它只有整数和 bool 值。然而,每种数据类型都有一个专用的堆栈。该语言本身是一个命令流,其中每个命令都可以从任一堆栈中查看、推送和/或弹出值。由命令压入/弹出的整数或 bool 值的数量永远不会改变(因此命令具有固定的数量)。还有一个平面整数数组,语言可以向其读取和写入值,代表外部存储器。堆栈本身可以是任意深度。

对于像“add”、“subtract”等简单命令,将整数堆栈命令转换为 CIL 几乎非常简单:CIL 堆栈可以批量替换整数堆栈(尽管我有一个附带问题:是否有一个限制 CIL 堆栈的深度,无论是在规范中还是在实践中?)但是,还有像 StoreIfTrue 这样的命令,它只会将值(来自整数堆栈)存储到某个索引处的平面整数数组(该索引也来自整数堆栈)如果 bool 堆栈的顶部值为 true。因此,对于某些命令,我​​需要同时访问 bool 堆栈和整数堆栈。

现在我必须维护一个 System.Collections.Generic.Stack 来表示 bool 堆栈。但我想知道是否有一种已知的算法或方法可以将我的自定义语言的两个堆栈模型“扁平化”为与 CIL 更直接兼容的单个堆栈模型。

最佳答案

我认为在一个堆栈中存储两个独立的堆栈是不可能的(至少在没有外部临时存储的情况下,但那样你会得到糟糕的性能)。这是因为无论您使用什么表示形式,都无法使两个堆栈的顶部始终接近实际堆栈的顶部。

但是CIL不仅仅有栈和堆,它还有局部变量。但只能通过常量索引访问局部变量。因此,如果您在编译时始终知道堆栈顶部的索引,并且还知道堆栈的最大大小,则可以使用局部变量来表示它。但我认为这两个条件不适用于您的情况。

因此,我认为使用 Stack<T>对于您的一个或两个堆栈来说是您的最佳选择。

关于.net - 将基于堆栈的语言编译为 CIL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11587687/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com