I feel the need to ramble slightly OT on how great Lua is: I was looking for an architecture/tech stack recently that would allow me to develop a cross-platform desktop GUI. I went on a several-weeks-long fact finding mission (the longest of its kind I've ever done in my 10 years as a professional software developer).

The option that won was to write all business logic (a few thousand lines of code) in Lua, then write the GUI in each platform's native language+ui-library combination and re-use the same business logic by embedding Lua.

Another option that made the shortlist was using Haxe instead of Lua, but after several weeks of active Haxe development, it became clear that that was a bad idea, and with Lua, the developer experience is now so much better.

I definitely plan on continuing to use Lua as my main programming language.

This comes after 20 years of having python as my main programming language because I'm displeased with feature creep and bloat on python. With lua, I find that I barely miss any features/abilities from the vastly more complex python while the simplicity of lua means my code gets to "go places" where python can't go.

With lua, you find casual implementers making fully compatible alternative implementations (e.g. NeoLua for C#, Luna for Java, fengari for JavaScript, ...) With Python, alternative implementations seemingly just can't keep up with the pace at which CPython is introducing unnecessary new features and CPython-compatbility is de-facto the only meaningful python standard there is. Jython and IronPython would make the platform so much more appealing, but they appear dead in the water. Python implementations for the browser pop up every couple of years only to see little adoption and quietly disappear again.

What's more: Once you've settled on Lua as an embedding language, developers of Lua logic are free to use not just Lua, but they can pick from a host of cool transpile-to-Lua languages [1].

[1] https://github.com/hengestone/lua-languages

Yes, Lua is like the good parts of JavaScript without the bad parts, but with worse lambda syntax and one-based indexing.

I looked into JS as an alternative, given that ES6 cleaned up a lot of the things that had previously been bugging me about JS. I thought JS must be well-suited for embedding usecases, and the vastly larger language community, compared to Lua, must be an advantage of some sort.

But I ended up concluding that I still don't want to go anywhere near JS.

It's like browser-based use of JS and node-based use of JS are sucking the air away from JS's potential as a language for embedding.

e.g. Nashorn was part of the Java standard API in Java 8 but then got dropped. There's project Detroit to try to replace it, but it doesn't seem to be going anywhere. Most people interested in embedding JS in Java will presumably want node compatibility, even though node is not a great architecture for embedding, so that's what GraalJS is doing, but it comes at the cost of a loss of portability to non-Graal Java environments. A widely-used way of embedding JS in C# is by actually invoking the system browser through WebView in some weird and convoluted way. ...it's things like that which make me recoil in horror. Meanwhile Lua for Java and Lua for C# is just quietly and humbly in existence and using a sane architecture.

...and then JS libraries are full of this async-stuff with promises and whatnot, and I'm reluctant to go anywhere near that if I'm positively certain that it serves absolutely no purpose in the applications I actually intend to build and comes at the price of making code so much more complicated and unreadable.

I've had some success with https://github.com/TypeScriptToLua/TypeScriptToLua

Luau may be an alternative as well, haven't tried it.

I love Lua, but at larger scales it's unmanageable.

Nim is used heavily in the gaming industry as a Lua replacement as well.