[M3devel] [Fwd: Re: A nonnative 64-bit language proposal]

Tony Hosking hosking at cs.purdue.edu
Thu Jul 19 21:23:54 CEST 2007


Here are my notes from a run through the language spec.  Next step is  
to flesh out the additional bits in the compiler beyond what I  
announced yesterday.  I would appreciate any feedback you can give as  
I look into this.

3. TYPES

-Ordinal Types:

There are three kinds of ordinal types: enumerations, subranges, and
integers.  There are two integer types, which in order of increasing  
range and
precision are INTEGER and LONGINT.

The base type of an ordinal value 'v' is its type (INTEGER or  
LONGINT) if 'v'
is an integer, otherwise it is the unique enumeration type that  
contains v.

Subranges may have base type LONGINT.

FIRST, LAST and NUMBER work for LONGINT.

LONGINT is predeclared.

Should the subrange [0..LAST(LONGINT)] be given a predeclared name?   
LONGCARD?

-Array Types:

Arrays may only be indexed by ordinals having an underlying INTEGER  
base type.
[Otherwise, it will be difficult deciding the index type for open  
arrays.]

-Set Types:

It seems reasonable that SET OF Base, where the base type for Base is  
LONGINT,
should be allowed.  The restrictons on the number of elements in the  
base set
remain (i.e., SET OF [0L..1023L] for elements having base type  
LONGINT will be
practical, but not SET OF LONGINT).

-Subtyping Rules:

These remain the same for ordinals having LONGINT base type.


4. STATEMENTS.

-Assignment:

Since INTEGER and LONGINT have different base types they are not  
assignable.

-For:

FOR statements will function with LONGINT-based index types:

     FOR id := first TO last BY step DO S END

where 'id' is an identifier, 'first' and 'last' are ordinal  
expressions with
the same base type (e.g., LONGINT), step is an integer-valued  
expression of
type INTEGER or LONGINT and S is a statement.  If omitted 'step'  
defaults to 1
or 1L, depending on the base type of the loop bounds 'first' and 'last'.

If the upper bound of the loop is LAST(INTEGER) or LAST(LONGINT), it
should be rewritten as a WHILE loop to avoid overflow.

-Case:

CASE statements may take an expression whose type is an ordinal type  
with base
type LONGINT.

-Inc and Dec:

INC and DEC function for both INTEGER-based and LONGINT-based ordinals.

7. EXPRESSIONS

-Conventions for describing operations:

The class 'Integer' will be used to describe the type class  
consisting of both
INTEGER and LONGINT (similar to the use of 'Float').

-Numeric literals:

Numeric literals denote constant non-negative integers or reals. The  
types of
these literals are INTEGER, LONGINT, REAL, LONGREAL, and EXTENDED.

A literal LONGINT has the same form as a literal INTEGER, except that  
it is
suffixed with the character 'L'.  Thus the LONGINT having value zero  
would be
written '0L'.  Moreover, if no explicit base is present, the value of  
the
literal must be at most LAST(LONGINT).  If an explicit base is  
present, the
value of the literal must be less than '2^Long.Size', and its  
interpretation
uses the convention of the 'Long' interface.

-Arithmetic operations:

We adjust the arithmetic operations as follows, where the type class  
'Integer'
can be one of INTEGER or LONGINT, FloatType represents the type of a  
type
variable taking one of the values REAL, LONGREAL, or EXTENDED, and  
IntType
represents the type of a type variable taking one of the values  
INTEGER or LONGINT.

prefix  + (x: Integer)  : Integer
	  (x: Float)    : Float

infix   + (x,y: Integer): Integer
	  (x,y: Float)  : Float
	  (x,y: Set)    : Set

prefix  - (x: Integer)  : Integer
           (x: Float)    : Float

infix   - (x,y: Integer): Integer
	  (x,y: Float)  : Float
	  (x,y: Set)    : Set

infix   * (x,y: Integer): Integer
	  (x,y: Float)  : Float
	  (x,y: Set)    : Set
	
infix   / (x,y: Float)  : Float
	  (x,y: Set)    : Set

infix DIV (x,y: Integer): Integer

infix MOD (x,y: Integer): Integer
           (x,y: Float)  : Float

       ABS (x: Integer)  : Integer
           (x: Float)    : Float

     FLOAT (x: Integer; T: FloatType := REAL): T
           (x: Float;   T: FloatType := REAL): T

     FLOOR (x: Float;   T: IntType := INTEGER) : T
   CEILING (x: Float;   T: IntType := INTEGER) : T

     ROUND (r: Float;   T: IntType := INTEGER) : T
     TRUNC (r: Float;   T: IntType := INTEGER) : T

MAX, MIN (x,y: Ordinal) : Ordinal
           (x,y: Float)   : Float

-Relations

These functions as expected for LONGINT.

-Type operations

       ORD (element: Ordinal): Integer
       VAL (i: Integer; T: OrdinalType): T

These function as expected, except that ORD returns INTEGER for  
elements of
enumeration types.  Otherwise, ORD returns an integer of the same  
base type as
the element.  Similarly, for VAL, if T is an enumeration type, then i  
must be
an INTEGER.

Thus, if 'n' is an integer of type T (INTEGER or LONGINT) then

       ORD(n) = VAL(n, T: IntType): = n

It is a static error if 'n' is not of type 'T'.

    NUMBER (T: OrdinalType)   : [0..LAST(LONGINT)] if BaseType(T) =  
LONGINT
	  (T: OrdinalType)   : [0..LAST(INTEGER)] if BaseType(T) = LONGINT
	  (A: FixedArrayType): CARDINAL
	  (a: Array)         : CARDINAL

     FIRST (T: OrdinalType)   : BaseType(T)
	  (T: FloatType)     : T
	  (A: FixedArrayType): BaseType(IndexType(A))
	  (a: Array)         : BaseType(IndexType(a))
      LAST (T: OrdinalType)   : BaseType(T)
	  (T: FloatType)     : T
	  (A: FixedArrayType): BaseType(IndexType(A))
	  (a: Array)         : BaseType(IndexType(a))

   BITSIZE (x: Any) : CARDINAL
           (T: Type): CARDINAL
BYTESIZE (x: Any) : CARDINAL
           (T: Type): CARDINAL
   ADRSIZE (x: Any) : CARDINAL
           (T: Type): CARDINAL

9. REQUIRED INTERFACES

There is an additional required interface 'Long', analogous to 'Word'  
except that

       Long.T = LONGINT


On Jul 19, 2007, at 1:34 PM, Rodney M. Bates wrote:

>
>
> Tony Hosking wrote:
>> My LONGINT implementation addresses many of your concerns.  The   
>> LONGINT space is segregated from the INT space.  I want to come  
>> up  with an implementation that also permits ordinals based on  
>> LONGINT in  addition to the current system of ordinals based on  
>> INTEGER.  This  requires revisiting the language spec and pushing  
>> through the  implications.  I'm going to look at that briefly  
>> before moving on to  fixing user-level threading for all targets.
>
> By "ordinals", do you mean enumerations?  Subranges?.  In the language
> definition, ordinals refers to both the above, plus INTEGER, with  
> CHAR and
> BOOLEAN being enumerations.
>
> It is hard to image a use for enumerations with more than 2^32 values.
> As I recall, I was thinking this would add quite a bit of  
> complexity to
> the language for negligible benefit.
>
> Subranges of LONGINT seem entirely useful and make for consistency.
> From a language definition standpoint, I think these just about fall
> into place with very little change.
>
> -- 
> -------------------------------------------------------------
> Rodney M. Bates, retired assistant professor
> Dept. of Computer Science, Wichita State University
> Wichita, KS 67260-0083
> 316-978-3922
> rodney.bates at wichita.edu




More information about the M3devel mailing list