One language, no subset.

Lynn H. Maxson lmaxson@pacbell.net
Sat, 24 Jun 2000 23:23:24 -0700 (PDT)


Kyle Lahnakoski wrote:"The second part, I do not 
see your objection because you repeated it: "One 
language which covered the hardware and software 
domains from the lowest level (hardware encoded 
logic)..."  The 'one language' being HLL,
and the 'subset of HLL' being that part which 
applies only to hardware.

One language.  No subset.  Not because it is not 
possible.  But because it is not necessary.

It is a specification language.  It makes no 
distinction between a software specification and a 
hardware specification.  They have the same look 
and feel.

What separates them is the "level of abstraction".  
You have two basic machine architectures, CISC and 
RISC.  Of the two RISC is a lower level.  That 
simply means that it is possible to implement a 
CISC architecture with a RISC.  In manufacturing 
terms your RISC instructions are raw material and 
your CISC instructions are assemblies, consisting 
of one or more RISC instructions.

These define the two lowest levels of abstraction.  
You can, if you like, refer to the specifications 
here as machine-dependent.  But that is only due to 
your understanding their levels within the 
hierarchy of levels that exist.

At the level above CISC we have our first 
machine-independent level, the raw material of all 
software.  It consists of control structures 
(sequence, decision, and iteration) and primitive 
operators.  All (machine-independent) levels above 
this level consist of assemblies which contain 
other assemblies and raw material.  Aside from the 
software irregularities of recursion and 
co-routines it behaves identically to any other 
manufacturing system.

Again there is no subset.  The same language that 
describes (specifies) the machine architecture 
differs in no way from that used to specify 
software.  I do not argue against anyone use of 
multiple languages.  I only argue that it is 
unnecessary.

Free yourself of the programming paradigm.  The 
fact of the matter is that all computer hardware 
and software has a 100% basis in pure logic.  We 
produce no illogical machines or software.  If they 
behave illogically, we deem it something to be 
corrected.

Every one of you who has taken plane geometry or 
algebra or symbolic logic or mathematical logic has 
been exposed to everything that can occur in a 
computing machine or software.  Having learned it 
in a textbook manner and having used that learning 
in the specifying and resolution of a logical 
problem, e.g. decomposition of a binomial or proof 
of a theorem, has been exposed to the only language 
necessary, that of logic.

I offer a specification language capable of 
expressing any logical expression.  Thus it is 
capable of expressing machine architectures and any 
software.  It is no better than any other 
specification language that does the same.  Which a 
given user prefers is of no concern to me.  I want 
to enable whatever preference he exhibits.

I have run into expressions of disgust when using a 
declarative form as an example.  The argument is 
not to bother the user with such knowledge.  The 
answer is to offer the user a non-declarative 
language.  My answer is to offer both within a 
single language, leaving it to the user to decide 
which in what circumstances he "prefers" to use.

That's the problem when you fall back on "leaving 
it up to the computer".  It implies that the 
language used by the computer differs from that of 
the user.  While it certainly happens, again the 
issue lies in its necessity.

I have this opposition to arrogance on the part of 
a tool author who wants to impose his system on the 
user, in effect deciding for the user.  I feel as a 
tool builder that I want to enable the user to find 
and do things his way.  I don't know what's best 
nor for how long something will remain top dog in 
this profession.

There is no arrogance in a specification language 
capbable of any logical expression.  Given the 
existing tools of logic programming, specifically 
the two-stage proof process of its logic engine 
(completness proof and exhaustive true/false), we 
have a relatively simple (and trusted) means of 
dealing with incompletness, ambiguity, and 
contradiction.

The secret lies not in avoiding them nor dictating 
the order of their resolution, but in simply noting 
them (and their reasons).  When we are in 
development we are by definition "in process" in an 
incomplete state.  Actually a series of such states 
until eventually we arrive at a complete state (at 
least for this version).

For Soma who prefers working at the assembly 
language level I would suggest that he do it with a 
specification language based on logic programming.  
In that manner the logic engine will generate all 
possible logically equivalent lower-level forms of 
a higher-level assembly.  This means the generation 
of "all" logically equivalent sequences of machine 
instructions (specifications).  That's more than he 
could ever construct (and test) in his lifetime as 
well as more than the best code generated by the 
best assembly language programmer.

What I am asserting here is the "normal" production 
of executables from a logic-programming-based 
specification language as fast or faster than the 
best assembly language program written by anyone.  
No performance hit regardless of software 
methodology.

If you want to completely rethink the process, then 
do so.<g>