As one of those people crazily obsessed with pursuing simplicity, I really grew to appreciate Lua's design[1]. I started embedding it into any place I wanted simple extensibility in applications. Gradually I found myself writing more and more and more application code in Lua.
This didn't turn out badly at all - Lua's performance is really very good compared to any alternatives, and development was also much faster. With its easy interfacing with C there wasn't really anywhere I couldn't fit it. Lua being so flexible is probably one reason I really can't put it down now.
A couple of years ago I decided to develop an XMPP server (that's another story...). The choice was essentially between C and Lua, myself not liking Java and things like Python/Ruby being too heavy. In order to get off the ground I decided to write entirely it in Lua, and then port each component to C later. I'm happy to say I've continued to be impressed by Lua, both in its runtime performance and the speed and ease at which we can develop code. I have no plans for the C rewriting anymore - we already compare quite favourably with an equivalent erlang server in benchmarks.
Interestingly the "Why on earth did you choose Lua?" comments I received at the start have significantly died off over time. I'd like to think that people really are dropping the "Lua is only for games." stance - in my opinion this language is drastically under-used.
Also (despite a few inaccuracies) there was a good short talk posted recently about Lua[2]. My main quibbles are for example that Kyle repeats that Lua doesn't have print() built-in. His talk is primarily from the embedding perspective, and when embedding, yes, you have to explicitly pull in the standard libaries - but print() is certainly there, along with various other things. Secondly he claims that Lua does not interface well with Java, yet there are several projects allowing exactly that[3]. There are even a few Lua implementations /in/ Java[4].
[1]: Slides from a talk at Stanford by one of the Lua author's on design decisions made in Lua: http://www.stanford.edu/class/ee380/Abstracts/100310-slides.... [2]: http://kylecordes.com/2010/lua-strange-loop [3]: http://www.keplerproject.org/luajava/ [4]: http://lua-users.org/wiki/LuaImplementations
And – speaking of historic reasons – correct me if I'm wrong, what good embeddable JavaScript interpreter would you have used five years ago?
Also, compared to Ruby and JavaScript, it's a much simpler language. You have to learn a lot less and deal with fewer idiosyncrasies, which often hurts people who "just" write scripts for big systems.
- modest resource requirements
- runs on everything (embedded, game consoles, etc.)
- has a JIT compiler that is way better than any Ruby/JS/Python JIT (and in fact in many cases better than a good Java compiler).
- Simple and regular syntax
- Vibrant and helpful community.
It's not the right choice for web development, because that's not where its echosystem is (although you can do that if you want). Other than that, the only drawback I can think of is that arrays start at 1 rather than 0.
- Data can be easily constructed inline without a lot of extra syntax
- The interpreter is very fast
- Functions as first class objects
- Closures
- Meta-tables
All of these things make Lua very expressive and concise for designers, while giving a lot of control to make things work correctly to the programmers.
A few cons: - the built in error handling is not great, we corrected it.
- variables are global by default, which can make typos become runtime errors, we corrected this as well
echosystem
What is the name of a word that is inadvertently created e.g. by a typo, or a slip of the tongue?
While I don't believe it applies to the current context, echosystem is just begging for use in some other contexts.
It has a nice, clean C implementation and can be easily cross-compiled.
I normally use ruby for a complete different set of problem (scripting on OSX).