字节码设计:第一版(仅仅用于表达式计算)
PushImm 123
Push R2
Pop R0
Mov src, dst #寄存器到寄存器
MovImm imm, reg #加载立即数到寄存器
CallPrimitiveFunction ‘+’ #ABI: 最多2个输入参数,R0,R1,输出结果在R0
核心JS代码(部分,优快云博客不支持上传附件):
Assembler.prototype = {
emitInstruction: function(inst) {
//应用窥孔优化:如果当前指令是Pop,并且前一条指令是Push,且寄存器参数相同,则去除这一对指令
if (inst.type=="Pop") {
if (this.code_buffer.length>0) {
var last_inst = this.code_buffer[this.code_buffer.length-1];
if (last_inst.type=="Push" && inst.arg==last_inst.arg) {
this.code_buffer.pop();
return;
}
}
}
this.code_buffer.push(inst);
},
getResult: function() {
return this.code_buffer;
},
toString: function() {
function inst2str(inst) {
return inst.type + " " + inst.arg
+ (!!inst.arg1 ? " "+inst.arg1 : "");
//当前,由于设计简化的缘故,每个字节码指令最多只有