【问题标题】:Representing arrays and records in bytecode用字节码表示数组和记录
【发布时间】:2011-01-11 11:07:32
【问题描述】:

我正在用 C 从头开始​​创建一种编程语言,我不希望使用第三方代码来处理变量。

首先,以字节码形式表示数组分配的最佳方式是什么,例如apples_in_crate[5] = 170

显然,apples = 170 可以表示为:

PUSHSCALAR ("apples")
PUSHREAL (170)
ASSIGNSCALAR

但是当涉及到数组时,事情会变得复杂得多。有什么建议吗?

其次,你将如何在字节码中表示crate[5].apples = 170(一条记录)?

任何帮助将不胜感激。

澄清:我正在编写一个解释器,所以数组的大小在“编译时”或解析时是已知的。例如,以下(抽象)代码将非常有效:

// Note: NUMBER_OF_CRATES is not known at compile-/parse-time,
// it could even be a dynamic expression.
array apples_in_crate[NUMBER_OF_CRATES]

for crate = 1 to NUMBER_OF_CRATES
   apples_in_crate[crate] = randint (101) + 100
end for

【问题讨论】:

    标签: c arrays bytecode


    【解决方案1】:

    这完全取决于您的字节码。你的结构有多静态?如果一切都在编译时完成(有点像在 C 和 C++ 中),你知道 apples_in_create 中每个元素的大小,所以你可以先 push apples_in_create,然后将 5 * sizeof(elements) 添加到该值,然后分配 170到那个地址。

    第二个示例也是如此:推送 crate,添加 5 * sizeof(Crate),添加 offset_of(apples),赋值。

    现在,如果您想让事情变得更加灵活(例如,如果您想允许反射之类的事情),您必须让您的系统在运行时更加了解您的数据类型。但是如果没有更多关于你的字节码应该是什么样子的信息,很难给你更多的建议。

    【讨论】:

    • 我已经稍微澄清了我的问题。具体来说,我正在制作一个解释器——所以像数组大小这样的东西在编译时或解析时都不知道,实际上可能是动态的。
    • 所以在这种语言中,array 是一个可以有任意数量成员的通用 hashmap(如 PHP、Javascript、LUA)?每个元素可以有不同的成员集? (没有人关心 NUMBER_OF_CRATES 是否未知。只要您知道数组的大小(sizeof == 一个元素的大小),就可以了,并且可以通过在数组之前存储大小来轻松实现边界检查。)
    【解决方案2】:

    例如,Here's 在 Java 虚拟机中是如何表示的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多