Ring++ began as a contribution to Ring. It is now the runtime that carries Ring's programs off Ring. This
page says why: on the technical side, and on the side of how the language is governed. The issues that Ring++ solves are
on a page of their own, each shown by a program run on both runtimes.
What Ring gets right
Ring is Mahmoud Fayed's work, and a remarkable one. A syntax simple enough to read aloud. Real multiparadigm
expressiveness, including the declarative brace block that Softanza's whole style is built on. A small VM that can be
read in a sitting, and that runs on a stock Android phone. A GUI story, an Android story, a package manager and a decade
of continuity, from one person.
Narrow defects get fixed fast and with credit. Seven of my ten pull requests landed, in some form, and over the eight
years I took part in the project, hundreds of my questions and reports were fixed or taken into account.
Nobody writes a 300,000-line library on a language they do not love. What follows is the bill for learning, at
production scale and with paying customers, which parts of a beautiful language were load-bearing.
The technical case
Softanza grew past 300,000 lines and met Ring's limits one by one. Each one here was measured.
Speed is paid for by the design. A string is copied every time it is passed to a function: passing a
1 MB string 2,000 times takes Ring 1.27 1,348 ms, and Ring++ less than one. A list is linked, so reaching its
middle walks to it, and a binary search becomes linear: 188 seconds in Ring 1.27, against 93 milliseconds in Ring++. A
method is looked up by its name at every call. On identical programs, Ring measured 9 to 16 times behind Lua.
Safety cannot be switched on.TRUE can be reassigned. Reading a missing key of a hash list adds
it. A program can rename the language's keywords. A method silently writes the program's variables. An error is a
string in a global. And none of it can be fenced off: there is no strict mode.
Text is bytes, and letters need a GUI toolkit.
# An Arabic word of four letters: salaam
cWord = "سلام"? len(cWord)
#--> 8, the bytes, not the letters? cWord[1]
#--> a broken character: half of the first letter
To get four letters, and the first of them, a Ring program has to load the whole Qt toolkit and go through its
QString, whether or not it has a window to show. Regular expressions come from Qt too. Ring++ keeps Ring's
byte answers, so that existing programs keep their meaning, and Softanza's own engine gives the letters with no GUI
toolkit at all: StzStringQ(cWord).NumberOfChars() is 4.
Simple on paper, complex in production. Ring's data types and syntax are simple. A real application is not:
the build steps, the C and C++ extensions, the libraries each needs and the versions they must match are where the time
goes, and the questions asked in Ring's own group show it, week after week.
No one way to build an interface. About ten GUI and graphics libraries ship with Ring 1.27 — Qt, libui,
NAppGUI, RayLib, Allegro, SDL, FreeGLUT, OpenGL, Tilengine, the Windows API — each with its own mental model.
Three worlds, not one. Desktop, mobile and web are three different worlds in Ring, each with its own build and
its own way of writing the application. No single programming model spans them.
Mistakes are found late. A function that does not exist, or a variable read before it is set, is found when
its line runs, in production, never before.
The governance case
The technical limits alone would have been work. What made them a reason to leave is that there is no way to change
them.
One person decides. Ring is designed and developed by its author alone. That is a legitimate way to run a
language, and it served Ring for a decade. The customers Softanza serves — banks, governments, platforms —
raised it as a risk they could not carry: a dependency whose every decision sits with one person, through no process a
user can take part in, and whose behaviour cannot be fenced by a strict mode.
A design question has no place to become a decision. Ring's repository has its issue tracker, its discussions
and its pull requests switched off; the Google Group is the only channel, and it holds conversations, not decisions.
Defects are fixed, often within days. Design questions are answered, and stay where they were.
We diverged on the project's governance. Over the years I argued for a different way of running it —
production use as a goal, a strict mode, a foundation around the language — and the project did not take that
direction. That is the author's right, and it is a fact a production user has to act on.
A project built for customers cannot depend on a direction it has no way to influence. So on 14 October 2026 I retired
Ring from all my projects.
What Ring++ does instead
It keeps the code that exists running. Softanza runs on Ring++: of the checks in its tests that pass on Ring,
Ring++ passes 12,924 of 13,008 on Windows and 12,170 of 12,255 on Linux, and every one it does not pass has a named
cause (how it is counted).
It answers like Ring, unless it says otherwise. Each of Ring's defects was looked at on its own and given one
of four answers: keep it, so existing programs mean the same; fix it, where no correct program could tell the
difference; refuse it, with a rule the compiler checks; or drop a feature Softanza never uses, and say so. Each answer is
written down with what it costs. They are explained on the issues page.
It measures instead of asserting. Ring 1.27, built from its own source, is the reference: 5,112 programs are
compared with it line by line, and a gate runs before every change.
It owns its ground. One program, no C compiler, every file it carries from elsewhere checked against its
hash.
RingServ, RingScript and MicroRing are no longer maintained on Ring. They are test projects for Ring++ now, and the
starting points for Haro's own server, browser and embedded runtimes.
Towards Haro
Ring++ is a bridge, not the destination. Haro is a new language built on this VM. It keeps Ring's simple syntax and its
expressiveness, the brace block first, and adds what Ring never had: a ? that shows a list as a list. Ring
prints a list one item per line, its structure lost, which is why Softanza has @@(). Its design is being
written and measured now, and it will be announced on its own.
Ring++ stays open source under the MIT licence, as Ring is. Its findings document Ring's VM in detail; they are there for
anyone to learn from, the Ring team included.