A compiler from MinCaml to WebAssembly including reference count gabage collection.
To test this compiler, you must install stack and wabt.
You can use this compiler without wabt.
But, in that case, you can just see outputed WebAssembly and you cannot run it.
wabt is utility for WebAssembly and it contains wat2wasm and wasm-interp.
I use these two utility in the test.
You can build and test this compiler as follows.
% git clone https://github.com/akawashiro/ml2wasm.git
% stack init
% stack solver
% ./testAll.shThe last two lines following called host host.print(i32:9999999) => are infomation of gabage collection.
They shows the number of living object and the size of consumed memory, respectively.
========== add.ml ==========
called host host.print(f32:5.000000) =>
called host host.print(i32:9999999) =>
called host host.print(i32:3) =>
called host host.print(i32:48) =>
main() => i32:132
========== closure.ml ==========
called host host.print(i32:12) =>
called host host.print(i32:9999999) =>
called host host.print(i32:3) =>
called host host.print(i32:52) =>
main() => i32:108
========== fib.ml ==========
called host host.print(i32:1) =>
called host host.print(i32:1) =>
called host host.print(i32:1) =>
called host host.print(i32:2) =>
called host host.print(i32:3) =>
called host host.print(i32:5) =>
called host host.print(i32:8) =>
called host host.print(i32:13) =>
called host host.print(i32:21) =>
called host host.print(i32:34) =>
called host host.print(i32:55) =>
called host host.print(i32:9999999) =>
called host host.print(i32:291) =>
called host host.print(i32:4660) =>
main() => i32:4880
========== fun.ml ==========
called host host.print(f32:20.000000) =>
called host host.print(f32:50.000000) =>
called host host.print(i32:9999999) =>
called host host.print(i32:3) =>
called host host.print(i32:48) =>
main() => i32:104
========== if.ml ==========
called host host.print(f32:10.000000) =>
called host host.print(i32:9999999) =>
called host host.print(i32:2) =>
called host host.print(i32:32) =>
main() => i32:104
========== adder.ml ==========
called host host.print(i32:10) =>
called host host.print(i32:9999999) =>
called host host.print(i32:4) =>
called host host.print(i32:68) =>
main() => i32:104
========== array.ml ==========
called host host.print(i32:1) =>
called host host.print(i32:9999999) =>
called host host.print(i32:6) =>
called host host.print(i32:132) =>
main() => i32:160
========== div.ml ==========
called host host.print(f32:10.000000) =>
called host host.print(i32:9999999) =>
called host host.print(i32:1) =>
called host host.print(i32:16) =>
main() => i32:76
========== float.ml ==========
called host host.print(f32:10.000000) =>
called host host.print(f32:10.000000) =>
called host host.print(i32:9999999) =>
called host host.print(i32:3) =>
called host host.print(i32:48) =>
main() => i32:132
========== nestlet.ml ==========
called host host.print(i32:9999999) =>
called host host.print(i32:4) =>
called host host.print(i32:64) =>
main() => i32:160
========== print.ml ==========
called host host.print(f32:10.000000) =>
called host host.print(i32:9999999) =>
called host host.print(i32:1) =>
called host host.print(i32:16) =>
main() => i32:76
========== tuple.ml ==========
called host host.print(i32:40) =>
called host host.print(i32:9999999) =>
called host host.print(i32:5) =>
called host host.print(i32:88) =>
main() => i32:196