Hello Here is the latest OCaml Weekly News, for the week of June 06 to 13, 2023.
Table of Contents ───────────────── release of minisat 0.5 containers 3.12 Recent tar releases (2.5.0, 2.4.0, …) mpp.0.3.6, which adds compatibility with OCaml 5, is now in opam trace 0.1, tracy-client 0.1 A short review of fmlib_browser (web frontend library) moonpool 0.1 Other OCaml News Old CWN release of minisat 0.5 ══════════════════════ Archive: <https://discuss.ocaml.org/t/ann-release-of-minisat-0-5/12336/1> Simon Cruanes announced ─────────────────────── [OCaml-minisat] 0.5 just landed on opam. This library has bindings to the classic [minisat] SAT solver. It should have decently low overhead (no ctypes, runtime lock released, etc.) and be useful for general purpose SAT solving. Minisat is not really state of the art anymore, but it’s still pretty damn good for a lot of use cases. [OCaml-minisat] <https://github.com/c-cube/ocaml-minisat/> [minisat] <http://minisat.se/> Darius asked and Simon Cruanes replied ────────────────────────────────────── Just out of interest, what is the state of the art, and what are these use cases? State of the art is, roughly, [Cadical] and [Kissa] (yes, both are from Armin Biere). They’re better on hard SAT instances, the ones that still take a while to solve. These minisat bindings could be updated at least to Glucose (a known patch to minisat with better heuristics), maybe I’ll do that at some point. The use cases: anything where you want to solve a NP-complete problem (register allocation for example; sudoku solving; also a lot of verification problems can benefit from a SAT encoding somewhere). Using an API instead of calling a process is useful because you can access more things and perform incremental solving easily: instead of solving a single SAT problem, you can solve a series of increasingly big problems without starting from scratch each time. [Cadical] <https://github.com/arminbiere/cadical> [Kissa] <https://github.com/arminbiere/kissat> containers 3.12 ═══════════════ Archive: <https://discuss.ocaml.org/t/ann-containers-3-12/12337/1> Simon Cruanes announced ─────────────────────── I’m happy to announce the release of [containers 3.12]. Containers is a lightweight and modular extension of the standard library. It enriches existing modules and adds a few that are missing. In this release, the highlights are: • more functions in `Set' and `Array' • a new `containers.pp' sublibrary, with Wadler-style pretty printing combinators • improvements to the parser combinators (`CCParse') • a whole bucket of bugfixes [containers 3.12] <https://github.com/c-cube/ocaml-containers/releases/tag/v3.12> Recent tar releases (2.5.0, 2.4.0, …) ═════════════════════════════════════ Archive: <https://discuss.ocaml.org/t/recent-tar-releases-2-5-0-2-4-0/12362/1> Reynir Björnsson announced ────────────────────────── I’m pleased to announce the release of tar.2.5.0 earlier this week. This release and the previous release improves PAX support, mirage key-value write support and bug fixes: • in 2.4.0 the pax global header is properly skipped when reading - previous releases did not skip the header properly which would result in a corrupt read. In a future release the global header will be read and used. More on that later. • in 2.5.0 the file name and link name are used from per-file pax headers, if present. • in 2.4.0 the ustar version is correctly encoded while writing. This did not seem to cause any issues with other implementations. Unfortunately, this is a breaking change, and may break reproducibility of archives written with prior versions of ocaml-tar. • earlier releases the past year have been focused on adding write support to the tar-backed mirage key-value store `tar-mirage'. Future release ╌╌╌╌╌╌╌╌╌╌╌╌╌╌ I am working on the next release which will support the global PAX header. This introduces additional global state in the reader, and will be a breaking change. Additionally, old and (mostly) unused modules and functions will be removed. If you use any of the bits being removed please feel free to chime in and comment on what you’d like to see kept. The work in progress can be viewed at: <https://github.com/mirage/ocaml-tar/pull/127> mpp.0.3.6, which adds compatibility with OCaml 5, is now in opam ════════════════════════════════════════════════════════════════ Archive: <https://discuss.ocaml.org/t/ann-mpp-0-3-6-which-adds-compatibility-with-ocaml-5-is-now-in-opam/12376/1> Philippe Wang announced ─────────────────────── mpp.0.3.6, which adds compatibility with OCaml 5, is now in opam! *MPP is a preprocessor, and also a metapreprocessor.* As a preprocessor, it’s quite simple and maybe even minimalistic. As a meta preprocessor, it’s very powerful, since it allows you to simply use OCaml (and almost any programming language) as your preprocessing language. Have fun! trace 0.1, tracy-client 0.1 ═══════════════════════════ Archive: <https://discuss.ocaml.org/t/ann-trace-0-1-tracy-client-0-1/12383/1> Simon Cruanes announced ─────────────────────── I’m quite giddy to announce the initial release of my library [trace], and of [tracy-client] (sponsored by my employer, Imandra). Trace is a lightweight library designed for instrumenting library and executable code with a low dependency cost. It provides abstractions for basic logging, traces (spans), and metrics, with a low footprint. The goal is that it’s ok to depend on it in libraries, and it costs almost nothing at runtime in the absence of a collector. The cost of a call in the absence of a collector is basically an atomic load and a comparison to `None'. A collector is a backend that is typically registered at program startup. Only applications should ever specify a backend. There is a simple `trace-tef' library that provides a backend that writes into a .json file in the Catapult/TEF format (compatible with `chrome://tracing' in chrome, and with [perfetto]). Which brings me to [tracy-client]. It is a library that provides direct bindings to the excellent [Tracy] project. It also comes with [tracy-client.trace], which provides a Trace backend that forwards events to Tracy over the network (while the program is running). It can be quite useful for interactive programs such as games, but also for CPU-oriented programs in general. The bindings work, but they don’t cover the full extent of Tracy yet (which notably include frames for graphic programs). So far these are the two released backends for Trace, but I have a Opentelemetry backend in the works; it won’t cover the depth of options of OTEL but it will make it possible to reuse trace-based instrumentation with any OTEL collector. Another exciting possibility with OCaml 5.1 is to use the upcoming `Runtime_events' (and custom user events) to forward trace events to an external logger with low overhead. Docs for Trace can be found [here]. Trace is licensed under the MIT license, and tracy-client under BSD-3. [trace] <https://github.com/c-cube/trace> [tracy-client] <https://github.com/imandra-ai/ocaml-tracy> [perfetto] <https://ui.perfetto.dev/> [Tracy] <https://github.com/wolfpld/tracy> [here] <https://c-cube.github.io/trace/> A short review of fmlib_browser (web frontend library) ══════════════════════════════════════════════════════ Archive: <https://discuss.ocaml.org/t/a-short-review-of-fmlib-browser-web-frontend-library/12384/1> Richard Huxton announced ──────────────────────── This is probably better as a blog article, but I’m guessing anyone who is interested is quite likely to find it here. It’s just some short notes on my first impressions (as an ocaml beginner) of the [fmlib_browser] web-app library. [fmlib_browser] <https://hbr.github.io/fmlib/odoc/fmlib_browser/> Summary ╌╌╌╌╌╌╌ • Port of [Elm] to ocaml + js_of_ocaml • Available on opam with source on <https://github.com/hbr/fmlib> • Seems like an accurate port - covers all the basics • Good documentation • Easy to start using • Don’t forget to build with `--profile=release' [Elm] <https://elm-lang.org/> Elm and the basics of the port ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ [Elm] is perhaps the best known of the functional compile-to-javascript languages and is particularly attractive to functional beginners. It has a focus on good error messages and simplicity. It’s overall architecture (global model, no side effects, update messages) has been copied many times. The fmlib_browser package is part of a family of functional/managed-effect libraries from the same author. It has basically the same structure as Elm, just translated into ocaml which is then compiled to javascript with js_of_ocaml. I’ll not repeat the [excellent documentation] and in any case for a general overview you can probably rely on the Elm introductory material too. [Elm] <https://elm-lang.org/> [excellent documentation] <https://hbr.github.io/fmlib/odoc/fmlib_browser/doc.html> In use ╌╌╌╌╌╌ Boring in the best way. Does what it says on the tin. There are some docs on hooking it up to dune and it works with ocaml 5.0. Compilation seems pretty fast, but be aware that by default you will get a javascript file that starts at about 5MB. If you run `dune build --profile=release' then the output will be stripped and minimised and you will be closer to 100KB. When gzipped for transfer this will come down to about 33KB as a starting point. That sounds large, but it increases fairly slowly from that point as you add actual code. Who is this for? ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ If you like the idea of Elm, are already working in OCaml and don’t need a large ecosystem this might do what you want. It’s not suited to small plugins but for a dashboard or other application you would leave open for a long time should work fine. moonpool 0.1 ════════════ Archive: <https://discuss.ocaml.org/t/ann-moonpool-0-1/12387/1> Simon Cruanes announced ─────────────────────── I’m happy to announce the release of [moonpool] 0.1. Moonpool, so far, is mostly an experiment, but is in a usable state already. So what is moonpool? It’s my go at starting to leverage OCaml 5 for multicore computations. Unlike other approaches, it relies _heavily_ on classic `Thread.t', because unlike domains it’s ok to create many of them and have some block on IO or long running C calls. A pool provides a `run: (unit -> unit) -> unit' function that runs the task (its argument) onto one of the pool’s workers at a later date. Moonpool works by allocating, at startup, a fixed pool of domains, of the recommended size.[^1] From there, the user can create a number of regular [thread pools], each of which will be distributed over the pool of domains so that the threads can run in parallel. It’s perfectly possible to have, on a 16 core machine, a pool of 50 IO threads for some server, along with a pool of 16 compute threads. Moonpool also provides a [Fut]ure abstraction. These futures are thread safe; the combinators such as `map', `bind', etc. can themselves run on pools. Futures are quite lightweight and use an `Atomic.t' variable for storage, no lock needed.[^2] Lastly: moonpool _also_ works on OCaml >= 4.08, by simply reducing to regular thread pools running on a single domain. This should allow users to use moonpool on 4.xx, before migrating to 5.xx on their own time. Documentation is [here]. It’s released under the MIT license. Contributions or discussions are very welcome. This is very early days for this project, and I have lots to learn. The task scheduler is quite simple and will probably not compete with domainslib on super-fine grained tasks; but for use cases where tasks are not that tiny I think it works perfectly fine already. [^1]: basically `Domain.recommended_domain_count()-1' on OCaml 5. [^2]: except for `Fut.wait_block', which is like an entrypoint and should be called “from the outside”. More in the documentation. [moonpool] <https://github.com/c-cube/moonpool/> [thread pools] <https://c-cube.github.io/moonpool/moonpool/Moonpool/Pool/index.html> [Fut] <https://c-cube.github.io/moonpool/moonpool/Moonpool/Fut/index.html> [here] <https://c-cube.github.io/moonpool/> Other OCaml News ════════════════ >From the ocaml.org blog ─────────────────────── Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. • [Florian’s OCaml compiler weekly, 5 June 2023] [the ocaml.org blog] <https://ocaml.org/blog/> [Florian’s OCaml compiler weekly, 5 June 2023] <http://cambium.inria.fr/blog/florian-compiler-weekly-2023-05-06> 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.schm...@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/>
_______________________________________________ caml-news-weekly mailing list caml-news-weekly@lists.idyll.org http://lists.idyll.org/listinfo/caml-news-weekly