所谓的中间代码(ES5 的 “JSIL”)
脚本
for (var i in obj) { obj[i] = i * 2 + 1; }寄存器版JSIL
/*literial registers L0 'i' identifier L1 'obj' identifier L2 2 number L3 1 number */ LVA $0, L1 CEE $1, $0 start: ITEM $2, $1 SVA L0, $2 MUL $3, [0], L2 ADD $3, $3, L3 SPR $0, $2, $3 NEXT $4, $1 JNZ start,$4 end:
堆栈版JSIL
/* variables L0 i L1 obj */ PUSH VAR L1 // obj PUSH ENUM 0 // obj,[enum]obj start: PUSH VAR L0 // obj,[enum]obj,i PUSH ITEM 1 // obj,[enum]obj,i,[enum]obj.item SAVE // obj,[enum]obj,i POP PUSH VAR L1 PUSH VAR L0 PROP // ... obj[i] PUSH VAR L0 // ... obj[i],i PUSH NUMBER 2 // ... i,2 MULT PUSH NUMBER 1 // ... 2i,1 ADD SAVE // ... obj[i]( = 2i+1) POP NEXT // obj,[enum]obj,hasNext? JZ end POP end:
你喜欢哪一种呢?