Why not do this for Python/R/Julia? Fine-grained dependency
tracking for Python or R would be difficult: both languages have significant libraries, such as
numpy
in Python, that depend heavily on C. Even if we could add dependency-tracking to
Python, these libraries would remain opaque. Julia has less of a C dependency and could be a feasible
target, although it would still probably require modifying the interpreter. Source-to-source
transformations avoid some of these issues, but introduce other complications. An alternative direction
we are exploring is the idea of evolving Fluid into a purely functional dialect of Python and
then provide our own version of libraries like
numpy
.
How mature is the language? The language has a reasonable range of data types (integers, strings, floats, lists, tuples, matrices and dictionaries), as well as some convenient features like piecewise function definitions and list comprehensions. However, it lacks a module system and support for basic IO, like loading CSV files. Either of these would make a good student project!
How do I create a webpage containing a Fluid visualisation?
Unfortunately the authoring workflow is poor at the moment. Fluid is implemented in PureScript, and
implementing a web page using Fluid currently requires a top-level PureScript main
to
specify additional program context, such as data sets and modules which need to be loaded along with the
Fluid code. We plan to break this dependency on PureScript soon by providing a command-line authoring tool, which should
streamline the authoring process considerably.
How does it work? When you load a Fluid visualisation, the interpreter builds a dependence graph capturing the dynamic IO dependencies of the program as it generates the visualisation. This graph is then used to add various affordances to the chart, so that selecting an element in the output can highlight the corresponding parts of the input, and vice versa. The relationship between the forward and backwards analyses over the graph is captured by the notion of a conjugate pair, a pair of functions between Boolean algebras (sets of data elements) that are “near inverses” of each other in a particular way. (A conjugate pair is essentially another presentation of a Galois connection; see our ESOP 2025 preprint for more details.)
Why do images take a while to load? Evaluating the program to a dependence graph can take a long time. We hope to be able to make some improvements to the performance of the interpreter soon, potentially by building the graph imperatively, and are also considering ways to precalculate the dependence graph and bundle it with the visualisation. Finally, moving to a Single-Page Application model for websites built using Fluid will mean the figure won't be reloaded if you navigate back to the page.
Can I get involved as a student or intern? If you are a student at University of Bristol, Charles University (Prague) or University of Cambridge you may be able to do a final-year or masters project on Fluid (see 2024 projects for details). In 2025 we will also have various summer internship schemes at the Institute of Computing for Climate Science and Department of Computer Science and Technology, University of Cambridge. However these schemes tend to be in high demand and also have strict eligibility criteria.
How can I contribute as an open source developer? We would especially welcome any contributions to the authoring framework, language features, or web publishing infrastructure. Please email Roly Perera if there is anything you think you could help with, and we will add to you our Slack workspace and GitHub organisation.