[net.lang] high-levelity

jc@mit-athena.ARPA (John Chambers) (12/26/84)

> ... (really, now, is C much higher level than assembly language?).

(No, but it's a higher-level language than most of its competitors. :-)

Come now, what does it mean to say that language X is "higher-level" 
than language Y?   We could start a very long debate on this subject.  
(Hint, hint....)

I'll throw out a definition for consideration, flaming, etc.  I will call
X "higher-level" than Y if it is generally possible to express concepts
(data structures, operations, flow of control, etc.) in fewer symbols in
X than in Y.  The definition of "lower-level" is left to the reader.

Note that by this definition only supplies a partial ordering.  Two 
languages may be so different that, depending on your application, 
either may require the smaller number of symbols.  I also won't listen 
to pickiness.  If most examples differ by only 50%, I will consider 
them to be the same level.  Some pairings, like APL and Prolog, are 
simply incommensurable.

This definition sounds intuitively like a useful one, but it sometime 
has results that partisans of various languages might find surprising.  
For example, Cobol is lower than assembly language.  PL/I and Ada tie 
with assembly language.  Pascal, Fortran and Basic are close, and barely 
above assembly language.  C comes out somewhat better, beating assembly 
language by about a factor of two.  Lisp, not surprisingly, comes out a 
bit higher, around 3 or 4.  APL, Snobol4, Forth, and Prolog and Smalltalk
come out much higher (around 10-20 for certain application areas, but only 
in the hands of a programmer that understands them.)

A related observation is that the time it takes me to make a chunk of
code work right is basically limited by how much I can see on a screen
at once.  (Yeah, I know about paper; it's about 2 orders of magnitude
slower.  Ever try running grep on a listing?)  Most terminals in the
real world are 80x24 or so; this is the practical limit to what I can
work on at once.  When I get ahold of some of Martillo's nice terminals
(not hard, he's right next door, and I know where the master key is.:-),
I'll be able to work on bigger functions.  But anyhow, the amount of code
it takes to express a concept is important.  The fewer symbols, the more
I can work on at once in my 2Kbyte window.  

I find it interesting and amusing that C, intended originally as a sort
of "structured assembly language" is able to express many concepts in fewer
symbols than its supposedly "high-level" competitors.  It's also interesting
and amusing that designing a language for ease of expressing low-level
"hardware" concepts such as pointers, absolute addresses, etc., resulted
in a language that is more portable than languages that were intended to
be portable (but rarely live up to the advertising very well).  I suspect
that it's not a fluke.  I think language designers should spend less time
flaming about the defects of C (which are many), and spend more time looking
at what makes this language better than most of its competitors for writing
the code it was designed for - operating systems, low-level drivers, etc.
Maybe eventually we might have a really high-level language that does what
C does, but does it a lot better.

Does anyone have another good (or at least interesting :-) definition of
high-level?  After all, people have been bandying the term about for years;
it's about time we had a definition so we could really tell which languages
are the advanced ones and which are just pretenders.

			John Chambers (Project Athena @ MIT)

g-frank@gumby.UUCP (12/28/84)

> I'll throw out a definition for consideration, flaming, etc.  I will call
> X "higher-level" than Y if it is generally possible to express concepts
> (data structures, operations, flow of control, etc.) in fewer symbols in
> X than in Y.  The definition of "lower-level" is left to the reader.
> 
> I think language designers should spend less time
> flaming about the defects of C (which are many), and spend more time looking
> at what makes this language better than most of its competitors for writing
> the code it was designed for - operating systems, low-level drivers, etc.
> Maybe eventually we might have a really high-level language that does what
> C does, but does it a lot better.
> 
> Does anyone have another good (or at least interesting :-) definition of
> high-level?  After all, people have been bandying the term about for years;
> it's about time we had a definition so we could really tell which languages
> are the advanced ones and which are just pretenders.
> 
> 			John Chambers (Project Athena @ MIT)

Of course, it's all in the eye of the beholder, and the most I can flame at
is the focus of the eye, eh?

In one sense, any definition is hopeless, given that "high" is a judgement
word, like "nice."  I find an interesting conflict in John's description.
First, he says that it's good to be able to express operations in a minimum of
symbols, in which case APL is the highest of the high.  Then he says that C
is best since it's good for writing operating systems in.  Which is it?  No
on in their right mind would write an operating system in APL (would they?).
So the definition is already flawed.

I think it's important to look at why programming languages were designed
in the first place.  Most of the time their designers wanted to be able to
express to the computer what they wanted to do in the most clear and natural
way possible.  They felt that assembly language didn't express their ideas
naturally.  I suspect that terseness, so beloved of C hackers, was not a
major goal.

For a while, designers concentrated on special purpose languages for string
handling, vector computation, etc.  Once again, they wanted a language to
model their particular application environment more accurately.  They felt
(as did the authors of C) that this would lead to higher productivity and
maintainability.

More recently, language designers have tried to solve software engineering
problems, designing languages that reduced coupling between modules, allowed
reusability of code, increased readability so that programs could be maintained
by people other than their authors, and permitted handling of exceptions in
a meaningful way.  None of these is particularly well done by C, yet each is
considered a "high-level" feature (if you need it, of course; otherwise it's
just "baggage").

A programming language may be considered just a means of communicating with
a computer, but it should not be forgotten that it is also a means of 
communicating with other programmers (including the original author, say in
three weeks or so).

And we still haven't mentioned the issue of provability of correctness!

mccaugh@uiucdcs.UUCP (12/30/84)

 Re: the question of hi-levelity--
     It seems to me that what eludes us in the way of definition is that we
     have yet to define "levelity" itself before we can assess the "hi-ness"
     of it...It was my understanding that Bell's classic on Computer Struct-
     ures might be a first resort to the problem: if by "level" we mean some
     "layer" of abstraction between programmer and bare machine,  then  per-
     haps the lowest-level languages are indeed the assembly languages  that
     are (except for macros) in 1-to-1 correspondence with the machine's own
     language. Alternatively, we might think of "hi-ness" of levels not only
     in terms of distance from the physical machine but (since they are lay-
     ers of "abstraction") also in terms of what virtual machine  does  play
     host to that language, e.g., the string-oriented machine that one might
     have in mind to interpret his Snobol program.  That is to say, "height"
     of the language level might pertain to the virtual machine instead  of
     the language, the usefulness of which concept is that then one can be-
     gin to think of equating languages level-wise if the virtual host  can
     interpret them both.


     uiucmsl!mccaugh

jejones@ea.UUCP (12/30/84)

Re high-level = able to express things in fewer symbols: how much of C's
advantage over Pascal, etc., would disappear if one behaved as the Algol 6x
reports request, and consider BEGIN, END, etc. to be one symbol? i.e. are
we counting characters or tokens?

						James Jones

ndiamond@watdaisy.UUCP (Norman Diamond) (12/31/84)

How's this for a first approximation to a definition of high-levelness:

If it is easier to translate between the problem being solved and a program
in language X, than between the problem and a program in language Y, then
X is higher-level than Y.  (Notice that this is two-way translation.  Those
programmers who are satisfied with write-only languages may alter this for
one-way translation, and define a different term.)

Here are additional thoughts:

If it is easier to translate a problem into a program than it is to translate
the program into machine code, then the language is at least moderately high-
level.  (This may give a bonus to write-only languages.  Anyone who can fix
this defect, please e-mail.)

If users of a language find their work easier than those who develop and
enhance compilers for it, then the language is at least moderately high-
level.

We could try a direct comparison between total time spent by all application
programmers using a particular compiler, and total time spent by all system
programmers who maintain the compiler.  After all, firms develop compilers
when they expect to have a lot of customers, and the customers expect to use
the compiler quite a bit.

So, nearly all present-day languages are still low-level.  True.

-- Norman Diamond

UUCP:  {decvax|utzoo|ihnp4|allegra|clyde}!watmath!watdaisy!ndiamond
CSNET: ndiamond%watdaisy@waterloo.csnet
ARPA:  ndiamond%watdaisy%waterloo.csnet@csnet-relay.arpa

"Opinions are those of the keyboard, and do not reflect on me or higher-ups."

smh@mit-eddie.UUCP (Steven M. Haflich) (12/31/84)

Norman Diamond (ndiamond@watdaisy.UUCP) defines an ordering function for
high-levelness:

>If it is easier to translate between the problem being solved and a program
>in language X, than between the problem and a program in language Y, then
>X is higher-level than Y.

This is an attractive formulation which directly addresses the
expressive `ease' of a language.  However, he then continues by
jumbling up the language with the hardware on which it runs:

>If it is easier to translate a problem into a program than it is to translate
>the program into machine code, then the language is at least moderately high-
>level.

The problem, of course, is that by implication a language's
high-levelness is penalized when running on `higher-level hardware'.  If
someone forges silicon that executes Prolog directly in microcode,
without compilation, does that make Prolog low-level?  Is C running on a
8086 higher level than when running on a VAX or 68000?

Soon more and more hardware will look less and less von Neumann.  At
least, I hope so! :-)

jc@mit-athena.ARPA (John Chambers) (12/31/84)

Hey, c'mon fellas!  I mean, it's fun to read criticism and take pot
shots at the pots shots, but where's your definition?  I admitted at
the start that mine was limited.  Let's hear some better ones.

If Lincoln had said the same things in 10,000 words, would we still
remember the Gettysburg Address?  Don't be silly!  Terseness counts.

I liked the comment about provability, perhaps because I can turn it 
around to support my liking of terseness.  I've played around with
provability, and one thing that is obvious is that difficulty of
proving correctness goes up as a very bad function of the number of 
tokens.  APL one-liners are usually easy to prove correct.  Pascal 
10-pagers are usually hopeless, even if they do the same thing in the 
same way.  I suspect that C is hopeless in this respect.   Or is it?

But provability is only loosely related to high-levility.  Or is it?

				John Chambers

g-frank@gumby.UUCP (01/01/85)

> But provability is only loosely related to high-levility.  Or is it?
> 
> 				John Chambers

This is the most interesting question I've heard all week.

Most of the definitions and discussions submitted so far on "high-levelity"
do deal, in one way or another, with the issue of "expressive ease."  Whether
speaking of ease of translation or natural expressivity, we all mean the same
thing.

Proof of correctness "works," in my limited experience, because constructs of
the pseudo-language in which such proofs are constructed correspond to actions
transformable into predicate calculus (does that make sense?).  A language 
allows programs to be proved correct when its constructs are so transformable,
and correct programs may be generated in such a language from well-defined
specifications.

Is there a connection between a "natural deduction system" and the "expressive
ease" mentioned above?  Yes and no.  Certainly such a system has expressive
rigour, and little or no ambiguity.  Whether such a system is indeed natural
has a lot to do with background and training.

Is the idea of expressive ease enough to define "high-level?"  BASIC programmers
will tell you that BASIC is high-level because it's "easy" to write in.  I think
that the more sophisticated the programmer's ideas and algorithms, the more he
or she demands of the language's expressiveness.  Does the programmatic calculus
approach represent the pinnacle of such expressiveness?  One argument for this
statement is that correct programs are generated directly from the specifica-
tions, and as a result the program "expresses" what it is to do, which is
"higher level" than a program that simply expresses how it is to be done.

jack@vu44.UUCP (Jack Jansen) (01/02/85)

The problem with all definitions given for 'high-levelness' is that
they use unmeasurable variables.
Besides that, it is probably impossible (and also not very interesting)
to compare two languages that have a completely different target,
for instance, COBOL and APL.
If you define 'high-levelness' as a function of the application
you want, how about this definition:

The degree of high-levelness of a language X for a problem Y is
defined as the size of the biggest subset of a set of programmers
who come up with the same solution, divided by the size of the
base set.

Or, in normal english, if you want to check how good COBOL is for
inverting matrices, you find yourself 100 COBOL programmers,
and tell them to write a program to invert a matrix, and
compare the results. You then divide the programmers into sub-sets
that used essentially the same algorithm (yes, I know, this is the
tricky part), count them, and the number of programmers in the biggest
set (divided by hundred) is a measure for the usefulness of COBOL
for inverting matrices.

After this, we could have even more fun, by asking 100 BASIC programmers
to write an operating system, 100 APL programmers to write a LISP
interpreter, 100 LISP programmers to write an APL interpreter, etc etc etc.
-- 
	Jack Jansen, {seismo|philabs|decvax}!mcvax!vu44!jack
	or				       ...!vu44!htsa!jack
If *this* is my opinion, I wasn't sober at the time.

g-frank@gumby.UUCP (01/03/85)

> If you define 'high-levelness' as a function of the application
> you want, how about this definition:
> 
> The degree of high-levelness of a language X for a problem Y is
> defined as the size of the biggest subset of a set of programmers
> who come up with the same solution, divided by the size of the
> base set.
> 
> 	Jack Jansen, {seismo|philabs|decvax}!mcvax!vu44!jack

One of my arguments for the high-levelness of programmatic calculus and related
languages was, in fact, that given a precise enough specification (ah, there's
the rub), different individuals will tend to come up with very similar code.
On the other hand, I've never been a grader in a class on the subject.  Can
anyone out there verify or make hash of this assertion?

jr@bbncca.ARPA (John Robinson) (01/04/85)

Newsgroups: net.lang
Subject: Re: High-levelity
References: <235@gumby.UUCP> <96@mit-athena.ARPA> <237@gumby.UUCP>

gumby!g-frank's observations about provability vs expressive
consistency vs the predicate calculus reminds me of some observations
Doug Lenat made during a talk last fall.  He was reviewing the success
of his PhD work, a program which was able to, given a small set of
axioms about mathematics, discover interesting theorems by use of a
surprisingly small set of hueristics like "look for interesting members
of a set and explore their properties."  [I fail to do his entertaining
presentation of the system justice here.  Also, I {red-faced} forget
the name - its successor of sorts is EURISKO, a program that reasons
about whatever body of knowledge you choose to innoculate it with.  If
you're interested, start searching with the Sep84 Scientific American.]

At any rate, perhaps the most cogent observation about the success of
his program was that it drew a lot of its power from the similarity of
the subject area (mathematics and predicate calculus) to the language
it was programmed in (LISP).  In part, this is because one of the ways
it searched for interesting new facts was by "mutation" of the LISP
code itself.  But I think the observation is really deeper than that.

So there does seem to be a clustering of the ideas of ability to
{express, prove} things in a language and its {high-levelity, ease of
use}.  I think Jack Jansen's observations about precision (how many
different programs will 100 COBOL programmers write?) relate to this as
well - if the language has no straightforward way to express a given
problem, programmers will arrive at any number of different solutions,
most of which lose the original problem expression in the details,
whereas when the language is appropriate to the problem, the usual
solution will just jump out at everyone.  I might even venture an
opinion that an expert system done well may be the creation of an even
more closely-targeted formal language that focuses on an even more
limited area of knowledge.  (You must stretch the definition of
"language" a bit to account for the interactive nature of these tools).

So the comparisons yield different measures of success of different
languages which depend on the subject area attacked using the language.
Thus, LISP proves to be useful in expressing ideas in the predicate
calculus and mathematics in general, and perhaps the popularity of C
relates to its ability to express what really are machine-oriented
notions (addresses, loops) in a way that is divorced from a particular
machine language, yet almost as precise while including (like Fortran
or Pascal) a standard arithmetic expression notation.  Unfortunately,
this also means that the ease of use is intimately tied to the intended
area of application of the language; thus the inevitable differences of
opinion among programmers who work in different environments with
different languages of choice.

/jr

jc@mit-athena.ARPA (John Chambers) (01/04/85)

> The degree of high-levelness of a language X for a problem Y is
> defined as the size of the biggest subset of a set of programmers
> who come up with the same solution, divided by the size of the
> base set.
> 
> 	Jack Jansen, {seismo|philabs|decvax}!mcvax!vu44!jack

This is one of the more enticing suggestions I've seen so far.  But 
it needs a little work, as there is one important qualification to
this approach.  There are some problems that have more than one real
solution.

A classical mathematical example is the high-school textbook proofs
that the base angles of an isosceles triangle are equal.  There are
two equally "fundamental" but different proofs.  One starts with
dropping a perpendicular from the apex to the opposite side, and
proving that the two resulting triangles are isomorphic (and right).
The other consists of showing that the original triangle is isomorphic
with its mirror image.  Both proofs end up with the angles in question
being the corresponding angles of isomorphic triangles, but two very
different triangles are used.

This would be considered by most mathematicians not a sign of the
weakness of Euclidean geometry, but rather of the power of the notation
used to express it.  Both proofs are simple and elegant; they are
not variants of a single underlying proof.  The language can handle
both with equal ease.

Similarly, in the world of programming, we have examples like sorting.
Suppose your programmers were asked to write a routine to sort a list
(or array) in memory (or other random-access storage).  Given no other
constraints (such as knowing how the data is likely to be ordered before
the sort is started), there are several algorithms that are fundamentally
different from each other.  Two of the best known are "quicksort" and
"bubblesort".  They are both very simple, and do their work in very
different ways.  There is no way of saying which is "best".  If the
list is short or starts out close to sorted, the bubblesort is better.
For a large random list, bubblesort is atrociously slow, and quicksort 
is about the best known.  A language that is "high-level" for sorting
would express both elegantly.  (It might also have an elegant way of
expressing the best and worst cases for each.)

I think that this definition does have its appeal.  Most of the 
extant sort algorithms can be expressed succinctly in some languages,
and not in others.  Thus, quicksort can be expressed simply and elegantly
only in languages that support recursion.  Without recursive functions,
you have to fake the recursion with a visible stack.  The code to do
the stack manipulations swamps the code for the elegant sort algorithm,
making a messy routine which is difficult to comprehend without much
study.  On the other hand, bubblesort is somewhat awkward (though not
very much so) in a language that has only recursive functions and no
explicit looping function.  

A language that has the power to express known sort algorithms probably
is required to have both recursion and a simple looping construct.
Sorting is a good example for another reason: A "practical" 
implementation of a sort algorithm is only possible if the language 
allows a comparison test routine to be provided as a parameter.
This immediately excludes most current programming languages (except 
for Lisp, C, Forth, Prolog, Snobol4, and a few others).  Note that
this is easy to express in most assembly languages (though the sort
algorithms are not).

I might also point out that there are several non-equivalent ways
to invert a matrix.  Can your language express all of them elegantly?
If not, it's not a "high-level mathematical" language.

By the way, I find myself trying to type "high-levility" rather than
"high-levelity"; I notice that others say "high-levelness".  Do we
have any votes for "high-levelhood"?  

> Some other definitions:
> 
> 1. X is "higher-level" than Y if it has fewer detractors among professors
> 	of computer science.
> 
> 2. X is "higher-level" than Y if fewer people believe it should be
> 	stamped out.
> 
> 3. X is "higher-level" than Y if it was invented as a substitute for Y.
 
Great!  I love all of them!  (Except that #3 has an obvious exception:
Basic was invented as a substitute for Fortran, Algol, and all those
other academic playthings.  Surely you don't mean to suggest that Basic
is a high-level language!? :-)

				John Chambers

chuck@dartvax.UUCP (Chuck Simmons) (01/07/85)

> ...
>For a large random list, bubblesort is atrociously slow, and quicksort 
>is about the best known.  A language that is "high-level" for sorting
>would express both elegantly.  (It might also have an elegant way of
>expressing the best and worst cases for each.)

Wouldn't a "high-level" language simply allow you to request that your
data structure be sorted without you having to worry about how it got
that way?

>I might also point out that there are several non-equivalent ways
>to invert a matrix.  Can your language express all of them elegantly?
>If not, it's not a "high-level mathematical" language.
>...
>Basic was invented as a substitute for Fortran, Algol, and all those
>other academic playthings.  Surely you don't mean to suggest that Basic
>is a high-level language!? :-)
>
>				John Chambers

In Basic (Dartmouth Basic 6, more or less the original) I would
invert a matrix A using the statement:

100 MAT A = INV (A)

What could be more high-level?

msb@lsuc.UUCP (Mark Brader) (01/09/85)

> 
> In Basic...I would
> invert a matrix A using the statement:
> 
> 100 MAT A = INV (A)
> 
> What could be more high-level?

How about APL (or the last APL I used, anyway)?

   A gets domino A

Where "gets" is a left arrow and "domino" is quad-overstrike-divide-sign.
None of these silly MATs or needless function calls.

Frivolously,
Mark Brader
one-time APList

mangoe@umcp-cs.UUCP (Charley Wingate) (01/10/85)

I like the notion that "Higher level languages express higher level
constructs better", and I think the following operational measures allow
some sort of comparison.  Consider first what most people would agree is
the very lowest level sort of language: the machine language of an 8-bit
processor.  ANY construct has to be provided by the programmer.  When one
progresses to, say, Fortran, one finds that a large number of constructs are
now provided; the programmer no longer has to construct them for every
instance.

  I therefore propose the following operational test:

      Language A is "higher-level" than Language B if, on the average,
      the number of machine instructions executed per "unit" of language A
      is greater than the same measure for language B.

For the purposes of distinguishing "terseness" from "expression", I choose to
define "unit" as tokens that actually do something.  Begin-End constructs
don't count, for instance.  One can normalize these comparisons further by
doing all the comparisons on the basis of 8-bit processor instructions; this 
will allow us to compare different assembly languages as well as making the
notion of language level independent of the processor.

One can readily see that (for instance) 32016 assembly language is higher
level than z-80 assembly.  Fortran is higher level than either, but not by
much.  APL and PROLOG are MUCH higher level; of the two, Prolog is probably
higher level.  Lisp is intermediate.  Note that for specialized languages,
it makes sense to make the comparison on the basis of the type of tasks the
language is designed for; it makes little sense to try to compare APL with
SNOBOL, for instance.

I'm not sure this means anything, in the long run.  A number of languages
(PL/M and FORTH, for example) are deliberately low level.  To use "level" as
a measure of merit is to misunderstand the purposes of the higher level
languages.  Languages like APL, SNOBOL, and Prolog are very high level
because the constructs used are well known, and thus the compiler/interpreter
overhead of translation is acceptable.  In comparison, by this measure 
languages like PL/I and Pascal are not especially high level.  Almost any
common data structure has to be constructed by the user.  It is evident
(to me anyway) that people are therefore ranking languages on some other
basis.

Charley Wingate    umcp-cs!mangoe

jack@vu44.UUCP (Jack Jansen) (01/10/85)

Well, let me air a few more thoughts on high-level{ity,ness}:

- A few people said that assembler is higher in level than
machine code. I think that this is *not* true.
Though macro-assemblers and such things may be higher-level
than non-macro-assemblers, I think that bare assembly is
just as low-level as machine code.
For instance, if you compare an 8080 to a 6809, everyone (I hope)
agrees that 6809 machine
code is higher level than 8080 machine code.
Now, it would be ridiculous to make 8080 assembler higher in level
than 6809 machine code (I, for one, would rather write 6809 machine
code than 8080 assembler, but this might very well be caused by
a serious brain-disease :-).

- Someone (sorry, I forgot who) said that one language is more HL than
another if it lets you say *what* is to be done, while the
you have to specify *how* it should be done in the other.
This sounds as a really neat criterion. It is also more-or-less
measured by my previously posted "statistic approach" (have
a number of programmers tackle the same problem, and see how
many come up with the same solution).

- 
- There are some parial orderings that seem to be quit general
accepted ( F66 < F77, Algol 60 < Pascal, etc), and there are some
pairs of languages that are probably not comparable (C and LISP,
APL and COBOL, etc).
But, there are also some languages that are in the same class, like
Pascal, C, Algol 68, Ada, or SNOBOL, AWK, ML/1 (maybe).
Maybe we could try ordering these *within their class* by having
people defend their pet-language by showing it's strength over
the other languages in the same class? If enough people do this,
we should be able to make a list of pros and cons of each language,
and use this to order the languages within one class.
-- 
	Jack Jansen, {seismo|philabs|decvax}!mcvax!vu44!jack
	or				       ...!vu44!htsa!jack
If *this* is my opinion, I wasn't sober at the time.

mwm@ucbtopaz.CC.Berkeley.ARPA (01/12/85)

> In Basic...I would
> invert a matrix A using the statement:
> 100 MAT A = INV (A)

> How about APL (or the last APL I used, anyway)?
>    A gets domino A
> Where "gets" is a left arrow and "domino" is quad-overstrike-divide-sign.
> None of these silly MATs or needless function calls.

How about SAS (if memory serves me correclty):  A = A ** -1 ;

	<mike

david@ukma.UUCP (David Herron, NPR Lover) (02/05/85)

I have been interested in this discussion.  But have stayed out of it
because I wasn't sure if I could contribute well.  But I have had one
idea that nobody else has talked about.

It has to do with the types of operators the language has.  A high
level language would have a high proportion of high level operators.
Most low level languages are extremely low level since the operations
they can perform are very limited.  But prolog is very high level since
one operator may represent much work.

This idea springs out of a feeling I got when I finally understood
what an integral was.  I all of a sudden KNEW that this squiggly
'S' shaped thing meant that I was supposed to do an infinite number
of additions of areas (all of which are infinitely small).  It is
just kind of staggering what kind of power that is.  I have felt that
same feeling for only two programming languages, Icon and Prolog. 
(Neither of which I know well, gosh darn it).  

At any rate.  By the above definition, Calculus is a very high
level language.




I also suspect that this is only part of the definition.  That the
"level" of the data types has a lot to do with language level.
(Level of data type would also affect level of operator, and 
vice versa.  hmmmm.....).


Well, thanks for listening to me.
-- 
-:--:-
David Herron;
		ARPA-> "ukma!david"@ANL-MCS or david%ukma.uucp@anl-mcs.arpa
		UUCP-> {ucbvax,unmvax,boulder,research}!anlams!ukma!david
		UUCP-> {mcvax!qtlon,vax135,mddc}!qusavx!ukma!david
		UUCP-> {A-Large-Portion-of-The-World}!cbosgd!ukma!david

No stupid sayings (I can't think of one).

No stupid disclaimers (Nobody else would claim my statements anyway).

jsdy@hadron.UUCP (Joseph S. D. Yao) (02/25/85)

I think the best fuzzy-definition for this fuzzy concept is that a
higher-level language has higher-level abstraction of concepts.  That
is sufficiently fuzzy that, whatever you think is a better abstraction,
a language that has that is higher-level  f o r   y o u .  Let's not
forget that there is some subjectivity involved here, since languages
are used to communicate concepts, and typically at least one of the
entities involved is a human or other sentient entity.	;-)

The above definition would include david@ukma's concept of more
powerful operators.  It would also include better control structures
(an extension of "operator") to perform more abstract operations.
It would include better data type definitions:  first, of more
"natural" atomic data types; then of complex data types; then of
data types with actions associated with them, and so forth.

No flames, please:  I will respond either OK, we disagree or yes,
for you that is a better abstraction.  Constructive discussion &
criticism welcomed.

Joe Yao		hadron!jsdy@seismo.{ARPA,UUCP}