Languages Pre-Fortran
craftofcoding.wordpress.com
craftofcoding.wordpress.com
It's hard to imagine nowadays how controversial this was. Previous versions of Algol did not necessarily require any form of dynamic memory allocation. Recursion requires it in some form to avoid overwriting a procedure's variables upon the recursive call.
Languages that forbid recursion (like Fortran before F90) can allocate for peak memory usage before runtime, which is especially useful on RAM-poor computers.
EDIT: The site also has a great quote on the subject (https://craftofcoding.wordpress.com/2022/10/20/d%c8%b3kstra-...).
"I got there first, Algol; don't bother looking for the return value!"
> McCarthy, fresh from the success of his Lisp project, was enthusiastic about recursion as an elegant way to get computers to do what they are best at: repeat execution of the same code with suitable modification each time around. In fact, the first Lisp had no iteration, so that the only way to add all elements of a linear list was to write a recursively defined function. As a member of the Algol committee he proposed making the possibility of recursion a feature of the new language. The proposal was crowded out by more pressing concerns. The result was that in the early months of 1960, when the report was to be finalized, there was no consensus on recursion.
Technically untrue, actually; you can require any potentially-recursive procedure to take a (pointer to a) array of stack frames to use when making a recursive call. However I don't know of any programming languages that actually do that, rather than supporting stack frames implicitly or (historically) prohibiting recursion altogether.
Consider, rather, the fact that Algol-60 had nested functions which captured the enclosing environment and could also be passed as arguments to other functions. Or call-by-name, whereby expression used as an argument in a function call would be re-evaluated every time it's referenced inside the function - again, kinda like closure, except this one could also be used on the left side of assignment. Or the ability to pass labels as function arguments, which could then be used for nonlocal goto across multiple function boundaries.
And now try to implement all this in a compiler targeting a machine with memory measured in kilobytes. Oh, and the compiler itself also runs on another such machine.
For the curious, here's the language specification: https://www.masswerk.at/algol60/report.htm
- C.A.R. Hoare in 1974 in "Hints on programming language design"
OTOH Algol 68 is a whole different story, and for all its weirdness (much of which is terminological - "transput" for I/O, "mode" for type etc), its extreme orthogonality and consistency is very elegant.
It took me a minute to realize that it wasn't saying that the language supported currying, but was made by curry.
I know intellectually that curry was a famous person but kind of wild to see it like this.
That's neat - I guess by this time Fortran programs were getting big/long enough that comments were needed.
IPL, a precursor of Lisp, was implemented in 1956.
It would be interesting to see what 'obvious' things weren't so obvious. What weird things seemed sensible at the time, etc
> 1955 – ПП (Ershov)
What was going on here?
1954 - ПП-1 (prototype / proof of concept)
1955 - ПП-2 (for Strela-1)
1955 - ПП БЭСМ (for BESM)
Followed by more versions for various new mainframes that appeared, named by suffixing "ПП" with the name of the hardware - e.g. there were distinct versions of ПП for Strela-3, Strela-4, and Strela-7.
The abbreviation itself stands for "программирующая программа", "a program that programs". So it sounds like it was originally a name of the specific prototype, but then became a generic term for any kind of compiler for a short while (later replaced by "translator", probably under the influence of FORTRAN and ALGOL).