Возникает сильная проблема с совместимостью кода. Я в свое время пытался делать портабельное ПО для КП (Oberon-L), XDS и А2. Вот что получалось для Oberon-L:
## Код:
```
TYPE
      File* = POINTER TO ABSTRACT RECORD
         type-: Type;
         init: BOOLEAN;
      END;
   PROCEDURE (f: File) InitType* (type: Type), NEW;
   BEGIN
      ASSERT(~f.init, 20);
      f.type := type$; f.init := TRUE
   END InitType;
```

Вот что получалось для A2:
## Код:
```
File* = OBJECT (* ========== *)
      VAR type-: Type;
         init: BOOLEAN;
   PROCEDURE InitType* (type: Type);
   BEGIN
      ASSERT(~SELF.init, 20);
      SELF.type := type; SELF.init := TRUE
   END InitType;
   END File;
```

Из одного программного кода нельзя получить другой простыми способами подстановок, как это делает препроцессор. Нужно для переноса на A2 процедурную часть заводить вручную копипастом внутрь объекта.

Мне нравится и Oberon-L (CONST,TYPE,VAR,PROC) и Active Oberon OBJECT(CONST,VAR,PROC), OBJECT(CONST,VAR,PROC), кроме слова "OBJECT". Но для компилятора нужно выбирать что-то одно, "всякая политика хороша, кроме политики колебаний".