Программирование на языке Симула-67

Книгу "Программирование на языке Симула-67" открыл почти случайно, но содержание и первые главы заинтересовали. А как может не заинтересовать изложение концепций объектно-ориентированного программирования из 1967 года?

Подобно тому, как Паскаль в 1980-х годах превратили в Объектный Паскаль, в конце 1960-х, то есть почти на 20 лет раньше, Алгол превратили в Объектный Алгол, названный Симулой. Алгол является подмножеством Симулы.

Несмотря на заявленную универсальность, название языка подчеркивает ту область применения, где объектно-ориентированный подход наиболее полно показывает свои преимущества. Это имитационное моделирование (simulation).

Вспоминаю, что в вузовском курсе математического моделирования мы делали лабораторные работы именно на объектном паскале. И поскольку отдельного курса по ООП ещё не было, приходилось одновременно с предметом изучать соответствующие концепции программирования. Действительно, реализовать аналогичный функционал в процедурном и даже модульном подходе гораздо труднее, прежде всего за счет необходимости явного управления структурами, видимостью их полей и процедурами, их обрабатывающими. Расширения ООП в языке делают эту работу на уровне компилятора.

Центральным понятием в Симуле-67 является объект и класс объекта. Объектом называется компонент программы, обладающий собственными данными и процедурами их обработки. Процедуры также называют сценариями поведения объекта. Однако, выполнение процедур возможно только для объекта, являющегося в данный момент активным. Переключение активной фазы на другой объект активизирует его локальное управление. Впрочем, это уже детали, специфичные для моделирования, а не для ООП.

Декларация класса состоит из заголовка и тела. Процедуры класса можно описывать непосредственно в теле декларации, подобно тому, как это сделано 30 лет спустя в Яве или пошарпанном Си. Переменные класса могут иметь область видимости, ограниченную классом или общедоступные. Конструктор класса является простой декларацией одноимённых формальных параметров, инициализирующих переменные класса.

class Пешка (Горизонталь, Вертикаль, Белая);
integer Горизонталь, Вертикаль;
boolean Белая;
...
procedure Ход;
begin
...
end;
procedure Взятие(Вправо); boolean Вправо;
begin
...
end;
end Пешка;

Чтобы вам не рассказывали про "православие, самодержавие, народность инкапсуляцию, наследование, полиморфизм", центральным концептом ООП было и остается наследование реализации. Главная особенность ООП - иерархическая организация классов и соответствующее ей одиночное наследование реализации, в Симуле также поддерживается.

Все концепты языка в книге проиллюстрированы достаточно простыми и понятными примерами (шахматные фигуры, расстановки, ходы).

В главе "Средства имитационного моделирования" описана специфика языка с точки зрения его применения по основному назначению. Подробно описано управление процессами, организация параллельной обработки, вводится концепция событий и уведомлений о событиях (извещений). При этом событие также является объектом! Программы этой главы также проиллюстрированы хорошо понятными примерами из массового обслуживания (очереди, кассы, станция техобслуживания автомобилей).

В главе "Обработка текстов" приводится много примеров использования Симулы в качестве универсального алгоритмического языка, того самого Объектного Алгола.

В целом книга оставляет самое позитивное впечатление даже если не углубляться в детали реализации и специфику моделирования. В отличие предыдущей книги по Лиспу, листать и читать легко, поскольку основные концепции интуитивно понятны.

Хотел бы порекомендовать всем считающими себя программистами хотя бы бегло ознакомится с текстом книги, чтобы понимать, откуда растут все современные языки ООП. Чтобы отличать базовые концепты в чистом виде от "карго-культов", от выпестованной в религиозных войнах шелухи и от "синтаксического сахара", которым они обильно посыпаны, но который не привносит новизны по сравнению с объектно-ориентированным программированием образца 1967 года.

Комментарии

Симула

Было дело. Сначала Симула 1, а затем Симула-67 оказались очень удобными языками для программирования самых разных задач. Тут было и имитационное моделирование и создание программного декодера для принимаемых со спутника сигналов. Только тёплые воспоминания. Трансляторы для языков были написаны для БЭСМ и ЕС группой из ИПМ-МИФИ.