Readers may like to know what I found the advantages and disadvantages of Object Rexx to be. Starting with the latter:
expose
. Instead of declaring all instance variables at the
head of a class definition, they have to be exposed
at the start of
each method, or at least those used by the method do. This makes it harder
to see what instance variables a class has, and less convenient to change
the name of a variable consistently.
.C~new~~setContents( .WebObjectContents~of( .C1~new~~setContents( .WebObjectContents~of( .C2~new... )) )We circumvented this by making the code generator break such expressions down into several assignments, using temporary variables to store intermediate results. This bug may by now have been fixed, in which case it has been no more than a temporary annoyance.
More seriously, even under the latest Merlin Object Rexx, it seems that the number of instances that can be created simultaneously is much smaller than one would expect from the amount of memory available. As well, execution speed decreases markedly as instances are created, even if only one is being accessed at a time. Graham Stark has suggested that adjusting process priorities may help with the speed problem, but we do need further help on this.
We found, when we started investigating Object Rexx and its efficiency in late 1996, that it was getting less whole-hearted support from IBM than we could have wished. Although the development team were personally very helpful, I found it extremely difficult to discover how long IBM would continue to support Object Rexx for, how much effort they would devote to optimising it and clearing bugs, and so on. It was notable that the IBM Web pages that announced Merlin at this time said almost nothing about Object Rexx. It is, I hope, not unreasonable to say in the revised post-conference version of this paper, that other conference delegates were also worried about future support for Object Rexx. Some felt that IBM top management does not wish to devote many resources to Object Rexx, and that this has hindered its development.
This has been a big problem. Firstly, IFS software must be reliable under heavy load and while sharing the server with some large modelling programs. It would not be good if the server were to crash on Budget Night, for example! But even four months before Budget Night 1996, we could not find out what might be done in the way of future bug-fixes and improvements. In the event, we decided not to use Object Rexx for anything other than this prototype teaching experiment, and to stick with Classic Rexx for our main Web applications. In the event, this performed excellently: but of course, it is not suitable for big WOM-style applications.
Secondly, I should add a personal comment. I suspect, and this seems to be borne out by experience, that very few if any Internet service providers and similar organisations use Object Rexx. I certainly would be unable to justify doing so if I were one, not because it's a bad language (it isn't), but because I would always worry about lack of speed and support. Consequently, in its present form, WOM is practically useless; until it is translated into some alternative language, my work on it has been almost entirely wasted.
All this would not matter if there were alternative non-IBM
implementations of the language. But as far as I know, there are not.
IBM do have an implementation for Windows, but it is not clear that this
would have more support than the OS/2 version. It is also incompatible
in a very important way: namely .environment
is not global, but
there is one copy per process. As indicated just below, its global
nature under OS/2 is very important to WOM.
As for Object Rexx's strengths:
.environment
. This is very handy as a place to store the
table which maps session identifiers to instances, and other global
information.
~~
. The expression i~~m
calls method
m
of i
but returns i
as result. This is unlike the
perhaps more normal use of ~
; i~m
calls m
and returns
its result. By using ~~
, the compiler can generate compact
code for creating instances and initialising them in the same expression,
as shown in Section 3.3.
New$
URL), and to find the corresponding
class and instantiate it at run-time.