33 lines
1.5 KiB
Text
33 lines
1.5 KiB
Text
-- demo\rosetta\Compiler\vm.exw
|
|
-- Since we have generated executable machine code, the virtual machine, such as it is, is just
|
|
-- the higher level implementations of printc/i/s, see setbuiltins() in cgen.e
|
|
-- Otherwise the only difference between this and cgen.exw is call(code_mem) instead of decode().
|
|
-- A quick test (calculating fib(44) 10^6 times) suggests ~500 times faster than interp.exw -
|
|
-- which is to be expected given that a single add instruction (1 clock) here is implemented as
|
|
-- at least three (and quite possibly five!) resursive calls to interp() in the other.
|
|
format PE32
|
|
--format ELF32
|
|
-- Note: cgen generates 32-bit machine code, which cannot be executed directly from a 64-bit interpreter.
|
|
-- You can however, via the magic of either the above format directives, use a 64-bit version of
|
|
-- Phix to compile this (just add a -c command line option) to a 32-bit executable, which can.
|
|
-- It would not be particularly difficult to emit 32 or 64 bit code, but some source code files
|
|
-- would, fairly obviously, then be very nearly twice as long, and a fair bit harder to read.
|
|
without js -- (machine code!)
|
|
include cgen.e
|
|
|
|
procedure main(sequence cl)
|
|
open_files(cl)
|
|
toks = lex()
|
|
object t = parse()
|
|
code_gen(t)
|
|
fixup()
|
|
if machine_bits()=32 then
|
|
-- ^ as per note above
|
|
call(code_mem)
|
|
end if
|
|
free({var_mem,code_mem})
|
|
close_files()
|
|
end procedure
|
|
|
|
--main(command_line())
|
|
main({0,0,"count.c"})
|