93 lines
2.2 KiB
Plaintext
93 lines
2.2 KiB
Plaintext
// compare_aot.ce — compile a .cm module via both paths and compare results
|
|
//
|
|
// Usage:
|
|
// cell --dev compare_aot.ce <module.cm>
|
|
|
|
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 <module.cm>')
|
|
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)
|
|
}
|