Your Language Sucks, It Doesn’t Matter
matklad.github.io
matklad.github.io
Beauty and elegance don't matter. Performance doesn't matter. In fact, no measure of "fitness for purpose" matters.
If Malbolge was built into every operating system, Stack Overflow would plug the gaps, and major production systems would be built in it. People would give conference talks about "scaling Malbolge to millions of transactions per second". It would have a package manager, a deep learning framework, and several UI toolkits.
In some sense, this has already happened.
> Beauty and elegance don't matter. Performance doesn't matter. In fact, no measure of "fitness for purpose" matters.
If that were true, C++ wouldn't be so popular.
I think some platforms existed that had already solved those issues, but it was a different time. Disseminating those ideas was harder, open source wasn't as much of a thing yet, so development was siloed, we didn't have blogs or youtube to aggregate and broadcast the danger of those footguns, and it was the evolutionary solution that did provide the most QOL improvements.
You could write code in D or Nim, and your code might be marginally more readable, but you wouldn't have as many easily available libraries, or as much support (eg: stack overflow). It's hard to compete with the fairly good compromise that C++ offers.
edit: and Bash and VBA
Powershell is still peripheral to most Windows' user's experiences. If they script anything on Windows, it's probably via VBA and MS Office. And even many sysadmins (IME, I know this is changing) seem to default to BAT files out of habit.
Contrast with shell on * nix, where it is more commonly used and known (even if not to writing fluency, most * nixers could probably read a shell script thrown at them barring poorly formatted/structured code). BASIC's popularity was largely due to its centrality to the user experience on early PCs, with many PCs starting in a prompt where BASIC could be entered directly. If it had been hidden away behind several menus and options, it would have been less popular.
Javascript's popularity is similarly due to its centrality to the experience with web browsers, and the ability to run it on anyone's computer without needing to compile and publish anything beyond the code itself (and an HTML page to show it off on).
EDIT: Asterisks ate themselves, edited to put a space between them and "nix(ers)"
It would also be hard for anyone to mistake powershell or a replacement for existing tools.
I'd say what matters is who is your sponsor.
C/C++ had Unix/AT&T and Microsoft as sponsors.
Basic and C# had Microsoft.
Javascript had all browsers' makers.
Java had Sun and Google.
Fortran and Cobol had IBM.
Python, Go and Kotlyn have Google.
Objective-C had Apple. When Apple was in the ropes Objective-C wasn't popular. Then Apple got big and Objective-C got big, also.
Turbo Pascal/Delphi had Borland when Borland was Borland. Now Borland is Embarcadero and the language is fading.
Smalltalk, Lisp and Lua had great runtimes but never had great sponsors.
Ok, there were exceptions: Perl, Ruby, DBase... but some of these are falling behind already.
That was a different time, though, and by 1990 Ashton-Tate (makers of dBase, and soon to be bought by Borland) was pretty much done. Microsoft bought dBase-clone Fox Software in '93, which is pretty much the only thing that kept anything dBase alive until FoxPro got put out to pasture sometime around '05-'06.
IOW, were it not for the sponsorship of Microsoft, dBase would have been done 30 years ago.
I thought dBASE was a great language for small-project RAD and ad-hoc data fiddling. I could crank out smallish apps in hours.
SET PROCEDURE TO MEADOWCan you explain when you think this was?
edit: link: https://www.news.com.au/technology/gadgets/the-forgotten-mic...
The old Mac OS didn't use Objective-C-based frameworks. Objective C was used on the NeXT workstations.
Objective C became popular because it was part of the tech stack brought back into Apple by Jobs.
Yet people use it as one and write tens of thousands of lines of code in it. See https://github.com/oilshell/oil/wiki/The-Biggest-Shell-Progr... and https://oilshell.org
Then, one day, you're trying to do some sort of repetitive task, and you use a for loop. Or you realize it would be nice if cron could run a command for you at a set time.
Then, some time later, you realize it would be useful if cron could execute five commands in sequence, or decide that your for loop is complicated enough that you'd like to write it out on multiple lines. And just like that, you've started developing shell scripts.
This is the impression one gets sometimes, but the recommendations for fast Julia actually seem to revolve around ensuring type stability (another way to say “static strong typing”) and avoiding heap allocations, in fact Julia seems like just another nicer syntax for C++
The majority of Twitter is Scala, Stripe uses Scala extensively, Verizon uses scala for at least a large portion of their TV related code as does Comcast, I could go on. Did it 'take over' the world like some of us hoped? Nope, it is definitely still a niche, but it's quite a large one at this point.
* C++
* Python
* JavaScript
* Java
* C#
* Rust
the author's thesis is that it doesn't matter. And software is written at a significant scale in React (arguably its own language).
This is exactly why I switched from C++ to Java, and from Python to Go, and why I’m using JavaScript in the browser.
But it doesn’t fully explain why I switched from Java to Python: that was partly for the runtime, but in that case the language itself played a big part.
On the topic of Zig, he seems to ignore that Zig provides several unique "runtime" features:
* unlimited comptime code execution * error sets and error return traces * choice between blocking or async runtime, using the same code * runtime checks for undefined behavior * debug allocator
And probably more that I'm not thinking of or am not aware of.
As it stands, it's _not_ easy to use the multiple platform setup. You really need to be both an expert in Kotlin, Gradle (and their plugins are _barely_ documented), and the target platform.
But if the build process becomes easy, and, they can build a rich ecosystem that basically can create abstraction layers on top of the target platforms, I see it going far. It's still not there yet, but it's moving quickly.
I'm still in a "wait and see" place with Kotlin. I've enjoyed working with it on the JVM, where the tooling is fantastic. But the JS and native toolchains are still not up to my standards. Just being another JVM language isn't good enough for me.
I don't really disagree with any of the overarching points here, other than the supposition that "runtime" is anywhere close to the one factor to rule them all. Adoption is determined by....mostly adoption. You generally choose the most popular language that fits your needs, however stringent they might be, and initial adoption has so many factors that go into it, and if syntax and paradigms were irrelevant, then why would C++ have superseded C, only to be replaced itself by a variety of languages addressing a variety of needs?
- Lack of modules/packages
- Dynamic binding as default
The former is an annoyance, especially in a "living system". Contrast with C where the lack of modules and prefix-based naming is controllable by putting things into libraries. So your use of OpenGL functions prefixed with gl is contained in one area, and I never need to see it if my portion deals with network code or anything else. But with elisp, once you load that, all those functions are thrown into the same scope as everything else. If something isn't properly prefixed, or if prefixes collide, then there will be problems.
Dynamic binding (lexical binding can be enabled as an option) means that, coming from other lisps, some things do not do what you'd expect:
(defun make-adder (x)
(lambda (y) (+ x y))
(let ((x 7)
(add-10 (make-adder 10)))
(add-10 x))
With dynamic binding we get 14, with lexical we get 17. This can be addressed by enabling lexical binding, but like I said it's not the default.As far as I'm aware, there is no way to measure whether a language is "objectively bad" except if that language does not allow you to do what you want to do (or, maybe, if the language makes doing what you want to do unreasonably difficult). Emacs Lisp has been successful for decades and by all appearances is going to continue being successful, which in my mind makes it objectively good by any empirical measure.
(By this measure, we could consider languages like the assembly languages, ALGOL, etc as "bad", so long as the context for analysis is "writing modern high-level software." They are mostly no longer used except when necessary, which seems to me the only measure worth considering until we develop a theory of language usability analysis.)
I wish the author had not been so vague in this dismissal. While their article is certainly allowed/encouraged to be full of opinionated conjecture (as they defend in the opening), I think such a strong position is deserving of at least a little more justification.
I believe the author somewhat elaborates on what he means by "objectively bad" with his example of Javascript having two "null" sort of values, which under a reasonable definition is objectively worse than a theoretical Javascript with a single null.
So if we read the author charitably, taking into account his example of Javascript having two nulls being objectively worse than a theoretical Javascript with one null, we can interpret his statement as "Emacs Lisp is objectively worse than other Lisps, which have essentially identical functionality and fewer sharp edges".
Your example wrt. JS's two null types doesn't exactly generalize. What are Emacs Lisp's "sharp edges", as you say? What does it prevent people from doing? In what way could it be made more ergonomic? I would argue that its long-term proven stability is an indicator that the language does not have sharp edges; at least, not ones which discourage its use significantly. When you go into discussions about programming languages, you can't throw a stone without hearing somebody bemoan Javascript or PHP, but I never hear Emacs Lisp being brought up (and people who do bring up Lisp are often just upset about the abundance of parentheses, it seems).
I dunno, it just strikes me as the author acting as though this is a given assumption, and I don't quite see it. I'm not saying they're wrong (because, of course, the entire article is an opinion piece and the author is entitled to their opinion), but rather that I just wish this claim had gotten a bit more justification.
I think Emacs Lisp is in the "easy to improve upon" category because of:
* lack of namespaces * dynamic binding by default * spartan standard library
I do love parenthesis though :)
If you compare languages that implement the same programming paradigms you can mistakenly arrive to the conclusion all languages are the same.
They are not the same.
Compare C with Prolog, Erlang/Elixir and Haskell and you will know what I am talking about.