所谓的中间代码(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:    

你喜欢哪一种呢?

posted @ 2009-12-31 23:03  infinte  阅读(400)  评论(0编辑  收藏  举报