For those with lots of imagination below is a teaser of the opcode
set. Please tear it apart. There are some strange ideas in it. It is
obviously not purely concatenative (for any definition), but it is
sufficiently so for quite a bit of analysis. The main advantages of
this bytecode are that (with only a few exceptions) we can easily
perform function call inlining, and automated subroutine extraction.
My implementation is an optimizing bytecode interpreter written in
C++, that translates from a high-level languages so it is taking a lot
of time to get everything off the ground.
enum OpCodeEnum
{
op_noop,
// literals
op_push_int,
op_push_char,
op_push_byte,
op_push_sub,
op_push_neg1,
op_push0,
op_push1,
op_push2,
op_push_true,
op_push_false,
op_push_string,
// stack shuffling
op_pop,
op_popd,
op_pop2,
op_pop3,
op_pop4,
op_dup,
op_dupd,
op_dup2,
op_dup3,
op_swap,
op_swapd,
op_swap13,
op_swap23,
op_swap14,
op_swap24,
op_swap34,
op_get,
op_get1,
op_get2,
op_get3,
op_get4,
op_set,
op_set1,
op_set2,
op_set3,
op_set4,
// integer comparison operators
op_lt_int,
op_gt_int,
op_lteq_int,
op_gteq_int,
op_eq_int,
op_neq_int,
// float comparison operators
op_lt_flt,
op_gt_flt,
op_lteq_flt,
op_gteq_flt,
op_eq_flt,
op_neq_flt,
// general comparison operators
op_lt,
op_gt,
op_lteq,
op_gteq,
op_eq,
op_neq,
// basic integer arithmetic
op_add_int,
op_sub_int,
op_div_int,
op_mul_int,
op_mod_int,
op_neg_int,
op_inc,
op_dec,
// basic floating-point arithmetic
op_add_flt,
op_sub_flt,
op_div_flt,
op_mul_flt,
op_mod_flt,
op_neg_flt,
// general arithmetic
op_add,
op_sub,
op_div,
op_mul,
op_mod,
op_neg,
// boolean operations
op_or,
op_not,
op_xor,
op_and,
// higher order functions
op_ret,
op_apply,
op_call,
op_tail_apply,
op_tail_call,
op_quote,
op_papply,
op_compose,
op_dip,
op_while,
op_if,
// objects
op_get_slot,
op_set_slot,
op_new,
op_null,
// arrays and lists
op_new_array,
op_count,
op_get_at,
op_set_at,
op_fold,
op_map,
op_filter,
op_filter_map,
op_range,
op_empty,
op_nil,
// types
op_typeof,
// used to find a name in the global environment.
// for example a standard library function
op_lookup,
// Used by the virtual machine for various purposes
op_reserved,
// Indicates that this is an extended byte-code set
op_extended
};