Это просто идея из разряда "а что если?".
Мне интересно ваше мнение.

Имхо, добавить поддержку интерфейсов в Oberon 2 не сложно:

1. RECORD без полей считается абстрактной (aka интерфейс)
Тип T = RECORD END совместим с любой записью, для которой имеются все методы T
Размещать такие записи запрещено. Наследоваться от записи можно.
2. Методы для RECORD без полей считаются особыми.
При загрузке модуля все такие методы собираются в одну глобальную таблицу:
<номер метода> | <уникальная сигнатура>
При добавлении каждого метода в таблицу если еще нет такой сигнатуры, то выдается новый номер и сигнатура добавляется в таблицу.
3. Таблицу методов в дескрипторе типов нужно дополнить номерами методов в глобальной таблице (если в глобальной таблице нет, то 0, например). Эти номера при загрузке модуля заполняются из глобальной таблицы.
4. Диспетчеризация выполняется очень просто:
Допустим есть абстрактный тип A = RECORD END с методом Read()
и наш конкретный тип R = RECORD f: FILE; END с методом Read()
При присваивании или передаче R в A ничего не делается. Тут поведение остается как раньше.
А вот при вызове любого метода у переменной типа A выполняется простой линейный поиск метода по номеру:
Из таблицы методов типа A берется номер метода и ищется в таблице методов R.
Если R является расширением A, то работает старый механизм.
5. ANYREC программист может определить себе сам как RECORD END без методов.

Все остальное в языке остается без изменений.

Какие грабли тут могут быть?

ps Диспетчеризацию можно ускорить за счет памяти если присваивать типам и методам номера и хранить глобальную таблицу NxM, где N - количество типов записей реализующих абстрактные методы, а M - количество абстрактных методов. Для получения адреса метода m для типа n делаем t^[n, m]

related:viewtopic.php?f=12&t=6127&p=102197#p102189