Simula — название двух языков программирования симуляции , Simula I и Simula 67, разработанных в 1960-х годах в Норвежском вычислительном центре в Осло Оле -Йоханом Далем и Кристен Нюгор . Синтаксически он является приблизительным надмножеством ALGOL 60 , [1] : 1.3.1 и также находился под влиянием дизайна Simscript . [2]
Simula 67 представила объекты , [1] : 2, 5.3 классы , [1] : 1.3.3, 2 наследование и подклассы , [1] : 2.2.1 виртуальные процедуры , [1] : 2.2.3 сопрограммы , [1] : 9.2 и дискретно-событийное моделирование , [1] : 14.2 и отличительную сборку мусора . [1] : 9.1 Другие формы подтипирования (помимо наследования подклассов) были введены в производных Simula. [ необходима ссылка ]
Simula считается первым объектно-ориентированным языком программирования . Как следует из названия, первая версия Simula 1962 года была разработана для проведения симуляций ; Simula 67 же была разработана как язык программирования общего назначения [3] и предоставила основу для многих функций объектно-ориентированных языков сегодня.
Simula использовалась в широком спектре приложений, таких как моделирование сверхбольших интегральных схем (VLSI), моделирование процессов , протоколов связи , алгоритмов и других приложений, таких как набор текста , компьютерная графика и образование . Влияние Simula часто недооценивается, и объекты типа Simula переиспользуются в C++ , Object Pascal , Java , C# и многих других языках. Ученые-компьютерщики, такие как Бьярн Страуструп , создатель C++, и Джеймс Гослинг , создатель Java, признали Simula как основное влияние. [4]
Следующий отчет основан на историческом эссе Яна Руне Холмевика. [5] [6]
Кристен Нюгаард начала писать программы компьютерного моделирования в 1957 году. Нюгаард увидел необходимость в лучшем способе описания неоднородности и работы системы. Чтобы продвинуться дальше со своими идеями о формальном компьютерном языке для описания системы, Нюгаард понял, что ему нужен кто-то с большими навыками компьютерного программирования , чем у него. Оле-Йохан Даль присоединился к нему в работе в январе 1962 года. Вскоре после этого было принято решение о привязке языка к ALGOL 60. К маю 1962 года были установлены основные концепции для языка моделирования . Родился SIMULA I , специальный язык программирования для моделирования дискретно-событийных систем.
Кристен Нюгаард была приглашена посетить корпорацию Eckert–Mauchly Computer в конце мая 1962 года в связи с маркетингом их нового компьютера UNIVAC 1107. Во время этого визита Нюгаард представила идеи Simula Роберту Бемеру , директору системного программирования в Univac . Бемер был большим поклонником ALGOL и нашел проект Simula убедительным. Бемер также был председателем сессии на второй международной конференции по обработке информации, организованной Международной федерацией по обработке информации (IFIP). Он пригласил Нюгаард, которая представила доклад «SIMULA – расширение ALGOL для описания дискретно-событийных сетей».
Норвежский вычислительный центр получил UNIVAC 1107 в августе 1963 года со значительной скидкой, на котором Даль реализовал SIMULA I по контракту с UNIVAC. Реализация была основана на компиляторе UNIVAC ALGOL 60. SIMULA I была полностью работоспособна на UNIVAC 1107 к январю 1965 года. В последующие несколько лет Даль и Нюгор много времени уделяли преподаванию Simula. Simula распространилась в нескольких странах по всему миру, и SIMULA I позже была реализована на других компьютерах, включая Burroughs B5500 и российский Урал-16 .
В 1966 году CAR Hoare представил концепцию конструкции класса записи, которую Даль и Найгаард расширили с помощью концепции префиксов и других функций, чтобы удовлетворить свои требования к обобщенной концепции процесса. Даль и Найгаард представили свою статью о декларациях классов и подклассов на рабочей конференции IFIP по языкам моделирования в Осло в мае 1967 года. Эта статья стала первым формальным определением Simula 67. В июне 1967 года была проведена конференция по стандартизации языка и инициированию ряда реализаций. Даль предложил унифицировать концепцию типа и класса. Это привело к серьезным обсуждениям, и предложение было отклонено правлением. Simula 67 была официально стандартизирована на первом заседании Группы по стандартам Simula (SSG) в феврале 1968 года.
Simula оказала влияние на разработку Smalltalk и более поздних объектно-ориентированных языков программирования. Она также помогла вдохновить модель акторов параллельных вычислений, хотя Simula поддерживает только сопрограммы , а не настоящий параллелизм . [7]
В конце шестидесятых и начале семидесятых годов существовало четыре основных реализации Simula:
Эти реализации были перенесены на широкий спектр платформ. TOPS-10 реализовал концепцию публичных, защищенных и закрытых переменных-членов и процедур, которая позже была интегрирована в Simula Standard в 1986 году.
Simula Standard 1986 — это последний стандарт, который перенесен на широкий спектр платформ. Существуют четыре основные реализации:
В ноябре 2001 года Даль и Нюгаард были награждены медалью IEEE Джона фон Неймана Институтом инженеров по электротехнике и электронике «За введение концепций, лежащих в основе объектно-ориентированного программирования, посредством разработки и реализации SIMULA 67». В апреле 2002 года они получили премию AM Turing Award 2001 от Ассоциации вычислительной техники (ACM) с пометкой: «За идеи, лежащие в основе возникновения объектно-ориентированного программирования, посредством разработки языков программирования Simula I и Simula 67». Даль и Нюгаард умерли в июне и августе того же года соответственно [10] до лекции ACM Turing Award [11] , которая должна была быть прочитана на конференции OOPSLA в Сиэтле в ноябре 2002 года.
Исследовательская лаборатория Simula — это научно-исследовательский институт , названный в честь языка Simula, и Нюгор занимал там должность на неполный рабочий день с момента открытия в 2001 году. Новое здание факультета компьютерных наук в Университете Осло названо Домом Оле Юхана Даля в честь Даля, а главная аудитория названа Simula.
Пустой компьютерный файл — это минимальная программа в Simula, измеряемая размером исходного кода . Он состоит только из одной вещи: фиктивного оператора .
Однако минимальную программу удобнее представить в виде пустого блока:
Начало Конец ;
Он начинает выполняться и немедленно завершается. В языке отсутствует возвращаемое значение из программы.
Пример программы Hello world в Simula:
Начало OutText ("Привет, мир!"); Outimage ; Конец ;
Simula нечувствительна к регистру .
Более реалистичный пример с использованием классов, [1] : 1.3.3, 2 подклассов [1] : 2.2.1 и виртуальных процедур: [1] : 2.2.3
Начало Класса Глиф; Виртуальный : Процедура печати Есть Процедура печати;; Начало Конец ; Класс глифа Char (c); Символ c; Начало процедуры print; OutChar(c); Конец ; Класс глифа Строка (элементы); Ссылка (Глиф) Элементы массива ; Начало процедуры print; Начало Целое i; Для i:= 1 Шаг 1 До тех пор, пока UpperBound (элементы, 1) Выполнить элементы (i).печать; OutImage; Конец ; Конец ; Ссылка (Глиф) rg; Ссылка (Глиф) Массив rgs (1 : 4); ! Основная программа; rgs (1):- Новый символ ('A'); rgs (2):- Новый символ ('b'); rgs (3):- Новый символ ('b'); rgs (4):- Новый символ ('a'); rg:- Новая строка (rgs); rg.печать;Конец ;
В приведенном выше примере есть один суперкласс (Glyph) с двумя подклассами ( Char
и Line
). Есть одна виртуальная процедура с двумя реализациями . Выполнение начинается с выполнения основной программы. Simula не поддерживает концепцию абстрактных классов , поскольку классы с чисто виртуальными процедурами могут быть инстанциированы . Это означает, что в приведенном выше примере все классы могут быть инстанциированы. Однако вызов чисто виртуальной процедуры приведет к ошибке времени выполнения .
Simula поддерживает вызов по имени [1] : 8.2.3 , поэтому устройство Дженсена может быть легко реализовано. Однако режим передачи по умолчанию для простого параметра — вызов по значению , в отличие от ALGOL , который использовал вызов по имени . Исходный код для устройства Дженсена должен поэтому указывать вызов по имени для параметров при компиляции компилятором Simula.
Другим гораздо более простым примером является функция суммирования , которая может быть реализована следующим образом:
Действительная процедура Sigma (k, m, n, u); Имя k, u; Целое число k, m, n; Действительный u; Начало действительного s; к:= м; Пока k <= n Выполнять Начало s:= s + u; k:= k + 1; Конец ; Сигма:= с;Конец ;
В приведенном выше коде используется вызов по имени для управляющей переменной (k) и выражения (u). Это позволяет использовать управляющую переменную в выражении.
Обратите внимание, что стандарт Simula допускает определенные ограничения на управляющую переменную в цикле for . Поэтому приведенный выше код использует цикл while для максимальной переносимости.
Следующее:
тогда можно реализовать следующим образом:
Z:= Сигма (i, 1, 100, 1 / (i + a) ** 2);
Simula включает пакет моделирования [1] : 14.2 для выполнения дискретно-событийного моделирования . Этот пакет моделирования основан на объектно-ориентированных функциях Simula и его концепции сопрограмм [1] : 9.2 .
Сэм, Салли и Энди покупают одежду. Они должны делить одну примерочную. Каждый из них просматривает магазин около 12 минут, а затем пользуется примерочной исключительно около трех минут, каждый из них следует нормальному распределению. Симуляция их опыта в примерочной выглядит следующим образом:
Моделирование Начало Класс FittingRoom; Начало Ссылка (Головная) дверь; Логическое значение inUse; Запрос процедуры ; Начало Если inUse Тогда Начало Подождите (дверь); дверь.Первый.Выход; Конец ; inUse:= True ; End ; Процедура выхода; Begin inUse:= False ; Активировать дверь.First; End ; дверь:- Новая Голова; Конец ; Отчет о процедуре (сообщение); Текстовое сообщение; Начало OutFix (Время, 2, 0); OutText (": " & сообщение); OutImage; Конец ; Класс процесса Person (pname); Текст pname; Begin While True Do Begin Удерживать (Обычно (12, 4, u)); отчет (pname & "запрашивает примерочную"); примерочная1.запрос; отчет (pname & " вошел в примерочную"); Удерживать (Обычный (3, 1, u)); примерочная1.выйти; report (pname & "покинул примерочную"); Конец ; Конец ; Целое число u; Ссылка (Примерочная) fittingRoom1; fittingRoom1:- Новая примерочная; Активировать нового человека («Сэм»); Активировать нового человека («Салли»); Активировать нового человека («Энди»); Удерживать (100);Конец ;
Основной блок имеет префикс Simulation
для включения симуляции. Пакет симуляции может использоваться в любом блоке, и симуляции могут быть даже вложенными при симуляции кого-то, кто выполняет симуляции.
Объект примерочной использует очередь ( door
) для получения доступа к примерочной. Когда кто-то запрашивает примерочную и она занята, он должен ждать в этой очереди ( Wait (door)
). Когда кто-то выходит из примерочной, первый (если таковой имеется) освобождается из очереди ( Activate door.first
) и соответственно удаляется из очереди на дверь ( door.First.Out
).
Person является подклассом , Process
а его деятельность описывается с помощью удержания (время на просмотр магазина и время, проведенное в примерочной) и вызывает процедуры в объекте примерочной для запроса и выхода из примерочной.
Основная программа создает все объекты и активирует все объекты-персоны, чтобы поместить их в очередь событий. Основная программа удерживает 100 минут смоделированного времени, прежде чем программа завершается.
{{cite report}}
: CS1 maint: неподходящий URL ( ссылка )Разработка .. SIMULA I и SIMULA 67... была под влиянием дизайна SIMSCRIPT ...