Algebraic data structures are really nice for representing ASTs and intermediate languages. And a compiler lends itself very well to functional programming, because what you ultimately want is just a function that takes the input code and produces the output code.
As Wikipedia says of ml (meta language) languages in general:
"Its types and pattern matching make it well-suited and commonly used to operate on other formal languages, such as in compiler writing, automated theorem proving and formal verification."
WASM currently does not have a GC but that's precisely why one is needed. Languages that target WASM need to implement their own GC but there's already a proposal to integrate a GC implementation into WASM[1].
As an adjacent dead comment points out, you'd use Emscripten to "convert nginx to WASM" (i.e. "compile"). Wasmer is a runtime.
But there are actually use cases to what you're talking about. Essentially instead of nginx -> LLVM -> machine code you're replacing it with nginx -> WASM -> cmm_of_wasm -> machine code. There are tons of LLVM opts already, but if there weren't, it might be reasonable to use WASM as IR and using cmm_of_wasm's opts to make it faster than a naive C compiler (but of course none of the popular compilers are naive anyways). Also, of course this won't work today because cmm_of_wasm doesn't rebuild the syscalls from emscripten-compiled-WASM (yet). But if you're writing your own language today, ignoring system interaction for a sec, targeting WASM even for native might not be a bad idea as backends are coming w/ optimizations.
8 comments
[ 3.5 ms ] story [ 31.0 ms ] threadalso...
> and eventually we hope to hook into OCaml’s excellent garbage collector
isnt WASM gc-free? why would the output need explicit GC interaction?
"Its types and pattern matching make it well-suited and commonly used to operate on other formal languages, such as in compiler writing, automated theorem proving and formal verification."
https://en.m.wikipedia.org/wiki/ML_(programming_language)
[1]: https://github.com/WebAssembly/gc/blob/master/proposals/gc/O...
But there are actually use cases to what you're talking about. Essentially instead of nginx -> LLVM -> machine code you're replacing it with nginx -> WASM -> cmm_of_wasm -> machine code. There are tons of LLVM opts already, but if there weren't, it might be reasonable to use WASM as IR and using cmm_of_wasm's opts to make it faster than a naive C compiler (but of course none of the popular compilers are naive anyways). Also, of course this won't work today because cmm_of_wasm doesn't rebuild the syscalls from emscripten-compiled-WASM (yet). But if you're writing your own language today, ignoring system interaction for a sec, targeting WASM even for native might not be a bad idea as backends are coming w/ optimizations.