OCaml Weekly News
Hello
Here is the latest OCaml Weekly News, for the week of February 27 to March 05, 2024.
Table of Contents
- mirage-crypto 0.11.3 (with more speed for elliptic curves) – and the future roadmap of mirage-crypto
- Ocsigen: summary of recent releases
- OCaml Platform Newsletter: January 2024
- Discussions on the future of the opam repository
- ocaml-protoc-plugin 5.0.0
- ppx_minidebug 1.3.0: toward a logging framework
- iostream 0.2
- Bogue, the OCaml GUI
- Owl project restructured
- 20+ ways to build an executable with foreign libs
- opam build and opam test: the opam plugins that simplifies your dev setup
- Seeking feedback on repackaged libraries for Base
- Outreachy internship demo session
- dream-html 3.0.0
- Add your OCaml Events to the Community Page on OCaml.org
- Other OCaml News
- Old CWN
mirage-crypto 0.11.3 (with more speed for elliptic curves) – and the future roadmap of mirage-crypto
Hannes Mehnert announced
we’re happy to announce mirage-crypto 0.11.3 (which just got merged to opam-repository), which includes huge performance improvements for elliptic curves. The API didn’t change at all :)
The background story is that we finally merged the “use bytes instead of Cstruct.t”
PR which was opened ~2.5
years ago by @dinosaure.
We reviewed that, and did some
benchmarks. And even went a bit further and are now using
string
(instead of bytes
). See
https://blog.robur.coop/articles/speeding-ec-string.html for further details.
Another PR worth mentioning is use windowed algorithm for base scalar multiplication from Virgile Robles – now some precomputed tables are shipped (same approach was done for 25519 already).
See this PR (and the release notes) for some detailed performance numbers on different CPUs – the P256 sign operation is around 10x faster than older releases. This is still 5 times slower than OpenSSL - but then we use fiat-crypto instead of handcrafted assembly code. We’re keen to improve the performance even further – ideas, observations, experiments and PRs are very welcome. We investigated benchmarking of e.g. digest algorithms across the OCaml ecosystem and OpenSSL as baseline and welcome improvements and further work on that (especially AES-GCM and Poly1305-ChaCha20 are painfully slow compared to OpenSSL).
Other improvements and fixes include support for Loongarch, NetBSD, use rdtime instead of rdcycle on RISC-V when in user mode, initial support for CL.EXE. Thanks to everyone involved in this released: @jbeckford @reynir @dinosaure @palainp @edwin
The full changelog may be worth to read.
Future roadmap (breaking changes)
Also, please note if you’re using mirage-crypto that we’ll revise the API and no longer use Cstruct.t / bigarrays, but instead
bytes/string. 0.11.3 will be the last release using Cstruct.t. The hash functionality (Mirage_crypto.Hash
) will also be removed
(since digestif implements them nicely). Please voice your concerns / ideas at
https://github.com/mirage/mirage-crypto/issues/205
Ocsigen: summary of recent releases
Vincent Balat announced
Eliom 10.3.1 released:
- Fixing Problem with browser navigation https://github.com/ocsigen/eliom/issues/781
- Adding raw events handlers in Eliom_content.Html.F.Raw for server-side only programming
OCaml Platform Newsletter: January 2024
Thibaut Mattio announced
Welcome to the ninth edition of the OCaml Platform newsletter!
In this January 2024 edition, we are excited to bring you the latest on the OCaml Platform, continuing our tradition of highlighting recent developments as seen in previous editions. To understand the direction we’re headed, especially regarding development workflows and user experience improvements, check out our roadmap.
Highlights:
- A preview version of the long-awaited Merlin project-wide references is available. Read more on the announcement.
- A first beta of opam 2.2 is available! Try it, and let the opam team know if you encounter any issues using opam on Windows.
- The
odoc
team started an effort to unify the OCaml.org package documentation with the local workflow provided by Dune. This is very exciting, as the result should be a much improved local documentation with Dune and faster releases ofodoc
features on OCaml.org. They are at the very beginning of the project, but stay tuned for exciting news in the coming months!
Releases:
[Dune] Exploring Package Management in Dune (W4)
Contributed by: @rgrinberg (Tarides), @Leonidas-from-XIV (Tarides), @gridbugs (Tarides), @kit-ty-kate (Tarides), @Alizter
Why: Unify OCaml tooling under a single command line for all development workflows. This addresses one of the most important pain points reported by the community.
What: Prototyping the integration of package management into Dune using opam as a library. We’re introducing a dune pkg lock
command to generate a lock file and enhancing dune build
to handle dependencies in the lock file. More details in the Dune
RFC.
Activities:
- Support opam’s pin-depends field – https://github.com/ocaml/dune/pull/9685
- Set %{pkg:dev} correctly for packages that use dev sources – https://github.com/ocaml/dune/pull/9605
- Remove Repository_id refactor, which instead now uses Git URLs to specify revisions – https://github.com/ocaml/dune/pull/9614
- Remove
--skip-update
and automatically infer offline mode when possible – https://github.com/ocaml/dune/pull/9683 - Support submodules in repos – https://github.com/ocaml/dune/pull/9798
- Don’t download the same package source archive multiple times during a build. Many OCaml packages are in Git repos (and source archives) with several other related packages, and it’s common for a project to depend on several packages from the same repo. Without this change, the source archive for a repo would be downloaded once for each package from that repo appearing in a project’s dependencies – https://github.com/ocaml/dune/pull/9771
- Add a cond statement for choosing lockdirs. This allows the lockdir to be chosen based on properties of the current system (e.g., OS, architecture) which will simplify working on projects with system-specific dependencies. – https://github.com/ocaml/dune/pull/9750
[opam] Native Support for Windows in opam 2.2 (W5)
Contributed by: @rjbou (OCamlPro), @kit-ty-kate (Tarides), @dra27 (Tarides), @AltGr (OCamlPro)
Why: Enhance OCaml’s viability on Windows by integrating native opam and opam-repository
support, fostering a larger community
and more Windows-friendly packages.
What: Releasing opam 2.2 with native Windows support, making the official opam-repository
usable on Windows platforms.
Activities:
- Add
rsync
package to internal Cygwin packages list (enables local pinning and is used by the VCS backends – ocaml/opam#5808 - Check and advertise to use Git for Windows – ocaml/opam#5718
- Released opam 2.2~beta1
[odoc
] Unify OCaml.org and Local Package Documentation
(W25)
Contributed by: @jonludlam (Tarides), @julow (Tarides), @panglesd (Tarides)
Why: Improving local documentation generation workflow will help package authors write better documentation for their packages,
and consolidating the different odoc
documentation generators will help make continuous improvements to odoc
available to a
larger audience.
What: We will write conventions that drivers must follow to ensure that their output will be functional. Once established, we
will update the dune rules to follow these rules, access new odoc
features (e.g., source rendering) and provide similar
functionalities to docs.ocaml.org (a navigational sidebar for instance). This will effectively make Dune usable to generate OCaml.org
package documentation.
Activities:
- We started by comparing the various drivers, their needs and constraints, and to flesh out what the conventions could look like. We will publish an RFC before starting the implementation work to ensure that we indeed understood the needs of everyone.
[odoc
] Add Search Capabilities to odoc
(W25)
Contributed by: @panglesd (Tarides), @EmileTrotignon (Tarides), @julow (Tarides), @jonludlam (Tarides)
Why: Improve usability and navigability in OCaml packages documentation, both locally and on OCaml.org, by offering advanced search options like type-based queries.
What: Implementing a search engine interface in odoc
, complete with a UI and a search index. Additionally, we’re developing a
default client-side search engine based on Sherlodoc.
Activities:
- We kept working on Sherlodoc in Januray, and a new version was released a few weeks ago, which can now be embedded on
odoc
-built doc sites. - We also finished updating the Dune rules which drive
odoc
, to enable the new search feature on locally built docs. These changes were released as part of Dune 3.14.0. – ocaml/dune#9772
[odoc
] Syntax for Images and Assets in odoc
(W25)
Contributed by: @panglesd (Tarides), @jonludlam (Tarides), @dbuenzli, @gpetiot (Tarides)
Why: Empower package authors to create rich, engaging documentation by enabling the integration of multimedia elements directly into OCaml package documentation.
What: We’re introducing new syntax and support for embedding media (images, audio, videos) and handling assets within the odoc
environment.
Activities:
- The PR is still under active review and we’re addressing the last minor concerns. – ocaml/odoc#1002
[odoc
] Improving odoc
Performance (W25)
Contributed by: @jonludlam (Tarides), @julow (Tarides), @gpetiot (Tarides)
Why: Address performance issues in odoc
, particularly for large-scale documentation, to enhance efficiency and user experience
and unlock local documentation generation in large code bases.
What: Profiling odoc
to identify the main performance bottlenecks and optimising odoc
with the findings.
Activities:
- We investigated a couple of issues brought forth by the
module type of
fix that was mentioned last month. This eventually resulted in a series of PRs: ocaml/odoc#1078, ocaml/odoc#1079 and ocaml/odoc#1081 - We also noticed that
odoc
’s handling of the load path was quadratic, so we changed that in ocaml/odoc#1075.
[Merlin] Support for Project-Wide References in Merlin (W19)
Contributed by: @voodoos (Tarides), @trefis (Tarides), @Ekdohibs (OCamlPro), @gasche (INRIA), @Octachron (INRIA)
Why: Enhance code navigation and refactoring for developers by providing project-wide reference editor features, aligning OCaml with the editor experience found in other languages.
What: Introducing merlin single occurrences
and LSP textDocument/references
support, extending compiler’s Shapes for global
occurrences and integrating these features in Dune, Merlin, and OCaml LSP.
Activities:
- Released a preview version of project-wide references and announced it on Discuss, asking for feedback - Play with project-wide occurrences for OCaml!
- Merged the compiler PR - ocaml/ocaml#12506
- As a teaser for future work that will build on project-wide references, we started prototyping the project-wide
rename
feature - voodoos/ocaml-lsp#index-preview
[Merlin] Improving Merlin’s Performance (W19)
Contributed by: @pitag (Tarides), @Engil (Tarides)
Why: Some Merlin queries have been shown to scale poorly in large codebases, making the editor experience subpar. Users report that they sometimes must wait a few seconds to get the answer. This is obviously a major issue that hurts developer experience, so we’re working on improving Merlin performance when it falls short.
What: Developing benchmarking tools and optimising Merlin’s performance through targeted improvements based on profiling and analysis of benchmark results.
Activities:
- We merged the Fuzzy testing CI. As a reminder, this CI tests Merlin PRs for behaviour regressions. This will help us make sure that we don’t inadvertently break Merlin queries by testing them on a broad range of use cases - ocaml/merlin#1716
- In
merlin-lib
, we started writing a prototype to process the buffer in parallel with the query computation. Parallelism refers to OCaml 5 parallelism (domains).
Discussions on the future of the opam repository
Kate announced
The notes for last week’s meeting are available here
For everyone who wants to come to the next meeting, please fill the framadate as soon as you know when you are available, so that we can plan when the meeting is going to be.
ocaml-protoc-plugin 5.0.0
Anders Fugmann announced
It’s my pleasure to announce release 5.0.0 of ocaml-protoc-plugin.
ocaml-protoc-plugin is a plugin for the google protobuf compiler, protoc
, to generate type mappings and functions for serialization
and de-serialization of google protocol buffers. The plugin aims to be fully compliant with the protobuf specification and
recommendations and to generate an intuitive mapping between google protobuf message definitions and Ocaml types. Ocaml-protoc-plugin
is written in pure ocaml.
Version 5.0.0 includes option to merge messages to be fully compliant with the protobuf specification and fixes bugs related to name mapping to avoid name collisions and fix code generation error in some corner cases.
Serialization and deserialization has also been hugely optimized for speed and is now on par with other ocaml protobuf implementations (benched against ocaml-protoc)
ocaml-protobuf-plugin 5.0.0 is available though opam and from the project page on github.
Full changelog is available here
ppx_minidebug 1.3.0: toward a logging framework
Lukasz Stafiniak announced
Hi! I’m happy to invite you to take a look at ppx_minidebug 1.3.0. It’s now available in the opam repository. Some new features since version 1.0:
- Extension point variants that support debug runtime passing, they simplify having e.g. dedicated log files for threads or domains.
- Unregistered extension points
%log
,%log_result
,%log_printbox
to explicitly log values. - Log levels at runtime to restrict how much is logged, and at compile time to restrict how much logging code is generated.
- Log levels can be both set globally and adjusted for local scopes.
- Compile time log levels can be read off an environment variable.
- Extension point prefix
%diagn_
(joining prefixes%debug_
and%track_
) that restricts the log level to explicit logs. - Does not crash for logs that escaped all log entries – prints the entry id of the entry the orphaned log lexically belongs to.
- Optionally prints log entry ids for all entries.
- Optionally snapshots unclosed log trees:
- outputs the current log tree if sufficient time passed since the previous tree was printed or the previous snapshot, erases the previous snapshot when snapshotting or printing the same log tree.
- A few more changes that improve usability.
P.S. If you face problems with missing line breaks in the HTML output, re-install printbox from source or version > 0.10.
iostream 0.2
Simon Cruanes announced
Iostream 0.2 was recently released on opam. Here’s the release itself.
Iostream is a library providing a small set of abstractions for I/O streams (!) over bytes
. With release 0.2, there are now 4 main
types, all of them based on objects:
Iostream.In.t
for unbuffered inputs;Iostream.In_buf.t
for buffered inputs;Iostream.Out.t
for unbuffered outputs;Iostream.Out_buf.t
for buffered outputs.
I found out that having all these explicit types is better than picking only some of them. A In_buf.t
can act as a proper byte
stream, exposing its internal slice of bytes so that it’s possible to implement line parsing and such. Thanks to the object types,
In_buf.t
is a subtype of In.t
, and same goes for Out_buf.t
and Out.t
.
There is also a iostream-camlzip
library
that implements stream encoding and decoding over these types.
Bogue, the OCaml GUI
sanette announced
I’m happy to announce a new version of Bogue (20240225). I would like to mention here two main changes:
- This is the last version that supports SDL 2.0.9 (default in Debian 10) Next version will use
tsdl 1.0.0
which requires SDL 2.0.10 or later - Thanks to @edwin , this version (if using SDL >= 2.0.16) is much more power-friendly (when idle). You may now leave a Bogue app open (if idle) without worrying for your laptop battery (and the environment): energy consumption is now very close to zero. (
powertop
indicates instantaneous power of 0mW, which I think means less than 0.1mW on my laptop)
Owl project restructured
jrzhao42 announced
Dear OCaml Community, following our previous decision to conclude the Owl project, we have been touched by the supportive and encouraging feedback from all of you. After a thorough discussion, Liang @ryanrhymes and I think it might still be for the best interest of the OCaml community to continue maintaining a solid numerical computing library. Consequently, I, Jianxin, will assume the role of project leader to ensure Owl remains maintained. Our goal is to keep Owl stable and updated, given the very limited resource we have, as explained in our previous declaration. At least we aim to keep Owl compatible with the latest stable version of OCaml.
As mentioned previously, our availability to dedicate time to Owl is limited. Achieving our objectives will require collective effort. Thus, I am looking to assemble a team of contributors eager to support both development and maintenance tasks. For details on our plans and how you can contribute, please refer to the project’s README file.
If you’re interested in joining the Owl team, taking on a specific part of the codebase, or if you have any questions, do not hesitate to contact me here or via email.
20+ ways to build an executable with foreign libs
Gregg Reynolds announced
Foreign libs can be linked into OCaml executables in a variety of ways. The pertinent info is distributed across several topics in the manual. So I put together a suite of 20-some MWEs demonstrating the options:
- emitting native or bytecode executables
- vm executables: freestanding or dependent on ocamlrun
- using a static or dynamic stublib
- linking the stublib against static or shared foreign libs
- putting lib deps directly on the cmd line v. using -cclib or -dllib
All demos use a very simple foreign lib (in C) and stublib, and the builds are expressed in a few relatively simple makefiles.
https://github.com/obazl/demos_obazl/tree/main/makefiles/ffi
This could be used as the basis of a proper tutorial, but I’m not sure I’ll get around to that.
(Oh crap, I forgot to update the docs. The make target names a little different. Read the makefiles. ;)
opam build and opam test: the opam plugins that simplifies your dev setup
Kate announced
Hi everyone,
I’m pleased to announce the release of opam-build & opam-test 0.2.0 (soon 0.2.4 with all the latest improvements)
These two opam plugins now require your current client to be opam 2.2 (e.g. the latest 2.2.0~beta1). If you use opam 2.2 you can install them using:
opam update && opam install 'opam-build>=0.2.0' 'opam-test>=0.2.0'
After that you can use them from any switches using:
opam build --help opam test --help
The highlights of this version cycle are:
- Vastly improved performance and UI
- Added a new
--global
and--local
command line argument to signify whether to use a local switch or a global switch - Add a new config file storing the user preference and which kind of switch to use by default
- Lots of fixes and improvements
On a personal note, my main incentive with these changes was to finally use these plugins personally and in
particular, while working on some packages for my work on the “OCaml 5.2 release readiness” (see a more general
description of this work
here), i
encountered a couple of packages where the only way to compile them was using opam as they were using custom
variables passed to their arguments. opam install
was not what i wanted (i don’t want to install it, i just need
to see if the local version compiles) but opam build
fits the bill perfectly here (I don’t know what build-system
it uses, i just want to compile it).
A demo of the new version (here 0.2.4) can be seen here:
Disclaimer: As with version 0.1.0, these plugins are still experimental, however they should be a lot more polished and usable, hopefully if enough people report issues (big thanks to @gridbugs for the reports on the previous versions) next version should be deemed stable.
Seeking feedback on repackaged libraries for Base
Mathieu Barbin announced
Dear OCaml community,
Lately I’ve been working on reducing dependency footprints in some of my projects, which led me to repackage some
of Jane Street’s libraries that I frequently use. The goal was to make these libraries depend solely on Base
,
thereby making them more accessible and lightweight.
Here are the libraries I’ve repackaged so far:
These libraries required minimal modifications to remove the original dependencies from Core
, Core_kernel
, or
Core_extended
, depending on the case.
For instance, the Nonempty List
library is a repackaged version of Core_kernel
’s Nonempty_list
. The original
code can be found here. I’ve modified the
code slightly to remove dependencies on Core
and Core_kernel
, making it solely dependent on Base
. This allows
the library to be used in more contexts without the need to add a dependency on Core
and Core_kernel
.
I’m reaching out to gauge interest in these repackaged libraries. While the use case might be niche, I believe
there could be Base
users who are motivated enough to limit their dependencies on core
, etc.
If there’s interest in the community for these libraries, I’m considering reaching out to Jane Street to discuss options. If Jane Street isn’t interested but the community is, I’m open to moving these libraries into a community space. I’m also willing to volunteer as a maintainer in this case. Of course, I want to respect the community’s established practices and wouldn’t want to step on anyone’s toes.
If there’s no interest, I’m happy to continue as is. I’m simply offering this in case it might be beneficial to others.
I appreciate your time and look forward to your feedback!
Outreachy internship demo session
Fay Carsons announced
Hi all! Myself and the other Outreachy interns from this batch are going to be publicly demoing our projects [date=2024-03-06 time=12:00:00 timezone=“America/New_York”] !
Im going to be talking about Joy, the creative coding library I developed, going over some features and hopefully doing some live-coded generative art! The other interns will be presenting their work with Bogue and refactoring the UI of Ocaml.org
Stop by if you’d like! link
dream-html 3.0.0
Yawar Amin announced
[ANN] dream-html 3.1.0
Thanks to the efforts of Kento Okura, I am happy to announce the release of 3.1.0, which brings complete support for all standard MathML attributes and elements.
Eg:
open Dream_html open MathML let op sym = mo [] [txt "%s" sym] let pow i n = msup [] [ mi [] [txt "%s" i]; mn [] [txt "%s" n]; ] (* a^2+b^2=c^2 *) let pythagoras_theorem = mtable [] [ mtr [] [ mtd [] [pow "a" "2"; op "+"; pow "b" "2"]; mtd [] [op "="]; mtd [] [pow "c" "2"]; ]; ]
As you can see, we can write helpers that greatly reduce duplication.
This addition completes dream-html’s support for all standard XML-based markups that are rendered by browsers.
This release also deprecates a couple of non-standard HTML attributes that I had mistakenly added before.
Add your OCaml Events to the Community Page on OCaml.org
Archive: https://discuss.ocaml.org/t/add-your-ocaml-events-to-the-community-page-on-ocaml-org/14251/1
Sabine Schmaltz announced
Hey folks!
This is a call for anyone who is running or knows about upcoming OCaml-related events to add those events to the Events directory on OCaml.org.
Here’s how to do it:
Open a pull request similar to this one:
https://github.com/ocaml/ocaml.org/pull/2134
If it’s a recurring event, create a listing in recurring.yml
. If it’s a one-time event, you should omit this.
If there’s start or end times, they need to be given in UTC - so that we can, in a later improvement to the Events directory, convert them to the viewer’s local timezone more easily. Here’s an example of an event with a start time:
--- title: "OCaml Users in Paris (OUPS)" textual_location: Paris, France location: lat: 48.8566 long: 2.3522 url: https://www.meetup.com/ocaml-paris/events/299014082/ recurring_event_slug: ocaml-users-paris-oups starts: yyyy_mm_dd: "7024-02-29" utc_hh_mm: "18:00" ---
Other OCaml News
From the ocaml.org blog
Here are links from many OCaml blogs aggregated at the ocaml.org blog.
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 to the caml-list.