[comp.lang.misc] Bondage and Discipline Languages

pierson@mist (Dan Pierson) (12/29/88)

In article <eWbWj#4OkIf8=eric@snark.UUCP>, eric@snark (Eric S. Raymond) writes:
>                             The European `bondage-and-discipline' school of
>language design (the people who brought you Algol-68, Pascal, Modula, Ada, and
>Modula-2 and are now having yet another try at getting their mistakes right in
>Modula-3) ...                                                     

Not to start a flame war over this matter of taste, but a couple of points:

1. I personally think that "they" may finally have gotten it right
   with Modula-3.  While the standard modules may need a bit more
   work, neither C nor C++ appeared at birth with complete standard
   libraries.  I think that world really needs a strongly typed
   language that is powerful, flexible, and efficient enough for
   production use while remaining portable and simple enough to be
   comprehensible and implementable.  I know it's heresy, but C is
   neither the most portable language around nor an all-around ideal
   language.  There are many areas in which a safer language is
   better.  While I'd miss the conciseness of C, I simply don't
   understand people who feel that being force to adhere to their own
   type abstractions intolerably cramps their style.  My experience is
   that all well written programs have a well (but maybe not
   explicitly) defined set of data types anyway, strongly typed
   languages simply protect against careless errors using these types.

2. "They" are neither European nor the same folks.  The Modula-3
   design team is more closely related to the people who created the
   Xerox Parc set of B&D languages which culminated in Cedar.  This is
   good both because Cedar looked like a very interesting system (the
   closest an Algol-descended imperative language has gotten to a Lisp
   environment) and because Wirth wasn't the designer.  Wirth has a
   history of designing 80% of a language and setting it free; the
   Modula-3 team made a serious attempt to design the whole thing
   before releasing it.
-- 
                                            dan

In real life: Dan Pierson, Encore Computer Corporation, Research
UUCP: {talcott,linus,necis,decvax}!encore!pierson
Internet: pierson@multimax.encore.com

eric@snark.UUCP (Eric S. Raymond) (12/30/88)

In article <4509@xenna.encore.com>, pierson@mist (Dan Pierson) writes:
> In <eWbWj#4OkIf8=eric@snark.UUCP>, eric@snark (Eric S. Raymond) writes:
> >                 The European `bondage-and-discipline' school of language
> >design (the people who brought you Algol-68, Pascal, Modula, Ada, and
> >Modula-2 and are now having yet another try at getting their mistakes right
> >in Modula-3) ...                                                     
> 
> Not to start a flame war over this matter of taste, but a couple of points:
> 
> 1. I personally think that "they" may finally have gotten it right
>    with Modula-3. 

Time will tell. The track record of its predecessor languages is not
encouraging -- each (with the possible exception of Pascal) was touted as
"they finally got it right" and all turned out to be botches of varying degrees
of dreadfulness. I expect Modula-3 will turn out to be more of the same. Wanna
start a pool on the announcement date of Modula-4?

>                   While the standard modules may need a bit more
>    work, neither C nor C++ appeared at birth with complete standard
>    libraries. 

True, though C++ comes close -- after all, it can use C libraries.

>               I think that world really needs a strongly typed
>    language that is powerful, flexible, and efficient enough for
>    production use while remaining portable and simple enough to be
>    comprehensible and implementable. 

I agree. That language is called C++ -- or, if you value "safety" a bit
higher, Eiffel.

>                                      I know it's heresy, but C is
>    neither the most portable language around nor an all-around ideal
>    language.  There are many areas in which a safer language is
>    better.

Again, I agree. That's why I'm watching Eiffel closely.

>            While I'd miss the conciseness of C, I simply don't
>    understand people who feel that being force to adhere to their own
>    type abstractions intolerably cramps their style. 

Ah. Now we come to the crux of the matter. My gripe with the B&D languages
isn't "strong typing" -- I *like* strong typing. I write in ADT style myself
(you must have seen my mildly evangelistic postings on the virtues of abstract
data type programming in comp.lang.c!).

My problem with B&D languages is that they have strong typing *with no escape
mechanism* -- and no way to represent the 'real' machine-level entities needed
for systems programming. And primitive data type sets poorly matched to real-
world application programming on real-world machines.

C's great virtue -- the one that makes me a fan despite its obvious flaws -- is
that for a large class of machine architectures and problems it gets the trade-
off between cleanness of type abstraction and fit of primitives to architecture
*right*. It was brilliant of Thompson and Ritchie to understand those issues as
well as they did; and in teaching that understanding to the world, I think they
advanced language design far more than the B&D languages have.

For another example of similar strengths, consider LISP -- also a `minimalist'
language based on an astute choice about fit-to-architecture; also, like C,
enduring and adaptable because its `open world' type paradigm has left it room
to evolve.

The thing that makes a 'bondage & discipline' language B&D is that there is
*no esacape* from whatever paradigmatic shortsightednesses got built in. Other
characteristic-of-breed problems like impoverished control structures,
verbosity, and the kind of chrome-and-tailfins featuritis you see most
developed in ADA are symptoms of the same basic problem; B&D-language designers
are all by definition arrogant enough to have believed that *their* programming
paradigm, *their* primitive data type set, *their* preferred style of
algorithm representation is the One True Way before which all mere mortals
should bow down in awe.

>                                                      My experience is
>    that all well written programs have a well (but maybe not
>    explicitly) defined set of data types anyway, strongly typed
>    languages simply protect against careless errors using these types.

I agree with this as far as it goes, but `strongly typed' isn't the issue here.
The issue is whether the kind and level of type protection you get is the
*designer's* choice or *your* choice!
 
> 2. "They" are neither European nor the same folks.  The Modula-3
>    design team is more closely related to the people who created the
>    Xerox Parc set of B&D languages which culminated in Cedar.

O.K. Perhaps there's hope for Modula-3 yet. There are some interesting ideas
in the Cedar family, and I agree with your assessment of it. However, I feel
that history justifies a certain skepticism and even cynicism on the issue.

After all...who *needs* another conventional (that is to say, Algol/FORTRAN/
BASIC-descended) procedural language right now? I think it's clear that the
expressive potential of such languages has been pushed to its limit already;
the action now is in second-generation OO languages like C++ and Eiffel, or
in more exotic areas like pure-functional or non-procedural languages.

Perpetrating yet another conventional B&D language on the world seems to me to
be a silly waste of time at best, much like announcing the ultimate buggy
whip when everybody knows automobiles are the coming thing. We already know
how to do better!
-- 
      Eric S. Raymond                     (the mad mastermind of TMN-Netnews)
      Email: eric@snark.uu.net                       CompuServe: [72037,2306]
      Post: 22 S. Warren Avenue, Malvern, PA 19355      Phone: (215)-296-5718

mccalpin@loligo.fsu.edu (John McCalpin) (12/30/88)

In article <eZCUN#34OkqV=eric@snark.UUCP> (Eric S. Raymond) writes:

>My problem with B&D languages is that they have strong typing
>*with no escape mechanism* -- and no way to represent the 'real'
 ^^^^^^^^^^^^^^^^^^^^^^^^^^
>machine-level entities needed for systems programming. And primitive
>data type sets poorly matched to real-world application programming
>on real-world machines.

Attacking this problem was one of the major goals of the Turing language
recently reviewed in the Communications of the ACM....  I know that some
Turing people read this group - any comments?

>After all...who *needs* another conventional (that is to say, Algol/FORTRAN/
>BASIC-descended) procedural language right now? I think it's clear that the
>expressive potential of such languages has been pushed to its limit already;

Although I agree that the expressive potential of Algol-style procedural
languages has already been "expressed", it has not done so in a *single*
language (with the possible exception of Algol-68 :-)).  

I work in the field of high-performance scientific computing, and I have
no trouble claiming that there does not exist a "good" scientific programming
language for vector and parallel architectures.  There is no reason why
it cannot be done in the good old Fortran or Algol styles, it just has not
been done yet.

What I want is a strongly-typed procedural language that:
(1) understands data structures;
(2) provides an expressive and concise array syntax;
(3) allows for user specification of the precision of variables
    and constants in some machine-independent manner;
(4) allows specification of data-dependencies to aid coarse-grain
    parallelization;
(5) exists and produces good code on CDC/ETA and Cray supercomputers,
    and on my IRIS workstation :-) !

Perhaps something like the Fortran-8X extensions added to a Pascal-like
base language....

>      Eric S. Raymond                     (the mad mastermind of TMN-Netnews)
>      Email: eric@snark.uu.net                       CompuServe: [72037,2306]

John D. McCalpin
mccalpin@masig1.ocean.fsu.edu
mccalpin@nu.cs.fsu.edu
mccalpin@fsu	(BITNET or MFENET)
SCRI::MCCALPIN	(SPAN)

pierson@mist (Dan Pierson) (12/31/88)

In article <eZCUN#34OkqV=eric@snark.UUCP>, eric@snark (Eric S. Raymond) writes:

It looks like we agree much more that I thought.

>>               I think that world really needs a strongly typed
>>    language that is powerful, flexible, and efficient enough for
>>    production use while remaining portable and simple enough to be
>>    comprehensible and implementable. 
>
>I agree. That language is called C++ -- or, if you value "safety" a bit
>higher, Eiffel.

I like C++ too.  The only bad thing about it is that it seems so
destined to succeed big that reasonable competitors don't have a
chance.  Also C++ still lacks exception handling which I rate about
equal to object orientation as an essential language feature.  While
this hole will probably be filled eventually, real implementations
will lack it for some time to come.

Eiffel is very interesting.  It's chance of success will probably
depend on whether true competitive implementations appear.
Unfortunately, I can't name a single proprietary language that's made
it big; probably because the entry cost is too high for it to get a
critical mass of users.

From recent Eiffel postings, it looks like the Eiffel folks are going
for a second generation lock-out.  They'll let "anyone" license the
language design for free (would that include an agreement that FSF
would be likely to accept?) but intend to continue developing the
language and standard library under their control.  This appears to
make all "competitive" implementations second-class citizens who get
to spend all their time playing catch-up.

>Ah. Now we come to the crux of the matter. My gripe with the B&D
>languages isn't "strong typing" -- I *like* strong typing. I write in
>ADT style myself (you must have seen my mildly evangelistic postings
>on the virtues of abstract data type programming in comp.lang.c!).

Unfortunately I don't normally read comp.lang.c.  I just resubscribed
yesterday and noticed a number of your postings for the first time.

>My problem with B&D languages is that they have strong typing *with
>no escape mechanism* -- and no way to represent the 'real'
>machine-level entities needed for systems programming. And primitive
>data type sets poorly matched to real- world application programming
>on real-world machines.

In general, I agree, however note the following from page 41 of the
Modula-3 spec:

    "An unchecked type transfer operation has the form:
    	LOOPHOLE(e, T)
     where e is an expression whose type is not an open array type and
     T is a type."

Of course, this is only available in an UNSAFE module.  The assumtion,
straight from Cedar, is that the vast majority of modules are SAFE and
that this sort of code can be localized in special modules which are
exceptionally thoroughly tested.

>For another example of similar strengths, consider LISP -- also a
>`minimalist' language based on an astute choice about
>fit-to-architecture; also, like C, enduring and adaptable because its
>`open world' type paradigm has left it room to evolve.

As a Lisp developer, how can I not agree?

>The thing that makes a 'bondage & discipline' language B&D is that
>there is *no esacape* from whatever paradigmatic shortsightednesses
>got built in. Other characteristic-of-breed problems like
>impoverished control structures, verbosity, and the kind of
>chrome-and-tailfins featuritis you see most developed in ADA are
>symptoms of the same basic problem;

I agree, one of the things that most attracts me to Modula-3 is that
they succeeded in limiting themselves to a language with a 50 page
readable spec.  One thing the world does not need is gargantuan
languages like Ada that are unreasonably difficult to teach,
understand, and implement (yes, I know, and why is Common Lisp so
bloated). 

>After all...who *needs* another conventional (that is to say,
>Algol/FORTRAN/ BASIC-descended) procedural language right now? I
>think it's clear that the expressive potential of such languages has
>been pushed to its limit already; the action now is in
>second-generation OO languages like C++ and Eiffel, or in more exotic
>areas like pure-functional or non-procedural languages.

I agree to the extent that I think Eiffel is one of the worthy
competitors of Modula-3 (did I mention that Modula-3 also is an OO
language with single inheritance and default methods?).  C++ strikes me
as the successor of C, and therefore not competive with either
language in the design arena; it will win the commercial competition
no matter what its merits are.
-- 
                                            dan

In real life: Dan Pierson, Encore Computer Corporation, Research
UUCP: {talcott,linus,necis,decvax}!encore!pierson
Internet: pierson@multimax.encore.com

boehm@titan.rice.edu (Hans Boehm) (12/31/88)

  I agree with most of the points made in this discussion, but Dan Pierson
included one sentence that troubles me:

> Also C++ still lacks exception handling which I rate about
> equal to object orientation as an essential language feature.

  I disagree somewhat about the importance of exception handling, but that's
beside the point.  I'm troubled by the view that "object orientation"
(or exception handling) should be a language feature.  I agree that
object-oriented programming is an extremely useful methodology.  But
casting it in stone by directly embedding one view of it into the language
design seems to be precisely what the "Bondage & Discipline" languages are
about  (although they of course generally did it for a less modern
methodology).
  I would certainly agree that a language should make it easy to program
using an object oriented methodology.  But I would be much more convinced
if this happened because the language design was sufficiently general
that it could express the necessary concepts rather
than because someone specifically tacked on the necessary
constructs.  Both classes and objects are really just tuples of things.
Inheritance amounts to adding elements to a tuple.  If I can't express these
without adding new language constructs, isn't there something wrong with my
language that has little to do with object orientation?  I also wouldn't
have much confidence that it could survive the next minor change in
methodology.
  Similarly, if I want exceptions, I would be happier with first-class
continuations, perhaps together with a library implementing your favorite
style of exception handling, than I would be with a new language primitive.
  Admittedly, some of this raises incompletely resolved issues
in language and compiler design (which is of course one legitimate reason
for the popularity of languages like C++).  But there are languages that
come close to achieving these things.  Scheme, as well as a variety of
more experimental statically typed languages come to mind.
  I may have read a lot into Dan Pierson's statement that he didn't
think he said.  If so, I apologize.

Hans-J. Boehm
boehm@rice.edu

dan-hankins@cup.portal.com (Daniel B Hankins) (12/31/88)

In article <eZCUN#34OkqV=eric@snark.UUCP> eric@snark.UUCP (Eric S. Raymond)
writes:

>Wanna start a pool on the announcement date of Modula-4?

     Have a look at Oberon.  Save for its omission of multitasking, it
appears to be a winner.  Very small language, small compiler, highly
optimizing, more expressive power than C or Modula-2 while still capable of
getting down and dirty with the machine.

>My problem with B&D languages is that they have strong typing *with no
>escape mechanism* -- and no way to represent the 'real' machine-level
>entities needed for systems programming. And primitive data type sets
>poorly matched to real- world application programming on real-world
>machines.

     Modula-2 certainly *does* have an escape mechanism - type casts are
perfectly legal.  And the primitive data types of BYTE and WORD should take
care of just about all the rest.

>the action now is in second-generation OO languages like C++ and Eiffel,
>or in more exotic areas like pure-functional or non-procedural languages.

     Ummm, OO languages are, strictly speaking, non-procedural (unless they
are hybrids such as C++ or Eiffel).  Nobody could accuse Smalltalk or Self
of being procedural, yet they are two of the most OO languages around.
     But in general, I'll agree with this statement.  It's really time to
finish up futzing around with procedural languages and get into OO bigtime.
The major problem is that there are *so* many programmers out there who
have a very hard time in thinking in any but the procedural paradigm.
     Eiffel and Oberon might be two ways to gradually introduce the timid
to the concepts of OO languages, rather like building an automobile shaped
like a horse-drawn carriage, only without the horses.


Dan Hankins

peter@ficc.uu.net (Peter da Silva) (01/01/89)

Dan Hankins says Smalltalk is nonprocedural.

Funny, I always though 'procedural' referred to control flow. So a non-
procedural language would be something like a declarative language (Prolog,
for example) or a dataflow language (don't know of any offhand, apart from
ladder diagrams).
-- 
Peter da Silva, Xenix Support, Ferranti International Controls Corporation.
Work: uunet.uu.net!ficc!peter, peter@ficc.uu.net, +1 713 274 5180.   `-_-'
Home: bigtex!texbell!sugar!peter, peter@sugar.uu.net.                 'U`
Opinions may not represent the policies of FICC or the Xenix Support group.

peter@ficc.uu.net (Peter da Silva) (01/01/89)

I mentioned in the previous message that I couldn't think of any dataflow
languages, off the top of my head. Of course I should be given a good swift
kick for forgetting Icon here...
-- 
Peter da Silva, Xenix Support, Ferranti International Controls Corporation.
Work: uunet.uu.net!ficc!peter, peter@ficc.uu.net, +1 713 274 5180.   `-_-'
Home: bigtex!texbell!sugar!peter, peter@sugar.uu.net.                 'U`
Opinions may not represent the policies of FICC or the Xenix Support group.

oster@dewey.soe.berkeley.edu (David Phillip Oster) (01/03/89)

Dataflow languages? Don't forget our favorite:

% cat languagelist | grep dataflow | awk '{ printf $2  "is dataflow!\n" }'
sh is dataflow!
csh is dataflow!
ksh is dataflow!

looks like dataflow to me!

gudeman@arizona.edu (David Gudeman) (01/03/89)

In article  <2594@ficc.uu.net> peter@ficc.uu.net (Peter da Silva) writes:
>I mentioned in the previous message that I couldn't think of any dataflow
>languages, off the top of my head. Of course I should be given a good swift
>kick for forgetting Icon here...

Ahem.  I hate to nit-pick, but my understanding of dataflow languages
is that they are non-procedural languages based on something similar
to circuit diagrams.  Icon is an expression-based procedural language
where expressions may produce multiple results under goal-directed
evaluation (sort of like Lisp with more readable syntax and Prolog's
backtracking mechanism).  No doubt Mr. da Silva was thinking of some
other language.

robert@island.uu.net (Robert Leyland) (01/03/89)

Ok folks, time to add some Worcestorshire sauce to the fire.

Check out the latest issue of Communications of the ACM. It has a desciption
of a language (called Turing) which escapes many of the S&M aspects of some
languages, while retaining the elegance and simplicity required for minimalists.

I haven't used this language, but the preview in that article certainly made me
want to look for it. (If anyone has details please mail them, I'll post a
follow up, inparticular I'd like either a Macintosh (MPW) or IBM PC (yech)
version).

One of the nicest features of the language is that it is simple enough for
beginning students to pick up and learn easily, and with a defined set of
extensions powerful enough to rival C in getting "close" to the machine.

I also, particularly, appreciate the removal of silly requirements like 
semicolons at the end of statements.

enough for know,
rob sez check it out...

References: CACM Vol 31 #12 December 1988, "The Turing Programming Language"
R.C. Holt and J.R.Cordy Pp 1410-

PS. anyone else notice how much better CACM has been getting recently?

-- 
Robert Leyland - Island Graphics, 4000 Civic Ctr Dr #400, San Rafael, CA 94903 
sun!island!robert - (415) 491-1000 - GEnie: r.leyland - usual disclaimers apply
Utopia is a nice place to visit but I wouldn't want to live there. I'd be bored!

daveh@cbmvax.UUCP (Dave Haynie) (01/04/89)

in article <2593@ficc.uu.net>, peter@ficc.uu.net (Peter da Silva) says:

> Dan Hankins says Smalltalk is nonprocedural.

> Funny, I always though 'procedural' referred to control flow. 

Well, I'm sure he means nonprocedural, in that it's based on message passing
rather than procedure calling.  At least on the surface, though, they sure
looks much more alike than Prolog or the like.

> Peter da Silva, Xenix Support, Ferranti International Controls Corporation.

-- 
Dave Haynie  "The 32 Bit Guy"     Commodore-Amiga  "The Crew That Never Rests"
   {uunet|pyramid|rutgers}!cbmvax!daveh      PLINK: D-DAVE H     BIX: hazy
              Amiga -- It's not just a job, it's an obsession

peter@ficc.uu.net (Peter da Silva) (01/04/89)

In article <8527@megaron.arizona.edu>, gudeman@arizona.edu (David Gudeman) writes:
> In article  <2594@ficc.uu.net> peter@ficc.uu.net (Peter da Silva) writes:
> >I mentioned in the previous message that I couldn't think of any dataflow
> >languages, off the top of my head. Of course I should be given a good swift
> >kick for forgetting Icon here...

> Ahem.  I hate to nit-pick, but my understanding of dataflow languages
> is that they are non-procedural languages based on something similar
> to circuit diagrams.

The multiple-result feature of Icon is a non-procedural dataflow capability
built on top of the procedural kernel. It's very well integrated, so it's
easy to ignore, but it's really an amazing capability.

> (sort of like Lisp with more readable syntax and Prolog's backtracking
> mechanism).

Not really that much like Lisp, but it's definitely got a lot in common
with Prolog. Where it differs from prolog is that the data stream is
built explicitly by a procedure rather then implied by the database.

> No doubt Mr. da Silva was thinking of some other language.

Nope. And we don't need to be so formal... you can call me Peter. Just
not "Pete".
-- 
Peter da Silva, Xenix Support, Ferranti International Controls Corporation.
Work: uunet.uu.net!ficc!peter, peter@ficc.uu.net, +1 713 274 5180.   `-_-'
Home: bigtex!texbell!sugar!peter, peter@sugar.uu.net.                 'U`
Opinions may not represent the policies of FICC or the Xenix Support group.

eugene@eos.UUCP (Eugene Miya) (01/04/89)

In article <27309@ucbvax.BERKELEY.EDU> oster@dewey.soe.berkeley.edu.UUCP (David Phillip Oster) writes:
>Dataflow languages? Don't forget our favorite:
>
>% cat languagelist | grep dataflow | awk '{ printf $2  "is dataflow!\n" }'
>sh is dataflow!
>csh is dataflow!
>ksh is dataflow!
>
>looks like dataflow to me!

I first heard this comparison given by Mike O'Dell (then at LBL).
While the pipeline is neat (i.e., in the beginning was the pipe, and the
pipe was good....), I didn't quite believe it.  Time passed.  Then David
posted this; sorry, David.  Fortunately, Jack Dennis is now working down the
hall, I asked him about my gut uneasiness, and he resolved something
I could not:

# Date: Tue, 3 Jan 89 15:36:30 PST
# From: Jack Dennis <dennis@riacs.edu>
# To: dennis@riacs.edu, eugene@eos.arc.nasa.gov
# Subject: Re:  Question?
# Status: R
# 
# Are Unix shell languages "data flow" languages?  --  Not really. They use
# the notion of composing stream functions, however since the individual
# func may cause "side effects" on files, I would not call them pure
# functional, and therefore they are not data flow.
# 
#     -j

Another gross generalization from

--eugene miya, NASA Ames Research Center, eugene@aurora.arc.nasa.gov
  resident cynic at the Rock of Ages Home for Retired Hackers:
  "Mailers?! HA!", "If my mail does not reach you, please accept my apology."
  {uunet,hplabs,ncar,decwrl,allegra,tektronix}!ames!aurora!eugene
  "Send mail, avoid follow-ups.  If enough, I'll summarize."

gudeman@arizona.edu (David Gudeman) (01/04/89)

In article  <2608@ficc.uu.net> peter@ficc.uu.net (Peter da Silva) writes:
>In article <8527@megaron.arizona.edu>, gudeman@arizona.edu (David Gudeman) writes:
>
>> Ahem.  I hate to nit-pick, but my understanding of dataflow languages
>> is that they are non-procedural languages based on something similar
>> to circuit diagrams.
>
>The multiple-result feature of Icon is a non-procedural dataflow capability
>built on top of the procedural kernel. It's very well integrated, so it's
>easy to ignore, but it's really an amazing capability.

I guess my understanding of "dataflow" is different from yours (and
since I've never studied the subject, I'm willing to admit ignorance),
but Icon's multiple-result feature is definitely procedural in nature.
At least it is if you would call co-routines procedural.  Icon has a
subset of co-routines built in to every expression in such a way that
you can ignore them if you want, or you can often pretend that they
are declarative.  But the bottom line is that when you resume an
expression for another result, that expression gets control and it can
do anything it wants, from changing the value of a variable to exiting
a loop to quiting the program.

Example:

	while line := read() do {
		res := parse(line) | break
		       -------------------
		write(res)
		}

The underlined portion is a generator, an expression that can produce
multiple results.  If the function parse() produces a result, then
that result is assigned to res.  However the | operator says that if
the first argument does not produce a result (the function parse() may
fail), then the result is the result of the second argument.  If break
were a value, then this value would be assigned to res.  But break is
a control structure that exits the loop.  The net effect is that you
will keep reading lines, parsing them and printing the result until
end of file or you get a failure in parsing, then you will exit the
loop.

BTW: this is an example of a common Icon idiom: using failure as a
simple exception-handling mechanism.  Sort of like 0 is used in C or
nil is used in Lisp, but it can't be confused with any legitimate
value.

peter@ficc.uu.net (Peter da Silva) (01/05/89)

In article <2269@eos.UUCP>, eugene@eos.UUCP (Eugene Miya) writes:
> From: Jack Dennis <dennis@riacs.edu>
> # Are Unix shell languages "data flow" languages?  --  Not really. They use
> # the notion of composing stream functions, however since the individual
> # func may cause "side effects" on files, I would not call them pure
> # functional, and therefore they are not data flow.

I can't agree. That's like saying the only lisp is pure lisp, since in pure
lisp there are no side effects... only the return value of a function is
used.

Just because X has additional features other than those in a pure Y language,
doesn't mean that X isn't a Y language. The shell and Icon are dataflow
languages with side effects.
-- 
Peter da Silva, Xenix Support, Ferranti International Controls Corporation.
Work: uunet.uu.net!ficc!peter, peter@ficc.uu.net, +1 713 274 5180.   `-_-'
Home: bigtex!texbell!sugar!peter, peter@sugar.uu.net.                 'U`
Opinions may not represent the policies of FICC or the Xenix Support group.

peter@ficc.uu.net (Peter da Silva) (01/05/89)

In article <8540@megaron.arizona.edu>, gudeman@arizona.edu (David Gudeman) writes:
> I guess my understanding of "dataflow" is different from yours (and
> since I've never studied the subject, I'm willing to admit ignorance),
> but Icon's multiple-result feature is definitely procedural in nature.
> At least it is if you would call co-routines procedural.

I don't. A define a procedural language as one in which all modules have
a parent-child relationship with each other. I also don't classify languages
by implementation details... for example, SmallTalk uses messages to pass
data between procedures, but since they generally have a parent-child
relationship (one calls the other) they're still procedures. Icon uses
a stack to pass a stream of data between concurrently executing modules.
They have a source/drain relationship. It's non-procedural.
-- 
Peter da Silva, Xenix Support, Ferranti International Controls Corporation.
Work: uunet.uu.net!ficc!peter, peter@ficc.uu.net, +1 713 274 5180.   `-_-'
Home: bigtex!texbell!sugar!peter, peter@sugar.uu.net.                 'U`
Opinions may not represent the policies of FICC or the Xenix Support group.

eugene@eos.UUCP (Eugene Miya) (01/06/89)

In summary:
I followed-up David <27309@ucbvax.BERKELEY.EDU> (who was commenting to
Peter) by asking Jack Dennis about data flow and Unix shells <2269@eos.UUCP>
since he's here (The mortal equivalent of Marshall McCullan[sp]).
Peter replies that <2626@ficc.uu.net> with the classic comment about
pure lisp (basically Jack's comment is a nitpick).  Now we can go grab
McCarthy over at Stanford.  I think I want to stand out of the way.
Honest, I didn't know myself. I think you guys can call send mail to one
another.

I always wondered what was supposed to happen after that scene in Annie Hall.

Another gross generalization from

--eugene miya, NASA Ames Research Center, eugene@aurora.arc.nasa.gov
  resident cynic at the Rock of Ages Home for Retired Hackers:
  "Mailers?! HA!", "If my mail does not reach you, please accept my apology."
  {uunet,hplabs,ncar,decwrl,allegra,tektronix}!ames!aurora!eugene
  "Send mail, avoid follow-ups.  If enough, I'll summarize."

mac3n@babbage.acc.virginia.edu (Alex Colvin) (01/07/89)

> I can't agree. That's like saying the only lisp is pure lisp, since in pure
> lisp there are no side effects... only the return value of a function is
> used.
> 
> Just because X has additional features other than those in a pure Y language,
> doesn't mean that X isn't a Y language. The shell and Icon are dataflow
> languages with side effects.

true, the shell could be called a dataflow language if it ALLOWED
(not REQUIRED) you to write dataflow programs.

unfortunately, it doesn't.  you have to be careful about file use conflicts,
such as "filter <x >x".  no cycles (deadlocks).
not to mention the difficulty of anything but a straight-line pipe.
i'd look for something more like Lucid.

mac3n@babbage.acc.virginia.edu (Alex Colvin) (01/07/89)

does smalltalk allow computation of continuations (a` la scheme)?

does icon allow a computation (expression?) to generate several unsynchronized
result streams?

dan-hankins@cup.portal.com (Daniel B Hankins) (01/08/89)

In article <2630@ficc.uu.net> peter@ficc.uu.net (Peter da Silva) writes:

>I don't. I define a procedural language as one in which all modules have a
>parent-child relationship with each other. I also don't classify languages
>by implementation details... for example, SmallTalk uses messages to pass
>data between procedures, but since they generally have a parent-child
>relationship (one calls the other) they're still procedures.

     Hmmm.  By this definition, Prolog would have to be procedural. 
Attempting to unify a clause results in a parent-child call to its
subclauses.

     On the other hand, both ConcurrentSmalltalk and my language Theme
would have to be non-procedural because the message sends are real message
sends, not disguised procedure calls.

     Is this really what you meant to say?


Dan Hankins

rjh@cs.purdue.EDU (Bob Hathaway) (01/09/89)

Lets please stop using the term B&D languages, this is a bad
analogy and a heavily biased opinion.  Maybe I can't adequately 
express classes or model abstractions in expression-based 
language X and feel similarly constrained.  This shows the
term 'B&D' can be applied from almost any paradigm or style 
of programming to any other and is semantically worthless.
Lets be more precise and use unambiguous terms such as
strongly, weakly, or dynamically typed languages so we don't have
to type 'k' so often.

rjh

gudeman@arizona.edu (David Gudeman) (01/09/89)

In article  <488@babbage.acc.virginia.edu> mac3n@babbage.acc.virginia.edu (Alex Colvin) writes:
>...
>does icon allow a computation (expression?) to generate several unsynchronized
>result streams?

Yes and no.  It depends on what you mean by ``unsynchronized''.  Icon
does allow result sequences to be liberated from their immediate
context with co-expressions, so the results can be gathered at the
programmer's leisure rather than in a depth-first order.  But Icon
doesn't support parallelism.

However, there is a language based on Icon that uses generators as a
basis for parallelism.  Quite an interesting feature.  The languages
is experimental, it's not distributed or supported.

peter@ficc.uu.net (Peter da Silva) (01/09/89)

In article <13293@cup.portal.com>, dan-hankins@cup.portal.com (Daniel B Hankins) writes:
> In article <2630@ficc.uu.net> peter@ficc.uu.net (Peter da Silva) writes:
> >I don't. I define a procedural language as one in which all modules have a
> >parent-child relationship with each other....

>      Hmmm.  By this definition, Prolog would have to be procedural. 
> Attempting to unify a clause results in a parent-child call to its
> subclauses.

Hmmm. Maybe there should be something in there about explicit relationships,
or something. Or maybe 'procedural' is something in the mind of the programmer.
A Prolog program looks more like a homogenous database... hmmm...

Of course I'm not going to attempt to defend Prolog as being or not
being procedural... I'm not a Prolog fan. In fact I'm pretty down on it.

>      On the other hand, both ConcurrentSmalltalk and my language Theme
> would have to be non-procedural because the message sends are real message
> sends, not disguised procedure calls.

I would say any language that uses concurrency as one of its basic paradigms
is pretty non-procedural. What does "Theme" look like?

Personally, I'd much rather program in Concurrent C than Objective C.

>      Is this really what you meant to say?

I don't know. It's pretty close to what I meant to say.
-- 
Peter da Silva, Xenix Support, Ferranti International Controls Corporation.
Work: uunet.uu.net!ficc!peter, peter@ficc.uu.net, +1 713 274 5180.   `-_-'
Home: bigtex!texbell!sugar!peter, peter@sugar.uu.net.                 'U`
Opinions may not represent the policies of FICC or the Xenix Support group.

eric@snark.uu.net (Eric S. Raymond) (01/11/89)

(begin half-smiley mode...

In <5795@medusa.cs.purdue.edu>, rjh@cs.purdue.edu (Bob Hathaway) writes:
> Lets please stop using the term B&D languages, this is a bad
> analogy and a heavily biased opinion.

I've promulgated the usage you're objecting to because I think it's a *good*
analogy, at least good enough for semi-serious rhetorical purposes. I would be
willing to switch to alternate terminology. If you prefer political obscenity
to sexual reference, this libertarian would be quite happy to substitute
`totalitarian language' for 'bondage & discipline language' in communicating
with you.

>                                       Maybe I can't adequately 
> express classes or model abstractions in expression-based 
> language X and feel similarly constrained.

Quite possibly. You're thinking of things like Backus's pure-functional
language aren't you? Yes, that has the B&D nature. So does Prolog. Don't
for a minute think I reserve my spleen for *obvious* examples of the breed...

>                                            This shows the
> term 'B&D' can be applied from almost any paradigm or style 
> of programming to any other and is semantically worthless.

I disagree. Perhaps you missed my original definition. To attain the B&D
nature, a language must be a) wedded to some *one* 'high-level' programming
philosophy known to be inadequate for general-purpose programming, and b) lack 
the generality or the low-level 'escape' constructs that would permit other
styles of system organization.

Thus, for example, APL is less hard-core B&D than, say, Prolog -- because it
has a 'goto' construct that permits alternatives to the preferred applicative
style (this observation should *not* be construed as a defense of
goto-intensive spaghetti-coding!).

> Lets be more precise and use unambiguous terms such as
> strongly, weakly, or dynamically typed languages so we don't have
> to type 'k' so often.

*<chortle>* So, you think these terms are unambiguous, do you? I think
I'll let someone else tackle *that* grand illusion!

Hey, look, B&D languages have their uses. For some people. I'd be the last to
try and legislate morality in the hack-room. What goes on between a consenting
programmer and his or her machine is strictly their business as long as no
third party is harmed. I just get annoyed when these people start evangelizing
for their kinks as though they'd found the Final Solution to the Programming
Problem...

...end half-smiley mode)
-- 
      Eric S. Raymond                     (the mad mastermind of TMN-Netnews)
      Email: eric@snark.uu.net                       CompuServe: [72037,2306]
      Post: 22 S. Warren Avenue, Malvern, PA 19355      Phone: (215)-296-5718

david@indetech.UUCP (David Kuder) (01/13/89)

In article <edcpu#4E04mv=eric@snark.uu.net> eric@snark.uu.net (Eric S. Raymond) writes:
>Quite possibly. You're thinking of things like Backus's pure-functional
>language aren't you? Yes, that has the B&D nature. So does Prolog. Don't
>for a minute think I reserve my spleen for *obvious* examples of the breed...
>
I think your use of B&D just got too broad.  Every language has a paradigm,
Prologs may be other than procedural but it isn't any more constricting than
C or LISP.  As far as it goes, it has always struck me as freeing rather than
binding.  It does have a certain discipline to it but what language doesn't?
Even this verdammit English stuff has rules that insure that things are
understood.

Speaking of *obvious* examples, what isn't a B&D language?  Is there a better
way of differentiating it from, for example, APL than calling one B&D?
-- 
____*_  David A. Kuder              {sun,sharkey,pacbell}!indetech!david
\  / /  Independence Technologies
 \/ /   42705 Lawrence Place        FAX: 415 438-2034
  \/    Fremont, CA 94538           Voice: 415 438-2003

eric@snark.uu.net (Eric S. Raymond) (01/15/89)

In article <1226@indetech.uucp>, david@emerald.UUCP (David Kuder) writes:
> I think your use of B&D just got too broad.

I was *wondering* how long it would be before some nettled Prolog partisan
spoke up...:-)

>                                             Every language has a paradigm,
> Prologs may be other than procedural but it isn't any more constricting than
> C or LISP.

You couldn't prove that by me, friend -- or by half the Prolog programmers I
know! This much I'll give Prolog, that it's at least compulsive about some
interesting and useful ideas. More so than APL. *Much* more so than Pascal.

>            As far as it goes, it has always struck me as freeing rather than
> binding.

Well, yes -- *if* the things that you care about can be modeled by Horn
clauses. The trouble is that there are lots of important things that cannot,
that are intrinsically stateful/sequential/procedural. Consider I/O, for
example, carefully.

> Speaking of *obvious* examples, what isn't a B&D language?

C. C++. Lisp. Basic. Fortran. Any assembler. These languages escape the
category by including enough low-level primitives to support just about any
programming style that's even vaguely procedural; of course, you may have to
give up a lot of the language's expressive power to do so.

Smalltalk and (possibly) Algol-68 escape the category because, although they
are wedded to particular programming paradigms, they include enough power
and extensibility that you can customize your way out from under the designers'
assumptions if you need to.

>                                                            Is there a better
> way of differentiating it from, for example, APL than calling one B&D?

Sure. Does a language simply *support* some bizarre and interesting way new of
thinking about algorithms, or does enforce the method with such religious
fervor that you can't do anything else, *even though the method is demonstrably
inadequate for general-purpose programming*?
-- 
      Eric S. Raymond                     (the mad mastermind of TMN-Netnews)
      Email: eric@snark.uu.net                       CompuServe: [72037,2306]
      Post: 22 S. Warren Avenue, Malvern, PA 19355      Phone: (215)-296-5718

holt@turing.toronto.edu (Ric Holt) (01/16/89)

A "puritanical language" is one in which you necessarily use
only the semantics provided by the language.
	Turing proper is one of these languages.

A "permissive language" is one in which you are allowed to access
details of the underlying implementation.
	Turing Plus and C are such languages.

sommar@enea.se (Erland Sommarskog) (01/17/89)

Eric S. Raymond (eric@snark.uu.net) writes:
>> Speaking of *obvious* examples, what isn't a B&D language?
>
>C. C++. Lisp. Basic. Fortran. Any assembler. These languages escape the
>category by including enough low-level primitives to support just about any
>programming style that's even vaguely procedural; of course, you may have to
>give up a lot of the language's expressive power to do so.

I must admit that I have found this discussion somewhat phoney. What is
B&D must be totally subjective. To me C seems like a typical example.
The programmer gets stuck in a bondage of discipline and has to think 
of irrelevant that a language like Ada saves him from. (Which Eric's  
last line also says in a way.)

But to throw some new wood on the fire, consider the following: Assume
you have routine you want to call but whose name you don't know until
run-time, thus you have the name in a string. Now in which langauges
can you easily do this? Interpreting langauges like Lisp and Basic,
support this I guess. But compiled langauges?
-- 
Erland Sommarskog
ENEA Data, Stockholm              This signature is not to be quoted.
sommar@enea.se

pds@quintus.uucp (Peter Schachte) (01/17/89)

In article <eeuqR#3lcVcX=eric@snark.uu.net> eric@snark.uu.net (Eric S. Raymond) writes:
>> Speaking of *obvious* examples, what isn't a B&D language?
>C. C++. Lisp. Basic. Fortran. Any assembler.

Gee, the last time I used C, the garbage collector didn't seem to work.
Oh, you mean I'm BOUND to manage memory myself?  I have to DICIPLINE
myself to make sure I free memory I'm not using anymore?

I think we need a narrower definition of B&D. Like, maybe, "a language
which doesn't allow the programmer to do everything the hardware
allows."  Note that this definition factors in the hardware.  All the
langauges you mention, except assembler, would be B&D on a vector
processor.  APL might be a better choice on such an architecture.  A
while back, someone built a machine designed to do combinator reduction.
On such a machine, SASL would be a good choice; on a 680x0, SASL would
be pretty far from the hardware.
-Peter Schachte
pds@quintus.uucp
..!sun!quintus!pds

peter@ficc.uu.net (Peter da Silva) (01/17/89)

In article <4246@enea.se>, sommar@enea.se (Erland Sommarskog) writes:
> But to throw some new wood on the fire, consider the following: Assume
> you have routine you want to call but whose name you don't know until
> run-time, thus you have the name in a string. Now in which langauges
> can you easily do this? Interpreting langauges like Lisp and Basic,
> support this I guess. But compiled langauges?

I do this all the time in 'C', for one reason or another. Many of my
interactive programs have the equivalent of this in them. It's more
painful to implement this in a language without aggregate initialisation,
of course. I can't imagine doing without this capability. Chopping up a
line into argv/argc is an excersize left to the reader.

struct {
	char *fname;
	int (*fcode)();
} funtab[] = {
	"fname1", func1,
	"fname2", func2,
	"fname3", func3,
	...
};
int nfuns = sizeof funtab / sizeof *funtab;

int call(name, argc, argv)
char *name;
int argc;
char *argv;
{
	int i;

	for(i = 0; i < nfuns; i++)
		if(strcmp(name, funtab[i].fname) == 0)
			return (*funtab[i].func)(argc, argv);
	return 0;
}
-- 
Peter da Silva, Xenix Support, Ferranti International Controls Corporation.
Work: uunet.uu.net!ficc!peter, peter@ficc.uu.net, +1 713 274 5180.   `-_-'
Home: bigtex!texbell!sugar!peter, peter@sugar.uu.net.                 'U`
Opinions may not represent the policies of FICC or the Xenix Support group.

blarson@skat.usc.edu (Bob Larson) (01/18/89)

In article <4246@enea.se> sommar@enea.se (Erland Sommarskog) writes:
>But to throw some new wood on the fire, consider the following: Assume
>you have routine you want to call but whose name you don't know until
>run-time, thus you have the name in a string. Now in which langauges
>can you easily do this? Interpreting langauges like Lisp and Basic,
>support this I guess. But compiled langauges?

Info/Basic  (Assuming you consider p-code languages compiled.)

Most any language under Primos: Pl/I, C, FORTRAN, PMA, etc.  The
language does need to support procedure pointers and some way to do
type punning, (or this part can be done in another language) and the
routine called must be in one of the libraries in the entry$ search
rules.

-- 
Bob Larson	Arpa: Blarson@Ecla.Usc.Edu	blarson@skat.usc.edu
Uucp: {sdcrdcf,cit-vax}!oberon!skat!blarson
Prime mailing list:	info-prime-request%ais1@ecla.usc.edu
			oberon!ais1!info-prime-request

sam@csri.toronto.edu (Samuel Weber) (01/18/89)

In article <eeuqR#3lcVcX=eric@snark.uu.net> eric@snark.uu.net
                                            (Eric S. Raymond) writes:
>In article <1226@indetech.uucp>, david@emerald.UUCP (David Kuder) writes:
>> Speaking of *obvious* examples, what isn't a B&D language?
>
>C. C++. Lisp. Basic. Fortran. Any assembler. 

What!!!  I am willing to admit that Lisp might not be B&D, but C and
C++ are unquestionably one of the worst bondage and disipline languages
around!  Both of these languages force one to adhere to an artificial
program/data distinction, as if there was some carved-in-stone
declaration of which bytes happened to be code, and which data.  If
I want to write self-modifying code, and the language prevents me
because the designer thought that self-modifying code was a 'bad thing',
one can hardly state that the language is not totalitarian!  What is
especially irritating is that even though many people, such as the
designers of Lisp, approved of self-modifying code, the designers
of C and C++ decided to single-handedly legislate it out of existance.

Conclusion:
  If you are going to disapprove of "B&D" languages, you should
realize that you are also arguing against C and C++.
-- 
    --Sam Weber               "Little Birds are bathing
    sam@csri.toronto.edu         Crocodiles in cream, Like a happy dream:
                               Like, but not so lasting--
        (quote by              Crocodiles, when fasting,
      Lewis Carroll)             Are not all they seem!"

elg@killer.DALLAS.TX.US (Eric Green) (01/19/89)

in article <8901180542.AA20739@yorkville.csri.toronto.edu>, sam@csri.toronto.edu (Samuel Weber) says:
> In article <eeuqR#3lcVcX=eric@snark.uu.net> eric@snark.uu.net
>>In article <1226@indetech.uucp>, david@emerald.UUCP (David Kuder) writes:
>>> Speaking of *obvious* examples, what isn't a B&D language?
>>C. C++. Lisp. Basic. Fortran. Any assembler. 
> What!!!  I am willing to admit that Lisp might not be B&D, but C and
> C++ are unquestionably one of the worst bondage and disipline languages
> around!  Both of these languages force one to adhere to an artificial
> program/data distinction, as if there was some carved-in-stone
> declaration of which bytes happened to be code, and which data.  If
> I want to write self-modifying code, and the language prevents me
> because the designer thought that self-modifying code was a 'bad
> thing',

Note that self-modifying code will break on most processors with
seperate C-cache and D-cache. The D-cache is usually write-through,
but not the C-cache. Writing code through the D-cache won't update the
cached code in the C-cache.

Also note that most modern operating systems (e.g. BSD4.[23]) page
code directly from the object file, and share this RAM image between
all instances of the running program. E.g. if you have four Emacs's
running, you only have a single instance of the code segment shared
amongst all four Emacsen. Self-modifying code would mean that the code
segment would no longer be sharable, meaning a MUCH higher
swapping/paging overhead. 

There are good reasons for not having self-modifying code. It is thus
silly to say that a language is "B&D" for not supporting it.

Re: what is NOT B&D: How about "any language in which you can write a
device driver is not B&D." Unfortunately, it's just as easy to write a
device driver in Pascal or Modula II as it is in "C" (although you
have to use unions to do so). 

> especially irritating is that even though many people, such as the
> designers of Lisp, approved of self-modifying code, the designers
> of C and C++ decided to single-handedly legislate it out of existance.

Hardware and OS designers legislated it out for efficiency reasons.
Self-modifying code in Lisp runs in the D-space, and is NOT shared
amongst processes. This has an obvious efficiency hit when you have
ten people all on the same system running that program.

--
Eric Lee Green    ..!{ames,decwrl,mit-eddie,osu-cis}!killer!elg
          Snail Mail P.O. Box 92191 Lafayette, LA 70509              
Netter A: In Hell they run VMS.
Netter B: No.  In Hell, they run MS-DOS.  And you only get 256k.