Concurrency is a big topic. In the most zoomed-out view, concurrent software has multiple "active" components — sometimes called processes or tasks — that can be in-progress simultaneously. The simultaneity can be physical (different tasks executing on different processors) or simulated by interleaving the execution of multiple tasks on a single processor. This page is my take on some of the most important concepts that fit under the concurrency umbrella.

The reasons for making concurrent software can be lumped into two main categories: performance and expressiveness.

Of course a single application might use concurrency in multiple ways for different reasons, but I think it's important to keep in mind that these are two categories are quite distinct. The Charcoal project is principally focused on the expressiveness part of the picture.

Figure 1: A map of the primary reasons for using concurrency in software. The check marks indicate the concepts that the Charcoal project most directly addresses.


Expressiveness is something of a catch-all in the sense that we mean "all the reasons for using concurrency that aren't directly related to performance". We put three primary concepts within the scope of expressiveness:

  • Reactive/interactive
  • Algorithmic
  • Isolation/independence


Some applications


Here we have a grab-bag of concepts that are either combinations of the ideas discussed above or more specitic instances of them. They are kinda sorta in order starting with the most relevant to Charcoal.

Creative Commons License
Charcoal Programming Language by Benjamin Ylvisaker is licensed under a Creative Commons Attribution 4.0 International License