Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [mdt-ocl.dev] MDT OCL Behavioural customisation

Ed,

Yup, that's way easier to understand, thanks for the clarifications. I still don't like this "EOCL" notion; but I understand your point. Going towards a "best possible implementation" (your notion of "implementing OCL 2.5") indeed seems like the best option we have, but we should also remember that we have limited time to release MDT OCL 3.0. Of course, I do like the idea of having compatibility options; as a developper of a project that relies on MDT OCL, I'd like to be able to switch to the new, better implementation without telling my adopters "Well, we switched to the new MDT OCL, none of your expressions will compile now. Please throw away what you've done so far and come to the new version". I just think that with the limited manpower we have, implementing/introducing changes for the new specification support shouldn't involve trying to find a way to support both specification version.

You mentionned that these two options you added were localized and easy to implement, so this doesn't really apply : when the choice is not tedious to implement, yes, it should be. I totally aggree with your comment "So where we can easily provide migration assistance let's do so. Where it is too hard, we can at least defer it.".

Among all of what need to be done for this release, I am not willing to play with the parser (I am not familiar with grammars and parsers), so I won't be the one to introduce these compatibility options in the end. I'll let you determine what's too tedious and what can be done; but I would like the option's default to always be set to the new behaviour. That would mean : by default, don't warn for operator precedence change; by default, support static features. If we introduce such compatibility options, I'd also like to have a way to set _all_ options at once to the 2.0 or 2.1f that's what you suggest with the ParsingOptions.OCL_2_1 thing, I believe I fully agree with your conclusions on this last mail.

Laurent Goubet
Obeo

Ed Willink a écrit :
Hi All

Adolfo: Now I'm getting confused. Our differences are very subtle, if any. I thought for a moment your email was written by me (your English is really good now).

Alex: There is no OCL_2_1 option. I was hypoithesing a mechanism for feature set selection..

Laurent: I'll try to explain carefully using Java and JDT as an example. EOCL is Eclipse OCL.

All: Can we please try not to mention MDT OCL 1.4.0. We all agree that it is a no-development maintenance release of MDT OCL 1.3.0. Every claim that it implements OCL 2.0 is liable to provoke further needless confusion and anguish. MDT OCL 1.4.0 exhibits source, API and binary compatibility with MDT OCL 1.3.0 that implemented an interpretation of OCL 2.0.

-------

The Java language is defined by Sun and has a number of major versions 1.0, 1.1, 1.2, 1.3, 1.4, 5.0, 6.0. These each represent a different language, albeit with, in some cases, very minor differences and considerable compatibilities.

The Java language is implemented by a variety of vendors; at least Sun and IBM and Eclipse/JDT. The Java language specification is sufficiently good for vendors to attempt an exact implementation. OCL is not, so MDT OCL defines a new language influenced by an official one. Therefore OCL 1.0, 2.0, 2.1, EOCL 1.3.0, EOCL 3.0.0 are all names of different languages.

JDT provides new versions every year, so both JDT 3.4 and 3.5 provide implementations for Java 6.0.

In order to assist users who are obliged to continue using an old JVM, JDT supports a binary compatibility option so that an old JVM dialect can be chosen for newer code.

Similarly, in order for users to continue using an older coding style, JDT supports a source compatibility option.

Occasionally as with 'assert', Java introduces a backwards incompatible language change. JDT therefore provides a finer grained option to control treatment of the assert keyword.

Sometimes certain coding idioms are recognised to be dangerous: for instance "if (a = b)", so an optional warning is provided.

My support for 'static' selection has some similarities to JDT's support for 'assert'.

My support for and/xor/precedence has similarities to JDT's "if (a = b)" warning.

My suggestion of a OCL.setOptions(env, ParsingOptions.OCL_2_1) has similarities to a JDT source level compatibility setting.

-------

The major difference between MDT OCL's support for OCL and JDT's support for Java is that the Java specification has sufficiently few ambiguities and contradictions to be implementable. Java also has a reference implementation and a high level of interaction amongst implementers to resolve any issue that arises. A revised Java implementation is also available with many stages of alpha and beta release for public comment. A revised OCL specification is endorsed without prototyping and with very limited review. An OCL issue may remain without comment for over a year. There is no mechanism for achieving a rapid consensus on how an OCL specification problem should be resolved.

Eclipse MDT OCL appears to be a good candidate for a reference implementation. As such we can almost impose de facto resolutions to specification problems that we become aware of. We must lead responsibly, since there is nothing/noone else to follow.

Since OCL 2.1 could be such a poor specification in detail, possibly worse than OCL 2.0, we cannot possibly claim to implement OCL 2.1 or 2.0. We implement EOCL 3.0 whose definition is OCL 2.1 revised by Issues {xxxx, yyyy, zzzz}. It would be nice to get the OCL 2.1 source so that we can distribute a coherent revised text; not on an Eclipse Site no doubt for Copyright reasons.

When offering our implementation of EOCL 3.0, we can choose what level of support to offer to users expecting to see OCL 2.0 or 2.1 or ...

I want to help users of EOCL 3.0 upgrade from 'OCL 2.0' by issuing a warning when they have an expression whose meaning in OCL 2.1 is different from OCL 2.0. This is the WARN_OF_XOR_OR_AND_PRECEDENCE_CHANGE option. It instructs an OCL 2.0 source user to add parentheses to enforce a preserved meaning. It instructs an EOCL 3.0 user to add parentheses to enforce a preserved meaning when re-using the OCL in an 'OCL 2.0' tool. Adding this ParsingOption was quite easy and localised.

I want to help users of EOCL 3.0 to prepare code for use in an 'OCL 2.0' tool. As well as the above, the SUPPORT_STATIC_FEATURES provides an EOCL 3.0 user with a warning if they use a feature that should not work under 'OCL 2.0'. Adding this ParsingOption was quite easy and localised. Taking this further to support 'OCL 2.0' behaviour in which 'static' was no longer a reserved word and so could be a variable name is dsirinctly harder and while desirable, I agree with Adolfo that we do not need to do it because we are focussed on 'OCL 2.1'.

I would like to help users accommodate the Collection conforms to OclAny and related semantic changes. However this change is not localised wrt the current MDT OCL code, which appears to have a large number of Collection, Invalid, UnlimitedNatural type conformance problems, some resulting in CCEs. Therefore for this change, I recommend that we refactor the code to provide a clean implementation of the 'OCL 2.5' semantics. When we have done this, we may find that it is possible to introduce a localised 'OCL 2.0' semantic warning, if so, let's do it; if not, too bad.

So where we can easily provide migration assistance let's do so. Where it is too hard, we can at least defer it.

I feel that MDT OCL 3.0.0 should offer the best possible interpretation of OCL 2.1. This is the EOCL 3.0 language.

Where practical, I feel that MDT OCL 3.0.0 should offer source level migration assistance to and from OCL 2.0.

   Regards

      Ed Willink

_______________________________________________
mdt-ocl.dev mailing list
mdt-ocl.dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/mdt-ocl.dev




Back to the top