ocaml VS tokio

Compare ocaml vs tokio and see what are their differences.

ocaml

The core OCaml system: compilers, runtime system, base libraries (by ocaml)

tokio

A runtime for writing reliable asynchronous applications with Rust. Provides I/O, networking, scheduling, timers, ... (by tokio-rs)
Our great sponsors
  • InfluxDB - Power Real-Time Data Analytics at Scale
  • WorkOS - The modern identity platform for B2B SaaS
  • SaaSHub - Software Alternatives and Reviews
ocaml tokio
119 196
5,150 24,515
1.4% 2.1%
9.9 9.5
1 day ago 5 days ago
OCaml Rust
GNU General Public License v3.0 or later MIT License
The number of mentions indicates the total number of mentions that we've tracked plus the number of user suggested alternatives.
Stars - the number of stars that a project has on GitHub. Growth - month over month growth in stars.
Activity is a relative number indicating how actively a project is being developed. Recent commits have higher weight than older ones.
For example, an activity of 9.0 indicates that a project is amongst the top 10% of the most actively developed projects that we are tracking.

ocaml

Posts with mentions or reviews of ocaml. We have used some of these posts to build our list of alternatives and similar projects. The last one was on 2024-04-03.
  • Autoconf makes me think we stopped evolving too soon
    8 projects | news.ycombinator.com | 3 Apr 2024
    > OCaml’s configure script is also “normal”

    If that’s this OCaml, it has a configure.ac file in the root directory, which looks suspicious for an Autotools-free package: https://github.com/ocaml/ocaml

  • The Return of the Frame Pointers
    6 projects | news.ycombinator.com | 17 Mar 2024
    You probably already know, but with OCaml 5 the only way to get flamegraphs working is to either:

    * use framepointers [1]

    * use LBR (but LBR has a limited depth, and may not work on on all CPUs, I'm assuming due to bugs in perf)

    * implement some deep changes in how perf works to handle the 2 stacks in OCaml (I don't even know if this would be possible), or write/adapt some eBPF code to do it

    OCaml 5 has a separate stack for OCaml code and C code, and although GDB can link them based on DWARF info, perf DWARF call-graphs cannot (https://github.com/ocaml/ocaml/issues/12563#issuecomment-193...)

    If you need more evidence to keep it enabled in future releases, you can use OCaml 5 as an example (unfortunately there aren't many OCaml applications, so that may not carry too much weight on its own).

    [1]: I haven't actually realised that Fedora39 has already enabled FP by default, nice! (I still do most of my day-to-day profiling on an ~CentOS 7 system with 'perf --call-graph dwarf', I was aware that there was a discussion to enable FP by default, but haven't noticed it has actually been done already)

  • Top Paying Programming Technologies 2024
    19 projects | dev.to | 6 Mar 2024
    11. OCaml - $91,026
  • OCaml: a Rust developer's first impressions
    4 projects | news.ycombinator.com | 12 Nov 2023
    > But .mli files do not help with the "no types in the source code" problém

    It partially helps since it forces you to have types where they matters most: interfaces.

    > And I did not experience any advantage of separate signature files so far,

    100kLoc is already quite big! I'm starting to think I'm an outlier since a lot of people don't see the benefits :)

    For me, it helps because I really don't want to see the implementation when I use an API. If I need to look at the implementation, it means the interface isn't well specified. All I need should be in the interface: types, docs, (abstract) types. And no more.

    Typically, an .ml file will have more than what is exported, types won't be abstract but will have a concrete implementation, and type signatures may be missing. How would it feels like to use list if only https://github.com/ocaml/ocaml/blob/trunk/stdlib/list.ml was available, instead of https://github.com/ocaml/ocaml/blob/trunk/stdlib/list.mli?

    Haskell tells you what is exported from a module, but it only shows you the names. To see the signatures, you need to rely on generated doc.

    Arguably, since OCaml has includes, it suffers from the same problem, your ".mli" may have tons of include and it becomes harder to see what's exported without an external tool

    4 projects | news.ycombinator.com | 12 Nov 2023
    > It partially helps since it forces you to have types where they matters most: exported functions

    But the problém the OP has is not knowing the types when reading the source (in the .ml file).

    > How would it feels like to use list if only https://github.com/ocaml/ocaml/blob/trunk/stdlib/list.ml was available,

    If the signature where in the source file (which you can do in OCaml too), there would be no problem - which is what all the other (for some definition of "other") languages except C and C++ (even Fortran) do.

    No, really, I can't see a single advantage of separate .mli files at all. The real problém is that the documentation is often worse too, as the .mli is autogenerated and documented afterwards - and now changes made later in the sources need to be documented in the mli too, so anything that doesn't change the type often gets lost. The same happens in C and C++ with header files.

  • Bringing more sweetness to ruby with sorbet types 🍦
    5 projects | dev.to | 18 Sep 2023
    If you have been in the Ruby community for the past couple of years, it's possible that you're not a super fan of types or that this concept never passed through your mind, and that's totally cool. I myself love the dynamic and meta-programming nature of Ruby, and honestly, by the time of this article's writing, we aren't on the level of OCaml for type checking and inference, but still, there are a couple of nice things that types with sorbet bring to the table:
  • What is gained and lost with 63-bit integers? (2014)
    2 projects | news.ycombinator.com | 12 Aug 2023
    Looks like there have been proposals to eliminate use of 3 operand lea in OCaml code (not accepted sadly):

    https://github.com/ocaml/ocaml/pull/8531

  • What can Category Theory do?
    2 projects | /r/askmath | 22 Jun 2023
    Haskell and Agda are probably the most obvious examples. Ocaml too, but it is much older, so its type system is not as categorical. There is also Idris, which is not as well-known but is very cool.
  • Playing Atari Games in OCaml
    2 projects | news.ycombinator.com | 15 Jun 2023
  • Bloat
    4 projects | /r/ProgrammingLanguages | 22 May 2023
    That does sound problematic, but without the code it is hard to tell what is the issue. Typically, compiling a 6kLoc file like https://github.com/ocaml/ocaml/blob/trunk/typing/typecore.ml takes 0.8 s on my machine.

tokio

Posts with mentions or reviews of tokio. We have used some of these posts to build our list of alternatives and similar projects. The last one was on 2024-04-05.
  • On Implementation of Distributed Protocols
    23 projects | dev.to | 5 Apr 2024
    Being able to control nondeterminism is particularly useful for testing and debugging. This allows creating reproducible test environments, as well as discrete-event simulation for faster-than-real-time simulation of time delays. For example, Cardano uses a simulation environment for the IO monad that closely follows core Haskell packages; Sui has a simulator based on madsim that provides an API-compatible replacement for the Tokio runtime and intercepts various POSIX API calls in order to enforce determinism. Both allow running the same code in production as in the simulator for testing.
  • I pre-released my project "json-responder" written in Rust
    11 projects | dev.to | 21 Jan 2024
    tokio / hyper / toml / serde / serde_json / json5 / console
  • Cryptoflow: Building a secure and scalable system with Axum and SvelteKit - Part 0
    12 projects | dev.to | 4 Jan 2024
    tokio - An asynchronous runtime for Rust
  • Top 10 Rusty Repositories for you to start your Open Source Journey
    11 projects | dev.to | 19 Dec 2023
    3. Tokio
  • API Gateway, Lambda, DynamoDB and Rust
    5 projects | dev.to | 5 Dec 2023
    The AWS SDK makes use of the async capabilities in the Tokio library. So when you see async in front of a fn that function is capable of executing asynchronously.
  • The More You Gno: Gno.land Monthly Updates - 6
    8 projects | /r/Gnoland | 30 Nov 2023
    Petar is also looking at implementing concurrency the way it is in Go to have a fully functional virtual machine as it is in the spec. This would likely attract more external contributors to developing the VM. One advantage of Rust is that, with the concurrency model, there is already an extensive library called Tokio which he can use. Petar stresses that this isn’t easy, but he believes it’s achievable, at least as a research topic around determinism and concurrency.
  • Consuming an SQS Event with Lambda and Rust
    7 projects | dev.to | 3 Nov 2023
    Another thing to point out is that async is a thing in Rust. I'm not going to begin to dive into this paradigm in this article, but know it's handled by the awesome Tokio framework.
  • netcrab: a networking tool
    4 projects | dev.to | 14 Oct 2023
    So I started by using Tokio, a popular async runtime. The docs and samples helped me get a simple outbound TCP connection working. The Rust async book also had a lot of good explanations, both practical and digging into the details of what a runtime does.
  • Thread-per-Core
    3 projects | news.ycombinator.com | 6 Oct 2023
    Regarding the quote:

    > The Original Sin of Rust async programming is making it multi-threaded by default. If premature optimization is the root of all evil, this is the mother of all premature optimizations, and it curses all your code with the unholy Send + 'static, or worse yet Send + Sync + 'static, which just kills all the joy of actually writing Rust.

    Agree about the melodramatic tone. I also don't think removing the Send + Sync really makes that big a difference. It's the 'static that bothers me the most. I want scoped concurrency. Something like <https://github.com/tokio-rs/tokio/issues/2596>.

    Another thing I really hate about Rust async right now is the poor instrumentation. I'm having a production problem at work right now in which some tasks just get stuck. I wish I could do the equivalent of `gdb; thread apply all bt`. Looking forward to <https://github.com/tokio-rs/tokio/issues/5638> landing at least. It exists right now but is experimental and in my experience sometimes panics. I'm actually writing a PR today to at least use the experimental version on SIGTERM to see what's going on, on the theory that if it crashes oh well, we're shutting down anyway.

    Neither of these complaints would be addressed by taking away work stealing. In fact, I could keep doing down my list, and taking away work stealing wouldn't really help with much of anything.

  • PHP-Tokio – Use any async Rust library from PHP
    7 projects | news.ycombinator.com | 27 Aug 2023
    The PHP <-> Rust bindings are provided by https://github.com/Nicelocal/ext-php-rs/ (our fork of https://github.com/davidcole1340/ext-php-rs with a bunch of UX improvements :).

    php-tokio's integrates the https://revolt.run event loop with the https://tokio.rs event loop; async functionality is provided by the two event loops, in combination with PHP fibers through revolt's suspension API (I could've directly used the PHP Fiber API to provide coroutine suspension, but it was a tad easier with revolt's suspension API (https://revolt.run/fibers), since it also handles the base case of suspension in the main fiber).

What are some alternatives?

When comparing ocaml and tokio you can also consider the following projects:

async-std - Async version of the Rust standard library

Rocket - A web framework for Rust.

hyper - An HTTP library for Rust

futures-rs - Zero-cost asynchronous programming in Rust

smol - A small and fast async runtime for Rust

rayon - Rayon: A data parallelism library for Rust

actix-web - Actix Web is a powerful, pragmatic, and extremely fast web framework for Rust.

crossbeam - Tools for concurrent programming in Rust

glommio - Glommio is a thread-per-core crate that makes writing highly parallel asynchronous applications in a thread-per-core architecture easier for rustaceans.

sqlx - 🧰 The Rust SQL Toolkit. An async, pure Rust SQL crate featuring compile-time checked queries without a DSL. Supports PostgreSQL, MySQL, and SQLite.

MIO - Metal I/O library for Rust.

bevy - A refreshingly simple data-driven game engine built in Rust