
Bloomberg/bucklescript: A back end for the OCaml compiler which emits JavaScript - kristianp
https://github.com/bloomberg/bucklescript
======
krat0sprakhar
For those wondering how this differs from js_of_ocaml -
[https://github.com/bloomberg/bucklescript/wiki/Difference-
fr...](https://github.com/bloomberg/bucklescript/wiki/Difference-from-
js_of_ocaml)

TL;DR

\- Debuggable output

\- Better interoperability

\- Faster compilation

~~~
jallmann
js_of_ocaml has deep integration with the DOM, event handling, and tyxml (to
emit HTML5 in a type-safe manner). It had a fine-grained reactive DOM before
Facebook React was even a thing... Bucklescript could add those features, but
it'd take a lot of work, and I'm not sure there would be much benefit over
what js_of_ocaml offers.

The sweet spot for Bucklescript seems to be in exposing bits of computation-
heavy logic through OCaml. The reimplementation of a 55k Immutable.js in 899
bytes of compiled JS makes me go oh-damn-did-you-see-that! On the other hand,
js_of_ocaml has rather unparalleled support for building UIs -- which probably
makes it a better choice if you want to do your whole web app in OCaml,
especially in combination with frameworks like Eliom.

~~~
erichocean
> _The reimplementation of a 55k Immutable.js in 899 bytes of compiled JS
> makes me go oh-damn-did-you-see-that!_

Link?

~~~
jallmann
Right there on the github page.

[https://github.com/bloomberg/bucklescript#more-
examples](https://github.com/bloomberg/bucklescript#more-examples)

------
seliopou
For those interested in compiling OCaml to JavaScript, check out
js_of_ocaml[0]. It's been around since 2011 or so, produces source maps, and
has a nice FFI. It also works over the output of the bytecode compiler so
there's no need to run a fork of the compiler. In my experience it's quite
nice to work with.

[0]: [http://ocsigen.org/js_of_ocaml/](http://ocsigen.org/js_of_ocaml/)

~~~
cwyers
This is apparently a fork of js_of_ocaml. I am not sure that I understand what
Bloomberg has added/changed to make it this.

~~~
krat0sprakhar
It's not a fork - it only uses a few parts of the JS pretty printer and
runtime support.
[https://github.com/bloomberg/bucklescript#licensing](https://github.com/bloomberg/bucklescript#licensing)

------
elcapitan
Their example is a bit of an odd choice, as it shows an imperative Ocaml
function resolving 1:1 into javascript, would be nice to see a small example
with some functional programming and how that translates.

~~~
steego
Here you go: [http://bloomberg.github.io/bucklescript/js-
demo/](http://bloomberg.github.io/bucklescript/js-demo/)

------
erichocean
Can BuckleScript translate (some?) Coq output to JavaScript? If so, what are
the limitations?

UPDATE: Looks like the answer is (usually) "no"—Ocaml code generated by Coq
frequently uses Obj.magic, which BuckleScript does not support. _sigh_

~~~
jeffsco
What happens if you declare an external function of type 'a -> 'b? Obj.magic
is trivial to implement, it's just the typing that is wonky. (Disclaimer: I
have never looked at BuckleScript or js_of_ocaml.)

