Мо́дула-2
(Modula-2) —
язык программирования
общего назначения, являющийся развитием
Паскаля
, разработанный
Никлаусом Виртом
в
1978 году
.
Цели и принципы разработки языка
Язык Модула-2 был разработан Никлаусом Виртом для создания системного программного обеспечения
(англ.)
(
, разработка которой началась в 1977 году в
Институте информатики Цюриха
. Этим определяются многие его особенности. Язык изначально проектировался как средство промышленного системного программирования, позволяющее писать надёжные, понятные, удобные в сопровождении программы. При этом язык должен был, оставаясь
языком высокого уровня
со
строгой типизацией
и поддержкой всех средств надёжного программирования, давать возможность обращаться непосредственно к аппаратуре, создавать специфические
системные программы
, такие как
обработчики прерываний
и
драйверы
устройств, поддерживать программирование
параллельно исполняющихся взаимодействующих процессов
.
Непосредственным предком Модулы-2 был язык
Модула
, созданный Виртом в первой половине 1970-х на основе
Паскаля
. Основным дополнением, отразившимся и в названии языка, была возможность разбиения программы на модули — отдельные фрагменты кода, взаимодействующие через явно описанные интерфейсы. Также был переработан синтаксис и добавлены средства параллельного программирования. Единственная экспериментальная реализация Модулы появилась в
1975 году
. Модулу можно рассматривать как первоначальный вариант, своего рода «альфа-версию» Модулы-2, синтаксически эти два языка очень близки. Кроме того, по словам Вирта, на Модулу-2 оказал влияние язык
(англ.)
(
, разработанный в
Xerox PARC
.
Общая характеристика
Язык Модула-2 —
структурный
,
модульный язык программирования
, с синтаксисом, основанным на языке Паскаль, но заметно переработанным и улучшенным. Его основные характерные особенности приведены ниже.
-
Программа представляет собой набор
модулей
— самостоятельных единиц компиляции, которые могут компилироваться раздельно. При этом программный модуль может (но не обязан) быть разделён на две части: модуль определений и модуль реализации. Модуль определений — это внешний интерфейс модуля, то есть набор экспортируемых им имён констант, переменных, типов, заголовков процедур и функций, которые доступны внешним модулям. Модуль реализации содержит программный код, в частности, конкретизацию описаний всего, что перечислено в модуле определений. Например, некоторый тип «запись» может быть объявлен в модуле определений с указанием лишь его имени, а в модуле реализации — с полной структурой. В этом случае внешние модули могут создавать значения данного типа, вызывать процедуры и функции, работающие с ним, выполнять присваивание переменных, но не имеют прямого доступа к структуре значений, поскольку эта структура не описана в модуле определений. Если для этого же типа описать в модуле определений структуру, то она станет доступна. Помимо модулей глобального уровня в Модуле-2 допускается создавать локальные модули.
-
Импорт определений, описанных в прочих модулях, полностью контролируется. Можно импортировать модули определений целиком, но синтаксис позволяет существенно уточнять списки импорта, например, импортировать из модуля конкретные константы, переменные, процедуры и функции, только те, которые необходимы.
-
Все средства ввода-вывода исключены из языка. Вместо них используются библиотечные модули, на которые возложена задача реализации ввода-вывода на конкретных системах. Однако имеется набор стандартизованных библиотек ввода-вывода, предоставляющих необходимые функции для типичных случаев (ввод-вывод основных типов данных с использованием текстового терминала, файловый ввод-вывод).
-
В язык введён минимум понятий и примитивов для
многопоточного программирования
, добавлена также
стандартная библиотека
, поддерживающая
параллельные программы
.
-
Включены средства прямого доступа к аппаратуре компьютера, в частности, реализовано прямое отображение структур данных на память, в том числе с прямым заданием адреса.
Язык прост по структуре — в нём имеется только 40
зарезервированных слов
(для сравнения, в
Аде
их 63); официальное «Сообщение о языке», содержащее исчерпывающее описание Модулы-2, занимает 40 страниц (полное описание
сокращённого
варианта
ПЛ/1
занимает около 200 страниц).
Особенности синтаксиса
Описать особенности Модулы-2 проще всего путём сравнения с языком Паскаль. Наиболее важные отличия, помимо введения модулей и механизмов управляемого экспорта описаний, состоят в нижеследующем.
-
Язык регистро-зависимый — прописные и строчные буквы в идентификаторах различаются. Все ключевые слова пишутся в верхнем регистре.
-
Синтаксис сделан более регулярным и упрощён. Все синтаксические конструкции, кроме цикла REPEAT-UNTIL, следуют принципу: конструкция, начинающаяся с ключевого слова, заканчивается ключевым словом. В частности, условный оператор имеет общий вид
IF Условие THEN
Операторы
ELSIF Условие THEN
Операторы
ELSIF Условие THEN
Операторы
...
ELSE
Операторы
END
Благодаря этому исчезла необходимость постоянного использования составных операторов
BEGIN-END
и «лестниц» операторов IF при многоступенчатой проверке условий.
-
Циклы
WHILE
и
FOR
также предусматривают тело из набора операторов и заканчиваются зарезервированным словом
END
.
-
Добавлен
безусловный цикл
LOOP-END
.
-
И
процедуры
, и
функции
объявляются с ключевым словом
PROCEDURE
.
-
Добавлен предопределённый тип BITSET —
битовое поле
.
-
Из языка исключён оператор безусловного перехода
GOTO
.
-
Добавлен процедурный тип, дающий возможность присваивать процедуры и функции переменным. Позже эта возможность была включена и в Паскаль, где она изначально отсутствовала.
Диалекты
Существует два основных диалекта Модулы-2. Первый —
PIM
(по названию книги Никлауса Вирта «Programming in Modula-2», где было дано развёрнутое описание языка и основных системных библиотек), существует в трёх основных вариантах, появлявшихся последовательно и минимально отличающихся друг от друга. Второй основной диалект —
ISO
, стандартизованный Международной организацией по стандартизации. Основные отличия диалектов от первоначального описания языка перечислены далее.
-
PIM2
(1983)
-
Требует обязательного использования директивы
EXPORT
в модуле определений.
-
Функция
SIZE
является библиотечной и должна импортироваться из модуля
SYSTEM
.
-
PIM3
(1985)
-
Удалена директива
EXPORT
из модулей определений. Изменение мотивировалось тем, что всё содержимое модуля определений экспортируется, так что использование
EXPORT
является избыточным.
-
Функция
SIZE
является предопределённой (доступна в любом месте программы без импорта).
-
PIM4
(1988)
-
Уточнено поведение операции
MOD
для отрицательных операндов.
-
Добавлено требование, согласно которому все строки, описанные как
ARRAY OF CHAR
, должны завершаться нулевым символом (ASCII NUL), даже если строка занимает весь массив целиком.
-
ISO
(1996 и 1998)
-
Добавлены типы данных
COMPLEX
and
LONGCOMPLEX
.
-
Добавлены исключения.
-
Добавлена конструкция для кода завершения модуля
FINALLY
.
-
Полностью стандартизована библиотека ввода-вывода.
-
Внесены уточнения, снявшие большинство неоднозначностей оригинального описания, сделано много мелких исправлений и разъяснений.
Достоинства и недостатки
Можно определённо сказать, что язык Модула-2, сохранив положительные черты Паскаля, имеет ряд особенностей, делающих её языком, гораздо более мощным и лучше приспособленным как для
системного
, так и для
прикладного программирования
. Основные преимущества Модулы-2 перед современными ему языками структурного программирования следующие
:
-
Простота и лаконичность определения языка. Полное определение синтаксиса в нотации
РБНФ
занимает менее 3 страниц, полные
синтаксические диаграммы
— 12 страниц, официальное «сообщение о языке» имеет объём 40 страниц, что для универсального языка с такими возможностями — едва ли не абсолютный минимум. Для сравнения: официальное полное определение
языка Ада
занимает 400 машинописных страниц.
-
Простой, логичный и однородный синтаксис, очищенный от избыточных конструкций и элементов, провоцирующих ошибки написания. Модула-2 — первый из директивных языков программирования, в котором удалось отказаться от оператора
GOTO
.
-
Хорошо продуманный механизм разделения программы на единицы компиляции (модули) с явно описываемыми интерфейсами и полностью контролируемым импортом, позволяющим импортировать как целые модули, так и отдельные элементы с возможностью как квалифицированного (с указанием имени модуля) так и неквалифицированного использования имён импортированных объектов.
-
Исключение из языка средств ввода-вывода и большинства стандартных процедур и функций и перенос их в библиотеки, оформленные в виде стандартных модулей, что упрощает язык и компилятор и предоставляет реализатору полную свободу в способах реализации стандартных процедур и функций.
-
Включение в язык механизмов низкоуровневого программирования, в том числе непосредственной работы с памятью и нетипизированными данными и указателями, что позволяет писать на языке высокого уровня большинство низкоуровневых программ, которые традиционно писались на ассемблере, таких как драйверы и обработчики
прерываний
.
-
Наличие элементарных средств параллельного программирования, выбранных таким образом, чтобы гарантировать их адекватную реализацию как на физически многопроцессорных платформах, так и на платформах с разделением времени.
-
Существенным для времени создания языка было появление процедурного типа и, соответственно, переменных, которым можно динамически присваивать процедуры.
К недостаткам языка можно отнести:
-
Слабость механизмов
параллельного программирования
, в частности — организации взаимодействия параллельных процессов. Реализация этих средств переложена на системные библиотеки, причём в стандартной библиотеке имеются лишь простейшие средства управления распараллеливанием. Параллельная программа на Модуле-2, использующая средства управления параллелизмом, выходящие за эти рамки, автоматически теряет переносимость.
-
Отсутствие механизмов управления отображением
абстрактных типов
на память.
-
Поддержка локальных модулей неоправданно усложняет компилятор. Поводами для использования вложенных модулей являются ограничение области видимости и выделение высокоприоритетных частей программы для обеспечения синхронизации при параллельной обработке, но их можно реализовать и другими, более простыми и очевидными, средствами.
-
Явное разделение на модуль реализации и модуль определения — спорное решение. Оно усложняет работу компилятора и вынуждает программиста синхронизировать изменения в разных файлах. Можно отметить, что в потомке Модулы-2 —
Обероне
, — от такого разделения отказались, вместо этого в едином программном модуле экспортируемые элементы (составляющие интерфейс модуля) просто помечаются специальным образом.
Можно также отметить отсутствие в Модуле-2 ряда возможностей, известных и популярных на момент её создания, что может быть отнесено как к достоинствам, так и к недостаткам языка, в зависимости от точки зрения конкретного критика:
Использование
В СССР первые
компиляторы
для Модула-2 появились в 1982-83 годах для ЭВМ СМ-4 и Электроника-60. Транслятор для БЭСМ-6 был разработан в
ВЦ АН СССР
(
В.А. Серебряков
, В.Г. Лютый, А.Н. Бездушный)
. Тогда же были выработаны технологии программирования и созданы первые пакеты прикладных программ на Модуле-2. Такие работы велись, в частности, на факультете Кибернетики
МИФИ
. ВНТК «СТАРТ» Вычислительного Центра
Сибирского отделения Академии наук СССР
разработал серию процессоров
Кронос
с аппаратной поддержкой языка программирования Модула-2.
В целом можно сказать, что Модула-2 не получила того распространения и признания, которого заслуживала по своим качествам. Язык завоевал определённую популярность в академической среде Европы, был довольно популярен среди программистов СССР, но не смог потеснить своего предшественника: новые реализации языка Паскаль, включившие в себя средства организации
модулей
, а позже — средства
объектного программирования
, всегда обходили Модулу-2 по популярности. Система Lilith, для которой создавалась Модула-2, не получила широкой известности и не смогла помочь Модуле-2 в продвижении.
Свою роль сыграло чрезвычайно широкое распространение дешёвых и быстрых Паскаль-компиляторов фирмы
Borland International
. Интересно, что компилятор Turbo Modula-2 для ОС CP/M был не только создан Borland, но даже поступил в продажу в Северной Америке и Западной Европе. Однако руководство компании, прежде всего
Филипп Кан
, приняло решение отказаться от развития этой системы, чтобы не создавать конкурента крайне успешному
Turbo Pascal
. Результатом этого решения стало то, что вице-президент Borland Нильс Йенсен, один из основателей компании, вместе со своей командой разработчиков в 1987 году покинул Borland, выкупив права на Turbo Modula-2. Созданная им компания
JPI
(Jensen & Partners International) выпустила под маркой TopSpeed линейку компиляторов для процессоров семейства x86: Assembler, Modula-2, Pascal, C/C++, Ada.
В настоящее время язык Модула-2 используется для программирования бортового программного обеспечения спутников, запускаемых в рамках проекта
ГЛОНАСС
. В конце 2010 г. компилятор GNU Modula-2 официально включён в коллекцию
GCC
.
Языки-потомки
-
Модула-3
— дальнейшее развитие Модулы-2, разработанное совместно Фирмами
DEC
и
Olivetti
при консультационной поддержке Вирта.
-
Оберон
— дальнейшее развитие Модулы-2, созданное Виртом в 1988 году. Оберон использует автоматическое управление памятью со
сборкой мусора
, также в нём изменён ряд черт, которые по опыту эксплуатации Модулы-2 автор счёл неудачными. Добавлена экономно реализованная объектная подсистема. Оберон, в свою очередь, стал родоначальником целой ветви языков:
,
Оберон-2
, Component Pascal (
Компонентный Паскаль
),
Активный Оберон
,
.
-
Zonnon
— язык, созданный Юргом Гуткнехтом на основе Модулы-2 и Активного Оберона, с добавлением ряда новых элементов, как оригинальных, так и заимствованных из других языков.
-
— Алма-0 является дополненной (мультипарадигмальной) версией императивного языка Modula-2.
-
— это структурированный язык программирования для параллельного программирования данных (SIMD-системы), разработанный Томасом Браунлом в 1989 году. Язык основан на последовательной Modula-2, но расширен неавтономными параллельными конструкциями.
Помимо прямых потомков, множество других языков в той или иной мере унаследовало у Модулы-2 элементы синтаксиса и общей архитектуры. О влиянии Модулы-2 говорили создатели таких мало похожих языков, как, например,
Lua
и
Go
. Влияние Модулы-2 (и в большей степени её потомка, языка Оберон) прослеживается в Java, C#, поздних диалектах Паскаля, таких как Object Pascal и Delphi.
Примечания
-
ISO/IEC 10514-1:1996
-
Вирт Н.
Программирование на языке Модула-2. М.: Мир, 1987;
-
↑
Курочкин В. М.
Предисловие редактора перевода к книге: Вирт Н. Программирование на языке Модула-2. М.: Мир, 1987.
-
↑
Никлаус Вирт.
(рус.)
. ИнфоАрт (1998). Дата обращения: 25 октября 2010.
19 сентября 2011 года.
-
(неопр.)
. Дата обращения: 30 ноября 2019.
11 сентября 2019 года.
-
Руслан Богатырёв.
(рус.)
. Мир ПК, #04/2001 (17 апреля 2001). Дата обращения: 25 октября 2010.
18 мая 2011 года.
-
Колташев А. А.
от 11 апреля 2011 на
Wayback Machine
-
(неопр.)
. Дата обращения: 9 октября 2009.
5 октября 2009 года.
-
English book:
Bräunl: Parallel Programming
, Prentice-Hall, 1993
English book:
Bräunl: Parallel Image Processing
, Springer-Verlag, 2001
German book:
Bräunl: Parallele Programmierung
, Vieweg-Verlag, 1993
German book:
Bräunl: Parallele Bildverarbeitung
, Addison-Wesley, 1995
German book:
Bräunl: Massiv parallele Programmierung mit dem Parallaxis-Modell
, Springer-Verlag, Informatik-Fachberichte, 1990
Russian book:
Bräunl: Parallel Programming
, Vyschshaya Shkola Publishers, Kiev, 1997
Литература
-
Вирт Н.
Программирование на языке Модула-2. Перевод с англ.
В. А. Серебрякова
, В. М. Ходукина; Под ред.
В. М. Курочкина
. — М. : Мир, 1987. — 222 с.
-
Вирт Н.
(версия книги на языке Модула-2), Москва, Мир, 1989,
ISBN 5-03-001045-9
(русск.), 0-13-022005-1 (англ)
-
Руслан Богатырёв.
(рус.)
. Мир ПК, #04/2001 (17 апреля 2001). Дата обращения: 25 октября 2010.
-
Кристиан К.
Руководство по программированию на языке Модула-2. — М.,
Мир
, 1989. —
ISBN 5-03-001117-X
— 463 с.
Ссылки
-
(рус.)
. — Подборка ссылок по языку Модула-2. Дата обращения: 25 октября 2010.
23 августа 2011 года.
-
(англ.)
. — официальный сайт. Дата обращения: 25 октября 2010.
23 августа 2011 года.
-
(англ.)
. —
бесплатный
компилятор
от новосибирской компании Эксельсиор. Дата обращения: 25 октября 2010. Архивировано из
23 августа 2011 года.
-
-
— ресурс пользователей языка.
-
.