[cwn] Attn: Development Editor, Latest OCaml Weekly News

Alan Schmitt alan.schmitt at polytechnique.org
Tue Jun 13 00:09:38 PDT 2023


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.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/20230613/87daf809/attachment-0001.html>


More information about the caml-news-weekly mailing list