Multicore OCaml: March 2020 update
discuss.ocaml.org
discuss.ocaml.org
You can use multicore right now: https://github.com/ocaml-multicore/ocaml-multicore though it's currently at an older version of OCaml, 4.06.1.
There's work currently going on to rebase on to OCaml trunk, show-stopping bugs aside there should be a more up to date version of multicore in the next couple of months - then the focus will be on upstreaming.
Hard to give a reasonable timeframe for release because that's going to depend a lot on how things get upstream.
In what form will Multicore OCaml support the, you know, multicore stuff? Will it be native OS threads? CSP? Actors? Something else?
Multicore OCaml separates the notion of concurrency (overlapped execution) and parallelism (simultaneous execution). You can have one without the other but also have both. The main principle that we're going for is that the compiler should expose just enough support for concurrency and parallelism such that interesting features can live outside the compiler as libraries. This permits the library evolution not to be tied with the language evolution but also permits diversity of libraries beyond what the language developers can aim to achieve. That said, we will build and maintain a few core libraries for concurrency and parallelism.
For concurrency, Multicore OCaml exposes effect handlers [1,2,3] which allows you to build generators, async/await, coroutines, etc as library functions (as opposed to primitives natively supported by the compiler). For example, have a look at aeio [4] which permits the construction of scalable asynchronous I/O in direct-style (no callbacks). aeio is also discussed in [1]. We also plan to extend Lwt to support parallelism.
For parallelism, the compiler exposes Domains, which are a wrapper over OS-threads [5]. Domains expose a low-level API that is not suitable for end user consumption. On top of domains, we support channels with bounded buffers [6] (similar to channels in Go, Mvars in GHC Haskell) as well as software transactional memory (STM) that supports shared memory and message passing concurrency and which can take advantage of hardware transactional memory [7].
[1] Concurrent System Programming with Effect Handlers: http://kcsrk.info/papers/system_effects_feb_18.pdf
[2] CUFP effects tutorial: https://github.com/ocamllabs/ocaml-effects-tutorial
[3] Effects Examples: https://github.com/kayceesrk/effects-examples
[4] Aeio: Asynchronous Effect-based IO https://github.com/kayceesrk/ocaml-aeio
[5] Domains: https://github.com/ocaml-multicore/ocaml-multicore/blob/para...
[6] domainslib: https://github.com/ocaml-multicore/domainslib
[7] Reagents: https://github.com/ocaml-multicore/reagents
Another question, if you allow me:
Will you provide preemptive scheduling primitives? Or will they be possible through the more low-level interface you described?
IMO preemptive scheduling is something that's very necessary nowadays, especially with the explosion of CPU core count.
We can do preemptive scheduling of user-level threads by registering a timer interrupt with the OS and preempting the currently running user-level thread in favor of another one. This is up to the individual libraries to implement. These issues are discussed in [1] Sec 4.3.
Really exciting that preemption is possible. Thanks for your insights!
Fable, I had to take a look again, but it seems a lot more mature then I remember it was a few years back.
Of course, I would love to see it go mainstream, but realistically speaking that will need to happen slowly.
Then there's Bloomberg: https://ocaml.org/learn/companies.html
> Bloomberg employs OCaml in a advanced financial derivatives risk management application
Press release from Bloomberg announcing BuckleScript: https://www.bloomberg.com/company/press/open-source-at-bloom...
> We are not currently using BuckleScript on the Terminal, but stay tuned…
This seems to suggest that they were looking at programming Bloomberg terminal applications in BuckleScript, compiled to JavaScript, at least at one point.
There's also LexiFi: https://www.quora.com/Is-the-OCaml-language-used-in-quantita...
I think if you go looking, it's not hard to find OCaml in finance in certain niches.
https://reasonml.github.io/docs/en/faq
My main interest in reasonml was writing native code. Looks like it will take some time to get to the same level as the JS backend?
I think it´s easy to find some feature of a language (such as modules) and claim that every language without it is not viable. You could make the same claim about OCaml not having some of F#s best features, such as operator overloading, inline and computation expressions. But this misses the point. If you´re writing a functional-first web application, then the F# solution and the ReasonML solutions are going to look very similar.
Regarding server run-times and Microsoft lock-in, this is no longer an issue. DotNET Core is open-source and cross-platform. You can also use Fable to compile F# code for Node.
> I don't understand the Reason hype when F# / Fable already offers this
My only point is that there are good reasons people would prefer ReasonML/OCaml over F#. I never claimed there were no reasons other people might prefer F#.
The only open-source debugger available for .Net Core is a poorly implemented hack by Samsung, because the vendor-provided debugger was never open-sourced.
https://blog.lextudio.com/the-rough-history-of-net-core-debu...
For instance this fast OCaml http server: https://github.com/inhabitedtype/httpaf
And you can even share types between client and server :)
There's even a browser extension which converts OCaml syntax to ReasonML and vice versa in docs.
They lost the Flow-TypeScript battle. And they learned, they wanted even more typesafety I guess.
Since TypeScript also compiles to JS, bringing "something a little less like JS, but a lot more safe" to the table seemed a better idea that pushing "unfamiliar syntax, but heay, it compiles to JS"
If there is any battle, I predict will probably be between Flow and Reason inside the Facebook org because of competing solutions.