Browse thread
High-performance bytecode interpreter in OCaml
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: | 2007-08-16 (08:33) |
From: | Grant Olson <olsongt@v...> |
Subject: | RE: [Caml-list] High-performance bytecode interpreter in OCaml |
> > As for CPS, what I meant is implementing each bytecode > instruction as a function that takes a continuation (next > instruction?). > > Thanks, Joel > Once again I made the mistake of following up on google groups! Anyway, nothing good was on tv so I wrote up a better example. I think you'd make things too complicated with CPS. Why not just create a dispatcher function and opcode instructions that are all tail recursive? Without knowing the internals, I don't see how it could be that much slower than CPS and is much easier for us humans to read. Anyway, here's a trivial vm: (* Stupid vm. It is initailized with an instruction counter of zero and has one register that is initially zero. There are four instructions: 'i' - increment the register 'd' - decrement the register 'p' - print the value of the register 'r' - reset the instruction counter to zero *) type vm = {current_inst:int;register:int;bytecode:string} let create_vm b = {current_inst=0;register=0;bytecode=b} let inc_inst v = {v with current_inst=v.current_inst+1} let update_reg v i = {v with register=v.register+i} let update_reg_and_inc v i = let new_v = update_reg v i in inc_inst new_v let rec dispatch v = let opcode=v.bytecode.[v.current_inst] in begin match opcode with 'i' -> inc v | 'd' -> dec v | 'p' -> print v | 'r' -> reset v end and inc v = let new_v = update_reg_and_inc v 1 in dispatch new_v and dec v = let new_v = update_reg_and_inc v 1 in dispatch new_v and print v = Printf.printf "%i\n" v.register; dispatch (inc_inst v) and reset v = dispatch {v with current_inst=0} let vm_instance = create_vm "piiipdpdddddddpiiiprpididi" let _ = dispatch vm_instance