TUNES digest, Vol 1 #356 - 8 msgs
Lynn H. Maxson
Lynn H. Maxson" <lmaxson@pacbell.net
Fri May 30 12:48:02 2003
Before C we had only strong typing, in fact in many cases
overly strong in that without explicit programmer intervention
we could have mixed arithmetic expressions, e.g. fixed and
floating point values. PL/I addressed this intelligently,
maintaining strong typing while at the same type applying
default conversion rules if the programmer did not want to
explicitly do so. In fact PL/I allowed character, i.e. string,
numeric values to also occur within the expression.
The argument of strong versus weak typing deals with the
matching of the operator and operands: numerical operators
should have numerical operands; logical operators, logical
operands; string operators, string operands; etc.. This says for
strong typing to occur for a set of operators available in the
language that we should have the corresponding operands
(data types) available also. C does not with its limited
support of data types. Thus it must use normally mismatched
combinations of operators and operands. Thus C engages in
weak typing, e.g. allowing an "int" variable to play in either
arithmetic or logical operations. It works because every
known machine allows a single "register" value to function
with either form.
Much the same argument occurs between the "artistic" and
the "engineering" approach. We should remember that when
developing software or maintaining it that in the interval, in
the transition, from initiation to completion its "natural" state
is "incomplete". To a compiler incomplete is not a natural
state, while it is to an interpreter. Thus it makes sense to
program in an interpretive mode while in the incomplete state
and then compile mode on reaching the complete state. As
everything preceding interpretive or compile code generation
is the same for both, why would you have to have two
separate products with two different modes of operation
when you could have them both in one product?
Thus you have with each operator an implicit type declaration
for its operands. Within each type you have different modes:
binary and decimal, fixed- and variable-point precision, fixed
and floating point data. Which type is best depends only upon
when all the votes are in: when it has or is about to reach the
state of completion. In short while it is in the incomplete state
the software can resolve the issue of typing, awaiting final
resolution by the programmer. It just keeps a list of such
unresolved issues which the programmer can resolve in any
order until it is as completely resolved as everything else.
What we also forget when discussing the need for knowledge
of Lisp is that what sets it apart is a "list aggregate" as a
data type as well as a set of list operators. It would seem
reasonable in any programming language, which supports
aggregate (array or structure) operands, to upgrade it to
support list aggregates as well along with the addition of list
operators.
Ultimately you get down to a defining issue. Can you
implement a language entirely using that language? If you
cannot, then you need at least two languages. Chances are
that's assembly language. Then if you access the Intel
Pentium Language Reference manual, you will note that each
instruction is given in three different forms: actual, symbolic
assembly, and HLL. As any language under consideration here
is an HLL, you have to ask why doesn't it include assembly
language? If it does, then you can implement it entirely using
it.
As every programming language is also a specification
language can your HLL not only implement itself entirely
within the language, but can it specify itself entirely using it
as well? Is it self-defining and thus self-extensible using only
its language? I mention this only because it seems a
"weakness" in all the languages mentioned or proposed thus
far under Tunes.
It makes little sense to me to talk about declarative languages
based on logic programming if it does not contain the ability to
have both processing statement types, the assertion and the
assignment. The proof process may differ for both, though
one (assignment) is a proper subset of the other (assertion).
Nevertheless all machine architectures, i.e. instructions, use an
imperative form. Thus any "complete" declarative language
should include this form as well.