Modula-2 — структурированный процедурный язык программирования , разработанный в период с 1977 по 1985/8 годы Никлаусом Виртом в ETH Zurich . Он был создан как язык операционной системы и прикладного программного обеспечения персональной рабочей станции Lilith . [1] Позже он использовался для программирования вне контекста Лилит.
Вирт рассматривал Modula-2 как преемника своих более ранних языков программирования Pascal и Modula . [2] [3] Основные понятия:
На языковой дизайн повлияли язык Mesa и Xerox Alto , оба из Xerox PARC , которые Вирт видел во время своего творческого отпуска в 1976 году. [4] Компьютерный журнал Byte посвятил августовский номер 1984 года языку и окружающей его среде. [5]
Вирт создал серию языков Oberon как преемника Modula-2, в то время как другие (особенно в Digital Equipment Corporation и Acorn Computers , позже Olivetti ) разработали Modula-2 в Modula-2+ и позже в Modula-3 .
Modula-2 — процедурный язык общего назначения, подходящий как для системного программирования , так и для программирования приложений. Синтаксис основан на более раннем языке Вирта, Паскале , с удаленными некоторыми элементами и синтаксической двусмысленностью. Концепция модуля , предназначенная для поддержки раздельной компиляции и абстракции данных; и была добавлена прямая языковая поддержка мультипрограммирования .
Язык позволяет использовать однопроходные компиляторы . Такой компилятор Гуткнехта и Вирта был примерно в четыре раза быстрее, чем более ранние многопроходные компиляторы . [6]
Вот пример исходного кода программы «Hello world»:
МОДУЛЬ Здравствуйте ; ИЗ STextIO IMPORT WriteString ; BEGIN WriteString ( «Привет, мир!» ) END Hello .
Модуль Modula-2 может использоваться для инкапсуляции набора связанных подпрограмм и структур данных и ограничения их видимости из других частей программы. Программы Модулы-2 состоят из модулей, каждый из которых состоит из двух частей: модуля определения , интерфейсной части, содержащей только те части подсистемы, которые экспортируются ( видны другим модулям), и модуля реализации , который содержит рабочий код, внутренний для модуля.
Язык имеет строгий контроль области действия . За исключением стандартных идентификаторов, ни один объект снаружи не виден внутри модуля, если он не импортирован явно; ни один внутренний объект модуля не виден снаружи, если он не экспортирован явно.
Предположим, что модуль M1 экспортирует объекты a, b, c и P, перечисляя их идентификаторы в явном списке экспорта.
МОДУЛЬ ОПРЕДЕЛЕНИЯ M1 ; ЭКСПОРТ КВАЛИФИЦИРОВАН a , b , c , P ; ...
Тогда объекты a, b,c и P из модуля M1 известны вне модуля M1 как M1.a, M1.b, M1.c и M1.P. Они экспортируются квалифицированным образом наружу (при условии, что модуль M1 является глобальным). Имя экспортирующего модуля, т. е. M1, используется в качестве квалификатора, за которым следует имя объекта.
Предположим, что модуль M2 содержит следующее объявление IMPORT
МОДУЛЬ М2 ; ИМПОРТ М1 ; ...
Тогда это означает, что объекты, экспортированные модулем M1 за пределы включающей его программы, теперь могут использоваться внутри модуля M2. На них указываются квалифицированные ссылки: M1.a, M1.b, M1.c и M1.P. Пример:
... М1 . а := 0 ; М1 . с := M1 . Р ( М1.а + М1.б ) ; _ _ _ ...
Квалифицированный экспорт позволяет избежать конфликтов имен. Например, если другой модуль M3 экспортирует объект с именем P, то эти два объекта можно различить, поскольку M1.P отличается от M3.P. Не имеет значения, что оба объекта внутри модулей экспорта M1 и M3 называются P.
Альтернативный метод существует. Предположим, что модуль M4 сформулирован так:
МОДУЛЬ М4 ; ИЗ M1 ИМПОРТ a , b , c , P ;
Это означает, что объекты, экспортированные модулем M1 наружу, снова могут использоваться внутри модуля M4, но теперь посредством простых ссылок на экспортированные идентификаторы в неквалифицированном виде , например: a, b, c и P. Пример:
... а := 0 ; с := P ( а + б ); ...
Этот метод импорта можно использовать, если нет конфликтов имен. Это позволяет использовать переменные и другие объекты вне их модуля экспорта таким же неквалифицированным способом, как и внутри модуля экспорта.
Правила экспорта и импорта не только защищают объекты от нежелательного доступа, но также позволяют создавать перекрестные ссылки на определение каждого идентификатора в программе. Это свойство помогает поддерживать большие программы, содержащие множество модулей.
Язык обеспечивает однопроцессорный параллелизм ( мониторы , сопрограммы и явная передача управления) и аппаратный доступ (абсолютные адреса, битовые манипуляции и прерывания ). Он использует систему номинальных типов .
Существует два основных диалекта Модулы-2. Первый — PIM , названный в честь книги Никлауса Вирта «Программирование в Модуле-2» . [4] Было три основных издания PIM: второе, третье (исправленное) и четвертое. Каждый описывает небольшие варианты языка. Вторым основным диалектом является ISO , названный в честь усилий по стандартизации Международной организации по стандартизации . Вот некоторые различия между ними.
EXPORT
предложение в модулях определения.SIZE
необходимо импортировать из модуляSYSTEM
EXPORT
пункт из модулей определения после того, как было замечено, что все внутри модуля определения определяет интерфейс с этим модулем, поэтому этот EXPORT
пункт был избыточным.SIZE
является всеобъемлющей (видна в любой области без импорта)MOD
, когда операнды отрицательны.ARRAY OF CHAR
строки завершались NUL-кодом ASCII, даже если строка точно вписывается в свой массив.COMPLEX
и LONGCOMPLEX
исключения, завершение модуля ( FINALLY
предложение) и полная библиотека стандартного ввода/вывода (I/O) . Есть много мелких отличий и уточнений. [7]Существует несколько расширений Modula-2 с языковыми расширениями для конкретных областей применения:
Существует несколько производных языков, которые очень похожи на Модулу-2, но сами по себе являются новыми языками. Большинство из них представляют собой разные языки с разными целями и собственными сильными и слабыми сторонами:
Многие другие современные языки программирования переняли особенности Модулы-2.
PIM [2,3,4] определяет 40 зарезервированных слов :
И ПОВТОРЕНИЕ ПЕТЛИ ELSIFМАССИВ КОНЕЦ MOD ВОЗВРАТНАЧАЛО ВЫХОД НАБОР МОДУЛЕЙЭКСПОРТОМ НЕ ТОГДАДЕЛО ДЛЯ ТОКОНСТ ИЗ ИЛИ ТИПОПРЕДЕЛЕНИЕ ЕСЛИ УКАЗАТЕЛЬ ДОПОРЯДОК РЕАЛИЗАЦИИ DIV VARДЕЛАЙТЕ ИМПОРТ КВАЛИФИЦИРОВАННЫМ, ПОКАЕЩЕ В ЗАПИСИ
PIM [3,4] определяет 29 встроенных идентификаторов :
АБС ИСКЛ. LONGINT REALНАБОР БИТОВ ЛОЖНЫЙ ДЛИННЫЙ РАЗМЕРBOOLEAN FLOAT MAX TRUECAP HALT MIN TRUNCКАРДИНАЛ ВЫСОКИЙ НОЛЬ ВАЛЧАР ИНК ОДДCHR, ВКЛЮЧАЯ ЗАКАЗДекабрьский целочисленный процесс
Модуль-2 используется для программирования многих встраиваемых систем .
Cambridge Modula-2 от Cambridge Microprocessor Systems основан на подмножестве PIM4 с языковыми расширениями для разработки встроенных систем. Компилятор работает под DOS и генерирует код для встраиваемых микроконтроллеров Motorola серии 68000 (M68k), работающих под управлением операционной системы MINOS.
Mod51 от Mandeno Granville Electronics основан на ISO Modula-2 с языковыми расширениями для разработки встроенных систем в соответствии с IEC 1131 , отраслевым стандартом для программируемых логических контроллеров (ПЛК), тесно связанным с Modula-2. Компилятор Mod51 генерирует автономный код для микроконтроллеров на базе 80C51.
Delco Electronics , в то время дочерняя компания GM Hughes Electronics , начиная с 1985 года разработала версию Modula-2 для встраиваемых систем управления. Delco назвала ее Modula-GM. Это был первый язык программирования высокого уровня, который использовался для замены машинного кода (языка) встроенных систем в блоках управления двигателем (ЭБУ) Delco . Это было важно, поскольку в 1988 году Delco производила для GM более 28 000 ЭКЮ в день. Тогда это был крупнейший в мире производитель ЭБУ. [18] Первое экспериментальное использование Modula-GM во встроенном контроллере было в 1985 году в контроллере антиблокировочной тормозной системы, который был основан на микропроцессоре Motorola 68xxx, а в 1993 году ЭБУ Gen-4 использовался командами автогонок чемпионата Champ Car World Series Championship. (CART) и команды Indy Racing League (IRL). [19] Первым производственным применением Modula-GM было его использование в грузовиках GM, начиная с модуля управления транспортным средством (VCM) 1990 модельного года, который использовался для управления двигателями Vortec GM Powertrain . Modula-GM также использовался во всех ЭБУ для семейства двигателей GM Buick V6 3800 Series II, используемых в Buick Park Avenue 1997-2005 модельного года . Компиляторы Modula-GM и соответствующие инструменты управления программным обеспечением были получены Delco от Intermetrics .
В 1986 году Modula-2 был выбран в качестве основы для языка высокого уровня Delco из-за его многочисленных преимуществ перед другими альтернативными языками. После того, как в 1995 году Delco Electronics была выделена из GM (с другими подразделениями по производству компонентов) и образовала Delphi Automotive Systems , глобальный поиск поставщиков требовалось использовать непатентованный язык программного обеспечения высокого уровня. Встроенное программное обеспечение ЭБУ, разрабатываемое в настоящее время в Delphi , компилируется коммерческими компиляторами для языка C.
Спутники российской системы радионавигационной спутниковой службы ГЛОНАСС , аналогичной системе глобального позиционирования (GPS) США , программируются в Модуле-2. [20]
Turbo Modula-2 — компилятор и интегрированная среда разработки для MS-DOS , разработанная, но не опубликованная компанией Borland . Компания Jensen and Partners, в которую входил соучредитель Borland Нильс Йенсен, купила неизданную кодовую базу и превратила ее в TopSpeed Modula-2. В конечном итоге он был продан компании Clarion, ныне SoftVelocity, которая в то время предлагала компилятор Modula-2 как часть своей линейки продуктов Clarion . [43]
Версия Turbo Modula-2 для Zilog Z80 CP/M некоторое время продавалась компанией Echelon по лицензии Borland. Сопутствующая версия для Hitachi HD64180 была продана Micromint как инструмент разработки для их одноплатного компьютера SB-180. [44]
У IBM был компилятор Modula-2 для внутреннего использования, который работал как в OS/2, так и в AIX , и имел первоклассную поддержку в редакторе E2 от IBM . [45] IBM Modula-2 использовался для частей внутреннего кода вертикальной лицензии OS/400 (фактически ядра OS/400). [46] Этот код в основном был заменен на C++ , когда OS/400 была перенесена на семейство процессоров IBM RS64 , хотя некоторые из них остались в современных версиях операционной системы. [47] [48] Также существовала серверная часть Motorola 68000 , которая, возможно, использовалась во встраиваемых системах. [45]
Модуль-2 используется для программирования некоторых операционных систем (ОС). Структура и поддержка модуля Modula-2 используются непосредственно в двух родственных ОС.
ОС под названием Medos-2 для рабочей станции Lilith была разработана в ETH Zurich Свеном Эриком Кнудсеном по совету Вирта. Это однопользовательская объектно-ориентированная операционная система, построенная на модулях Modula-2. [49] [50] [51]
ОС под названием Excelsior , для рабочей станции «Кронос» , разработана Сибирским отделением Академии наук Советского Союза , Новосибирским вычислительным центром, проектом «Модульные асинхронные развивающиеся системы» (МАРС), «Кронос Исследовательской группой» (КРГ). Это однопользовательская система, основанная на модулях Модула-2. [52]
Фотография дискеты .