while the following list does not go far beyond opinion, and opinions adapt over time, i only rate languages which i have used professionally.
adhering to the "principle of least surprise". offers low-level control with a high degree of freedom, particularly in memory manipulation. most features map closely to their underlying implementation, though undefined and unspecified behavior varies across compilers. static typing, manual memory management, and direct access to memory allow for fine-grained control. highly optimized compilers exist for numerous platforms. however, it lacks modern features such as a module system, proper scope management, memory ownership semantics, and hygienic macros, making it both tedious and risky to use. despite its shortcomings, no superior alternative offers the same level of control and performance. there is also sc, which is c written with s-expressions.
its syntax excels for didactic purposes, merging the principle of least surprise with a syntactic elegance reminiscent of scheme. compiling directly to javascript, it offers a streamlined, decluttered alternative while remaining compatible with the javascript ecosystem, including node.js. coffeescript + javascript -> agility. indentation-based syntax ensures readability and coherence. coffeescripts expressiveness comes from well-recognizable patterns derived from a minimal set of constructs. perfect for code examples and algorithm learning, it is expressive and syntactically close to pseudocode.
schemes syntax and semantics prioritize pragmatic and autodidactic efficiency, making it one of the simplest languages to learn, parse, and translate.
certain r6rs features are questionable:
@
for instance variables, @@
for class variables, $
only for globalsp/pp
for debug printingbegin/end
keywords rather than indentation{}
for scope when chaining method calls. this is unfortunately otherwise ambiguous with begin/end:k => v
vs k: v
var
)const
keyword and an awkward attempt at a module systempackage.json
, sometimes required use of async complexityrelies heavily on calling external programs for tasks that other languages handle with built-ins, which is both a strength and a weakness. while flexible, it is processing-expensive and lacks the structural consistency expected of a full-fledged programming language.
javascript written with s-expressions. compiled output closely resembles hand-written javascript, combining scheme-like syntax with javascript functionality.
pros:
#
for line commentscons:
awkward constructs:
self
in method definitionsNone
, control keywords)print()
vs p/pp
)pythons comparative advantages are domain-specific:
massive scientific/data ecosystem
institutional inertia
availability on nearly all systems by default
syntax issues:
associative array access:
isset
checks??
operator mitigates some casesno native support for:
typical execution model:
heavily patched syntax:
if-fi
) unintuitivedefun
, defvar
, progn
)public static void
) obfuscate intent$, @, %
)1;
at eof) and symbolic idioms ($_
, <>
, =>
)<=>
, //=
, ~~
, etc.)[obj message]
), but consistent once learnederror handling:
if err != nil
)lacks expressive abstraction mechanisms:
strengths:
drawbacks:
there are many programming languages - thousands, in fact - and the number continues to grow. informally, "programming language" often refers to a combination of syntax, semantics, compiler implementations, available libraries, extensions, and the surrounding community. however, at its core, a programming language is defined by its syntax and semantics. these are the fundamental elements, as they allow a developer to precisely instruct a computer. everything else, such as tools and software ecosystems, emerges from this foundation. for this reason, syntax and semantics are the most critical factors when evaluating a programming language.
learning a language and mastering its intricacies requires significant investment. becoming highly proficient can take years. most people learn the languages that their company requires, those recommended to them, or ones that are popular due to effective marketing. once learned, these languages often become a lifelong preference, with developers rarely considering alternatives. language popularity is often influenced by the success of programs written in that language, but this is not necessarily indicative of the languages intrinsic qualities.
initial language choices are frequently arbitrary, but subsequent choices are often constrained by past experience. for example, after spending two weeks learning language x, a developer might opt to use it for a new project, rather than adopting language y, which would require additional time and effort to learn. over time, this dependency grows. why change tools when the current one, while imperfect, offers a familiar and somewhat predictable workflow?
there is also the intellectual challenge of solving problems in different languages. some tasks, easily solved in one language, may be more laborious in another. at times, developers find themselves grappling with problems that would not exist had a different tool been chosen. however, such issues are rarely obvious upfront, and finding solutions can be an engaging process.
the age of a language matters little. languages evolve, and an older design can endure if it is fundamentally strong. implementation quality is key. in practice, it is often more common to see popular but flawed languages gradually improved over time, rather than developers switching to languages built on superior foundations. for instance, complex and inconsistent syntaxes can persist simply because the language's ecosystem is well-established.
readability has often been equated with ease of understanding, but this impression usually stems from familiarity developed through repeated exposure. reading code involves interpreting visual patterns through multiple cognitive processes, such as returning to the beginning of a line, identifying elements separated by whitespace, and mapping sequences of characters to abstract meanings. human cognitive costs are relatively expensive, and even minor, repetitive tasks can accumulate and lead to cognitive fatigue, reducing the overall work being done.
notation permits a degree of flexibility: formatting can vary without altering the underlying structure. whitespace, often optional, enables a wide range of stylistic choices, typically shaped by each authors personality and conventions.