SOUL/HEART design specifications

Hi guys, I’ve been following the SOUL development for a while, and first off just want to say thanks for providing this project!

P.S. This is basically a verbatim copy of my question on Github at as to open up a discussion here, as this seems to be a better place.

I’ve been reading the SOUL Project Overview, and this pretty much outlines a couple of strong points for SOUL that rely on SOUL at some point being able to run on bare-metal or a “SOUL-processor”. What I grasp from this is the idea that SOUL could eventually run on hardware platforms through a software VM/JIT, or who knows at some point, a hardware VM or “SOUL-chip”.

From what I can gather, SOUL code gets compiled into an intermediate language called HEART, which I assume is similar to other intermediate representations such as JVM bytecode, LLVM IR, or NVIDIA PTX. I’m assuming this IR currently gets translated into whatever supported target platform, e.g. C/C++ or WebAssembly.

Now, I’m pretty interested in trying to find out how one would go from SOUL to actual (embedded) bare-metal, and which routes would be feasible. I am therefore trying to find out more about the design and structure of the HEART intermediate format, so am looking for a specification or design document of some kind.

However, I cannot seem to find any documentation on HEART.

Going by Jules’ answer, I know now that you are being conservative in declaring it final. The language still seems “fluid” and in an unstable phase at this stage, so that makes sense actually.

Jules also mentioned that the docs are still being written at this point. This leads me to think that the language was designed-whilst-being-implemented, instead of having been spec’ed out first before any sort of implementation; kind of a hands-on approach. That’s just an assumption, as I have no idea what’s been going on internally at ROLI.

It however makes me curious how you guys see the future development of both SOUL and HEART, as in will things will be spec’ed out (and reviewed) where the specification will define the implementation, or will the language be defined by ROLI’s implementation (which seems to be the case currently)?

I’m curious because I’m guessing this could have an effect for those e.g. looking to develop non-updateable hardware (or silicon) solutions that would support SOUL (and HEART). Again, I’m just going by what I can find on the net, and trying to extrapolate :slight_smile:

We certainly have done a lot of exploration and experimentation with the language as we evolved it, especially before we released anything publicly. Designing a language is more of an art rather than a science, as it’s often not at all obvious how a particular bit of syntax will “feel” in practice until you can write some real code and play with it.

However, it has pretty much congealed now, and although we might make a few tweaks in the coming months, I expect we’ll freeze the spec at some point within the next year, at which point we’ll be able to produce more details docs about it. Building any kind of bare-metal device, even using generic processors like ARMs isn’t going to happen overnight, so I think those time-scales are fine. Of course if you dive into an amazing project for a hardware device and end up waiting for us, then let us know and we’ll hurry it up!