Programming languages (and the ecosystems that surround them) are incredibly interesting. They can be sliced in many different ways based on syntactic similarity, type system similarity, suitedness for various problem domains, and many other attributes.
Below I present an spectrum of various languages, arranged by distance from the underlying hardware1:
A few interesting patterns become evident in this diagram:
There are some outlier languages (such as Go, Lua, and Forth) which are more expressive than their distance from the hardware would suggest.
Anything that is Intermediate Typed or below has a stronger focus on the type system, usually for preventing bugs or just having very precise types.
Many languages in or near this region are lumped under the vague term functional programming, which roughly translates to a programming style that avoids mutable data structures & side effects by default, or just “a language that feels like Haskell” (the canonical “functional” language).
I suspect there aren’t as many languages at the bottom in Academic-land because there are fewer Academics than Practitioners, such languages are harder to write (because of more complex type systems), or because I simply am not aware of many such languages as a non-Academic.
Series
This article is part of the Programming for Perfectionists series.
When speaking of “hardware distance”, the hardware I am referring to is the common commodity hardware architectures such as x86 and ARM. It should be noted that there are also specialized architectures where Forth, Lisp, and Prolog are the assembly language. And some architectures like the Burroughs actually have typed memory and pointers, which eliminates a lot of the dangers of working with untyped assembly.↩
Examples of Practitioner-jargon: “inheritance”, “generics”, “dependency injection”, “covariance”. Examples of Academic-jargon: “monad”, “functor”, “reduce”, “dependent type”, “currying”. More examples from this presentation on functional programming.↩
ReceiptTally is a custom language of my own designed to describe household receipts. With this description it can be calculated who owes whom money for reimbursement purposes. I haven’t bothered to make this project public at this time.↩