The original words are
One reason that the distinction between process and procedure may be confusing is that most implementations of common languages (including Ada, Pascal, and C) are designed in such a way that the interpretation of any recursive procedure consumes an amount of memory that grows with the number of procedure calls, even when the process described is, in principle, iterative. As a consequence, these languages can describe iterative processes only by resorting to special-purpose “looping constructs” such as do, repeat, until, for, and while.
I am not familiar with C language, what about Java or C#? Is this true with them as well?
And why?
Note: I thought the author is talking about abilities of different languages. But actually it is just about different implementations of compilers.
He’s basically trying to say that compilers for these languages can’t do tail recursion elimination. To make a long story short, he’s wrong (or over-generalizing anyway — I guess “most implementations” is enough of weasel wording that it could technically be sort of correct, though misleading at best). While I certainly can’t guarantee that every compiler for every other language does tail recursion elimination, there’s no question that at least some C and C++ compilers (e.g., Intel C++, gcc/g++) can and will. I haven’t checked, but given that GNAT (the Gnu Ada compiler) uses the same optimizer and such as their C and C++ compilers, my immediate guess would be that it can do tail recursion elimination as well.
It’s been long enough since I’ve used Pascal that I can’t make an intelligent comment on it — my immediate guess would be “no”, but that has little to do with the language itself, and mostly comes down to the fact that most current use of Pascal traces back to Borland, and they never seemed to put a lot of effort into optimal code generation.