Парадигмы | императивный, структурированный, модульный, скрытие данных и процедур, параллельный |
---|---|
Семья | Вирт Модула |
Разработано | Никлаус Вирт |
Впервые появился | 1978 ; 43 года назад ( 1978) |
Печатная дисциплина | Статичный, прочный, безопасный |
Сфера | Лексический (статический) |
Платформа | Лилит ( 2901 драм ) |
Операционные системы | Кроссплатформенность |
Расширения имени файла | .mod,.m2,.def,.MOD,.DEF,.mi,.md |
Веб-сайт | www.modula2.org |
Основные реализации | |
Компилятор ETH, написанный Никлаусом Виртом GNU Modula-2 ADW Modula-2 | |
Диалекты | |
PIM2, PIM3, PIM4, ISO | |
Под влиянием | |
Модула, Меса, Паскаль, АЛГОЛ W, Евклид | |
Под влиянием | |
Модула-3, Оберон, Ада, Фортран 90, Lua, Seed7, Zonnon, Modula-GM |
Modula-2 - это структурированный процедурный язык программирования, разработанный в период с 1977 по 1985 год Никлаусом Виртом из ETH Zurich. Он был создан как язык для операционной системы и прикладного программного обеспечения на Lilith персональной рабочей станции. Позже он был использован для программирования вне контекста Лилит.
Вирт рассматривал Modula-2 как преемника своих более ранних языков программирования Pascal и Modula. Основные концепции:
На дизайн языка повлияли язык Mesa и Xerox Alto, оба от Xerox PARC, которые Вирт увидел во время своего творческого отпуска в 1976 году там. Компьютерный журнал Byte посвятил августовский выпуск 1984 года языку и окружающей его среде.
За Модулой-2 последовала Модула-3, а затем и серия языков Оберон.
Modula-2 - это процедурный язык общего назначения, достаточно гибкий для системного программирования, но с гораздо более широким применением. В частности, он был разработан для прямой поддержки раздельной компиляции и абстрагирования данных. Большая часть синтаксиса основана на более раннем и более известном языке Вирта - Паскале. Modula-2 был разработан, чтобы быть в целом похожим на Паскаль, с удаленными некоторыми элементами и синтаксической двусмысленностью, а также важным добавлением концепции модуля и прямой языковой поддержкой мультипрограммирования.
Язык позволяет использовать однопроходные компиляторы. Такой компилятор от Gutknecht и Wirth был примерно в четыре раза быстрее, чем предыдущие многопроходные компиляторы.
Вот пример исходного кода программы «Hello world»:
MODULE Hello; FROM STextIO IMPORT WriteString; BEGIN WriteString("Hello World!") END Hello.
Modula-2 модуль может быть использован для инкапсуляции набора взаимосвязанных подпрограмм и структур данных, а также ограничивать их видимость из других частей программы. В конструкции модуля очень чисто реализована функция абстракции данных Modula-2. Программы Modula-2 состоят из модулей, каждый из которых состоит из двух частей: модуля определения, части интерфейса, которая содержит только те части подсистемы, которые экспортируются (видимые для других модулей), и модуля реализации, который содержит рабочий код, который является внутренним для модуля.
В языке есть строгий контроль объема. Объем модуля можно рассматривать как непроницаемую стену: за исключением стандартных идентификаторов, никакой объект снаружи не виден внутри модуля, если он явно не импортирован; объект внутреннего модуля не виден снаружи, если он явно не экспортирован.
Предположим, модуль M1 экспортирует объекты a, b, c и P, перечисляя свои идентификаторы в явном списке экспорта.
DEFINITION MODULE M1; EXPORT QUALIFIED a, b, c, P;...
Затем объекты a, b, c и P из модуля M1 становятся теперь известными вне модуля M1 как M1.a, M1.b, M1.c и M1.P. Они квалифицированным образом экспортируются наружу (предполагается, что модуль M1 является глобальным). Имя экспортирующего модуля, то есть M1, используется в качестве квалификатора, за которым следует имя объекта.
Предположим, что модуль M2 содержит следующее объявление IMPORT
MODULE M2; IMPORT M1;...
Тогда это означает, что объекты, экспортированные модулем M1 за пределы его включающей программы, теперь могут использоваться внутри модуля M2. На них есть квалифицированные ссылки, а именно: M1.a, M1.b, M1.c и M1.P. Пример:
... M1.a:= 0; M1.c:= M1.P(M1.a + M1.b);...
Квалифицированный экспорт позволяет избежать конфликтов имен: например, если другой модуль M3 также будет экспортировать объект с именем P, мы все равно сможем различать эти два объекта, поскольку M1.P отличается от M3.P. Благодаря квалифицированному экспорту не имеет значения, что оба объекта называются P внутри своих модулей экспорта M1 и M3.
Существует альтернативный метод, который широко используется программистами Модулы-2. Предположим, что модуль M4 сформулирован так:
MODULE M4; FROM M1 IMPORT a, b, c, P;
Тогда это означает, что объекты, экспортированные модулем M1 вовне, могут снова использоваться внутри модуля M4, но теперь путем простых ссылок на экспортированные идентификаторы неквалифицированным образом, таким образом: a, b, c и P. Пример:
... a:= 0; c:= P(a + b);...
Этот метод неквалифицированного импорта позволяет использовать переменные и другие объекты вне их модуля экспорта точно таким же простым, то есть неквалифицированным способом, как внутри модуля экспорта. Стены, окружающие все модули, теперь стали неактуальными для всех тех объектов, для которых это было явно разрешено. Конечно, неквалифицированный импорт можно использовать только в том случае, если нет конфликтов имен.
Эти правила экспорта и импорта могут показаться излишне ограничивающими и многословными. Но они не только защищают объекты от нежелательного доступа, но также имеют приятный побочный эффект, обеспечивающий автоматическую перекрестную ссылку на определение каждого идентификатора в программе: если идентификатор уточняется именем модуля, то определение происходит от этот модуль. В противном случае, если это происходит неквалифицированно, просто выполните поиск в обратном направлении, и вы либо встретите объявление этого идентификатора, либо его появление в операторе IMPORT, который называет модуль, из которого он исходит. Это свойство становится очень полезным при попытке понять большие программы, содержащие много модулей.
Язык обеспечивает (ограниченный) однопроцессорный параллелизм ( мониторы, сопрограммы и явная передача управления) и аппаратный доступ (абсолютные адреса, битовые манипуляции и прерывания ). Он использует систему номинального типа.
Есть два основных диалекта Modula-2. Первый - PIM, названный в честь книги Никлауса Вирта « Программирование в модуле-2 ». Существовало три основных редакции PIM: вторая, третья (исправленная) и четвертая. Каждый описывает небольшие варианты языка. Второй важный диалект - ISO, названный в честь усилий по стандартизации Международной организации по стандартизации. Вот несколько отличий между ними.
EXPORT
предложение в модулях определения.SIZE
необходимо импортировать из модуляSYSTEM
EXPORT
из модулей определения после того, как было замечено, что все в модуле определения определяет интерфейс к этому модулю, следовательно, EXPORT
предложение было избыточным.SIZE
повсеместна (видна в любой области без импорта)MOD
оператора, когда операнды отрицательны.ARRAY OF CHAR
строки заканчивались ASCII NUL, даже если строка точно помещается в свой массив.COMPLEX
и LONGCOMPLEX
исключения, завершение модуля ( FINALLY
предложение) и полную стандартную библиотеку ввода / вывода (I / O). Есть много мелких отличий и уточнений. Есть несколько расширенных наборов Modula-2 с языковыми расширениями для определенных областей приложений:
Есть несколько производных языков, которые очень похожи на Modula-2, но сами по себе являются новыми языками. Большинство из них - это разные языки с разными целями и со своими сильными и слабыми сторонами:
Многие другие современные языки программирования переняли возможности Modula-2.
PIM [2,3,4] определяет 40 зарезервированных слов :
AND ELSIF LOOP REPEAT ARRAY END MOD RETURN BEGIN EXIT MODULE SET BY EXPORT NOT THEN CASE FOR OF TO CONST FROM OR TYPE DEFINITION IF POINTER UNTIL DIV IMPLEMENTATION PROCEDURE VAR DO IMPORT QUALIFIED WHILE ELSE IN RECORD WITH
PIM [3,4] определяет 29 встроенных идентификаторов :
ABS EXCL LONGINT REAL BITSET FALSE LONGREAL SIZE BOOLEAN FLOAT MAX TRUE CAP HALT MIN TRUNC CARDINAL HIGH NIL VAL CHAR INC ODD CHR INCL ORD DEC INTEGER PROC
Modula-2 используется для программирования многих встраиваемых систем.
Cambridge Modula-2 от Cambridge Microprocessor Systems основан на подмножестве PIM4 с языковыми расширениями для разработки встраиваемых систем. Компилятор работает под DOS и генерирует код для встроенных микроконтроллеров на базе Motorola серии 68000 (M68k), работающих под управлением операционной системы MINOS.
Mod51 от Mandeno Granville Electronics основан на ISO Modula-2 с языковыми расширениями для встроенной разработки в соответствии с IEC1131, отраслевым стандартом для программируемых логических контроллеров (PLC), тесно связанным с Modula-2. Компилятор Mod51 генерирует автономный код для микроконтроллеров на базе 80C51.
Delco Electronics, в то время дочерняя компания GM Hughes Electronics, разработала версию Modula-2 для встроенных систем управления, начиная с 1985 года. Delco назвала ее Modula-GM. Это был первый язык программирования высокого уровня, который использовался для замены машинного кода (языка) для встроенных систем в блоках управления двигателем (ЭБУ) Delco. Это было важно, потому что в 1988 году компания Delco производила для GM более 28 000 ЭКЮ в день. Тогда это был крупнейший в мире производитель ЭБУ. Первое экспериментальное использование Modula-GM во встроенном контроллере было в контроллере антиблокировочной тормозной системы 1985 года, который был основан на микропроцессоре Motorola 68xxx, а в 1993 году - в ЭБУ Gen-4, используемом командами чемпионата чемпионата мира по автогонкам Champ Car World Series (CART). и команды Indy Racing League (IRL). Первым производственным применением Modula-GM было его использование в грузовиках GM, начиная с модуля управления транспортным средством (VCM) 1990 модельного года, который использовался для управления двигателями Vortec GM Powertrain. Modula-GM также использовалась во всех ЭБУ для семейства двигателей Buick V6 под углом 90 ° 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.
Turbo Modula-2 - это компилятор и интегрированная среда разработки для MS-DOS, разработанная, но не опубликованная Borland. Компания Jensen and Partners, в которую входил соучредитель Borland Нильс Дженсен, выкупила неизданную базу кода и превратила ее в TopSpeed Modula-2. В конечном итоге он был продан компании Clarion, которая сейчас принадлежит компании SoftVelocity, которая по-прежнему предлагает компилятор Modula-2 как часть своей линейки продуктов Clarion.
Zilog Z80 CP / M версия Turbo Modula-2 был на короткое время фирмой Echelon по лицензии Борланд. Сопутствующий выпуск Hitachi HD64180 был продан Micromint в качестве инструмента разработки для своего одноплатного компьютера SB-180.
У IBM был компилятор Modula-2 для внутреннего использования, который работал как на OS / 2, так и на AIX, и имел первоклассную поддержку в редакторе IBM E2. IBM Modula-2 использовалась для частей Вертикального лицензионного внутреннего кода OS / 400 (фактически, ядра OS / 400). Этот код был заменен на C ++ при переносе OS / 400 на семейство процессоров IBM RS64. Motorola 68000 бэкенд также существуют, которые могут быть использованы во встраиваемых системах продукции.
Modula-2 используется для программирования некоторых операционных систем (ОС). Модульная структура и поддержка Modula-2 используются непосредственно в двух связанных ОС.
Операционная система Medos-2 для рабочей станции Lilith была разработана в ETH Zurich Свендом Эриком Кнудсеном по совету Вирта. Это однопользовательская объектно-ориентированная операционная система, построенная из модулей Modula-2.
ОС под названием Excelsior для рабочей станции Kronos была разработана Сибирским отделением Академии наук Советского Союза, Новосибирским вычислительным центром, проектом Modular Asynchronous Developable Systems (MARS), Kronos Research Group (KRG). Это однопользовательская система, основанная на модулях Модула-2.
Эта статья основана на материалах, взятых из Free On-line Dictionary of Computing до 1 ноября 2008 г. и включенных в соответствии с условиями «перелицензирования» GFDL версии 1.3 или новее.