[comp.lang.misc] ABC, not Beta

budd@mist.cs.orst.edu (Tim Budd) (01/26/88)

Yes, Lambert Meertens and his group at the Centrum voor Wiskunde en 
Informatica (center for matematics and computer science) in Amsterdam have
for many years been working on a wonderful language; formerly called B
(with the required addition ``not the predecessor of C'') and now (for
obvious reasons; namely they got tired of saying the above) called ABC.

It is explicitly designed for teaching good programming practices.
It is the only language I know that directly supports programming by
stepwise refinements, in which you can see the developement even in the
final program.
It is one of the few languages I know that has no declaration statements
and is yet strongly typed.
It has nice features such as infinite precision numbers, fractions, tables
and lists, and more.

So as to not paint an overly rosy picture, there are problems with ABC:
For a long time it only ran under Unix (I believe this may have since
changed).
It is not noted for its speed.
It uses a lot of memory.
The people producing it are very good researchers, not particuarly good
salespeople.

I once wrote all the conventional parsing algorithms in ABC.  The
construction of LR parsing tables took about a page of code.  Try that in C.

I strongly believe that the speed problem is not inherient, and a good,
fast implementation can be constructed.  I have even promised Lambert that
one of these years I will prove this by making one.  This language deserves
to be much more widely known.  For its intended task (teaching novice users
good programming practices) I know of no better language.  I think it would
be great in a high school setting, or even perhaps in grade schools.

For more information, write
	ABC Implementation
	CWI / AA
	Postbox 4079
	1009 AB Amsterdam
	the Netherlands
	or send a note to my good friend steven pemberton (who will
	probably regret I mentioned this) at steven@mcvax.uucp

Here is a (not very exciting or interesting) example ABC program
	HOW TO AVERAGE:
		INITIAIZE
		GET INPUT
		WHILE valid:
			TREAT
			GET INPUT
		OUTPUT:
	INITIALISE: PUT 0,0 IN sum, n
	GET INPUT:
		WRITE "Number: "
		READ i EG 0
	TREAT:
		PUT sum + i, n+1 IN sum, n
	valid: REPORT i > 0
	OUTPUT: WRITE "The average is:", average
	average: RETURN sum/n

the bottom half of the program is a sequence of ``refinements'', simple
paramenterless procedures that are part of a larger procedure.
Of course, refinements become more useful as programs become longer.

--tim budd , oregon state university  (budd@cs.orst.edu)