[M3devel] range analysis?
Tony Hosking
hosking at cs.purdue.edu
Tue May 24 04:04:18 CEST 2011
On May 23, 2011, at 6:53 PM, Hendrik Boom wrote:
> On Mon, May 23, 2011 at 01:26:52PM -0500, Rodney M. Bates wrote:
>> This needs more thought. On the one hand, 2.2.3 on array types allows
>> the explicit element type in either kind of array type definition to
>> be empty,
>
> Well, the array might be empty, in which case no nonexistent values
> would be required when the array is created.
You cannot instantiate an empty array type.
>
>> unlike the way 2.2.4 on record types requires a field type
>> to be nonempty.
>>
>> On the other hand, 2.2 has a general prohibition against declaring a
>> variable of empty type, and it is all over the language spec that the
>> elements of arrays are "variables". The general definition of variable
>> in 2.1 would apply to array elements. Thre are numerous places that
>> describe things that can be done with a variable that we all informally
>> know can be done to an element, as it should be and we all have done
>> many times. Moreover, 2.2.3 says in the first paragraph that the
>> elements are variables.
>>
>> So here, the compiler is too liberal, and the language would be clearer
>> with an explicit rule against empty element types.
>>
>> I haven't spotted anywhere a parameter is specifically called a variable,
>> and it is not required to have a nonempty type in the description of
>> parameter declarations. However, it certainly seems to me to fit
>> the definition of variable, and as above, there are lots of things
>> we know can be done with it that the language simply describes as
>> doable to a variable. Moreover, for every mode, there is a rule
>> that at call time, the formal is "bound to" a variable, which pretty
>> well makes it variable in any context where it can be used. Even in
>> a keyword binding, we are getting ready to bind it to a variable
>> very soon.
>>
>> So maybe we need to 1) say a formal parameter is a variable, and
>> 2) say the type in a parameter declaration must be nonempty.
>>
>> The language definition is also full of an ambiguity in its use
>> of "variable" that I have been bothered by in talking about programming
>> languages in general for years. One meaning is the meaning I have been
>> talking about, The other is the kind of variable that is declared by a
>> VAR declaration (not a VAR parameter). There are some uses in the
>> language that I think need to have this latter meaning in order to be right.
>>
>> So we need a different or qualified term for this narrower meaning.
>>
>> On 05/23/2011 11:54 AM, Tony Hosking wrote:
>>>
>>> On May 23, 2011, at 12:45 PM, Rodney M. Bates wrote:
>>>
>>>> On 05/23/2011 09:31 AM, Tony Hosking wrote:
>>>>> An empty subrange gives a warning in the compiler.
>>>>
>>>> By my experiments, empty subrange, empty enumeration, and arrays
>>>> thereof don't warn.
>>>
>>> Sorry yes, you're right. But usage to declare any variable does.
>>>
>>>>
>>>>> But, the semantics is that it is empty, and has no values of the type.
>>>>> You cannot allocate (NEW) an empty type.
>>>>> You cannot declare a field of empty type.
>>>>
>>>> It seems odd that we have this rule for fields, but no corresponding
>>>> prohibition against arrays with empty element types. By experiments,
>>>> cm3 allows this, for both fixed and open arrays, but treats such array
>>>> types as empty types, something the language also does not say.
>>>>
>>>> At the least, the language and the compiler should agree with each other.
>>>> Maybe records/objects and arrays should be treated consistently here?
>>>
>>> Yes, I suppose so.
>>>
>>>>> Nor can you declare a variable of empty type.
>>>>
>>>> Again, oddly, there is no such prohibition in the language against
>>>> declaring a formal parameter of empty type. Cm3 prohibits it,
>>>> and calls it a 'variable' in the error message.
>>>
>>> You're right, though it's not the parameter that errors but the variable associated with the parameter.
>>>
>>>> Again, language and compiler should agree.
>>>
>>> Can you point me to the relevant entries in the language spec?
>>>
>>>>
>>>> The language also prohibits applying FIRST and LAST to the empty
>>>> enumeration, but they are OK applied to an empty subrange.
>>>> This makes sense, because they return values of the base type
>>>> of the argument type, and such values exist for an empty subrange
>>>> but not the empty enumeration, whose base type is only itself.
>>>>
>>>>>
>>>>> On May 23, 2011, at 8:41 AM, Hendrik Boom wrote:
>>>>>
>>>>>> On Sun, May 22, 2011 at 11:18:02PM +0000, Jay K wrote:
>>>>>>>
>>>>>>> Well, I can build the whole tree and see how many times it helps.
>>>>>>> I think this is a pretty standard optimization technique.
>>>>>>> Though it'd work better with compiler-derived additional information.
>>>>>>>
>>>>>>> I initially happened upon this idea developing test cases.
>>>>>>>
>>>>>>>> The code assumes the minimum of a type is less than or equal to its maximum.
>>>>>>>
>>>>>>> I'll change it not have that problem -- to just fall back to usual pessimistic code for such types, I guess.
>>>>>>
>>>>>> What *is* the semantics of a range whose minimum is greater than its
>>>>>> maximum? There plainly can't be any values in this range. How is a
>>>>>> variable of this tyoe initialized? Not to some arbitrary value of the
>>>>>> type, because there aren't any. I can see this type being useful to
>>>>>> admit convenient generalizations -- for example, an array with n
>>>>>> elements can still exist if n happens to be zero, but it seems to me
>>>>>> that any code involving a value of the range for subscripts for this
>>>>>> array must be simple unexecutable.
>>>>>>
>>>>>> Or is there some latitude available in the principle that a value of a
>>>>>> variable must always be of the correct type?
>>>>>>
>>>>>> -- hendrik
>>>>>
>>>>>
>>>
>>>
More information about the M3devel
mailing list