GHCJS now runs Template Haskell on node.js - Any interest in out of process TH for general cross compilation?
stegeman at gmail.com
Wed Jul 2 16:14:09 UTC 2014
I've added some code   to GHCJS to make it run Template Haskell code
on node.js, rather than using the GHC linker. GHCJS has supported TH for a
long time now, but so far always relied on native (host) code for it. This
everything (another is that Cabal Setup.hs scripts need to be compiled to
Now besides the compiler having to do twice the work, this has some other
which means packages like unix or Win32 show up somewhere, depending on the
host environment. This also limits our options in choosing JS-specific
- The Template Haskell code runs on the host environment, which might be
slightly different from the target, for example in integer size or
operating system specific constants.
Moreover, building native code made the GHCJS installation procedure more
tricky, making end users think about libgmp or libiconv locations, since it
basically required the same preparation as building GHC from source. This
change will make installing much easier and more reliable (we still have to
update the build scripts).
How it works is pretty simple:
- When any code needs to be run on the target (hscCompileCoreExpr, through
the Hooks API new in GHC 7.8), GHCJS starts a node.js process with the
thrunner.js  script,
- GHCJS sends its RTS and the Template Haskell server code  to node.js,
the script starts a Haskell thread running the server,
incremental linking functionality. The code for the splice, including
dependencies that have not yet been sent to the runner (for earlier
splices), is then sent in a RunTH  message,
- the runner loads and runs the code in the Q monad, can send queries to
GHCJS for reification,
- the runner sends back the result as a serialized Template Haskell AST
(using GHC.Generics for the Binary instances).
All Template Haskell functionality is supported, including recent additions
for reifying modules and annotations. I still need to clean up and push the
patches for the directory and process packages, but after that, the TH code
can read/write files, run processes and interact with them and make network
connections, all through node.js.
wondering if there's any interest in getting this functionality into GHC
7.10 for general cross compilation. The runner would be a native (target)
program with dynamic libraries (or object files) being sent over to the
target machine (or emulator) for the splices.
Thanks to Andras Slemmer from Prezi who helped build the initial proof of
concept (without reification) at BudHac.
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Glasgow-haskell-users