The ModulaTor logo 7KB

The ModulaTor

Oberon-2 and Modula-2 Technical Publication

The ModulaTor
Erlangen's First Independent Modula_2 Journal! Nr. 1, Feb-1994 
______________________________________________________________


Modula-2O 

An object oriented extension of Modula-2 

Dedicated to Professor N. Wirth on the occasion of his 60th birthday 

Markus Klingspor and Juergen Wolff von Gudenberg 

Institut fuer Informatik 

Universit~at Wuerzburg 

D-97074 Wuerzburg 

November 1993 [ed. note: revised in Feb-1994; submitted to The ModulaTor in 
03-Feb-1994] 

Abstract: In this paper we summarize some ideas which currently are discussed 
concerning the extension of the ISO-Modula-2 Standard [iso] and combine 
these with our opinion how a type safe object oriented modular language with 
separate compilation should be defined. One of the main design principles of 
Modula-2O was to generate a genuine object oriented language and maintain 
upward compatibility to Modula-2 by introducing the extensions orthogonally. 
Although many of the key object oriented features can be simulated by 
procedural components of records with slight extensions [wm2oop], we propose 
the introduction of class types as the main building block which enables us to 
define dynamic entities, realize late binding and polymorphism, and allows for 
multiple inheritance and generic data types. Many of the newly introduced 
features are well known from other object oriented languages [cpp, eiffel, 
oberon2, modula3] but some ideas are new like the solution of constrained 
genericity, the covariant type-checked refinement of methods or the means of 
handling VAR parameters together with polymorphism. 

(We like to thank the members of the Modula-2 Interessen Gemeinschaft for fruitful comments.) 

 

Class Types 

The key features of object oriented programming like autonomous dynamic 
objects, (multiple) inheritance, late binding of methods, polymorphism and 
genericity are all introduced in connection with classes. Classes -- in other 
languages called objects -- contain attributes which may be modified by class 
type specific methods. Attributes and methods are subsumed under the name 
features in this paper. 

Although class types and modules seem to have many things in common, class 
types should not be denoted as modules as e.g. in Modula-2/90 [odersky]. The 
main reason for this is backward compatibility. Either every module is a class 
type which would cause problems for code written in Modula-2, or no module 
should be considered as a class type. 

On the other hand record types with their data and procedural components do 
not support late binding and object autonomy and therefore are not suitable to 
represent class types. 

Therefore we introduce class types as an extension of record types. 

 

Type Definition 

The complete definition of a class type is separated into two parts, the interface 
or type definition in the definition module and the associated method bodys in 
the implementation module. 

The new keyword CLASS commences the type description and in an 
implementation module opens, for the implementation of the methods of the 
class type, a new scope where all its features are directly visible . This scope 
also contains an initialization and a finalization part like a local module. Since all 
features of a class type are thus contained in two contiguous parts the 
readability of the code is high in contrast to Oberon-2 or C++ which heavily rely 
on a browser. 

DEFINITION MODULE Classes;

TYPE TClassExample = CLASS
                       x: TX;
                       PROCEDURE X(x: TX);
                       y: READONLY TY;
                       PROCEDURE Y(y: TY);
                     PROTECTED
                       z: TZ;
                       i: READONLY INTEGER;
                       PROCEDURE Z(z: TZ);
                     PUBLIC
                       j: INTEGER;
                     END;
END Classes.

IMPLEMENTATION MODULE Classes;

CLASS TClassExample;
  VAR l,m: INTEGER;

  PROCEDURE X(x: TX);
  BEGIN
    ...
  END X;
  PROCEDURE PrivateMethod;
  BEGIN
  END PrivateMethod;
  PROCEDURE Y(y: TY);
  BEGIN
    ...
  END Y;
  PROCEDURE Z(z: TZ);
  BEGIN
    ...
  END Z;
BEGIN
  x := 42;
FINALLY
  x := 0;
END TClassExample;

END Classes.
 

All features listed in the class type description in the definition module are 
exported which resembles the export of records in Modula-2. Their access from 
outside the module can, however, be restricted by the new keywords 
READONLY or PROTECTED (see Visibility). 

Additional rules are not needed. So, the unit of visibility is the module of the 
class type definition (where every statement may access all features of the 
class). This is the same approach as taken in Oberon-2 [oberon2]. 

Classes, i.e. variables of class type, are dynamic data structures and implicitly 
hold a pointer to the actual instance of the structure. Consequently they are 
created by a call of the standard procedure NEW which obtains an additional 
optional parameter denoting the actual class type of the object to be created. 

Class features are accessed like record fields in Modula-2, no explicit 
dereference is needed. A reference to the calling object of a method is passed 
as an implicit first parameter. Inside the method body this parameter is called 
SELF. 

So classes are implicit pointers. Since sometimes it is desirable to have classes 
as static entities, we introduce an expanded class type by the definition 
EXPANSION OF < class type name >. 

This mimics the declaration of dynamic types in Modula-2. At the first sight it 
might have been more natural to introduce dynamic classes as pointers to the 
by default expanded class types, but that leads to many inconsistencies when 
adding concepts like constrained genericity and redefinition of methods. 

The following declares an expanded class type: 

...
TYPE TClassExample = CLASS
                       ...
                     END;
     TEClassExample = EXPANSION OF TClassExample;

VAR tec: TEClassExample;
    tec2: EXPANSION OF TClassExample;
 

The address of a value of expanded class type can be assigned to a variable of 
dynamic class type. An assignment of the address of a value of expanded class 
type to a VAR parameter of class type is not allowed because there exists no 
variable which actually holds the address. A class can be assigned to a variable 
of expanded class type by dereferencing it. The resulting expanded class type is 
checked to be identical to that of the variable. The explicit notation of the 
dereference was chosen to indicate an assignment to an expanded type. 
Although it is possible to declare pointers to expanded class types, there is not 
much use for it and the resulting type is not compatible to the corresponding 
class type. 

The Introduction of expanded class types leads to an aliasing problem. If inside 
a method of the class type the value of self is returned, it may well point to an 
location in the stack. To avoid this, the possibility to expand a class type may be 
restricted by declaring it as DYNAMIC. Also access to the self value is only 
possible for dynamic class types. 

 

Class Type Variables 

Declaration 

Variables of class type are declared like any other Modula-2 variables. Since 
classes are dynamic structures they must be created before their features can 
be accessed. For dynamic class types the initialization or finalization part is 
executed upon creation and deletion. For each declared variable of expanded 
class type, the initialization and finalization part -- if present -- is executed before 
and after the corresponding parts of the surrounding scope. The surrounding 
scope for global variables is the module in which they are defined. For local 
variables, the initialization and finalization part are executed as a prologue and 
epilogue to the procedure body. 

Creation and Memory Management 

Classes are created by a call of the standard procedure NEW, which has one 
optional parameter denoting the class type of the object to be created. They are 
deleted by a call to the standard procedure DISPOSE. 

MODULE Create;

TYPE TCreate = CLASS
                 x: INTEGER;
               END;
...
VAR ec: EXPANSION OF TCreate;
    c: TCreate;
BEGIN
  (* Here ec is already initialized *)
  NEW(c,TCreate);
END Create.
 

 

Inheritance 

Class types can inherit features from an ancestor type, define additional new 
features and they can redefine inherited features to adjust them to new tasks. In 
this sense, a class type can be a specialization of its ancestor. 

 

Encapsulation and Inheritance 

The encapsulation of data and code is solved correspondingly to the framework 
of Modula-2. Everything listed in the definition module is exported and directly 
visible in an importing module and can be inherited. The access, however, may 
be restricted to conform to the stricter conventions in object oriented 
programming. 

The keyword PUBLIC opens the public section of a class type, this 
characterizes the default case, i.e. direct visibility, read and write access. 

Features declared inside the PROTECTED section of a class type can only be 
accessed outside the module by heirs or descendants (see below). 

The modifier READONLY allows only read access for attributes. It may appear 
in any section. In the protected section of a class type it restricts access for heirs 
of the class type. 

Note: The combination of READONLY and PROTECTED is not considered to 
be important, therefore it is forbidden. 

Private attributes which are not inherited are not allowed. The overhead of 
dragging these attributes as invisible anonymous data fields through the whole 
class type hierarchy which is necessary, if they are accessed -- directly or 
indirectly -- by a public method, seems too large. The problem of completely 
disregarding information from the ancestor should better be solved by a 
redesign of the class type structure, the introduction of a common (abstract) 
ancestor class type, e.g. 

Everything contained in the implementation module like the code of methods is 
encapsulated. It is also possible to define new (private) methods -- which are 
statically bound, whereas the definition of additional attributes is forbidden. 

 

Abstract Class Types 

An abstract class type, specified by the keyword ABSTRACT, only describes an 
interface for some of its methods, no entities of an abstract class type may be 
created. Abstract methods have no implementation in the current class. If an 
abstract class type only contains abstract methods, it does not need to have an 
implementation part at all. 

TYPE TAbstract = ABSTRACT CLASS
                   ABSTRACT PROCEDURE x;
                 END;
 

The concept of abstract classes in the current version of Modula-2O is much 
weaker than in Eiffel [eiffel], because it is not possible to define invariants etc. 
which are inherited. 

 

Single Inheritance 

A class type may inherit features from another class type called its ancestor 
type. In a class type definition, an INHERIT clause indicates that the new class 
type inherits all features from the specified ancestor class type. 

...
TYPE TParent = CLASS
                 x,y: INTEGER;
                 PROCEDURE test;
               END;
     TChild = CLASS
                INHERIT TParent;
                z: INTEGER;
                REDEFINE PROCEDURE test;
                PROCEDURE Test;
              END;
...
 

The features of the ancestor type are directly visible in the descendant class. 
Methods may be redefined and attribute access restricted, however. The 
redefinition of methods has to appear in the definition module and must not be 
an abstract definition. The user of a class who only sees the definition module 
should know the place of definition of a method. The keyword REDEFINE must 
appear before every redefined method to avoid the unintended declaration of 
new methods. The heir of a class should see all attributes of its ancestor, since 
Modula-2O does not support anonymous attributes. 

 

Redefinition of methods 

A class type may redefine parameter and result types of inherited methods. The 
only restriction is that any redefined parameter type must be a descendant of 
the original type and may not be an expanded class type. 

...
TYPE TX = CLASS
          END;
     TY = CLASS
            INHERIT TX;
          END;
     TParent = CLASS
                 x,y: INTEGER;
                 PROCEDURE test(t: TX): TX;
               END;
     TChild = CLASS
                INHERIT TParent;
                REDEFINE PROCEDURE test(t: TY): TY;
              END;
...
 

Redefinition of method parameter types together with late binding (see Binding) 
leads to a hole in the type system, as was exposed by Cook [cook] and is shown 
in the following example: 

...
TYPE TX = CLASS
            PROCEDURE test(t: TX);
          END;
     TY = CLASS
            INHERIT TX;
            REDEFINE PROCEDURE test(t: TY);
          END;
...
VAR x: TX;
    y: TY;
BEGIN
  ...
  x := y;
  x.test(x);
 

The call of x.test(x) is really a call of the implementation of the method test in 
class type TY inside which we now have an entity of type TX assigned to a 
parameter of type TY which is a violation of type compatibility rules (see 
Binding). 

The problem is solved by an additional type check for every redefined 
parameter. This code is only generated for methods that actually have those 
parameters which keeps the introduced overhead relatively small. 

The redefinition of method result types leads to no problem. If a result type is 
redefined, the type of the RETURN statement is checked at compile time inside 
the method. A direct call to the method is also checked correctly at compile time. 
If the method is called indirectly via the interface of the original inherited method, 
it returns a descendant type which is perfectly valid in the sense of 
polymorphism. 

 

Multiple Inheritance 

The main advantage of multiple inheritance is, that it is possible to introduce 
concepts at any level of a class type hierarchy without either programming them 
from scratch or dragging them through the whole hierarchy. Of course, multiple 
inheritance introduces some new problems to deal with. One problem are name 
clashes, because it is possible that several features which have the same name 
can be inherited from different base classes. Name clashes are resolvable by 
qualified access. Qualified access is denoted syntactically by appending the 
appropriate type in square brackets. Qualification may be repeated. 

On the other hand any implementation of multiple inheritance leads to an 
overhead in either time or space. But there exist sophisticated implementations 
of multiple inheritance [minheritance] which keep this overhead relatively small 
so that compared to the gain of flexibility this is nothing to worry about. Objected 
oriented programming was introduced merely to deal with program complexity 
and not for efficiency reasons. 

The following gives an example of multiple inheritance: 

MODULE Clashes;

TYPE TA = CLASS
            a: INTEGER;
          END;
     TB = CLASS
            a: INTEGER;
          END;
     TC = CLASS
            INHERIT TA, TB;
          END;

VAR c: TC;
BEGIN
  c[TA].a := 11;
  c[tB].a := 42;
  (* an access to c.a is not unique and therefore unresolva
ble. *)
END Clashes.
 

 

Ancestor Calls 

If the functionality of an inherited method shall only be extended and not 
completely modified it is necessary to access the inherited method. This is not 
achievable through a type cast because the method binding is dynamic (see 
Binding). The call of an inherited method is written by qualification: 

  AncestorTypeName.MethodName(...
 

The method called is the last (re)definition of the corresponding method 
MethodName in the hierarchy of class type ancestors of the class type 
AncestorTypeName. Thus it is not only possible to call the ancestor method 
which corresponds to the method inside which the statement occurs, but any 
ancestor method that is visible in the current scope. If a method was defined 
private -- i.e. inside the implementation module, then it is not inherited and can 
not be redefined. 

 

Type Compatibility (Polymorphism) 

In object oriented programming it is possible to assign entities of class types to 
variables of their -- direct or indirect -- ancestor types. We allow this only for 
dynamic classes. Assignments of the form 

  X := Y;
 

are only possible if the type of Y is compatible to the type of X. An expanded 
class type is only compatible to itself, whereas a dynamic class type is 
compatible to all its ancestors. Otherwise a value would only partially be 
assignable to a static variable of its ancestor type which means that a projection 
would take place and dynamic binding of methods (see Binding) would be 
replaced by static binding. Our experiences have shown that projection is 
unnecessary and only leads to problems and irritations. 

 

Dynamic binding 

Methods redefined in descendant types are dynamically bound to the actual 
type at runtime. 

The following gives an example: 

TYPE TX = CLASS
            PROCEDURE test;
          END;
     TY = CLASS
            INHERIT TX;
            REDEFINE PROCEDURE test;
          END;

VAR x: TX;
    y: TY;
BEGIN
  x.test;
  x := y;
  x.test;
 

The first call to x.test really calls the implementation of the method test in class 
TX whereas the second call to x.test really calls the implementation of the 
method test in class TY, as the actual type of x after the assignment x := y is TY. 

 

VAR Parameters (The Swap Problem) 

Polymorphism together with the use of VAR parameters causes a severe 
problem which is not solved sufficiently in commonly used object oriented 
languages [cpp, eiffel, oberon2]. 

We consider the following example: 

MODULE SwapCars;

TYPE TCar = CLASS
              ...
            END;
     TVolkswagen = CLASS
                     INHERIT TCar;
                     ...
                   END;
     TBMW = CLASS
              INHERIT TCar;
              ...
            END;

(* Mercedeses are too expensive to be considered here *)

PROCEDURE SwapCar(VAR a,b: TCar);
VAR tmp: TCar;
BEGIN
  tmp := a; a := b; b := tmp;
END SwapCar;

VAR b: TBMW;
    v: TVolkswagen;
BEGIN
  NEW(b,TBMW);
  NEW(v,TVolkswagen);
  SwapCar(v,b);
END SwapCars.
 

This will lead to a type error which is not detectable at compile time. To be able 
to detect the error at runtime, VAR parameters are treated differently if they are 
of dynamic class type -- the problem arises only for dynamic class types 
because in the case of expanded class types the polymorphic assignment is not 
allowed. Before execution of the body of the procedure or method the type 
signature of every VAR parameter of dynamic class type is saved in a hidden 
local variable and on every assignment to that parameter, the signature of the 
value to be assigned is checked to be compatible with the saved signature. 
Thus for every VAR parameter an additional parameter must be passed, which 
denotes the static signature of the passed variable. If the signatures do not 
match a runtime error will occur. 

 

Genericity 

Genericity is not only a special case of inheritance and polymorphism as it is 
often said. Genericity can roughly be simulated through polymorphism [eiffel], 
but then type consistency is no longer provable at compile time. As Modula-2 is 
a strongly statically typed language, it conforms more to the nature of the 
language itself to introduce genericity on a syntactic basis as to rely on the 
programmer to use runtime type checking to achieve this goal. 

 

Unconstrained Genericity 

Since classes are complex entities, which have something of a life of their own, 
it should not become common style to cast around classes between different 
types. To be more specific, it should not be necessary to use type casts to build 
generic structures. This is to be understood in the sense of reusability. If a 
programmer has written code for a doubly linked list, he would like to use this 
code again and again for different purposes without the need to rewrite it from 
scratch every time. This goal can be achieved through generic or parameterized 
class types. A class type is called generic or parameterized, if it contains entities 
of unspecified types. The following shows an example of a generic class: 

MODULE Generics;

TYPE TGenericStack = CLASS [T]
                       PROCEDURE Push(element: T);
                       PROCEDURE Pop():T;
                     END;
     TInteger = CLASS
                  value: INTEGER;
                END;

CLASS TGenericStack;
...

END TGenericStack;

VAR TIntStack: TGenericStack[TInteger];
    i: EXPANSION OF TInteger;
BEGIN
  i.value := 17;
  TIntStack.Push(i);
  ...

END Generics.
 

 

Constrained Genericity 

Constrained genericity allows a generic class type to access features of some 
basic class type for its generic parameters. Any parameter, for which an actual 
type is instantiated must be a descendant of the formal constraint type. 

TYPE TSortable = ABSTRACT CLASS
  ABSTRACT PROCEDURE IsLessThan(elem: TSortable): BOOLEAN;
  ABSTRACT PROCEDURE IsGreaterEqual(elem: TSortable): BOOLEAN;
     END;
  TSortedListElem = CLASS [T: Sortable];
    data: T;
    next: TSortedListElem;
    PROCEDURE Insert(member: T);
  END;
  TSortableStudent = CLASS
    INHERIT TSortable;
    REDEFINE PROCEDURE IsLessThan(elem: TSortableStudent): BOOLEAN;
    REDEFINE PROCEDURE IsGreaterEqual(elem: TSortableStudent): BOOLEAN;
  END;

VAR sortedStudentList: TSortedListElem[TSortableStudent];
 

A problem arises with the creation of attributes of the formal generic type. 
During compilation it can not be determined how much storage is needed and 
which initialization code is to be executed for the actual generic parameter 
which is not known yet. The problem can be solved by indirecting this calls 
through a type parameter table which contains the needed information for every 
generic parameter and is set up for every instance of the generic type. 

 

Overloading 

It is possible to overload procedures and all predefined operators. Syntactically 
operators and functions are treated differently. 

For example to overload the "+" operator we write: 

PROCEDURE UniqueName OPERATOR "+" (arg1, arg2: type): type;

 

To overload a procedure (e.g. INC) we write: 

PROCEDURE UniqueName OVERLOAD INC (VAR arg1: type);
 

The overloaded name must already be visible and the parameter type signature 
must be unique in this scope. 

It is also possible to overload a method or to define an overloaded operator as a 
method. In this case a binary operator may only have one parameter, as the 
other one is determined by the binding class. 

The UniqueName needs to be unique inside its scope and makes it possible to 
import a single overloaded operator or procedure, additionally an expression 
can be transformed into a unique form for debugging purposes. Also the 
corresponding procedures can be called like normal procedures by their 
UniqueName. Operators are of course infix and their predefined priority remains 
unchanged. 

To import operators or overloaded procedures from another module there are 
several possibilities: 

FROM X IMPORT OPERATOR "+"; imports all operators "+" defined in X.
FROM X IMPORT UniqueName;   imports one operator or overload by its name.
FROM X IMPORT OVERLOAD INC; imports all overloads of INC from X.
FROM X IMPORT OPERATOR;     imports all operators;
FROM X IMPORT OVERLOAD;     imports all overloaded procedures;
 

In the case of an unnamed import like IMPORT OPERATOR, the unique names 
are not imported to avoid naming conflicts. Also we did not include an IMPORT 
ALL like Modula-2 SC [modula2sc] for just the same reason. Naming or 
signature conflicts can also be resolved by qualification with the module name. If 
operators or overloaded procedures are imported via their unique name, their 
overloaded name or operator symbol is hidden and they must be called like 
ordinary procedures. 

TYPE tOperator = CLASS
                   PROCEDURE Test OPERATOR "+" (s: INTEGER);
                 END;
(* Implicit SELF Parameter! , Imported with CLASS *)

PROCEDURE MatrixAdd OPERATOR "+" (a,b: MATRIX): MATRIX;
PROCEDURE IntegerSwap OVERLOAD Swap(VAR i,j: INTEGER);

FROM x IMPORT MatrixAdd;
FROM x IMPORT OPERATOR "+";
FROM x IMPORT Swap;
FROM x IMPORT OVERLOAD Swap;
FROM x IMPORT OPERATOR;
 

 

Type Information 

Modula-2O supports concepts to determine the runtime type of a class. The 
procedure TYPEOF accepts one parameter which can be an arbitrary variable. 
If the compile-time type of the variable is a dynamic class type, its actual runtime 
type is returned. In all other cases the result is the compile-time type. The 
results of two calls to TYPEOF are comparable. The following shall serve as an 
example: 

TYPE TA = CLASS
          END;
     TB = CLASS
            INHERIT TA;
          END;
     TC = CLASS
          END;
VAR a: TA;
    b: TB;
BEGIN
  NEW(a,TA);
  NEW(n,TB);

  IF TYPEOF(a)=TA THEN ... (* TRUE *)
  IF TYPEOF(a)<=TA THEN ... (* TRUE *)
  IF TYPEOF(a)>=TA THEN ... (* TRUE *)
  IF TYPEOF(a)<=TYPEOF(b) THEN ... (* TRUE *)
  IF TYPEOF(a)=TYPEOF(b) THEN ... (* FALSE *)
  IF TYPEOF(b)>=TYPEOF(a) THEN ... (* TRUE *)

  a := b;
  IF TYPEOF(a)<=TA THEN ... (* FALSE *)
  IF TYPEOF(a)>=TA THEN ... (* TRUE *)
  IF TYPEOF(a)=TA THEN ... (* FALSE *)
  IF TYPEOF(a)=TB THEN ... (* TRUE *)

  IF TYPEOF(a)<=TC THEN ... (* FALSE *)
  IF TYPEOF(a)>=TC THEN ... (* FALSE *)
 

If TYPEOF(x)<=TYPEOF(y) = TRUE then y is assignable to x. 

It is also possible to use TYPEOF in a type-case statement: 

...
  TYPECASE TYPEOF(a) OF
    TA: ...
  | TB:
  END;
 

In contrast to the usual case statement in Modula-2 the alternatives need 
neither be matched exactly nor need they be mutually exclusive. The first 
alternative which conforms to TYPEOF(a) is chosen. 

Note: Inside the chosen alternative, the type is accessible as the type of the 
alternatives label. This leads to an aliasing problem if the parameter of TYPEOF 
is an arbitrary designator. As this problem is not solvable easiliy, we decided to 
remove automatic casting. 

Inside the alternative the type is not automatically casted to avoid aliasing 
problems. 

It is further possible to enforce type checking on assignments and parameter 
passing in Modula-2O. This is implemented by placing the type guard against 
which the actual runtime type of a variable should be checked in square 
brackets after the variable. The assignment in the following example would be a 
compile time error without the added type guard and a runtime error if the 
runtime type of a is not compatible with TB. 

...
  b := a[TB];
 

 

Summary 

We have shown that our approach presents some powerful new concepts 
(Genericity, Varpar, etc.) which are easy to use and can be implemented quite 
efficiently as a test implementation of a compiler for a subset [diplom] has 
demonstrated. 

 

Bibliography 

[wm2oop] J. Bergin, S. Greenfield: What Does Modula-2 Need to Fully Support 
Object Oriented Programming? SIGPLAN Notices, Vol. 23, No. 3, March 1988. 

[modula3] L. Cardelli, et al.: Modula-3 Report. SRC Research Report 31, DEC 
1988. 

[cook] W.R. Cook: A Proposal for Making Eiffel Type-safe. The Computer 
Journal, Vol. 32, No. 4, 1989. 

[chorn] C. Horn: Conformance, Genericity, Inheritance and Enhancement. 
Bezivin et. al. eds., ECOOP 87, LNCS 276, pp. 223-233. 

[minheritance] Shih-Kun Huang, Deng-Jyi Chen: Efficient algorithms for method 
dispatch in object-oriented programming. Journal of Object Oriented 
Programming, Vol. 5, No. 5, September 1992. 

[iso] Document ISO/IEC JTC1/SC22/WG13 D181. BSI, Leicester University, 
1992. 

[diplom] M. Klingspor: Implementierung objektorientierter Konzepte in einen 
Modula-2 ~Ubersetzer. Diplomarbeit, Universit~at Wuerzburg, 1992. 

[modula2sc] C.F. Korn, S. Gutzwiller, S. K~onig: Modula-SC a Precompiler to 
Modula-2. In Contributions to Computer Arithmetic and Self-Validating 
numerical methods, J.C. Baltzer AG, 1990. 

[eiffel] B. Meyer: Object-oriented Software Construction. Prentice Hall, 1988. 

[oberon2] H. M~ossenb~ock: Objektorientierte Programmierung in Oberon-2. 
Springer Verlag, 1992. 

[odersky] M. Odersky: Extending Modula-2 for Object-oriented Programming. 
First international Modula-2 conference, 1989. 

[cpp] B. Stroustrup: The C++ Programming Language, Second Edition. Addison 
Wesley, 1991. 

[objpas] L. Tesler: Object Pascal Report. Apple Computer 1985. 

[pim3] N. Wirth: Programming in Modula-2, 3rd Edition. Springer Verlag, 1985. 

 

The ModulaTor Forum 

From: sanders@inf.ethz.ch (Beverly Sanders)
Newsgroups: comp.lang.eiffel,comp.compilers,comp.lang.modula2,comp.lang
.oberon
Subject: Final Program: Prog. Langs and System Architectures (March 94,
 Zurich)
Keywords: conference
Date: Mon, 31 Jan 1994 12:14:44 GMT
Sender: compilers-sender@chico.iecc.com
Organization: Dept. Informatik, ETH, Zurich, CH
Approved: compilers@chico.iecc.com

A formatted postscript version of this announcement is
available via ftp from neptune@inf.ethz.ch in file ~ /ftp/pub/PLSA.ps

+-------------------------------------------------------+
|                       PLSA'94                         |
|                                                       |
|              International Conference                 |
|   on Programming Languages and System Architectures   |
|                                                       |
|               With a Special Session                  |
|    in Honor of Niklaus Wirth on his 60th Birthday     |
|                                                       |
|                  March 2-4, 1994                      |
|                    ETH Zuerich                        |
|                    Switzerland                        |
+-------------------------------------------------------+

CONFERENCE PROGRAM 

WEDNESDAY, MARCH 2 

Topics: Optimization, Concurrency 

Session 1 Chair: Juerg Gutknecht, ETH Zuerich, Switzerland 

9:15 - 9:30 Opening Address Carl August Zehnder and Juerg Gutknecht 

9:30 - 10:30 Interconnecting Computers: Architecture, Technology, and 
Economics Butler W. Lampson (DEC SRC, Palo Alto, USA) 

Session 2 Chair: Martin Reiser, IBM Research Zuerich, Switzerland 

11:00 - 11:30 On Computing Power Jean E. Vuillemin (DEC Paris Research 
Laboratory, France) 

11:30 - 12:00 Increasing Memory Bandwidth for Vector Computations Sally A. 
McKee, Steven A. Moyer, William A. Wulf, Charles Hitchcock (University of 
Virginia and Dartmouth College, USA) 

Session 3 Chair: Susan Graham, University of California, Berkeley, USA 

14:00 - 14:30 The Advantages of Machine-Dependent Global Optimization 
Manuel E. Benitez, Jack W. Davidson (University of Virginia, USA) 

14:30 - 15:00 Dependence-Conscious Global Register Allocation Wolfgang 
Ambrosch, M. Anton Ertl, Felix Beer, Andreas Krall (Technical University of 
Vienna, Austria) 

15:00 - 15:30 Type Test Elimination using Typeflow Analysis Diane Corney, 
John Gough (Queensland University of Technology, Brisbane, Australia) 

Session 4 Chair: Beverly A. Sanders, ETH Zuerich, Switzerland 

16:00 - 16:30 Where Concurrent Processes Originate Stanislaw Chrobot 
(Kuweit University) 

16:30 - 17:00 High-Level Abstractions for Efficient Concurrent Systems Suresh 
Jagannathan, James Philbin (NEC Research, Princeton, USA) 

THURSDAY, MARCH 3 

Topics: Programming Language Design, Modular Programming 

Session 1 Chair: Butler W. Lampson, DEC SRC, Palo Alto, USA 

9:00 - 10:00 Languages and Interactive Software Development Susan Graham 
(University of California, Berkeley, USA) 

10:00 - 10:30 Language and Architecture Paradigms as Object Classes 
Diomidis Spinellis, Sophia Drossopoulou, Susan Eisenbach (Imperial College 
London, United Kingdom) 

Session 2 Chair: Gustav Pomberger, University of Linz, Austria 

11:00 - 11:30 Engineering a Programming Language: The Type and Class 
System of Sather Clemens A. Szyperski, Stephen Omohundro, Stephan Murer 
(ICSI Berkeley, USA) 

11:30 - 12:00 OPAL: Design and Implementation of an Algebraic Programming 
Language Klaus Didrich, Andreas Fett, Carola Gerke, Wolfgang Grieskamp, 
Peter Pepper (Technical University of Berlin, Germany) 

Session 3 Chair: Edsger W. Dijkstra, University of Texas, Austin, USA 

14:00 - 15:00 Mechanized Support for Stepwise Refinement Jan L. A. van de 
Snepscheut (Caltech, USA) 

15:00 - 15:30 Architectural Issues in Spreadsheet Languages Alan G. Yoder, 
David L. Cohn (University of Notre Dame, USA) 

Session 4 Chair: Peter Schulthess, University of Ulm, Germany 

16:00 - 16:30 Technological Steps toward a Software Component Industry 
Michael Franz (ETH Zuerich, Switzerland) 

16:30 - 17:00 Distributed High-Level Module Binding for Flexible Encapsulation 
and Fast Inter-Modular Optimization Christian S. Collberg (University of 
Auckland, New Zealand) 

19:00 Conference Banquet Hotel Zuerich, Neumuehlequai 42 

FRIDAY, MARCH 4 

Topic: Oberon 
 

Session 1 Chair: Niklaus Wirth, ETH Zuerich, Switzerland 

9:00 - 10:00 Hardware and Software: The Closing Gap C.A.R. Hoare (Oxford 
University, United Kingdom) 

10:00 - 10:30 Is Oberon as Simple as Possible? Atanas Radenski (University of 
North Carolina, USA) 

Session 2 Chair: Hanspeter Moessenboeck, ETH Zuerich, Switzerland 

11:00 - 11:30 On the Essence of Oberon David A. Naumann (Southwestern 
University, Georgetown, USA) 

11:30 - 12:00 Adding Concurrency to the Oberon System Spiros Lalis, Beverly 
A. Sanders (ETH Zuerich, Switzerland) 

Special session in honor of Niklaus Wirth on his 60th birthday Chair: Carl August 
Zehnder, ETH Zuerich, Switzerland This session is held in room HG F30 
(Auditorium Maximum) 

14:00 - 14:30 Greeting address Gustav Pomberger (University of Linz, Austria) 

14:30 - 16:00 Addresses of a personal nature C. A. R. Hoare (Oxford University, 
United Kingdom) Edward M. McCreight (Adobe, Palo Alto, USA) Anita and Bill 
Walker (East Central University, USA) and others 

Apero 

PROGRAM COMMITTEE 

J. Gutknecht, ETH Zuerich, CH (Chairman)
R. P. Cook, Microsoft, USA
G. Coray, EPF Lausanne, CH
O. J. Dahl, University of Oslo, N
E. W. Dijkstra, University of Texas, USA
G. Goos, TU Karlsruhe, D
S. Graham, UC Berkeley, USA
D. Gries, Cornell University, USA
D. Hanson, Princeton University, USA
B. Kernighan, AT&T Bell Labs, USA
B. W. Lampson, DEC SRC, USA
J. Ludewig, TU Stuttgart, D
J. Misra, University of Texas, USA
H. Moessenboeck, ETH Zuerich, CH
R. Needham, Cambridge University, UK
S. Owicki, DEC SRC, USA
G. Pomberger, University of Linz, A
P. Rechenberg, University of Linz, A
M. Reiser, IBM Research, CH
B. A. Sanders, ETH Zuerich, CH
P. Schulthess, University of Ulm, D
A. Shaw, University of Washington, USA
A. Tanenbaum, Vrije Universiteit Amsterdam, NL
P. D. Terry, Rhodes University, SA
L. Tesler, Apple Corp., USA
J. Welsh, University of Queensland, AUS
N. Wirth, ETH Zuerich, CH

ORGANIZING COMMITTEE

C. A. Zehnder, ETH Zuerich (Chairman)
W. Gander, ETH Zuerich
M. Franz, ETH Zuerich

CONFERENCE SECRETARIAT AND STAFF

H. Guelguen,  ETH Zuerich
M. Bernard,   ETH Zuerich
I. Noack,        ETH Zuerich

LOCATION ETH Zuerich (main building HG), Raemistrasse 101, Zuerich, 
Switzerland Regular sessions: room HG F1 (F floor) Friday afternoon session: 
room HG F30 (Auditorium Maximum, F floor) 

Trains run every 10-15 minutes from the Zuerich airport to the central railway 
station and cost about CHF 5. A taxi from the airport to the center costs about 
CHF 40. From the central railway station take the tram (3 stops) to "ETH 
Zentrum" next to the ETH main building: either tram 6 (direction Zoo) or tram 10 
(direction Seebach). No parking is available at ETH. 

INFORMATION PLSA'94, ETH Zentrum, CH-8092 Zuerich, Switzerland Phone: 
+41-1-632 7311, Fax: +41-1-261 5389, E-Mail: PLSA94@inf.ethz.ch 

REGISTRATION, CONFERENCE DESK Use the enclosed registration card. For 
late registration at the conference desk we charge additional CHF 50. The 
conference desk (in fron00 to 17:00 on Wednesday and from 8:45 to 17:00 on 
Thursday and Friday. 

ACCOMODATION Hotels can be reserved using the enclosed hotel reservation 
card. 

LUNCHES Lunches can be taken in the ETH restaurant "Polyterrasse" (Mensa) 
which is in the main building (B floor, southern elevators). Don't forget your 
lunch tickets that you will get at the conference desk. 

CONFERENCE BANQUET The conference banquet will be held on Thursday, 
March 3, 19:00, at the Hotel Zuerich (Neumuehlequai 42) which is within walking 
distance from ETH. Banquet tickets at CHF 70 each have to be ordered with the 
conference registration. 

PROCEEDINGS AND BOOKS The proceedings are published by 
Springer-Verlag. One copy is included in the conference fee. Additional copies 
can be purchased at the conference book desk that will also show a selection of 
books related to the conference field. 

EXHIBITION Hardware developed at ETH Zuerich will be shown in the J floor of 
the RZ building, Clausiusstrasse 59. The exhibition will be open on conference 
days until 22:00. -- Send compilers articles to compilers@iecc.com or {ima | 
spdcc | world}!iecc!compilers. Meta-mail to compilers-request@iecc.com. 

________________________________________________________________

IMPRESSUM: The ModulaTor is an unrefereed journal. Technical papers are to be taken as working papers and personal rather than organizational statements. Items are printed at the discretion of the Editor based upon his judgement on the interest and relevancy to the readership. Letters, announcements, and other items of professional interest are selected on the same basis. Office of publication: The Editor of The ModulaTor is Guenter Dotzel; he can be reached by tel/fax: [removed due to abuse] or by mailto:[email deleted due to spam]
  ModulaWare home page   The ModulaTor download    [Any browser]

Webdesign by www.otolo.com/webworx, 14-Jul-1998