[x]. Работа компилятора не тривиальна. Как выяснится при изучении наследования, для потомка класса
Синонимичная инфиксная операция
Класс
infix "@", item (i: INTEGER): G is...
Здесь задаются два имени компонента: infix "@" и
В общем, объявление компонентов в форме:
a, b, c... "Описание компонента"
рассматривается как краткая форма записи последовательности объявлений:
a "Описание компонента"
b "Описание компонента"
c "Описание компонента"
...
с одним и тем же "Описанием компонента".
Это применимо как для атрибутов (где "Описание компонента" имеет форму: некоторый_тип), так и для подпрограмм (is тело_программы).
Нотация, применяемая в этом примере для доступа к массиву, достаточно проста. Она совместима с механизмами доступа для других структур, хотя, заметим, инструкция
Стоимость универсализации
Как всегда нужно убедиться, что ОО-техника, введенная в интересах повторного использования, расширяемости и надежности, не влечет потерю производительности. Этот вопрос уже поднимался при рассмотрении массивов. Теперь необходимо с этих позиций проэкзаменовать механизм универсализации в целом. Какова цена универсализация?
В частности, этот вопрос возникает из-за опыта С++, где универсализация, известная как механизм шаблонов, представляла одно из поздних добавлений к языку. Выяснилось, что некоторые компиляторы воспринимают введение универсализации буквально, генерируя различные копии методов класса для каждого фактического родового аргумента! В результате в литературе по С++ предупреждают программистов об опасности широкого использования шаблонов:
| Число создаваемых экземпляров шаблона - уже проблема для некоторых пользователей С++. Если пользователь создает List |
Авторы этого предупреждения (С++ эксперты из AT&T, один из них соавтор официальной С++ документации [Ellis 1990]) продолжают предлагать различные способы, позволяющие избежать порождения шаблонов. Но универсализация не предполагает дублирование кода. При хорошо спроектированном языке и хорошем компиляторе можно генерировать единый код компонентов родового класса, так что последующие добавления потребуют минимальных затрат:
[x]. времени компиляции;
[x]. размера сгенерированного кода;
[x]. времени выполнения;
[x]. памяти, требуемой для выполнения.
Работая в такой среде, можно использовать всю мощь универсализации, не опасаясь потери производительности, как на этапе компиляции, так и выполнения.
Обсуждение: что все-таки не сделано
Основные идеи универсализации уже представлены, но как вы могли заметить, на два важных вопроса не даны ответы.