Print

Print


On Sat, 2016-07-09 at 14:58 -0400, Vipul Parekh wrote:
> 1.  You note, "The reasons given by the vendors are.. it's too hard "
> and then you remark, "it isn't -- I've laid out a roadmap for how to
> do it, and nobody commented on it."  How exactly do you know it is NOT
> too hard?  Can you please elaborate?  I've heard on this mailing list
> any change or addition to the "type system" in Fortran is highly
> complicated.  I inquired of ENUM functionality on Fortran forums (a
> feature supported over a decade or more by all programming languages
> that are casting Fortran aside in technical computing area, and the
> response on this mailing list (you were the only exception) was so
> luddite and disappointing, to say the least.  It was as if the query
> was of some complexity beyond the theory of everything.  To me, your
> proposal intuitively feels hard but I expect I'm mistaken. So I am
> curious to learn how your proposal doesn't affect the "type system"
> and keen to hear more on the "it isn't" comment of yours.  

I believe the measurement unit of a variable can be represented
internally by the processor in exactly the same way that kind type
parameters are represented.  Processors already know how to handle
multiple type parameters, so this ought not to inflict any significant
trauma on the type system.  Generic resolution, and checking type, kind,
rank, and unit consistency for argument correspondence, is then
automatically carried out by existing mechanisms.  Again, no significant
trauma for the type system.  No code generation is involved.

Checking and computing units of expressions isn't much more difficult
than checking and computing types and kinds of expressions.  Both
involve "evaluation" of the expression by a set of recursive functions
(or one function with a SELECT CASE construct).  No code generation is
involved.

Conversion functions are generated by declarations of conversion units. 

A family of units related by conversions can be represented by an
undirected graph, and its transitive closure, where each edge has two
labels, one being the A-B conversion, and the other its inverse.

A unit family generates several functions, two for each edge in its
relationship graph, times the number of real kinds supported by the
processor.  For example, a temperature family might have an atomic unit
of Kelvin, and conversion units of Rankine, Celsius, and Fahrenheit.
The processor needs to calculate the transitive closure of the
relationship graph, in order to produce conversions between all pairs of
units in the family, in this case twelve functions, times the number of
kinds of real that the processor supports, but this is a trivial
problem, probably less than one page of code.  The proposal allows a
generic name and a unit name to be the same.  This is not a different
problem from allowing a generic name and a type name to be the same.
You can call this "code generation" if you wish, but it could happen
during or very shortly after parsing.  The functions are trivial, of the
form f(u) = a*u+b, with "a" and and "b" constant and "a" nonzero, so the
inverse is trivial too.  I assume the processor has mastered constant
folding.  Hopefully, they'll be inlined where they're applied, but the
proposal is silent on this score.

That leaves formatted I/O.  During input, if a "U" edit descriptor
appears, it works like an "A" edit descriptor to read the name of the
unit of the previous value.  Once the name is in hand, the runtime
support routine checks whether it's exactly the same, in the same family
(in which case it converts the value), or announces an error.  This
"code generation" is in the runtime support library, with perhaps a tiny
bit of help from the processor to connect the local names of conversion
functions to the possible set of input strings.  This doesn't seem to be
terribly difficult.  During output, if a "U" edit descriptor appears,
the name of the unit of the variable is output, as if by an "A" edit
descriptor.  This is even easier than input.