On The Insider: Britney's Bikini-Clad Top 10
BNET Business Network:
BNET
TechRepublic
ZDNet

April 7th, 2006

APL, COBOL, & Dijkstra

Posted by Paul Murphy @ 3:24 am

Categories: General

Tags:

One of the issues that arose in the talkbacks to my blog on the Second IT Commandment (Thou Shalt Honor and Empower thy (Unix) Sysadmins) came from a throwaway comment, on my part, about the difficulty of teaching a COBOL programmer to use APL. That drew a response from Jorwell citing Dijkstra as an authority against APL:

Dijkstra on APL: "APL is a mistake, carried through to perfection. It is the language of the future for the programming techniques of the past: it creates a new generation of coding bums"

Now, just so you know what we’re talking about: APL - A Programming Language, was developed by Kenneth Iverson (Ph’d Mathematics) to implement a mathematical notation in a computing environment. His textbook: Algebra: an Algorithmic Treatment (Addison-Wesley, 1971) and the matching 1976 APL Press book, Calculus in a New Key by D. L. Orth, demonstrate that essentially all of elementary analysis (i.e. linear algrebra and the calculus) can be expressed in APL, demonstrated in APL, thought about in APL, and advanced using APL notation.

That doesn’t mean it’s easy to understand - like Perl it lends itself to throwaway code because it’s often easier to reinvent something than debug it.

This thing, for example, finds the uniq elements in a vector and is marked as a throwaway because of what it doesn’t do - examine its input:

Dijkstra was a great man, a leader in the field, but he had a tendency to shoot from the lip, and this was one of his more unfortunate slips along those lines. More to the point, there’s reason to believe that he would have regretted the comment ten years later if he’d learnt something about APL in the interim.

The APL comment comes from a note he tossed off in June of 1975 in which he excoriates virtually every programming language then used. Here’s pretty much the whole thing, direct from the University of Texas Dijkstra repository:

Sometimes we discover unpleasant truths. Whenever we do so, we are in difficulties: suppressing them is scientifically dishonest, so we must tell them, but telling them, however, will fire back on us. If the truths are sufficiently impalatable, our audience is psychically incapable of accepting them and we will be written off as totally unrealistic, hopelessly idealistic, dangerously revolutionary, foolishly gullible or what have you. (Besides that, telling such truths is a sure way of making oneself unpopular in many circles, and, as such, it is an act that, in general, is not without personal risks. Vide Galileo Galilei…..)

Computing Science seems to suffer severely from this conflict. On the whole, it remains silent and tries to escape this <1–more–> conflict by shifting its attention. (For instance: with respect to COBOL you can really do only one of two things: fight the disease or pretend that it does not exist. Most Computer Science Departments have opted for the latter easy way out.) But, Brethren, I ask you: is this honest? Is not our prolonged silence fretting away Computing Science’s intellectual integrity? Are we decent by remaining silent? If not, how do we speak up?

To give you some idea of the scope of the problem I have listed a number of such truths. (Nearly all computing scientists I know well will agree without hesitation to nearly all of them. Yet we allow the world to behave as if we did not know them….)

Programming is one of the most difficult branches of applied mathematics; the poorer mathematicians had better remain pure mathematicians.

The easiest machine applications are the technical/scientific computations.

The tools we use have a profound (and devious!) influence on our thinking habits, and, therefore, on our thinking abilities.

FORTRAN –"the infantile disorder"–, by now nearly 20 years old, is hopelessly inadequate for whatever computer application you have in mind today: it is now too clumsy, too risky, and too expensive to use.

PL/I –"the fatal disease"– belongs more to the problem set than to the solution set.

It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration.

The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offence.

APL is a mistake, carried through to perfection. It is the language of the future for the programming techniques of the past: it creates a new generation of coding bums.

The problems of business administration in general and data base management in particular are much too difficult for people that think in IBMerese, compounded with sloppy English.

About the use of language: it is impossible to sharpen a pencil with a blunt axe. It is equally vain to try to do it with ten blunt axes instead.

Besides a mathematical inclination, an exceptionally good mastery of one’s native tongue is the most vital asset of a competent programmer.

Many companies that have made themselves dependent on IBM-equipment (and in doing so have sold their soul to the devil) will collapse under the sheer weight of the unmastered complexity of their data processing systems.

Simplicity is prerequisite for reliability.

We can found no scientific discipline, nor a hearty profession on the technical mistakes of the Department of Defense and, mainly, one computer manufacturer.

The use of anthropomorphic terminology when dealing with computing systems is a symptom of professional immaturity.

By claiming that they can contribute to software engineering, the soft scientists make themselves even more ridiculous. (Not less dangerous, alas!) In spite of its name, software engineering requires (cruelly) hard science for its support.

In the good old days physicists repeated each other’s experiments, just to be sure. Today they stick to FORTRAN, so that they can share each other’s programs, bugs included.

Projects promoting programming in "natural language" are intrinsically doomed to fail.

Isn’t this list enough to make us uncomfortable? What are we going to do? Return to the order of the day, presumably…….

The most impressive thing about this list, at least to me, is that you could say all of this today and still be wrong only about APL.

So why do I think he would have changed his mind about APL if he’d taken the time to learn something about it? Because of the programming language desiderata he laid down in a 1985 interview with Rogier van Vlissingen -who, by the way, sometimes contributes to the talkbacks here.

The interview as a whole is worth reading, but here’s an important bit, starting from an exchange of particular interest to those who, like me, decry Microsoft’s role in both defining and meeting consumer expectations about PC software. (Note, my comments are in brackets, like this.)

[Dijkstra] … User satisfaction is not a quality criterion for a computer product.

[Rogier] What would make you say that?

[Dijkstra] I was introduced to user satisfaction as a quality criterion years ago and I found it ridiculous. You can achieve it in all sorts of ways. For instance by not educating your customers; telling them that it cannot be any better. Postulating that the fact that software has bugs is a law of nature. You can even achieve it by intimidation. The worst part of it is that the goal is too fuzzy to give any technical aid. No, user satisfaction as a criterion is very typically American, because the American interface between the supplier and his customers, is that a supplier leaves the last stages of control to the customer. That is why you always see "satisfaction guaranteed" and if not you may return it: they’ll mend it endlessly.

Same thing has happened with the design of programming languages. Programming languages of course have to be user friendly, programmers have to like them. For a long time features of programming languages were included on account of their supposed popularity, the main criterion was will people like it, again stemming from a rather dismal perception of the user. The great change in programming languages came from the fact that we started giving formal definitions of the semantics of programming language concepts. Something you need if you want to be able to prove things about the programs written in it. And even if you do not intend to do that in a formal way, it was an extremely healthy exercise for programming language designers. Formalization acted as an early warning system: if the formal definition of a feature gets very messy and complicated, then you should not ignore that warning.

(APL was/is the only formally defined programming language to achieve wide usage and was first sold as a way to formalize the OS/360 design)

[Rogier] Can you explain some more about those language developments that have these better features?

[Dijkstra] The versions that computer scientists are experimenting with are languages that are not selected for their potential appeal to the uneducated, but are screened by criteria such as mathematical power in a very rigorous sense, mathematical elegance and that kind of research produced all sorts of things. Some stay within the framework of imperative programming languages, because we know so well how to implement them very efficiently. Others are exploring functional programming languages.

(That’s APL - elegance, mathematical rigor, both imperative and functional programming modes.)

[Rogier] Can you explain the difference between the two?

[Dijkstra] I can try in a minute. Others are trying to be in their considerations even less constructive. They define the answers by a number of logical equations, leaving it to the implementation to find the solution to that set of equations. The net effect of it seems to be that a full system for really acceptable programming will be at the same time a full system that will suffice for the description of constructive mathematics. What is happening is that the gap between a program a computer may execute and the mathematical proof that the answer exists is narrowing.

(Sure, in APL, these are indistinguishable:)

The simplest way to characterize the difference between imperative programming languages and non-imperative ones is that in the reasoning about imperative programming you have to be aware of the ’state’ of the machine as is recorded in its memory. In conjunction with that there is a clear distinction between a program on the one end and the information processed on the other. In the case of functional programming you create a language in which you can write all sorts of expressions and evaluating an expression then means massaging that expression until you have it in the shape that you want to have it in.

(Again, a description of APL)

[Rogier] You are speaking of the leading edge of research of computer languages…..

[Dijkstra] Yes, What it is again in danger of being supported to death because one of the hopes of functional programming is that in the execution of programs written in a functional style it will be easier to exploit a lot of concurrency.

(And, indeed, if there’s hope today for an APL resurgence it’s mainly because the language is perfectly suited to exploit Sun’s multi-threaded SMP on a chip - aka Niagara/CMT- much more efficiently than anything else in the inventory.)

[Rogier] How much of this research is at this point flowing back into industry applications?

[Dijkstra] Little but more than you think. I know of a definitely industrial environment, to wit a huge software house that is part of a large oil company and whose charter is primarily to satisfy the software needs of the parent company, so this is most definitely an industrial environment, where in the case of a new program to be developed they made a prototype using a functional programming language in an amazingly short time. In fact in something like better than one tenth of the time an other technique would have required. They have an implementation of this functional programming language, but not a very good one; as a result the prototype was unacceptably slow, but the experience was that it was a very important intermediate step towards the final product. So we have seen already that, though invisible in the final product, novel programming languages and implementation techniques are beginning to play a role behind the scene. This is going to have a profound impact on the software community as a whole, you see the point is that whenever you try to benefit in the development of programs from the availability of machines then obviously the first candidates for automation are those aspects of the programming process that are more or less routine jobs. As a result the really difficult stuff remains. With all our so-called programming tools the net effect is that programming becomes more and more difficult. The easy parts are automated away and the difficult parts remain and that has now reached the stage that it requires of the software developer quite a degree of mathematical sophistication. I was very amused when some time ago in a strictly industrial environment I observed a heated discussion. The discussion involved a whole bunch of so-called higher order functions; higher order functions are considered too fancy to even talk about to many mathematicians, they are functions that have functions for their argument and may return a function as a value, it was in a group of industrial computer scientists and they talked about higher order functions as if they were the most normal thing in the world.

Fundamentally Dijkstra wanted a programming language that can handle both symbolic and numerical computation, is logically equivalent to a mathematics notation, and can extend the notion of recursion to functions (and operators - although he doesn’t say that) that can produce, parametize, and execute other operators or functions.

You could do all that with APL in 1971; by 1980 variants like Dyadic and Sharp APL had made the capabilities explicit while modern descendants like J directly implement many of the key formalizations; thereby merging theory and practice.

So what happened? Well, how do you think the average COBOL programmer reacts to something like this (highly efficient) GCD function? (Note: I know I didn’t write it, but have no record of who did).

Right. That, and I think the general acceptance in the 80s APL community of the idea that the character set was a barrier to acceptance was a serious mistake confusing marketing with value.

 

Paul MurphyPaul Murphy (a pseudonym) is an IT consultant specializing in Unix and related technologies. See his full profile and disclosure of his industry affiliations.


Email Paul Murphy

Subscribe to Managing L'unix via Email alerts or RSS.

  • Talkback
  • Most Recent of 89 Talkback(s)
He preferred Algol
Specifically Algol60. He was heavily involved in its standardization and wrote its first compiler, creating the shunting yard algorithm in the process.... (Read the rest)
Posted by: ZDNET_guest666 Posted on: 06/07/08 You are currently: a Guest | | Terms of Use
GOTO "hell"  Roger Ramjet | 04/07/06
Ok, lets see a draft  murph_zZDNet Moderator | 04/07/06
.cshrc  Roger Ramjet | 04/07/06
Next time...  Erik1234 | 04/07/06
Easy enough  Roger Ramjet | 04/07/06
God's last name?  murph_zZDNet Moderator | 04/07/06
Ahhh, APL...  Henry Miller | 04/07/06
BYE BYE COBOL  BillyG_n_SC | 04/07/06
Exactly  murph_zZDNet Moderator | 04/07/06
But...  rapson | 04/07/06
What's your point?  rapson | 04/07/06
The point is that  murph_zZDNet Moderator | 04/07/06
I disagree with the second part  Erik1234 | 04/07/06
Agreed  jorwell | 04/10/06
I agree with erik  rapson | 04/07/06
I understand  Roger Ramjet | 04/07/06
I don't think so  Erik1234 | 04/07/06
However  jorwell | 04/10/06
No loops and no recursion?  Erik1234 | 04/10/06
Any language based on set theory and predicate logic  jorwell | 04/10/06
Maybe  Roger Ramjet | 04/10/06
Maybe the processor performs a loop  jorwell | 04/10/06
Inferior beings  bportlock | 04/10/06
Tackling the wrong problem...  Erik1234 | 04/07/06
yep: wrong problem  murph_zZDNet Moderator | 04/07/06
Provably correct programs  Mark Miller | 04/07/06
Provably correct programs  Erik1234 | 04/07/06
How developers see their job  Mark Miller | 04/08/06
So Little Has Changed  Kai Ahnig | 04/07/06
Great comment - thanks!  murph_zZDNet Moderator | 04/07/06
Don't like Maple?  Erik1234 | 04/07/06
More array languages  Kai Ahnig | 04/08/06
Of course  jorwell | 04/10/06
Sets, stacks, and queues  Roger Ramjet | 04/10/06
Good post  Mark Miller | 04/07/06
Popularity  D. T. Schmitz | 04/08/06
RoR  Erik1234 | 04/09/06
Reserve Judgement  D. T. Schmitz | 04/09/06
I will...  Erik1234 | 04/09/06
An arrogant old man  Viracocha_z | 04/09/06
Agreed on the details, buit not the conclusion  murph_zZDNet Moderator | 04/09/06
Native Tongue  Erik1234 | 04/09/06
Human Language  Viracocha_z | 04/09/06
As metaphor it works.  Anton Philidor | 04/11/06
Logical correctness  jorwell | 04/10/06
Proof  Roger Ramjet | 04/10/06
No. Yes. No. Yes...  murph_zZDNet Moderator | 04/10/06
My interpretation  jorwell | 04/11/06
He was annoyed because...  Anton Philidor | 04/10/06
Maybe you would like to justify this statement?  jorwell | 04/10/06
Wait, Wait! are you really saying he invented ...  murph_zZDNet Moderator | 04/11/06
Farewell to Academia  Viracocha_z | 04/11/06
Why so glum?  Mark Miller | 04/11/06
Programming and Mathematics  Erik1234 | 04/11/06
Agreed.  murph_zZDNet Moderator | 04/11/06
Requiring "... a deep understanding of mathematics..."  Anton Philidor | 04/11/06
It's not the logic of the programming language  Erik1234 | 04/12/06
A note from Ham Richards  murph_zZDNet Moderator | 04/11/06
Brevity. Performance.  jorwell | 04/17/06
Rediscovering Dijkstra  Mark Miller | 04/11/06
And now for the antithesis of Dijkstra...  Mark Miller | 04/11/06
Interesting post  jorwell | 04/11/06
The mathematicians might have been with Leibniz  jorwell | 04/12/06
Small misunderstanding  jorwell | 04/12/06
Resemblance?  Mark Miller | 04/14/06
Re: Leibniz's Dream  Mark Miller | 04/14/06
Started off well . . .  Roger Ramjet | 04/12/06
Do you really need a computer to do programming?  jorwell | 04/12/06
The Seven Bridges of K?nigsburg  Roger Ramjet | 04/12/06
CRAP! That was Euler!  Roger Ramjet | 04/12/06
This is how  Ross44 | 04/12/06
You are right!  Roger Ramjet | 04/13/06
He was trying to describe a process...  Mark Miller | 04/14/06
Started off well . . . (Manually paragraphed properly because of ZDnet quir  Roger Ramjet | 04/12/06
Calculus  Erik1234 | 04/12/06
Wow, that's an accurate picture  Roger Ramjet | 04/13/06
What is CIS? What is IT?  Erik1234 | 04/13/06
As with most things  Roger Ramjet | 04/13/06
The only way??  Ross44 | 04/13/06
AI, IT, and the human mind  Erik1234 | 04/13/06
Well  jorwell | 04/13/06
And Sapir and Whorff  Roger Ramjet | 04/13/06
If you just take the SQL course  jorwell | 04/13/06
Not a SQL course  Roger Ramjet | 04/13/06
Not quite  jorwell | 04/14/06
I don't understand this  Mark Miller | 04/14/06
He preferred Algol  ZDNET_guest666 | 06/07/08
Whats wrong ZDnet  Roger Ramjet | 04/12/06
Congratulations, Murph!  Erik1234 | 04/12/06

What do you think?

SponsoredWhite Papers, Webcasts, and Downloads

advertisement

Recent Entries

Archives

ZDNet Blogs

White Papers, Webcasts, and Downloads

Enterprise Applications

  • Check out some of the easiest and most powerful ways to boost productivity while saving money on your application infrastructure. See ZDNet's comprehensive Enterprise Application resource center, now!
  • New Online Dashboard
  • Read about top issues IT decision-makers face every day, plus get cost effective solutions to real life IT problems. Oracle Topline