在c#中实现ByteCode解释器



我的问题是:有没有内存高效的方式来模仿c++联合概念,同时允许字符串数据类型,或其他一些有效的方式,包括数据类型和值在字节码与最小的指针跟踪,以便利用指令缓存?

我正试图用c#写一个VM字节码解释器。出于简单、安全和熟悉的原因,我希望使用c#,主要是因为我想与我已经编写的c#代码库进行交互。

网上有关于如何这样做的信息,除了它在c++中使用'union',我似乎找不到等效的。具体来说,任何类型的值(即任何不是指令的值)都存储为带标记的联合。

我在c#中搜索并发现了这样的问题:有区别的联合,但他们的答案并不能使代码高效-使用继承仍然涉及指针跟踪。

c#中的c++ union建议使用StructLayout。它会一直工作,直到你需要字符串值,然后抛出:

[StructLayout(LayoutKind.Explicit)]
public struct SampleUnion
{
[FieldOffset(0)] public byte typeTag;
[FieldOffset(1)] public int num;
[FieldOffset(1)] public bool flag;
[FieldOffset(1)] public string c;
}

无法加载类型…因为它包含一个偏移量为1的对象字段,该字段与非对象字段不正确对齐或重叠。

我也试着到处传递字节数组,但是当我必须使用值时,我在性能成本上被烧掉了,因为我必须转换它。

我考虑过使用dynamic。也许这可以工作,但对于某些类型来说,这充其量是浪费内存,而在最坏的情况下,我不确定它可能试图在幕后进行什么恶作剧。

我的意思是,最坏的情况下,我想我可以用c++编写字节码解释器,并在c#代码中调用它,但如果可以的话,我宁愿避免这样做,特别是因为我不喜欢乱用不安全关键字的想法,它给我的项目带来了很多复杂性。

如本文所述,字节码解释器的伪代码是:

load the bytecode into memory
initialize interpreter state
repeat {
   fetch the next instruction,    advance the instruction pointer
   decode the instruction 
   execute the instruction
}

根据字节码格式或结构的不同,指令可以是固定长度或动态长度。像数组或字符串这样的数据通常被引用为(固定长度)内存偏移量。数据嵌入在字节码中,与指令分开。数据地址/偏移量是字节码内的索引,因为数据是以字节序列的形式存储的。加载字符串的指令将包含字符串偏移量,但不包含字符串数据本身。

为了获取和解码下一条指令,通常要分析前一个或两个字节,这些字节通常是操作码。从这个操作码中,推导出指令的长度。然后,可以将属于该指令的字节复制到结构体(ure)中,以进一步拆分该指令并提取该指令的操作数。

我看不出联合在这个过程中有什么用。

XIDEK可扩展解释器开发工具包

中描述了一个简单的c++字节码解释器

最新更新