OCaml Weekly News
Hello
Here is the latest OCaml Weekly News, for the week of September 05 to 12, 2023.
Table of Contents
- Miou, a simple scheduler for OCaml 5
- Eio Digest #1 (September 2023)
- Help revamping the getting started tutorials in ocaml.org
- pcre2-ocaml.7.5.1 released
- Third (and hopefully last) release candidate for OCaml 5.1.0
- Ocaml.org tutorial revamping, cont’d - Basic Datatypes
- Printing, modular implicits and the Stdlib
- Ocaml.org tutorial revamping, con’d - Values and Functions
- Old CWN
Miou, a simple scheduler for OCaml 5
Calascibetta Romain announced
I’m pleased to announce the experimental release of Miou (0.0.1~beta1
): a round-robing scheduler for OCaml 5. Miou is a small library that focuses on implementing system & network applications.
You can now find the project on GitHub, Robur’s repository, as well as its documentation and a few tutorials. This release was marked by the implementation of a happy-eyeballs/dns [1] client combining concurrency and parallelism. The aim is to be able to continue implementing services using this library and to guide the user/developer towards good system practices.
The project is still in an iteration phase with the implementation of services such as dns and email in order to validate our design. This release invites you to iterate with us to benefit from everyone’s experience.
We will complete this thread with articles specifying the implementation of Miou. The documentation gives a good overview of our objectives and the Miou framework. If you are interested, we invite you to read it.
We would like to thank everyone who has been involved in any way in the project for their experience and their contributions. And we hope to consider other experiences and feedback in order to develop Miou in the same way as Robur has already done for the other projects.
[1]: Implementing happy-eyeballs via the excellent ocaml-dns project has enabled us to:
- check that it is possible to launch a background task managing connections without being able to detach a task
- satisfy the notions of socket ownership
- implement a real application using one of the protocols we maintain
Eio Digest #1 (September 2023)
Sudha Parimala announced
As we’re bracing towards an update to Eio 1.0 after ICFP (famous last words, just kidding :D), the team is happy to present updates on Eio and friends. We hope to carry this out on monthly or bi-monthly basis, in line with the precedent set by Multicore Monthlies, the Platform Newsletter and others.
For the uninitiated, Eio is a direct-style concurrency library for OCaml 5 and beyond. Eio leverages effect handlers for non-blocking IO, and at the same time offers advantages such as enhanced support for backtraces and being able to write concurrent code in direct-style.
Additionally, Eio offers fast native backends for various operating systems when available, such as
io_uring
for Linux. Eio is conceived to be a replacement for existing monadic concurrency libraries such as Lwt.
Eio 0.12 was released not long ago. The pending tasks for Eio 1.0 are being tracked at Eio#338.
Before going on with detailed updates, I’d like to take a moment to thank all contributors and users for spending their time on Eio. Without their collective efforts, there is no way we could be as far in the development of Eio as we are. If you’re interested in contributing or testing we’d be more than happy to welcome you to the community!
Updates
Eio has undergone significant developments and improvements in the past few months. Notably, it replaces the OCaml object system with polymorphic variants to represent OS resources, thereby making code more accessible. Eio also boasts various backends, including
a fast native IO backend for Linux’s io_uring
and a generic POSIX backend, while also exploring possibilities for macOS and Windows support.
Moreover, Eio is making strides in JavaScript interoperability, aiming to target browser applications. The latest release introduces a resource pool, akin to
Lwt_pool
, and anticipates support for custom events with the
meio
CLI tool. Quite a few applications have started migrating to Eio, including Irmin, Wayland,
ocaml-grpc
, OCaml CI’s solver service and more, expanding Eio’s utility across diverse domains.
- Replacing objects with variants
PR: https://github.com/ocaml-multicore/eio/pull/553
Originally, Eio’s capabilities were encoded using the OCaml object system. However, as objects in OCaml are not a widely used feature, there was concern from the community that reliance on the object system would hinder wider adoption of Eio. As a result of this feedback, Eio now uses polymorphic variants to serve the same function as objects did previously.
Polymorphic variants are better understood by most OCaml practitioners and we hope that this change will enable more users to adopt Eio. Very little code is expected to break as a result, and this change will be made available in other libraries built with Eio soon.
- Backends
One of the goals of Eio is to provide fast native IO backends for major operating systems. It is for this reason that we started with a backend for
io_uring
, Linux’s state-of-the-art, high-performance I/O API. We eventually added alibuv
backend (through Luv), which allowed portability across multiple operating systems, vis-à-vis Linux, MacOS, and Windows. Unfortunatley it also caused several problems, and we ended up replacing it witheio_posix
.Eio_posix
is a generic POSIX backend, usingocaml-iomux
. The Windows backend is functional (pun intended), with more improvements being added. At some point, we may rethink a Grand Central Dispatch backend and IO Completion ports backend for MacOS and Windows respectively. - Javascript Interop
PR: https://github.com/ocaml-multicore/eio/pull/405
Having talked about backends for major operating systems, one cannot ignore browsers, which are getting increasingly common. We have a WIP browser backend for enabling Eio to target Javascript (and Jsoo) applications. This is a promising avenue that opens up possibilities for Lwt based libraries that use Jsoo to migrate to Eio.
Furthermore,
eiojsoo
shows some interesting examples of Eio- Js_of_ocaml in action.
- Pool and Lazy
- Pool: https://github.com/ocaml-multicore/eio/pull/602
- Lazy: https://github.com/ocaml-multicore/eio/pull/609
The latest release of Eio provides a pool. This is similar to
Lwt_pool
, helpful for managing a collection of resources. For instance, it’s possible that maintaining a pool of expensive resources such as domains or database connections is more memory and resource efficient than the alternative.The latest release also includes a fiber-safe lazy module (
Eio.Lazy
) that allows lazy values to be forced concurrently from multiple fibers. - Custom Events (meio)
OCaml 5.1 will have support for user-defined custom events, extending the ring-buffer based event tracing system.
meio
is a tokio-console style CLI tool for real time monitoring of Eio programs. The hope is that it will make debugging Eio programs a more pleasant experience. The tool is currently experimental. We hope to have an initial release scheduled for after OCaml 5.1 is out. - Splitting Eio Core
Issue: https://github.com/ocaml-multicore/eio/issues/544
Something we discussed in our developer meeting is potentially splitting out the core Fiber as a separate library. A potential use-case of this might be formally verifying Eio Fibers. While no decisions have been made on this yet, we’re interested to know if this could be useful for anything not mentioned above.
- Applications
Several applications have started harnessing the power of Eio. Below are some we know of:
Irmin
In a first for the library, Irmin has a shiny new Eio backend. Irmin, the distributed database (which is used as storage system for Tezos, amongst others), has started migrating to Eio with the eventual goal of supporting multicore Irmin. Stay tuned to hear more about this from the Irmin team.
Wayland
Eio 0.12 added support for SCM_RIGHTS. This allowed conversion of the ocaml-wayland library to Eio. That, in turn, allowed an Eio port of wayland-proxy-virtwl. These ports should be merged and released soon.
OCaml-grpc
Repository: https://github.com/dialohq/ocaml-grpc
ocaml-grpc
now includes an Eio mode. @quernd reported that it has been deployed in their production systems and is working quite well.Solver Service
OCaml CI’s solver service is now powered by Eio. This has also made the solver service multicore. The Lwt version is still active because we are still debugging some performance issues with the Eio version.
Eio-solo5
Available at: https://github.com/TheLortex/eio-solo5
We’re committed to preserving Eio’s compatibility with the larger Mirage ecosystem. With that in mind,
eio-solo5
is a small experiment that demonstrates Dream running over Eio and Mirage libraries.Nixpackages
PR: https://github.com/NixOS/nixpkgs/pull/230270
Thanks to @toastal, Eio and sub-packages are now available at Nix packages.
- Call to Action
Windows
The good news is that we have a functional Windows backend for Eio (shout-out to @patricoferris). Not so good news is that we haven’t done an awful lot of stress testing on it. If you are running Eio on Windows, we’re eager to hear what works, and more importantly what doesn’t. We intend for the Windows backend to be a first class citizen, in alignment with the overarching objective of upholding Windows as a primary platform within the OCaml ecosystem. That means resolving bugs and improving workflows, so please let us know about your experience using Eio on Windows.
- Learn More
Our README offers a comprehensive getting-started guide for Eio. For the more curious readers wanting additional information:
- Lwt to Eio tutorial at ICFP 2023: Thomas Leonard (@talex5) and Jon Ludlam (@jonludlam) are running a tutorial at ICFP on migrating Lwt applications to Eio. Materials are available here.
- Awesome multicore OCaml: awesome-multicore-ocaml is a collection of all resources related to Multicore and effect handlers.
Help revamping the getting started tutorials in ocaml.org
Archive: https://discuss.ocaml.org/t/help-revamping-the-getting-started-tutorials-in-ocaml-org/12749/4
Cuihtlauac Alvarado announced
The pull request corresponding to these tutorials has been updated with the feedback we’ve received.
- https://github.com/ocaml/ocaml.org/pull/1431
- https://staging.ocaml.org/docs/a-tour-of-ocaml
- https://staging.ocaml.org/docs/how-to-write-an-ocaml-program
We are considering publishing soon but are still accepting feedback.
pcre2-ocaml.7.5.1 released
Chet Murthy announced
Hi, I’ve just released pcre2-ocaml
, a wrapper around the Debian package
pcre2
(for PCRE new version #2, PCRE2). pcre-ocaml
, the long-standing version by Markus Mottl will become obsolete b/c Debian is removing support for the underlying Debian package
pcre3
(PCRE old version #1, PCRE1).
[yes, this is confusing.]
This is a port by @tobil4sk (don’t know their ID on this forum): I’m (for now) just maintaining it.
https://github.com/camlp5/pcre2-ocaml
It should be available in opam by now.
I’ve already found a bug (courtesy of @viritrilbia ) and have a fix with the beginning of unit-tests ready to release.
If anybody has any interest in joining in to maintain this package, please do contact me.
Third (and hopefully last) release candidate for OCaml 5.1.0
Archive: https://discuss.ocaml.org/t/third-and-hopefully-last-release-candidate-for-ocaml-5-1-0/12975/1
octachron announced
Since last week, there were two significant bugs fixed in the OCaml 5.1.0 runtime (one overflow bug, and a stack corruption bug in the s390x port). Since those bug fixes are as small as they are subtle, they were deemed worthy of a release of a third release candidate for OCaml 5.1.0.
If there are no more surprises this week, the release of OCaml 5.1.0 shall happen next week.
If you find any bugs, please report them on OCaml’s issue tracker.
The full changelog for OCaml 5.1.0 is available on GitHub
A short summary of the two fixed bugs in this release candidate is also available below.
Installation Instructions
The base compiler can be installed as an opam switch with the following commands on opam 2.1 and later:
opam update opam switch create 5.1.0~rc3
The source code for the release candidate is also directly available on:
- Fine-Tuned Compiler Configuration
If you want to tweak the configuration of the compiler, you can switch to the option variant with:
opam update opam switch create <switch_name> ocaml-variants.5.1.0~rc3+options <option_list>
where
<option_list>
is a comma-separated list ofocaml-option-*
packages. For instance, for aflambda
andno-flat-float-array
switch:opam switch create 5.1.0~rc3+flambda+nffa ocaml-variants.5.1.0~rc3+options ocaml-option-flambda ocaml-option-no-flat-float-array
All available options can be listed with
opam search ocaml-option
.
Last Second Bug Fixes
- #11284, +#12525: Use compression of entries scheme when pruning mark stack. Can decrease memory usage for some workloads, otherwise should be unobservable. (Tom Kelly, review by Sabine Schmaltz, Sadiq Jaffer and Damien Doligez)
- #12486: Fix delivery of unhandled effect exceptions on s390x (Miod Vallat, report by Jan Midtgaard, review by Vincent Laviron and Xavier Leroy)
Ocaml.org tutorial revamping, cont’d - Basic Datatypes
Cuihtlauac Alvarado announced
Update of the ocaml.org tutorials continues.
We’d like to have your opinion on this new one:
- Staging: https://staging.ocaml.org/docs/basic-data-types
- GitHub PR: https://github.com/ocaml/ocaml.org/pull/1514
It addresses datatypes basic concepts. It covers the most common predefined datatypes, variants, and records.
Mutability and references are not covered, and polymorphic variants are neither (we’re planning to work on these as stand-alone tutorials).
We love feedback, we need it.
Printing, modular implicits and the Stdlib
Emile Trotignon announced
I wanted to share thoughts I had on the thorny “printing question” with the community. I have written a small blog post here, and I would enjoy discussing the questions raised here.
Ocaml.org tutorial revamping, con’d - Values and Functions
Cuihtlauac Alvarado announced
Here is a new episode in the series of updates of the ocaml.org tutorials
It addresses values, functions, environment, scope, closures, shadowing and friends.
As for the previous one, we’d love to know what you think about it.
Old CWN
If you happen to miss a CWN, you can send me a message and I’ll mail it to you, or go take a look at the archive or the RSS feed of the archives.
If you also wish to receive it every week by mail, you may subscribe online.