// compare_aot.ce — compile a .cm module via both paths and compare results // // Usage: // cell --dev compare_aot.ce var build = use('build') var fd_mod = use('fd') var os = use('os') var json = use('json') var show = function(v) { return json.encode(v) } if (length(args) < 1) { print('usage: cell --dev compare_aot.ce ') return } var file = args[0] if (!fd_mod.is_file(file)) { if (!ends_with(file, '.cm') && fd_mod.is_file(file + '.cm')) file = file + '.cm' else { print('file not found: ' + file) return } } var abs = fd_mod.realpath(file) // Shared compilation front-end var tokenize = use('tokenize') var parse_mod = use('parse') var fold = use('fold') var mcode_mod = use('mcode') var streamline_mod = use('streamline') var src = text(fd_mod.slurp(abs)) var tok = tokenize(src, abs) var ast = parse_mod(tok.tokens, src, abs, tokenize) var folded = fold(ast) var compiled = mcode_mod(folded) var optimized = streamline_mod(compiled) // --- Interpreted (mach VM) --- print('--- interpreted ---') var mcode_json = json.encode(optimized) var mach_blob = mach_compile_mcode_bin(abs, mcode_json) var result_interp = mach_load(mach_blob, stone({})) print('result: ' + show(result_interp)) // --- Native (AOT via QBE) --- print('\n--- native ---') var dylib_path = build.compile_native(abs, null, null, null) print('dylib: ' + dylib_path) var handle = os.dylib_open(dylib_path) if (!handle) { print('failed to open dylib') return } // Build env with runtime functions. Must include starts_with etc. because // the GC can lose global object properties after compaction. var env = stone({ logical: logical, some: some, every: every, starts_with: starts_with, ends_with: ends_with, log: log, fallback: fallback, parallel: parallel, race: race, sequence: sequence }) var result_native = os.native_module_load(handle, env) print('result: ' + show(result_native)) // --- Comparison --- print('\n--- comparison ---') var s_interp = show(result_interp) var s_native = show(result_native) if (s_interp == s_native) { print('MATCH') } else { print('MISMATCH') print(' interp: ' + s_interp) print(' native: ' + s_native) }