Like most of SerenityOS you can follow much of its development is on YouTube [2]. A good video series that captures the language ergonomics is in the "Jaktness Monster" series which goes through creating a NES Emulator from scratch [3].
[1] https://github.com/SerenityOS/jakt
One of its Co Creators @jntrnr was on both the Rust core language and TypeScript language teams which was how they were able to build the first rust based compiler + VSCode static analysis so quickly. Once the language was capable enough they rewrote the compiler in Jakt where it's now self hosting.
Excited to track its trajectory given how fast they were able to develop it, which already has a nice development experience in VSCode.
I like the language! It is so much more readable than Rust. I might switch from Rust to Jakt once version 1.0 has been published.
Comptime would be nice to have, though!
The one difference is that jakt is transpiled to C++ (IMHO it's a disadvantage, but could be useful).
Having experienced compiler engineers from the start is important for how well designed the language is syntactically and how strong its foundation is which helps with correctness and development velocity. Swift is always going to be the primary choice for Mac/iOS Apps but it sees relatively little usage elsewhere, either way it's going to be interesting to track Jakt's progress given how well designed it is and how fast they've been able to develop it.
Checking through the repo and videos, I don't see how this is the case. It seems a pleasant language but there isn't something GUI specific. That said the last one seems to have an issue frequently attributed to Rust, specifically requiring much effort to wrap an "unsafe" library for usage on "safe" language.
They're still actively developing inheritance support which I believe is the last remaining feature before they can start creating SerenityOS's (OOP) GUI Apps with it [1].
Even though it doesn't require SerenityOS, even SerenityOS GUI apps can be ported to run on Linux, Andreas already has ported its Ladybird Browser that wraps SerenityOS LibWeb engine in a QT App [2] to Linux, his last video shows "Abstracting the event loop so Ladybird can be fast & responsive on Linux" [3]
[1] https://github.com/SerenityOS/jakt#usage
Naturally, it's very annoying to use this C-based OOP API in any other language, especially languages that have their own incompatible OOP type system like Java or C++.
One of the biggest reasons to use Vala is that it's OO system is GObject, making interacting with GTK and GLib code significantly more painless.
In the late 1990s there already was Objective-C. It already had open source compiler support, a battle-tested runtime, a free software desktop environment, and a corporate sponsor that became the world’s most valuable corporation.
Instead of using what was already there, the Linux GUI community extracted a poor shadow of Obj-C out of the GIMP image processing program (itself a poor shadow of a commercial market leader).
I would hardly consider the GIMP developers (who became the early developers of GTK) to be rash in their option not to adopt a language that had only been available for a couple of years in the open source world.
And all these years later, at a time when Apple has essentially abandoned Objective C, GTK and Glib continue to provide bindings for dozens of languages to create cross-platform GUI applications, and even if many of us don't agree with the direction(s) it has taken, GTK itself has continued to evolve, whereas UI libraries that came with Objective C have become frozen in time.
So in short, not really a tragedy at all.
Improvements have slowed on ObjC, as Apple’s focus switched to swift - ObjC 2.0 in 2014 was the last major change.
I think you misunderstood the criticism. They didn't say GIMP used the wrong model when it started, they said the greater community was wrong for copying GIMP later on.
> And all these years later, at a time when Apple has essentially abandoned Objective C, GTK and Glib continue to provide bindings for dozens of languages to create cross-platform GUI applications, and even if many of us don't agree with the direction(s) it has taken, GTK itself has continued to evolve, whereas UI libraries that came with Objective C have become frozen in time.
The suggestion is that Objective C should have been used instead of GObject. That doesn't mean having to use any particular libraries. And the same work to bind and evolve could have been poured into any reasonably solid library.
Early in 1997, Guillaume Laurent and I spent some time looking into Objective C as a possible language for the "next version" of the Rosegarden sequencer on Unix/X11. At the time Rosegarden was a C application[1] using Athena widgets with my own little styling library, and we were sure there must be better options and were prepared to rewrite the UI entirely if we had to.
We ended up ruling it out for a few reasons, which I've just looked up in old email archives. I had some trouble getting the then-new gcc Objective C runtime working across Unix systems (we didn't only target Linux) and feared that we wouldn't be able to give our code to someone else and have them compile it easily. We couldn't find a working graphical toolkit: we thought GNUstep wasn't ready and also that it was probably going to be overkill. Other possibilities like NSXKit[2] weren't there either. Guillaume experimented with writing a toolkit himself but quickly ran into various obstacles that I don't have a record of.
(What is striking in hindsight is how hard it was to find reliable information to help us make a decision like this. There was documentation, and there were opinions, but there was very little of the form "we used this for our project and here's how it worked" that you would begin to see after blogging had become commonplace. We worked mostly on supposition and projection - install something, see if we could get it to build at all, spend a couple of hours with it and make guesses based on that, as well as on external info such as how much we knew about the developers that worked on it.)
So we switched to C++ instead. Considered Qt, argued about it, looked at LessTif, then GTK, then contributed a bit to gtkmm, then after a couple of years of nominally using gtkmm and getting nothing done, we switched to Qt after all and were happy. Happy-ish.
Even for people who really liked Objective C in 1997, it was pretty hard to make a case for. Maybe an open source company with staff and capital could have, but they barely existed.
[1] https://all-day-breakfast.com/cannam/x11-rosegarden/rosegard...
[2] http://www.hardcoreprocessing.com/home/anoq/Programming/GNUS...
You probably don't understand the context of mid-90s free and open software. Nothing is free, nothing open, relevant business models do not yet exist. Few things that are open barely work: linux takes hours to compile-tweak-recompile, all the tools are half-baked and semi-broken. You had to fix most things yourself.
Anyways, the only tools that do work reliably and have no license issues are coming from FSF: Emacs, gcc, unix utils, etc. Note that objC was not free, and the free version sucked most of the time. GCC did have world-class support for C though.
C was and still is a good choice for a core portable cross-language library. But UIs are probably the only programming context where OOP fits well. So people came with Gobject.
It all makes total sense, and that's why the whole thing survives to this very day.
That’s my exact criticism: they came up with GObject instead of using the C-based solution that already existed, had open source compiler support, and was actively developed by Apple.
The GTK community made a huge mistake in trying to turn GIMP’s poor design into a generic GUI framework rather than collaborating with GNUstep on creating a next-generation framework.
Objective-C is closer to the original, or at least early, Alan Kay and Smalltalk flavor of object oriented languages. In the late 1990s, we had already had 10 years of C++, so the C++ flavor "C with classes" type of object oriented programming was more familiar to most people.
I'd guess already then, the Smalltalk flavor of Objective-C felt a bit alien to many, who had grown familiar with the C++ flavor.
It is, but I wouldn't look at Objective-C as the previous invention. X11 already hat the Toolkit Intrinsics (Xt), and it's not like they were unknown to the developers, the first version of Gimp having been written in Motif.
A new toolkit in the vein of Xaw/Motif/OLIT would've been a more immediate choice, but then again, no two persons seem to have the same preferences when it comes to object-orientation.
(I'm sitting in the proverbial glasshouse here, having switched my own "let's make some widgets for Qt 0.x" project to "let's reinvent X11 toolkits" in the mid to late 90s)
I would say that it is essentially completely painless to interact with GTK and Glib via gtkmm and glibmm.
How did you resist Qt?
22+ years later I would say that both Qt and Gtkmm have their own pros and cons. They have both run into pretty deep issues with integrating their own drawing model into the windows, macOS and X11 models. They both provide things that the other does not.
At this point, I don't see one as better than the other, and for a long established application like mine, the idea of switching is essentially unthinkable.
Of course things were different more than a decade ago: C++11 did not exist yet or compiler support was lacking, and Gtk and Qt couldn't wait for it to catch up.
The object model is very close to C++ and Java, and I wonder if they could have made the memory layouts slightly different so that they were compatibile with C++, like in COM. But anyway gtkmm for C++ seems to work well.
Did Elementary survive the fall out between its two cofounders? I haven't really followed.
Anyone know if they’ve noted it somewhere? Is it just the investment in Vala and their custom widget library that set the direction?
How do you make it so you can call "Widget" methods on a "Button"? Without proper subclassing, you have to either create a lot of duplicate functions, or the user has to explicitly cast up. Nim has implicit converters, so I tried defining conversions from all types to their base classes (Button -> Widget). But this made compilation time insanely slow.
Modern languages make this about "favor composition over inheritance" and say it helps you avoid monstrous Java-esqe class hierarchies. But it is really about subtyping and the Liskov substitution principle. You have a heterogeneous list of different "Widgets", how easily can you treat them as one kind, even if they need different behavior in detail?
Nim had experimental support for generics co-/contravariance. So you could say a "IF Button struct is a subclass of Widget struct THEN a GObjectPointer[Button] can be used in all cases where a GObjectPointer[Widget] can be used" (covariance). This was a unique feature and would solve the problem without implementation inheritance, but unfortunately it didn't work properly and I think it has been removed.
GTK's OOP semantics have been mapped very successfully to, among other languages, C++, Python, Perl and Go. It's unfortunate perhaps that the Rust bindings do not feel idiomatic for Rust programmers, but that's hardly fatal or unexpected.
I also think this is why Rust has lagged heavily on the GUI development front. No matter how you claim component or ECS-based architectures are better and faster, sometimes the only thing you really need might be a good ol' inheritance-based scenegraph... You can definitely do UI with a component-based object model (ex. Unity game engine), but the whole process seems a bit more... convoluted.
But still, back at that time (2014) there was far less research done on how Rust library authors can ergonomic bind to C/C++ libraries that have their own object system. Nowadays people have figured out some techniques and we can actually use GTK and Qt from Rust, albeit in an awkward manner (lots and lots of macros).
>Elementary OS – Why we write elementary apps in Vala (2014)
Fixed the title for you.