A language few people used became the ancestor of Java, C and Pascal
ALGOL, released in 1958 and revised in 1960, never sold well. Yet it became the standard way to describe algorithms in computing journals, and most of today's popular imperative languages, from C and Pascal to Java and C#, descend from it directly or through intermediaries. Commercial flops can still win the family tree.
ALGOL's gifts included better portability and the first use of a formal grammar notation, now called Backus–Naur form, to pin down exactly which strings of symbols count as valid programs. One descendant, Simula, pioneered object-oriented programming with inheritance and subtypes. Another, C, gave programmers unusually direct access to the machine through flexible pointers, powerful and efficient but easy to get wrong.
Before any of this, the first computers of the 1940s were programmed in raw machine instructions that were painful to debug and tied to a single machine. Assembly languages made code more readable but no more portable. Hardware was the scarce, costly resource then and programmers' time the cheap one, so clumsy languages close to the metal made sense. Fortran, from 1957, changed the balance: often considered the first compiled high-level language, it let engineers write formulas in familiar notation and is still in use. Lisp arrived in 1958 with recursion and automatic garbage collection, and dominated artificial intelligence work for decades. Prolog, from 1972, let programmers state the goal and leave the method to the interpreter.
Each era brought new pressures. Mainframes fed by punch cards around 1960 favoured languages built for minimal interaction, since nothing could be typed in mid-run. Personal computers in the 1980s produced C++. Japan invested heavily in so-called fifth-generation languages combining logic and concurrency, but rivals outperformed them. The web of the 1990s rewarded Java's portability and security and spawned scripting languages such as Python, JavaScript and Ruby. After 2010, Rust, Go, Swift and Zig began competing for work long reserved for C.
Every language has two layers. Syntax governs which arrangements of symbols are legal; semantics governs what they mean. A program can pass the first test and fail the second, just as a grammatical sentence about a married bachelor can never be true. In some languages, notably Perl and Lisp, code can even run while it is being parsed, which makes checking the syntax an undecidable problem.
Source: Programming language