Hacker News new | ask | show | jobs
by flafla2 800 days ago
Superficially this language appears to be very similar to Swift. Beyond the syntax, it also has first class refcounting, C language binding, and no external runtime (compiles straight to binary).

I wonder, does Vala have a stable ABI, or native compatibility with other higher-level languages like C++ or ObjC? These are other difficult challenges which Swift attempts to tackle (and depending on who you ask, with varying levels of success).

In any case this is an interesting language. Thanks for sharing

4 comments

Vala predates swift by many years. It's meant as a high level implementation of the C GObject system, to which it compiles.
> Superficially this language appears to be very similar to Swift

It's almost a clone of C#; it's tightly coupled with the GObject system instead of .Net.

Oh got it. So like c# but compiles to native a la Swift?
There's more languages than Swift...
Didn't you watch the latest WWDC? Apple invented programming languages.
What does .NET JIT emit? What does NativeAOT compile .NET applications to? :)
(I’ve worked in an AOT for .NET and I’m a JIT expert.)

Even if you compile MSIL to native, you’re compiling to the GC’s ABI, which is definitely very different from what Vala and Swift do.

.NET follows platform calling convention. GC reference assignment to a memory location does involve going through a write barrier (main user of which is concurrent mark phase of GC) but otherwise it's just plain Windows or System V ABI for the respective ISA.

Practically speaking, you cannot call .NET methods directly unless they are annotated with [UnmanagedCallersOnly] which is necessary to ensure GC is in consistent state, module initializers have ran, etc. This is a concern for NativeAOT libraries as you don't have to explicitly call their entrypoint before calling them AFAIK.

This, however, is true for most languages that are not C. This is also a constraint for both Swift, which has its own reference counting and ABI (Library Evolution ABI) and likely Vala assuming it is reference counted.

The runtime vs runtime-less arguments are not exactly helpful given the context - there are """runtime"""-heavy interpreted languages like Python, Elixir or JS, there is Java which assumes JVM, but is already lower level, and then there's .NET, which under the hood looks a lot like a strange flavour of C++ when you e.g. inspect the AOT binaries with Ghidra.

Fun fact, native profilers work with NAOT applications transparently on all platforms. You can hit "sample" in activity monitor on macOS and it will show you fully symbolicated trace if symbols are available. Just recently, I used Samply to perform multi-threaded profiling and it worked just as well as it would for something written in Rust, if not better.

Swift and Vala and any other eagerly reference counted language don’t have to worry about native C code squirreling away a reference to a GC’s object and not responding to a GC marking callback (either because the mechanism doesn’t exist or because it isn’t used correctly).

That’s an enormous difference in ABI.

Oh neat I’ve never heard of NativeAOT. I’ve only used Unity’s AOT compiler “Burst” for C# (I assume that is something different?).

Cool stuff.

edit: Actually I meant to say Unity’s IL2CPP, which transpiles IR to C++. Burst is a different tool with similar goals—it compiles IR straight down to native via LLVM.

To be precise, runtime is an umbrella term. Swift, C++ and Rust usually have """runtime""" just as much. Which includes but not limited to:

- Automatic or semi-automatic memory management

- Threadpool and, optionally, async abstraction implementation

- APIs to introspect type system properties / reflection

Swift very much has all these. And so does .NET.

As for Unity, it has diverged and lags behind "vanilla" .NET in features, language versions and performance significantly, so the experience of using it won't translate to what is expected to be "normal" C#/.NET of today.

Vala is pretty old these days. My understanding is that they built it because Mono became popular but there were patent and licensing concerns with it.
That's how I remember it, too. I still miss F-Spot.
> compiles straight to binary

I checked it ten years ago-ish, I think it transpiles into C (with GObject). Still no runtime though.