Парадигмы | императивный , структурированный , модульный , скрытие данных и процедур , параллельный |
---|---|
Семья | Вирт / Модула |
Разработано | Никлаус Вирт |
Впервые появился | 1978 ( 1978 ) |
Дисциплина набора текста | Статичный , прочный , безопасный |
Объем | Лексический (статический) |
Платформа | Лилит ( 2901 драм ) |
ОС | Кроссплатформенный |
Расширения имени файла | .mod, .m2, .def, .MOD, .DEF, .mi, .md |
Веб-сайт | www.modula2.org |
Основные внедрения | |
Компилятор ETH, написанный Никлаусом Виртом GNU Modula-2 ADW Modula-2 | |
Диалекты | |
ПИМ2, ПИМ3, ПИМ4, ИСО | |
Под влиянием | |
Модула , Меса , Паскаль , АЛГОЛ W , Евклид | |
Под влиянием | |
Модуль-2+ , Модуль-3 , Оберон , Ада , Фортран 90 , Lua , Seed7 , Зоннон , Модуль-GM |
Modula-2 — это структурированный, процедурный язык программирования , разработанный между 1977 и 1985/8 Никлаусом Виртом в ETH Zurich . Он был создан как язык для операционной системы и прикладного программного обеспечения персональной рабочей станции Lilith . [1] Позднее он использовался для программирования вне контекста Lilith.
Вирт рассматривал 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 — это процедурный язык общего назначения, подходящий как для системного, так и для прикладного программирования. Синтаксис основан на более раннем языке Вирта, Pascal , с некоторыми удаленными элементами и синтаксическими неоднозначностями. Была добавлена концепция модуля , разработанная для поддержки раздельной компиляции и абстракции данных; и прямая языковая поддержка мультипрограммирования .
Язык позволяет использовать однопроходные компиляторы . Такой компилятор Гуткнехта и Вирта был примерно в четыре раза быстрее, чем более ранние многопроходные компиляторы . [6]
Вот пример исходного кода программы «Hello world»:
МОДУЛЬ Hello ; FROM STextIO IMPORT WriteString ; BEGIN WriteString ( "Hello World!" ) END Hello .
Модуль Modula-2 может использоваться для инкапсуляции набора связанных подпрограмм и структур данных, а также для ограничения их видимости из других частей программы. [7] Программы Modula-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:
МОДУЛЬ M2 ; ИМПОРТ M1 ; ...
Тогда это означает, что объекты, экспортированные модулем M1 за пределы его включающей программы, теперь могут использоваться внутри модуля M2. Они упоминаются квалифицированным образом : M1.a, M1.b, M1.c и M1.P. Пример:
... М1.а : = 0 ; М1.с : = М1.П ( М1.а + М1.б ) ; ...
Квалифицированный экспорт позволяет избежать конфликтов имен. Например, если другой модуль M3 экспортирует объект с именем P, то эти два объекта можно различить, поскольку M1.P отличается от M3.P. Не имеет значения, что оба объекта называются P внутри своих экспортирующих модулей M1 и M3.
Существует альтернативный метод. Предположим, что модуль M4 сформулирован следующим образом:
МОДУЛЬ M4 ; ИЗ M1 ИМПОРТ a , b , c , P ;
Это означает, что объекты, экспортированные модулем M1 наружу, снова могут использоваться внутри модуля M4, но теперь просто с помощью ссылок на экспортированные идентификаторы без каких-либо ограничений , например: a, b, c и P. Пример:
... а := 0 ; с := Р ( а + b ); ...
Этот метод импорта можно использовать, если нет конфликтов имен. Он позволяет использовать переменные и другие объекты вне их экспортирующего модуля тем же неквалифицированным образом, как и внутри экспортирующего модуля.
Правила экспорта и импорта не только защищают объекты от нежелательного доступа, но и позволяют создавать перекрестные ссылки на определения каждого идентификатора в программе. Это свойство помогает в обслуживании больших программ, содержащих много модулей.
Язык обеспечивает однопроцессорный параллелизм ( мониторы , сопрограммы и явная передача управления) и аппаратный доступ (абсолютные адреса, битовая манипуляция и прерывания ). Он использует номинальную систему типов .
Существует два основных диалекта Modula-2. Первый — PIM , названный в честь книги «Программирование на Modula-2 » Никлауса Вирта. [4] Было три основных издания PIM: второе, третье (исправленное) и четвертое. Каждое из них описывает небольшие изменения языка. Второй основной диалект — ISO , названный в честь усилий по стандартизации Международной организации по стандартизации . Вот несколько различий между ними.
EXPORT
условие в модулях определений.SIZE
необходимо импортировать из модуляSYSTEM
EXPORT
пункт из модулей определения после замечания, что все в модуле определения определяет интерфейс к этому модулю, поэтому EXPORT
пункт был излишним.SIZE
является всеобъемлющей (видимой в любой области без импорта)MOD
, когда операнды отрицательные.ARRAY OF CHAR
строки завершались ASCII-символом NUL, даже если строка точно вписывается в свой массив.COMPLEX
и LONGCOMPLEX
исключения, завершение модуля ( FINALLY
пункт) и полную стандартную библиотеку ввода/вывода (I/O) . Есть много мелких отличий и уточнений. [8]Существует несколько надмножеств Modula-2 с языковыми расширениями для конкретных областей применения:
Есть несколько производных языков, которые очень похожи на Modula-2, но являются новыми языками сами по себе. Большинство из них — это разные языки с разными целями и с собственными сильными и слабыми сторонами:
Многие другие современные языки программирования переняли особенности Modula-2.
PIM [2,3,4] определяет 40 зарезервированных слов :
И ELSIF ПОВТОРЕНИЕ ЦИКЛАМАССИВ КОНЕЦ МОД ВОЗВРАТНАЧАТЬ ВЫХОДНОЙ МОДУЛЬ НАБОРАЭКСПОРТОМ НЕ ТОГДАДЕЛО ДЛЯ TOКОНСТ ИЗ ИЛИ ТИПОПРЕДЕЛЕНИЕ ЕСЛИ УКАЗАТЕЛЬ ДОПОРЯДОК РЕАЛИЗАЦИИ DIV VARИМПОРТИРУЙТЕ КВАЛИФИКАЦИОННО, ПОКАОСТАЛЬНОЕ В ЗАПИСИ С
PIM [3,4] определяет 29 встроенных идентификаторов :
ABS EXCL LONGINT REALBITSET FALSE LONGREAL РАЗМЕРBOOLEAN FLOAT MAX TRUECAP HALT MIN TRUNCКАРДИНАЛЬНЫЙ ВЫСОКИЙ НИЛЬ ВАЛСИМВОЛ ВКЛЮЧАЯ НЕЧЕТНЫЙCHR ВКЛЮЧАЯ ЗАКАЗDEC ЦЕЛОЕ ПРОЦЕСС
Modula-2 используется для программирования многих встраиваемых систем .
Cambridge Modula-2 от Cambridge Microprocessor Systems основан на подмножестве PIM4 с языковыми расширениями для разработки встроенных систем. Компилятор работает на DOS и генерирует код для встроенных микроконтроллеров на базе Motorola 68000 series (M68k), работающих под управлением операционной системы MINOS.
Mod51 от Mandeno Granville Electronics основан на ISO Modula-2 с языковыми расширениями для разработки встроенных систем в соответствии с IEC 1131 , отраслевым стандартом для программируемых логических контроллеров (ПЛК), тесно связанным с Modula-2. Компилятор Mod51 генерирует автономный код для микроконтроллеров на базе 80C51.
Delco Electronics , тогда дочерняя компания GM Hughes Electronics , разработала версию Modula-2 для встраиваемых систем управления, начиная с 1985 года. Delco назвала ее Modula-GM. Это был первый язык программирования высокого уровня , используемый для замены машинного кода (языка) для встраиваемых систем в блоках управления двигателем (ЭБУ) Delco . Это было важно, поскольку в 1988 году Delco производила более 28 000 ЭБУ в день для GM. Тогда это был крупнейший в мире производитель ЭБУ. [19] Первое экспериментальное использование Modula-GM во встраиваемом контроллере было в 1985 году в контроллере антиблокировочной тормозной системы, который был основан на микропроцессоре Motorola 68xxx, а в 1993 году в ЭБУ Gen-4, который использовался командами Champ Car World Series Championship Auto Racing Teams (CART) и Indy Racing League (IRL). [20] Первым производственным применением Modula-GM было его использование в грузовиках GM, начиная с модуля управления транспортным средством (VCM) 1990 модельного года, используемого для управления двигателями Vortec от GM Powertrain . Modula-GM также использовался во всех ЭБУ для семейства двигателей GM 90° Buick V6 3800 Series II, используемых в Buick Park Avenue 1997-2005 модельного года . Компиляторы Modula-GM и соответствующие инструменты управления программным обеспечением были получены Delco от Intermetrics .
Modula-2 был выбран в качестве основы для языка высокого уровня Delco из-за его многочисленных преимуществ по сравнению с другими альтернативными вариантами языка в 1986 году. После того, как Delco Electronics отделилась от GM (с другими подразделениями компонентов) и образовала Delphi Automotive Systems в 1995 году, глобальный поиск поставщиков потребовал использования непатентованного языка программного обеспечения высокого уровня. Встроенное программное обеспечение ECU , которое сейчас разрабатывается в Delphi, компилируется с помощью коммерческих компиляторов для языка C.
Спутники российской радионавигационной спутниковой службы ГЛОНАСС , аналогичные американской системе глобального позиционирования (GPS), программируются на языке Модула-2. [21]
Turbo Modula-2 был компилятором и интегрированной средой разработки для MS-DOS , разработанной, но не опубликованной компанией Borland . Jensen and Partners, в которую входил соучредитель Borland Нильс Йенсен, купили невыпущенную кодовую базу и превратили ее в TopSpeed Modula-2. В конечном итоге она была продана Clarion, теперь SoftVelocity, которая затем предложила компилятор Modula-2 как часть своей линейки продуктов Clarion в то время. [44]
Версия Turbo Modula-2 для Zilog Z80 CP/M некоторое время продавалась компанией Echelon по лицензии Borland. Сопутствующий релиз для Hitachi HD64180 продавался компанией Micromint в качестве инструмента разработки для их одноплатного компьютера SB-180. [45]
IBM имела компилятор Modula-2 для внутреннего использования, который работал как на OS/2, так и на AIX , и имел первоклассную поддержку в редакторе IBM E2 . [46] IBM Modula-2 использовался для частей OS /400 Vertical Licensed Internal Code (фактически ядра OS/400). [47] Этот код был в основном заменен на C++ , когда OS/400 была портирована на семейство процессоров IBM RS64 , хотя часть его осталась в современных выпусках операционной системы. [48] [49] Также существовал бэкэнд Motorola 68000 , который, возможно, использовался в продуктах встроенных систем. [46]
Modula-2 используется для программирования некоторых операционных систем (ОС). Структура и поддержка модуля Modula-2 используются непосредственно в двух родственных ОС.
ОС Medos-2 для рабочей станции Lilith была разработана в ETH Zurich Свендом Эриком Кнудсеном при поддержке Вирта. Это однопользовательская объектно-ориентированная операционная система, построенная из модулей Modula-2. [50] [51] [52]
Операционная система Excelsior для рабочей станции Kronos была разработана Академией наук Советского Союза , Сибирским отделением, Новосибирским вычислительным центром, проектом Modular Asynchronous Developable Systems (MARS), исследовательской группой Kronos Research Group (KRG). Это однопользовательская система на базе модулей Modula-2. [53]
Фотография дискеты.