[Haskell-cafe] [ANNOUNCE] Ajla: a new purely functional programming language

Mikulas Patocka mikulas at twibright.com
Mon May 27 16:21:32 UTC 2024



On Mon, 27 May 2024, jo at durchholz.org wrote:

> On 26.05.24 23:57, Mikulas Patocka wrote:
> > Hi
> > 
> > I'd like to announce the release of Ajla - a new purely functional
> > programming language that looks like traditional procedural languages.
> > 
> > If you are interested, see https://www.ajla-lang.cz/
> 
> Just one thing that caught my eye:
> 
> > Ajla has efficient mutable arrays - if an array's reference count is one,
> the array is modified in place. If not, a copy of the array is created and
> modified.
> 
> That design decision restricts you to reference-counting garbage 
> collectors. These have multiple problems and restrictions, such as:
> - Inability to deal with reference cycles.

You can create circular lists in Haskell, but not in Ajla. I.e. the 
statement "var cycle := [ 1, 2, 3 ] + cycle;" won't compile, because the 
variable cycle is not known.

> - Assigning to a reference means TWO additional write operations to keep 
> the reference counts up-to-date; this means your programmers will try to 
> minimize allocation, which tends to restrict the design space so the 
> code gets worse.
> - Reference counting is less efficient than copying collectors for most 
> cases.
> - Being restricted to one GC algorithm means the language cannot improve 
> on that front, the GC approach is baked into the language semantics and 
> cannot be changed if it turns out it was an unlucky choice.

Ajla has possibility to bypass the reference counting - if the refcount is 
-1, it means that the object is stored in a read-only memory-mapped file 
and the refcount won't be updated at all.

So, if I find some workload where there would be many threads massively 
thrashing on the same reference count, I could set it to -1 and let some 
primitive GC free it. So far, I haven't found such a workload, so I 
haven't implemented it.

> I'd recommend doing something like the borrowing semantics in Rust, or 
> uniqueness typing of Clean: Some language mechanism that makes sure that 
> all mutable data is only accessible through a single reference at any 
> one time.

If you use arrays in the same way as unique types, there would be no 
refcount modification. I.e. if you pass an array to a function and stop 
using it in the parent function, there is refcount increment followed by 
refcount decrement - and the optimizer will fuse these two refcount 
operations into nothing.

> This will also allow compilers to aggressively optimize, since if a 
> language enforces a one-reference-to-mutables-only, there can be no 
> aliasing, and that's a huge win as any even merely potential aliasing 
> prevents a whole host of important optimizations.

I've written SSA-based optimizer for Ajla (see the file 
newlib/compiler/optimize/ssa.ajla) and it was surprisingly easy because 
there is no aliasing. From the user's point of view, every variable can be 
modified independently. Modifying a single variable doesn't modify any 
other.

Mikulas

> Just my 2c :-)
> 
> Regards,
> Jo
> _______________________________________________
> Haskell-Cafe mailing list
> To (un)subscribe, modify options or view archives go to:
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> Only members subscribed via the mailman list are allowed to post.


More information about the Haskell-Cafe mailing list