- It is easy to install and use as it works with an existing installation of OCaml, with no need to recompile any library.
- It comes with bindings for a large part of the browser APIs.
- According to our benchmarks, the generated programs runs typically faster than with the OCaml bytecode interpreter.
- We believe this compiler will prove much easier to maintain than a retargeted OCaml compiler, as the bytecode provides a very stable API.
Js_of_ocaml is composed of multiple packages:
- js_of_ocaml-compiler, the compiler.
- js_of_ocaml-ppx, a ppx syntax extension.
- js_of_ocaml, the base library.
- js_of_ocaml-lwt, lwt support.
- js_of_ocaml-tyxml, tyxml support.
See opam file for version constraints.
- tyxml, reactiveData
- ocp-indent: needed to support indentation in the toplevel
- higlo: needed to support Syntax highlighting in the toplevel
- cohttp: needed to build the toplevel webserver
opam install js_of_ocaml js_of_ocaml-compiler js_of_ocaml-ppx
Your program must first be compiled using the OCaml bytecode compiler
js_of_ocaml package. The syntax
extension is provided by
ocamlfind ocamlc -package js_of_ocaml -package js_of_ocaml-ppx -linkpkg -o cubes.byte cubes.ml
Then, run the
Most of the OCaml standard library is supported. However,
- Most of the Sys module is not supported.
Extra libraries distributed with OCaml (such as Thread) are not supported in general. However,
- Bigarray: bigarrays are supported using Typed Arrays
- Num: supported
- Str: supported
- Graphics: partially supported using canvas (see js_of_ocaml-lwt.graphics)
- Unix: time related functions are supported
Tail call is not optimized in general. However, mutually recursive functions are optimized:
- self recursive functions (when the tail calls are the function itself) are compiled using a loop.
- trampolines are used otherwise. More about tail call optimization.
- marshalling of floats is not supported (unmarshalling works);
- the polymorphic hash function will not give the same results on datastructures containing floats;
- these functions may be more prone to stack overflow.
|int||number (32bit int)|
|int32||number (32bit int)|
|nativeint||number (32bit int)|
|string||string or object (MlBytes)|
|"immediate" (e.g. true, false, None, ())||number (32bit int)|
|"block"||array with tag as first element (e.g.
|array||block with tag 0 (e.g.
|tuple||block with tag 0 (e.g.
|contructor with arguments||block (e.g.
|exception and extensible variant||block or immediate|
- OCaml 4.04.2 includes Base, Core_kernel, Async_kernel, Async_js
- OCaml 4.04.0+BER see http://okmij.org/ftp/ML/MetaOCaml.html
- OCaml 4.05.0 includes Base, Core_kernel, Async_kernel, Async_js
- OCaml 4.06.0 includes Base, Core_kernel, Async_kernel, Async_js
Contents of the distribution
|LICENSE||license and copyright notice|
|ppx/||ppx syntax extensions|
|toplevel/||web-based OCaml toplevel|