我正在開發,編譯爲自己的虛擬機,一個簡單的具有指令以某種數據的工作像點,載體一種腳本語言,漂浮和等..存儲單元表示這樣:設計的虛擬機JIT
struct memory_cell
{
u32 id;
u8 type;
union
{
u8 b; /* boolean */
double f; /* float */
struct { double x, y, z; } v; /* vector */
struct { double r, g, b; } c; /* color */
struct { double r, g, b; } cw; /* color weight */
struct { double x, y, z; } p; /* point variable */
struct { u16 length; memory_cell **cells; } l; /* list variable */
};
};
說明是通用的,可以在許多不同的操作數工作。例如
ADD dest, src1, src2
可以使用浮點數,向量,點,顏色根據操作數設置正確類型的目標。
主執行週期只檢查指令的操作碼(它是一個包含用於定義任何類型指令的聯合的結構)並執行它。我使用了一種簡化的方法,其中我沒有寄存器,只有大量的存儲單元。
我想知道JIT是否可以幫助我獲得最佳表演或不如何實現它。
正如我說最好的執行已達成到目前爲止是這樣的事情:
void VirtualMachine::executeInstruction(instr i)
{
u8 opcode = (i.opcode[0] & (u8)0xFC) >> 2;
if (opcode >= 1 && opcode <= 17) /* RTL instruction */
{
memory_cell *dest;
memory_cell *src1;
memory_cell *src2;
/* fetching destination */
switch (i.opcode[0] & 0x03)
{
/* skip fetching for optimization */
case 0: { break; }
case MEM_CELL: { dest = memory[stack_pointer+i.rtl.dest.cell]; break; }
case ARRAY_VAL: { dest = memory[stack_pointer+i.rtl.dest.cell]->l.cells[i.rtl.dest.index]; break; }
case ARRAY_CELL: { dest = memory[stack_pointer+i.rtl.dest.cell]->l.cells[(int)i.rtl.dest.value]; break; }
}
/* omitted code */
switch (opcode)
{
case ADD:
{
if (src1->type == M_VECTOR && src2->type == M_VECTOR)
{
dest->type = M_VECTOR;
dest->v.x = src1->v.x + src2->v.x;
dest->v.y = src1->v.y + src2->v.y;
dest->v.z = src1->v.z + src2->v.z;
}
/* omitted code */
是否容易/便利嘗試JIT編譯?但我真的不知道從哪裏開始,這就是爲什麼我要問一些建議。
除此之外,還有什麼其他的建議,我應該考慮在開發它?
這個虛擬機應該足夠快,可以爲光線追蹤器計算着色器,但我還沒有做過任何一種基準測試。
一個很好的鍛鍊確實......但爲什麼另起爐竈?已經有很多很棒的VM:LLVM,JVM,BEAM(Erlang Emulator)等等。 – jldupont 2009-11-28 12:24:55
因爲理解這些主題的內幕很有趣.. – Jack 2009-12-01 15:36:56
我之前忘了提及這個,但是你見過OpenCL嗎? (http://www.khronos.org/opencl/)可能會給你一些想法。 – 2009-12-01 17:09:05