[cwn] Attn: Development Editor, Latest OCaml Weekly News
Alan Schmitt
alan.schmitt at polytechnique.org
Tue Jun 6 07:22:10 PDT 2023
Hello
Here is the latest OCaml Weekly News, for the week of May 30 to June 06,
2023.
Table of Contents
─────────────────
Meetup group in New York City
Creating a tutorial on sequences
new release: Merlin 4.9
Taking Inventory of the OCaml Ecosystem on OCaml.org
New release: DocuLib 1.3.5
opam 2.1.5 release!
dune 3.8.0
Second alpha release of OCaml 5.1.0
ML’23: ACM SIGPLAN ML Family Workshop — Call for presentations
qcheck-lin and qcheck-stm 0.2
Melange 1.0 – compile OCaml / ReasonML to JavaScript
Debugging Native Code in “Second OCaml” YouTube Video
Sandmark nightly now supports latency profiling
Update on Eio (effects-based direct-style IO for OCaml 5)
Initial Emissions Monitoring of the OCaml.org Infrastructure
Other OCaml News
Old CWN
Meetup group in New York City
═════════════════════════════
Archive:
<https://discuss.ocaml.org/t/meetup-group-in-new-york-city/12270/1>
Ashish Agarwal announced
────────────────────────
I’m pleased to announce that the [OCaml NYC Meetup] is back! We have
scheduled our first new event for June 20th, where we will discuss the
use of OCaml in Tezos. Please join the meetup group to stay informed
about future events. We normally will not post to this forum.
We are always looking for speakers. Please reach out to me if you are
in the New York City area and are interested in giving a talk.
[OCaml NYC Meetup] <https://www.meetup.com/nyc-ocaml/>
Creating a tutorial on sequences
════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/creating-a-tutorial-on-sequences/12091/2>
Cuihtlauac Alvarado announced
─────────────────────────────
This tutorial is now online: <https://ocaml.org/docs/sequences>
Thanks to Miod Vallat, Sayo Bamigdade (@SaySayo), Christine Rose
(@professor.rose), Sabine Schmaltz (@sabine), Guillaume Petiot
(@gpetiot), Xavier Van de Woestyne (@xvw) and Simon Cruanes (@c-cube )
for their feedback
new release: Merlin 4.9
═══════════════════════
Archive:
<https://discuss.ocaml.org/t/ann-new-release-merlin-4-9/12277/1>
vds announced
─────────────
I am pleased to announce a new release of Merlin!
Merlin is an editor service that provides modern IDE features for
OCaml.
This new release brings a number of improvements and bug fixes. In
particular we identified and patched an important memory consumption
issue that could greatly affect Merlin’s performance in heavily
functorized projects.
Full changelog:
<https://github.com/ocaml/merlin/blob/master/CHANGES.md#merlin-49>
Taking Inventory of the OCaml Ecosystem on OCaml.org
════════════════════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/taking-inventory-of-the-ocaml-ecosystem-on-ocaml-org/12278/1>
Sabine Schmaltz announced
─────────────────────────
we have an open PR on ocaml/ocaml.org
(<https://github.com/ocaml/ocaml.org/pull/1226>) to show an
approximation of what the state of the OCaml ecosystem is with respect
to different topics / use cases.
This addition is inspired by Rust’s excellent “Are we X yet?” pages
which
1. *highlight libraries* that are production-ready, well-documented,
and have a nice API in the different categories. This is a
*showcase where we want to proudly point newcomers to*.
2. offer a high-level overview of the usability of the language for
certain applications. This *makes visible where contributions to
the ecosystem would be particularly valuable* to the OCaml
community. They provide a starting point for (prospective) package
authors to see where gaps in the ecosystem are, so they can *create
successful open source projects that meet community demand*! (I
know at least one company which is interested in contributing to
funding such projects. :wink:)
This is where you come in:
1. *Please help us give these pages an iconic name / title*. Got an
idea? Reply to this post! Make it memorable.
2. *Are there any important categories missing?*
3. Contributions are always welcome - none of use here is an expert on
the ever-growing OCaml ecosystem!
New release: DocuLib 1.3.5
══════════════════════════
Archive:
<https://discuss.ocaml.org/t/ann-new-release-doculib-1-3-5/12286/1>
nguermond announced
───────────────────
I’m happy to announce a new release of DocuLib on OPAM, a lightweight
and easy to use GUI for locally managing metadata for books,
textbooks, and articles (kind of like Zotero). This release is mostly
for minor fixes but I want to take the opportunity to advertise
[DocuLib] again.
Its core features are
• facilitating looking up metadata with an interface to
openlibrary.org, semanticscholar.org, and bibtex references through
crossref.org
• automatically detecting duplicates (by md5 hash), file renamings,
and files moved between libraries without losing metadata
• keeping track of authors, title, tags, personal notes, date,
DOI/ISBN
• error permissive search
For a full list of changes see [CHANGES]
Feel free to make suggestions in the comments!
[DocuLib] <https://github.com/nguermond/doculib>
[CHANGES] <https://github.com/nguermond/doculib/blob/master/CHANGES.md>
Kiran Gopinathan asked and nguermond replied
────────────────────────────────────────────
Could you comment a bit more on the comparison to zotero?
Are there certain features in doculib that you can’t
easily achieve in zotero?
The biggest difference is the way data is stored:
• Zotero puts a priority on metadata entries where a physical file is
a child of that entry if it exists, whereas DocuLib entries are
one-to-one with physical files on your computer
• files added to Zotero are either stored in a Zotero data directory
(over which you have no control) or a link to a file on your
computer (which you have to keep track of manually, so clearly not
the preferred method), whereas DocuLib files are stored in
libraries, of which you can have multiple. A library is a directory
containing files you want DocuLib to index, but metadata for that
library is also stored in that library.This means libraries are
portable, so you can share them or sync them independently of
DocuLib.
• Zotero stores metadata in a database, whereas DocuLib stores
metadata as json files one-to-one with the corresponding document
So in short, use DocuLib if you are a document hoarder and want local
control over your files. I’d say creating bibliographic references is
not the primary focus of DocuLib, whereas it is for Zotero.
opam 2.1.5 release!
═══════════════════
Archive: <https://discuss.ocaml.org/t/ann-opam-2-1-5-release/12290/1>
R. Boujbel announced
────────────────────
We are pleased to announce the patch release of [opam 2.1.5].
This opam release consists of [backported] bug fixes & a security fix.
You’ll find more information in the [release blog post], and the local
cache corruption issue in [the security post].
Thanks to [robur] for the security review!
To upgrade simply run:
┌────
│ bash -c "sh <(curl -fsSL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh) --version 2.1.5"
└────
[opam 2.1.5] <https://github.com/ocaml/opam/releases/tag/2.1.5>
[backported] <https://github.com/ocaml/opam/issues/5444>
[release blog post] <https://opam.ocaml.org/blog/opam-2-1-5>
[the security post] <https://opam.ocaml.org/blog/opam-2-1-5-local-cache>
[robur] <https://robur.coop>
dune 3.8.0
══════════
Archive: <https://discuss.ocaml.org/t/ann-dune-3-8-0/12291/1>
Etienne Millon announced
────────────────────────
The dune team is pleased to announce the release of Dune 3.8.0.
It is now available in opam-repository. As usual, it should always be
safe to upgrade your `dune' package: new features and deprecations are
only availble if you upgrade the language version in your
`dune-project' files.
Added
╌╌╌╌╌
• Introduce mdx stanza 0.4 requiring mdx >= 2.3.0 which updates the
default list of files to include `*.mld' files (#7582,
@Leonidas-from-XIV)
• Allow `(stdlib ...)' to be used with `(wrapped false)' in library
stanzas (#7139, @anmonteiro).
• Allow the main module of a library with `(stdlib ...)' to depend on
other libraries (#7154, @anmonteiro).
• Support `(link_flags ...)' in `(cinaps ...)' stanza. (#7423, fixes
#7416, @nojb)
• Allow `(package ...)' in any position within `(rule ...)' stanza
(#7445, @Leonidas-from-XIV)
• Added a new user action `(concurrent )' which is like `(progn )' but
runs the actions concurrently. (#6933, @Alizter)
• Accept the Ordered Set Language for the `modes' field in `library'
stanzas (#6611, @anmonteiro).
• Allow parallel execution of inline tests partitions (#7012, @hhugo)
• Add the `--display-separate-messages' flag to separate the error
messages produced by commands with a blank line. (#6823, fixes
#6158, @esope)
• Add `--watch-exclusions' to Dune build options (#7216,
@jonahbeckford)
• Adds support for loading plugins in toplevels (#6082, fixes #6081,
@ivg, @richardlford)
• Introduce a `public_headers' field on libraries. This field is like
`install_c_headers', but it allows to choose the extension and
choose the paths for the installed headers. (#7512, @rgrinberg)
• Dune can now detect Coq theories from outside the workspace. This
allows for composition with installed theories (not necessarily
installed with Dune). (#7047, @Alizter, @ejgallego)
• Added a `--no-build' option to `dune coq top' for avoiding rebuilds
(#7380, fixes #7355, @Alizter)
• Add a `coqdoc_flags' field to the `coq.theory' stanza allowing the
user to pass extra arguments to `coqdoc'. (#7676, fixes #7954
@Alizter)
• Preliminary support for Coq compiled intefaces (`.vos' files)
enabled via `(mode vos)' in `coq.theory' stanzas. This can be used
in combination with `dune coq top' to obtain fast re-building of
dependencies (with no checking of proofs) prior to stepping into a
file. (#7406, @rlepigre)
• Read `pkg-config' arguments from the `PKG_CONFIG_ARGN' environment
variable (#1492, #7734, @anmonteiro)
• Use `$PKG_CONFIG', when set, to find the `pkg-config' binary (#7469,
fixes #2572, @anmonteiro)
Changed
╌╌╌╌╌╌╌
• Bootstrap: remove reliance on shell. Previously, we’d use the shell
to get the number of processors. (#7274, @rgrinberg)
• Non-user proccesses such as version control or config checking are
now run silently. (#6994, fixes #4066, @Alizter)
• Bytecode executables built for JSOO are linked with `-noautolink'
and no longer depend on the shared stubs of their dependent
libraries (#7156, @nojb)
• Always include `opam' files in the generated `.install' file.
Previously, it would not be included whenever `(generate_opam_files
true)' was set and the `.install' file wasn’t yet generated. (#7547,
@rgrinberg)
Deprecated
╌╌╌╌╌╌╌╌╌╌
• Modules that were declared in `(modules_without_implementation)',
`(private_modules)' or `(virtual_modules)' but not declared in
`(modules)' will cause Dune to emit a warning which will become an
error in 3.9. (#7608, fixes #7026, @Alizter)
• Coq language versions less 0.8 are deprecated, and will be removed
in an upcoming Dune version. All users are required to migrate to
`(coq lang 0.8)' which provides the right semantics for theories
that have been globally installed, such as those coming from opam
(@ejgallego, @Alizter)
Fixed
╌╌╌╌╌
• Find `pps' dependencies in the host context when cross-compiling,
(#7415, fixes #4156, @anmonteiro)
• Fix plugin loading with findlib. The functionality was broken in
3.7.0. (#7556, @anmonteiro)
• Load the host context `findlib.conf' when cross-compiling (#7428,
fixes #1701, @rgrinberg, @anmonteiro)
• Allow overriding the `ocaml' binary with findlib configuration
(#7648, @rgrinberg)
• Resolve `ppx_runtime_libraries' in the target context when cross
compiling (#7450, fixes #2794, @anmonteiro)
• Fix `dune install' when cross compiling (#7410, fixes #6191,
@anmonteiro, @rizo)
• Fix string quoting in the json file written by `--trace-file'
(#7773, @rleshchinskiy)
• Correctly set `MANPATH' in `dune exec'. Previously, we would use the
`bin/' directory of the context. (#7655, @rgrinberg)
• merlin: ignore instrumentation settings for preprocessing. (#7606,
fixes #7465, @Alizter)
• When a rule’s action is interrupted, delete any leftover directory
targets. This is consistent with how we treat file targets. (#7564,
@rgrinberg)
• Fix dune crashing on MacOS in watch mode whenever `$PATH' contains
`$PWD' (#7441, fixes #6907, @rgrinberg)
• Dune in watch mode no longer builds concurrent rules in serial
(#7395 @rgrinberg, @jchavarri)
• `dune coq top' now correctly respects the project root when called
from a subdirectory. However, absolute filenames passed to `dune coq
top' are no longer supported (due to being buggy) (#7357, fixes
#7344, @rlepigre and @Alizter)
• RPC: Ignore SIGPIPE when clients suddenly disconnect (#7299, #7319,
fixes #6879, @rgrinberg)
• Always clean up the UI on exit. (#7271, fixes #7142 @rgrinberg)
• Bootstrap: correctly detect the number of processors by allowing
`nproc' to be looked up in `$PATH' (#7272, @Alizter)
• Speed up file copying on macos by using `clonefile' when available
(@rgrinberg, #7210)
• Support commands that output 8-bit and 24-bit colors in the terminal
(#7188, @Alizter)
• Speed up rule generation for libraries and executables with many
modules (#7187, @jchavarri)
• Do not re-render UI on every frame if the UI doesn’t change (#7186,
fix #7184, @rgrinberg)
• Make `coq_db' creation in scope lazy (@ejgallego, #7133)
• dune install now respects –display quiet mode (#7116, fixes #4573,
fixes #7106, @Alizter)
• Stub shared libraries (`dllXXX_stubs.so') in Dune-installed
libraries could not be used as dependencies of libraries in the
workspace (eg when compiling to bytecode and/or Javascript). This is
now fixed. (#7151, @nojb)
• Fix regression where Merlin was unable to handle filenames with
uppercase letters under Windows. (#7577, @nojb)
• On nix+macos, pass `-f' to the codesign hook to avoid errors when
the binary is already signed (#7183, fixes #6265, @greedy)
• Fix bug where RPC clients built with dune-rpc-lwt would crash when
closing their connection to the server (#7581, @gridbugs)
• Fix RPC server on Windows (used for OCaml-LSP). (#7666, @nojb)
Second alpha release of OCaml 5.1.0
═══════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/second-alpha-release-of-ocaml-5-1-0/12299/1>
octachron announced
───────────────────
With the progress of the ongoing stabilisation effort for OCaml 5.1.0,
I am happy to announce a second alpha release for OCaml 5.1.0.
This second alpha release contains many noteworthy fixes:
• a long-awaited GC fix
• a Windows ABI fix
as announced in the first alpha but also
• a compiler-libs (parsetree) fix
• a type system compatibility enhancement change
• a restored backed for s390x/IBM Z
The full list of changes since the first alpha is available below.
Once most major OCaml tools are updated to the last compiler-libs
changes, we will switch to beta releases. Hopefully, this will happen
in the upcoming weeks. The progress on stabilising the ecosystem is
tracked on the [opam readiness for 5.1.0 meta-issue].
Currently, the release is still planned for around July.
If you find any bugs, please report them on [OCaml’s issue tracker].
If you are interested in the ongoing list of new features and bug
fixes, the updated change log for OCaml 5.1.0 is available [on
GitHub].
[opam readiness for 5.1.0 meta-issue]
<https://github.com/ocaml/opam-repository/issues/23669>
[OCaml’s issue tracker] <https://github.com/ocaml/ocaml/issues>
[on GitHub] <https://github.com/ocaml/ocaml/blob/5.1/Changes>
Installation Instructions
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
The base compiler can be installed as an opam switch with the
following commands on opam 2.1:
┌────
│ opam update
│ opam switch create 5.1.0~alpha2
└────
The source code for the alpha is also available at these addresses:
• [GitHub]
• [OCaml archives at Inria]
[GitHub] <https://github.com/ocaml/ocaml/archive/5.1.0-alpha2.tar.gz>
[OCaml archives at Inria]
<https://caml.inria.fr/pub/distrib/ocaml-5.1/ocaml-5.1.0~alpha2.tar.gz>
◊ 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~alpha2+options <option_list>
└────
where `option_list' is a space-separated list of `ocaml-option-*'
packages. For instance, for a flambda and no-flat-float-array switch:
┌────
│ opam switch create 5.1.0~alpha2+flambda+nffa ocaml-variants.5.1.0~alpha2+options ocaml-option-flambda ocaml-option-no-flat-float-array
└────
All available options can be listed with `opam search ocaml-option'.
Changes Compared To The First Alpha Release
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
◊ Runtime System:
• [#11589], [#11903]: Modify the GC pacing code to make sure the GC
keeps up with allocations in the presence of idle domains. (Damien
Doligez and Stephen Dolan, report by Florian Angeletti, review by KC
Sivaramakrishnan and Sadiq Jaffer)
• (*breaking change*) [#11865], [#11868], [#11876]: Clarify that the
operations of a custom block must never access the OCaml runtime.
The previous documentation only mentioned the main illicit usages.
In particular, since OCaml 5.0, it is no longer safe to call
`caml_remove_global_root' or `caml_remove_generational_global_root'
from within the C finalizer of a custom block, or within the
finalization function passed to `caml_alloc_final'. As a workaround,
such a finalization operation can be registered with `Gc.finalize'
instead, which guarantees to run the finalizer at a safe point.
(Report by Timothy Bourke, discussion by Yotam Barnoy, Timothy
Bourke, Sadiq Jaffer, Xavier Leroy, Guillaume Munch-Maccagnoni, and
Gabriel Scherer)
• [#11827], +[#12249]: Restore prefetching for GC marking (Fabrice
Buoro and Stephen Dolan, review by Gabriel Scherer and Sadiq Jaffer)
• [#12131]: Simplify implementation of weak hash sets, fixing a
performance regression. (Nick Barnes, review by François Bobot,
Alain Frisch and Damien Doligez).
• [#12231]: Support MinGW-w64 11.0 winpthreads library, where the
macro to set up to get flexdll working changed (David Allsopp and
Samuel Hym, light review by Xavier Leroy)
[#11589] <https://github.com/ocaml/ocaml/issues/11589>
[#11903] <https://github.com/ocaml/ocaml/issues/11903>
[#11865] <https://github.com/ocaml/ocaml/issues/11865>
[#11868] <https://github.com/ocaml/ocaml/issues/11868>
[#11876] <https://github.com/ocaml/ocaml/issues/11876>
[#11827] <https://github.com/ocaml/ocaml/issues/11827>
[#12249] <https://github.com/ocaml/ocaml/issues/12249>
[#12131] <https://github.com/ocaml/ocaml/issues/12131>
[#12231] <https://github.com/ocaml/ocaml/issues/12231>
◊ Type System:
• (*breaking change*) [#12189], [#12211]: anonymous row variables in
explicitly polymorphic type annotation, e.g. `'a. [< X of 'a ] ->
'a', are now implicitly universally quantified (in other words, the
example above is now read as `'a 'r. ([< X of 'a ] as 'r) -> 'a').
(Florian Angeletti and Gabriel Scherer, review by Jacques Garrigue)
[#12189] <https://github.com/ocaml/ocaml/issues/12189>
[#12211] <https://github.com/ocaml/ocaml/issues/12211>
◊ Code Generation And Optimizations:
• [#11712], [#12258], [#12261]: s390x / IBM Z multicore support: OCaml
& C stack separation; dynamic stack size checks; fiber and effects
support. (Aleksei Nikiforov, with help from Vincent Laviron and
Xavier Leroy, additional suggestions by Luc Maranget, review by the
same and KC Sivaramakrishnan)
[#11712] <https://github.com/ocaml/ocaml/issues/11712>
[#12258] <https://github.com/ocaml/ocaml/issues/12258>
[#12261] <https://github.com/ocaml/ocaml/issues/12261>
◊ Internal/compiler-libs Changes:
• [#12119], [#12188], [#12191]: mirror type constraints on value
binding in the parsetree: the constraint `typ' in `let pat : typ =
exp' is now directly stored in the value binding node in the
parsetree. (Florian Angeletti, review by Richard Eisenberg)
[#12119] <https://github.com/ocaml/ocaml/issues/12119>
[#12188] <https://github.com/ocaml/ocaml/issues/12188>
[#12191] <https://github.com/ocaml/ocaml/issues/12191>
◊ Bug Fixes
• [#11846]: Mark rbx as destroyed at C call for Win64 (mingw-w64 and
Cygwin64). Reserve the shadow store for the ABI in the c_stack_link
struct instead of explictly when calling C functions. This
simultaneously reduces the number of stack pointer manipulations and
also fixes a bug when calling noalloc functions where the shadow
store was not being reserved. (David Allsopp, report by Vesa
Karvonen, review by Xavier Leroy and KC Sivaramakrishnan)
• [#12170]: fix pthread_geaffinity_np configure check for android
(David Allsopp, review by Sébastien Hinderer)
• [#12252]: Fix shared library build error on RISC-V. (Edwin Török,
review by Nicolás Ojeda Bär and Xavier Leroy)
• [#12255], [#12256]: Handle large signal numbers correctly (Nick
Barnes, review by David Allsopp).
• [#12277]: ARM64, fix a potential assembler error for very large
functions by emitting stack reallocation code before the body of the
function. (Xavier Leroy, review by KC Sivaramakrishnan)
[#11846] <https://github.com/ocaml/ocaml/issues/11846>
[#12170] <https://github.com/ocaml/ocaml/issues/12170>
[#12252] <https://github.com/ocaml/ocaml/issues/12252>
[#12255] <https://github.com/ocaml/ocaml/issues/12255>
[#12256] <https://github.com/ocaml/ocaml/issues/12256>
[#12277] <https://github.com/ocaml/ocaml/issues/12277>
ML’23: ACM SIGPLAN ML Family Workshop — Call for presentations
══════════════════════════════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/ml23-acm-sigplan-ml-family-workshop-call-for-presentations/12224/2>
Guillaume Munch-Maccagnoni announced
────────────────────────────────────
I’m letting you know that the deadline has been extended to June 8th
(AoE).
qcheck-lin and qcheck-stm 0.2
═════════════════════════════
Archive:
<https://discuss.ocaml.org/t/ann-qcheck-lin-and-qcheck-stm-0-2/12301/1>
Jan Midtgaard announced
───────────────────────
I’m happy to share release 0.2 of `qcheck-lin' and `qcheck-stm' for
black-box property-based testing.
• `qcheck-lin' requires little more than an interface description. It
allows to test a library for sequential consistency, that is,
whether results obtained from using it in parallel agree with some
linear, single domain execution.
• `qcheck-stm' is a model-based, state-machine framework for both
sequential and parallel testing. It allows to test an imperative
interface against a pure model description, and thereby allows to
express and test intended behaviour beyond a signature description.
For example, here’s a minimal `qcheck-lin' test of a selection of the
`Stdlib' `Hashtbl' interface:
┌────
│ module HashtblSig =
│ struct
│ type t = (char, int) Hashtbl.t
│ let init () = Hashtbl.create ~random:false 42
│ let cleanup _ = ()
│
│ open Lin
│ let a,b = char_printable,nat_small
│ let api =
│ [ val_ "Hashtbl.add" Hashtbl.add (t @-> a @-> b @-> returning unit);
│ val_ "Hashtbl.remove" Hashtbl.remove (t @-> a @-> returning unit);
│ val_ "Hashtbl.find" Hashtbl.find (t @-> a @-> returning_or_exc b);
│ val_ "Hashtbl.mem" Hashtbl.mem (t @-> a @-> returning bool);
│ val_ "Hashtbl.length" Hashtbl.length (t @-> returning int); ]
│ end
│
│ module HT = Lin_domain.Make(HashtblSig)
│ ;;
│ QCheck_base_runner.run_tests_main [
│ HT.lin_test ~count:1000 ~name:"Hashtbl DSL test";
│ ]
└────
Running this test quickly finds a minimal counterexample to illustrate
that `Hashtbl' is not safe to use in parallel:
┌────
│ Messages for test Hashtbl DSL test:
│
│ Results incompatible with sequential execution
│
│ |
│ Hashtbl.add t '<' 0 : ()
│ |
│ .------------------------------------.
│ | |
│ Hashtbl.add t 'a' 0 : () Hashtbl.remove t '<' : ()
│ Hashtbl.length t : 0
└────
We presented preliminary work on both these libraries at the OCaml
Workshop 2022. The libraries furthermore underlie our continuing
effort to test the multicore runtime of OCaml 5.x, and have helped
identify several issues.
The 0.2 release adds a range of features and bugfixes, including
support for OCaml 4.12.x, 4.13.x and 4.14.x without the `Domain' and
`Effect' modes.
Detailed release notes and more information is available from the
GitHub repository:
<https://github.com/ocaml-multicore/multicoretests>
Happy testing!
Melange 1.0 – compile OCaml / ReasonML to JavaScript
════════════════════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/ann-melange-1-0-compile-ocaml-reasonml-to-javascript/12305/1>
Antonio Nuno Monteiro announced
───────────────────────────────
The Melange team and I are thrilled to announce the release of Melange
1.0 today, marking a major milestone in the life of the project. This
release represents the culmination of many months of hard work and
incredible collaboration.
Melange, which [started as a fork of BuckleScript], was created with
the vision of maintaining compatibility with OCaml and providing the
best OCaml experience within the modern JavaScript ecosystem. Today,
we are proud to present Melange 1.0, a mature and reliable tool for
compiling OCaml to efficient and readable JavaScript that teams rely
on [to deliver complex OCaml / ReasonML applications].
[Get it now]:
┌────
│ $ opam install melange.1.0.0
└────
[started as a fork of BuckleScript]
<https://anmonteiro.com/2021/03/on-ocaml-and-the-js-platform/>
[to deliver complex OCaml / ReasonML applications]
<https://tech.ahrefs.com/ahrefs-is-now-built-with-melange-b14f5ec56df4>
[Get it now] <https://ocaml.org/p/melange/1.0.0>
Highlights
╌╌╌╌╌╌╌╌╌╌
Melange 1.0 radically improves user experience. This release focuses
on robustness, OCaml compatibility and developer experience: Melange
is fully embracing the [OCaml Platform] to make it easy and reliable
for OCaml users to target JavaScript.
[OCaml Platform] <https://ocaml.org/docs/platform>
◊ Dune Integration
Integrating with Dune was our biggest priority. [Dune 3.8], released
very recently, adds Melange support by understanding the following
types of stanzas:
┌────
│ (library
│ (modes melange) ;; <- new Melange mode
│ )
│
│ ;; emit JS to ~js-output~ folder in this
│ ;; directory
│ (melange.emit
│ (target js-output))
└────
In Melange 1.0, the Dune integration is the officially supported
workflow to build Melange projects. It provides robust rule
generation, static assets support (your HTML / CSS / SVG / images),
seamless editor integration (e.g. with OCaml LSP or Merlin).
[Dune 3.8] <https://discuss.ocaml.org/t/ann-dune-3-8-0/12291>
◊ Documentation
With Melange 1.0, we’re also launching a new documentation effort,
[melange.re]. This website should currently be considered a work in
progress, and we’re looking for feedback on how to best explain the
Melange workflow and its available features. Feel free to get in touch
in the [OSS repository].
Additionally, the Dune documentation includes [reference materials]
specific to using Melange with Dune.
[melange.re] <https://melange.re>
[OSS repository] <https://github.com/melange-re/melange-re.github.io>
[reference materials]
<https://dune.readthedocs.io/en/latest/melange.html>
◊ Everything else
◊ Wider OCaml version support
Melange was previously only available on OCaml 4.14. In this
release, we’ve widened that range to versions of OCaml starting from
version 4.13. This includes the OCaml 5 release line and allows
Melange projects to share the same OCaml compiler switch as e.g.
server-side projects.
Editor integration is the only caveat: it only works on OCaml 4.14,
since Melange emits [`.cmt' artifacts] (used by e.g. LSP) targeting
the OCaml 4.14 binary format.
[`.cmt' artifacts]
<https://ocaml.org/p/ocaml-base-compiler/4.14.1/doc/Cmt_format/index.html>
◊ Multiple syntaxes
Dune supports [ReasonML] out of the box via [dialects], keeping
ReasonML support in Melange unchanged from a user perspective.
Internally, however, Melange 1.0 has dropped any knowledge of
ReasonML, relying on the existing, battle-tested Dune support for
dialects instead.
A [`rescript-syntax'] package is part of the Melange release too. It
enables support for ReScript syntax in Melange, which Dune also
supports. Keep in mind, however, that newer ReScript features are
unlikely to be supported by this best-effort compatibility package.
[ReasonML] <https://reasonml.github.io/>
[dialects]
<https://dune.readthedocs.io/en/stable/overview.html#term-dialect>
[`rescript-syntax'] <https://ocaml.org/p/rescript-syntax/1.0.0>
◊ Separate PPX
A big benefit of deep integration with the OCaml platform is having
the freedom to assume that a native toolchain is present. That made
it possible to unbundle the Melange distribution into a few separate
components.
Melange now ships with a `melange.ppx' preprocessor based on
[Ppxlib] that can be added to `(preprocess (pps melange.ppx))', as
per [Dune’s preprocessing specification].
The React JS PPX (for Reason + JSX) has also been extracted and is
now distributed separately as [`reactjs-jsx-ppx'].
[Ppxlib] <https://ocaml-ppx.github.io/ppxlib>
[Dune’s preprocessing specification]
<https://dune.readthedocs.io/en/stable/reference/preprocessing-spec.html>
[`reactjs-jsx-ppx'] <https://ocaml.org/p/reactjs-jsx-ppx/1.0.0>
◊ Enabling modern JS workflows
The Melange design in Dune was designed from day one with the goal
of embracing the JavaScript platform:
• The Dune integration generates JavaScript files in a predictable
way
• The resulting layout works well with the Node.js [module
resolution algorithm], which most bundlers understand.
• The JS output layout is [documented here].
• To exercise modern workflows, Melange has been tested in a
[Next.js] application using [React Server Components], and the
available constructs were deemed sufficient to enable similar use
cases.
[module resolution algorithm]
<https://nodejs.org/api/modules.html#all-together>
[documented here]
<https://melange.re/v1.0.0/build-system/#javascript-artifacts-layout>
[Next.js] <https://nextjs.org/>
[React Server Components]
<https://react.dev/blog/2020/12/21/data-fetching-with-react-server-components>
◊ Full list of changes:
The full list of changes can be consulted [here].
[here] <https://github.com/melange-re/melange/blob/main/Changes.md>
Support & Sponsorship
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
The effort that went into this release would not have been possible
without the support of many.
We’d like to thank everyone who made it possible:
• [Ahrefs] has shown interest in Melange [since its first
announcement]. Since October 2022, Ahrefs’s crucial sponsorship has
made it possible to [build its codebase with Melange] and work on
this release.
• [Qwick], who has been running Melange since November 2022, providing
invaluable feedback, financial backing and an open-minded team
willing to try new directions.
• The [OCaml Software Foundation] previously [committed funding] for
the Melange project in October 2022, and has recently approved a new
round of OSS sponsorship.
• [My (Antonio) sponsors] on GitHub, both past and present
We’d also like to thank the following notable contributors to this
release:
• [Rudi Grinberg], for his indispensable guidance and direction on the
design and implementation of the Dune integration.
• [Javier Chávarri], for migrating a huge production codebase at
Ahrefs to Melange, working on the Dune integration, the Melange
documentation effort and providing vital feedback to the project.
• [David Sancho], for trying out our most bleeding edge ideas and
providing early feedback on how to move forward with ways that
encompass the whole ecosystem.
[Ahrefs] <https://ahrefs.com/>
[since its first announcement]
<https://tech.ahrefs.com/building-ahrefs-codebase-with-melange-9f881f6d022b>
[build its codebase with Melange]
<https://tech.ahrefs.com/ahrefs-is-now-built-with-melange-b14f5ec56df4>
[Qwick] <https://www.qwick.com/>
[OCaml Software Foundation] <https://ocaml-sf.org/>
[committed funding]
<https://twitter.com/_anmonteiro/status/1589044352479035393>
[My (Antonio) sponsors] <https://github.com/sponsors/anmonteiro/>
[Rudi Grinberg] <https://github.com/rgrinberg>
[Javier Chávarri] <https://github.com/jchavarri>
[David Sancho] <https://github.com/davesnx>
Looking Forward
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
We are enthusiastic about the progress we have made and the positive
feedback we have received from the community. We remain committed to
continuously improving Melange, ensuring it remains a robust and
efficient tool for OCaml developers targeting the JavaScript platform.
Our [Q2 2023 roadmap] includes most of the goals that we set out to
achieve over the past few months, and some of what we’re thinking
about working in the months ahead. Melange 1.0 only marks the
beginning of our journey towards the best OCaml experience on the JS
platform.
Finally, we would like to extend our deepest thanks to everyone who
has supported the project, whether through code contributions,
testing, or providing feedback. This is your achievement as much as it
is ours, and we look forward to continuing this journey together.
[Q2 2023 roadmap]
<https://docs.google.com/document/d/1279euT9LeJIkwAUYqazqeh2lc8c7TLQap2_2vBNcK4w/>
Debugging Native Code in “Second OCaml” YouTube Video
═════════════════════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/ann-debugging-native-code-in-second-ocaml-youtube-video/12315/1>
jbeckford announced
───────────────────
In response to an earlier post
(<https://discuss.ocaml.org/t/enhancing-ocaml-debugging-experience-in-visual-studio-code/12236/4?u=jbeckford>)
I’ve uploaded a video on YouTube.
Direct Link: [https://youtu.be/OV19_FqAUCw]
Quick Summary: Pre-requisite skill is the ability to compile your own
OCaml compiler. Only macOS and Linux. Breakpoints and single-stepping;
no display of OCaml values.
Hopefully it will be the first of several if a few people subscribe or
comment. The video, and others that I may make for that new channel,
are *not for OCaml beginners*.
/Aside: Personally, I don’t become a beginner in a new subject without
first having a glimpse of what I can accomplish in that subject. My
expectation is that the people curious about OCaml may land on a few
videos and then become beginners./
Since this is my very first YouTube video, I’d appreciate feedback!
[https://youtu.be/OV19_FqAUCw] <https://youtu.be/OV19_FqAUCw>
Sandmark nightly now supports latency profiling
═══════════════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/ann-sandmark-nightly-now-supports-latency-profiling/12318/1>
Puneeth Chaganti announced
──────────────────────────
[Sandmark nightly] now monitors tail latency of sequential and
parallel applications enabled by new features in OCaml 5.
<https://global.discourse-cdn.com/business7/uploads/ocaml/optimized/2X/2/28bed5afb55f4d8182f7b83913d7d73d666eb835_2_1380x404.png>
[Click to see the Sequential latency benchmark run]
<https://global.discourse-cdn.com/business7/uploads/ocaml/optimized/2X/b/b849c2316026f43d0c2cf2855df298177339d1c7_2_1380x938.jpeg>
[Click here to see the Parallel latency benchmark run]
[Sandmark nightly] <https://sandmark.tarides.com/>
[Click to see the Sequential latency benchmark run]
<https://sandmark.tarides.com/?app=sequential-latency&pausetimes_seq_00=turing&pausetimes_seq_find_by=hostname&pausetimes_seq_10=turing&pausetimes_seq_01=20230601&pausetimes_seq_12=%5B%27turing_5.2.0%2Btrunk%2Bbartoszmodelski%2Bpr12212%2Bpausetimes_seq_20230530_a6f309f%27%5D&pausetimes_seq_11=20230530&pausetimes_seq_02=turing_5.2.0%2Btrunk%2Bpausetimes_seq_20230601_224c14c&pausetimes_seq_num_variants=2>
[Click here to see the Parallel latency benchmark run]
<https://sandmark.tarides.com/?app=parallel-latency&pausetimes_par_num_variants=2&pausetimes_par_01=20230531&pausetimes_par_find_by=hostname&pausetimes_par_02=navajo_5.2.0%2Btrunk%2Bpausetimes_par_20230531_224c14c&pausetimes_par_00=navajo&pausetimes_par_12=navajo_5.2.0%2Btrunk%2Bpausetimes_par_20230526_8778780&pausetimes_par_10=navajo&pausetimes_par_11=20230526>
Instrumented runtime of the past
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
In the past, Sandmark used to support monitoring GC latencies using
the instrumented runtime that was present in OCaml 4. But this GC
latency feature was disabled due to breaking changes in Sandmark when
moving from OCaml 4 to OCaml 5. It is also useful to note that the
instrumented runtime wrote to a file, and had a noticeable impact on
the program speed. As a result, this instrumentation had to be enabled
with a compile-time flag that linked the instrumented runtime with the
application rather than the default runtime. The instrumented runtime
was used to generate the graphs that were used in the ICFP paper,
[Retrofitting Parallelism onto OCaml] (Fig 10 and Fig 12). However,
given its cost, the instrumented runtime was seen as only to be used
by GC hackers for performance debugging.
[Retrofitting Parallelism onto OCaml]
<https://kcsrk.info/papers/retro-parallel_icfp_20.pdf>
Latency profiling through olly
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
OCaml 5 supports [Runtime Events] — a new feature that enables
continuous monitoring of production applications. The key differences
to the earlier instrumented runtime approach are
1. Instead of a file, the events are now written to a shared in-memory
ring. The events may be read out by an external process from this
ring.
2. Some of the frequent (expensive) probes associated are eschewed to
keep the costs low. The expensive probes are still available using
the instrumented runtime.
Due to this design, every OCaml 5 program may be continuously
monitored for performance, not just the ones compiled with the
instrumented runtime. On top of this runtime events feature, we have
built [olly], an observability tool for OCaml programs. Olly can
extract traces of GC events that can be viewed by [Perfetto] and also
produce a short report on GC behaviour including tail latency
profiles.
The Sandmark team has now replaced the old latency profiling feature
developed over OCaml 4 instrumented runtimes to using olly to generate
the profiles. (See Sandmark PR [here]). Now, the OCaml compiler is
continuously monitored not only for speed and memory usage, but also
for latency.
[Runtime Events]
<https://v2.ocaml.org/releases/5.0/api/Runtime_events.html>
[olly] <https://github.com/tarides/runtime_events_tools>
[Perfetto] <https://perfetto.dev/>
[here] <https://github.com/ocaml-bench/sandmark/pull/424>
Call for action
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
If you are interested in profiling and analysing the performance of
the development branch of the OCaml compiler, please submit your
branch through [Sandmark Nightly Config].
[Sandmark Nightly Config]
<https://github.com/ocaml-bench/sandmark-nightly-config/>
Update on Eio (effects-based direct-style IO for OCaml 5)
═════════════════════════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/update-on-eio-effects-based-direct-style-io-for-ocaml-5/10395/3>
Thomas Leonard announced
────────────────────────
With Eio 0.10 just released, it’s time for another update! Since the
above post (which was for Eio 0.5), some of the bigger changes are:
• A new eio_posix backed for Unix-type systems provides much better
performance than the old libuv one. Removing libuv has also made it
safe to share file-descriptors between domains, so you can now
accept a connection with one domain and handle it with another, for
example.
• There is now an [API for spawning sub-processes].
• Networking changes include better support for datagram sockets and
the new [Eio.Net.run_server] convenience function.
• Many of the data-structures (promises, conditions, semaphores and
synchronous streams) are now lock-free, making them faster to use
across multiple domains.
• It is safe to [handle signals in Eio] now that
`Eio.Condition.broadcast' is lock-free (signal handlers can’t take
locks, since they may have interrupted the thread holding the lock).
Though note that reliable signal handling on OCaml 5 requires
[OCaml#12253] to be fixed too.
• [Fiber.fork_seq] provides an easy way to create generator functions.
• Eio now supports [domain-local-await], which allows sharing e.g.
[kcas] data-structures across Eio and Domainslib domains.
• [Error handling] has been improved. You can now add extra context
information to errors (e.g. an error opening a missing file will now
include the path of the file). You can also choose how specific to
be: e.g. you can catch all IO errors, all network errors, or all
connection reset errors.
• There are also some experimental backends under development:
• [eio_solo5] is for MirageOS unikernels.
• [eio_js] is for browsers.
• eio_windows is for Windows - see [#125] if you’d like to help out.
A more detailed list of changes can be found in the [release notes].
Eio’s [README.md] provides an introduction to most of the features.
If you’d like to get involved, the new [HACKING.md] document explains
the structure of the code for people who want to contribute to Eio,
and there are regular [Eio developer meetings] for anyone who wants to
get involved.
[API for spawning sub-processes]
<https://github.com/ocaml-multicore/eio#running-processes>
[Eio.Net.run_server]
<https://ocaml-multicore.github.io/eio/eio/Eio/Net/index.html#running-servers>
[handle signals in Eio]
<https://github.com/ocaml-multicore/eio#example-signal-handlers>
[OCaml#12253] <https://github.com/ocaml/ocaml/issues/12253>
[Fiber.fork_seq]
<https://ocaml-multicore.github.io/eio/eio/Eio/Fiber/index.html#val-fork_seq>
[domain-local-await]
<https://github.com/ocaml-multicore/domain-local-await>
[kcas] <https://github.com/ocaml-multicore/kcas>
[Error handling]
<https://github.com/ocaml-multicore/eio/blob/main/README.md#error-handling>
[eio_solo5] <https://github.com/TheLortex/eio-solo5>
[eio_js] <https://github.com/ocaml-multicore/eio/pull/405>
[#125] <https://github.com/ocaml-multicore/eio/issues/125>
[release notes] <https://github.com/ocaml-multicore/eio/releases>
[README.md] <https://github.com/ocaml-multicore/eio/blob/main/README.md>
[HACKING.md]
<https://github.com/ocaml-multicore/eio/blob/main/HACKING.md>
[Eio developer meetings]
<https://discuss.ocaml.org/t/eio-developer-meetings/12207>
Initial Emissions Monitoring of the OCaml.org Infrastructure
════════════════════════════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/initial-emissions-monitoring-of-the-ocaml-org-infrastructure/12335/1>
Patrick Ferris announced
────────────────────────
I’m happy to announce that some initial emissions monitoring has been
added to the OCaml.org infrastructure. A more detailed write up can be
found at
<https://infra.ocaml.org/2023/05/30/emissions-monitoring.html>. This
is a first step in accurately measuring the amount of emissions we are
generating. There was a discuss thread touching on some of this a
while ago <https://discuss.ocaml.org/t/ocaml-carbon-footprint/8580>.
I think there are two important next tasks: getting full coverage of
all of the infrastructure machines and making the data publicly
available. I hope to work on this (in an open-source way) in the
future, if anyone else is interested do let me know!
Thanks to [Tarides] (who funded the initial work on this) and to
@lambda_foo, Mark Elvers and @avsm for helping with the deployment and
ideas for measuring emissions. There is an issue on the
ocaml/infrastructure repository for the next steps
<https://github.com/ocaml/infrastructure/issues/47> :seedling:
[Tarides] <https://tarides.com>
Other OCaml News
════════════════
From the ocaml.org blog
───────────────────────
Here are links from many OCaml blogs aggregated at [the ocaml.org
blog].
• [Two variants of the Bind rule]
• [Oxidizing OCaml: Locality]
• [The Future of Programming with Richard Eisenberg]
• [Beta release of Frama-C 27.0~beta (Cobalt)]
• [Specifying Functions: Two Styles]
[the ocaml.org blog] <https://ocaml.org/blog/>
[Two variants of the Bind rule]
<http://cambium.inria.fr/blog/two-variants-of-the-bind-rule>
[Oxidizing OCaml: Locality]
<https://blog.janestreet.com/oxidizing-ocaml-locality/>
[The Future of Programming with Richard Eisenberg]
<https://signals-threads.simplecast.com/episodes/the-future-of-programming-with-richard-eisenberg-pOktpZ_e>
[Beta release of Frama-C 27.0~beta (Cobalt)]
<https://frama-c.com/fc-versions/cobalt.html>
[Specifying Functions: Two Styles]
<http://gallium.inria.fr/blog/function-specs-2023-05-12>
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].
[Alan Schmitt]
[send me a message] <mailto:alan.schmitt at polytechnique.org>
[the archive] <https://alan.petitepomme.net/cwn/>
[RSS feed of the archives] <https://alan.petitepomme.net/cwn/cwn.rss>
[online] <http://lists.idyll.org/listinfo/caml-news-weekly/>
[Alan Schmitt] <https://alan.petitepomme.net/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.idyll.org/pipermail/caml-news-weekly/attachments/20230606/75311419/attachment-0001.html>
More information about the caml-news-weekly
mailing list