Модула

Можно считать, что история языка Модула начинается в 1980 году, когда Никлаус Вирт, один из выдающихся специалистов по теории информации, известный большинству специалистов по вычислительной технике в основном как создатель языка Паскаль, опубликовал описание нового языка программирования, названного им Модула. В отличие от Паскаля, который был по замыслу языком для обучения программирования, Модула с самого начала представлял собой язык для профессиональных системных программистов, продолжая лучшие традиции своего предшественника и обогащая их новыми идеями, соответствующих таким требованиям к языкам программирования, как структурность, модульность и способность к расширению. Как и множество других языков программирования, Модула подвергалась эволюции, во время которой ее первоначальное название было переделано в имя Модула-2

Модула – 2

Классическая Модула-2

10 лет после Паскаля. Модула-2 была создана профессором Цюрихского института программирования и создателем Паскаля Никлаусом Виртом в конце 70-х годов. Со времени создания Паскаля прошло почти десять лет, и он по праву считался лидером среди языков европейской школы. Разумеется, за это время проявились не только достоинства Паскаля, но и его недостатки: отсутствие механизмов раздельной компиляции (модулей), работы со строками символов и нестандартизованный ввод-вывод. Эти недостатки были простительны для языка, создававшегося для обучения программированию, но недопустимы для языка общего назначения, которым Паскаль стал де-факто. Вирт решил исправить эти недостатки, создав новый язык, предназначенный для системного программирования (то есть для создания операционных систем и программ общего назначения).

Модульное программирование. В 70-е годы в программировании возобладала концепция модульного программирования. Модули, экспорт и импорт имен, инкапсуляция считались обязательными элементами языков программирования будущего. Модульное программирование было такой - же модой в области создания языков программирования, как и структурное программирование десятилетием раньше (его влияния не избежал и Паскаль) или объектно-ориентированное программирование десятилетие спустя. Но Вирт, хотя и включил механизмы модульного программирования в свой новый язык, все же избежал превращения языка в манифест очередной программистской моды (как это произошло, например, с Адой).

Стилистические украшения. Вместе с модулями новый язык получил механизм раздельной компиляции; другие недостатки Паскаля тоже не были забыты. Во-первых, Вирт устранил нагромождение begin и end во вложенных операторах Паскаля: в Модуле все операторы имеют замкнутую конструкцию, то есть ВСЕГДА имеют открывающую и закрывающую скобки. Потребность в написании многочисленных begin отпала. Во вторых, Вирт попытался решить проблему работы со строками. Строки вообще сложно обрабатывать в языках со строгой типизацией (к которым относится и Паскаль, и Модула, и Ява), поскольку по сути своей они являются массивами переменной длины. Вирт частично решил эту проблему, разрешив в качестве параметров процедур и функций использовать массивы переменной длины (параметры класса array of). Помимо этого, Вирт внес в Модулу массу мелких удобств, которые особенно приятны автору этих строк: он устранил ключевое слово function, добавил оператор return, сделал разделителем вариантов в операторе case вертикальную черту, добавил в язык тип “беззнаковое целое”, ввел elsif-часть в оператор if и еще много других приятных мелочей.

Системное программирование. Назначение Модулы-2 как инструмента системного программиста тоже нашло свое отражение в языке. При введении в язык механизма работы со строками Вирт сделал выбор в пользу строк zero end (то есть строк, признаком конца которых служит нулевой байт). Это общепринятая практика, реализованная, в частности, в Си. Отметим, что создатели Borland Pascal пошли другим путем: в их реализации Паскаля строки начинаются с байта, содержащего длину строки. В настоящее время этот подход можно считать устаревшим. Помимо строк zero end для целей системного программирования в Модулу были введены механизмы параллельного программирования (мониторы и семафоры), а так же средства для прямой адресации оперативной памяти (модуль System). Можно считать, что все эти средства уже устарели, поскольку современные операционные системы, такие, как Windows, OS/2 и UNIX, используют собственные механизмы параллельного программирования, а интеграция механизмов виртуальной памяти непосредственно в процессор (защищенный режим в процессорах Intel) сделала бессмысленной прямую адресацию оперативной памяти.

Кое-что устарело. Со времени создания Модулы прошло почти 20 лет, и, разумеется, многие ее конструкции уже устарели. Представляется, что Вирт неоправданно много внимания уделил модульному программированию (напомню: такое было время). С созданием графических интерфейсов устарели стандартные модули, описанные Виртом вместе с языком программирования (в частности, модуль InOut). По той же причине более не требуется выделять большими буквами ключевые слова (такие, как CASE или END): с этим с успехом справляются синтаксис - ориентированные редакторы.

Цели модернизации языка

Модула как усовершенствованный Паскаль. При создании варианта Модулы-2 для компилятора Странник было решено максимально унифицировать ее с Паскалем и Си. Первая задача решается просто, поскольку Модула была создана на основе Паскаля. Более того, те конструкции, которые существенно отличают ее от Паскаля (например, мощные механизмы раздельной компиляции – модули, файлы описаний) не слишком востребованы в настоящее время. Поэтому главная концепция, из которой исходил автор при создании своей версии Модулы – сделать НЕ БОЛЕЕ чем усовершенствованный Паскаль.

Унифицировать с Си. Более сложной оказалась вторая задача – унификация Модулы и Си. Несмотря на то, что все современные языки программирования содержат примерно одни и те же конструкции и предоставляют программисту одинаковые возможности, различия между Модулой (Паскалем) и Си весьма существенны. Главное отличие состоит в том, что Си не является языком со строгой типизацией и допускает неявное преобразование типов. Можно так – же упомянуть отсутствие механизма раздельной компиляции в Си (функции связи между модулями выполняет единственная директива #include) и разные способы задания строковых и шестнадцатеричных констант. При проведении унификации Модулы и Си автор предпочел дополнить языки отсутствующими в них конструкциями. Так, Модула получила строковые и шестнадцатеричные константы Си, а Си – оператор with для работы со структурами и тип boolean.

Сохранить компактность. Сверхзадачей при создании языка было сохранение “духа” Модулы и вообще всех языков Вирта – его умение решать серьезные задачи минимальными средствами. И Паскаль, и Модула, и Оберон были “маленькими” языками. Были попытки модернизировать эти языки за счет включения в них дополнительных возможностей (например, Модула-3 или Оберон-2), однако эти “модернизированные” языки не получили распространения. Поэтому, при создании Модулы для компилятора Странник была предпринята попытка аккуратно исключить все редко используемые или неоправданно сложные конструкции языка. В частности, был упрощен механизм экспорта-импорта и исключены потерявшие свою актуальность стандартные библиотеки , такие, как InOut.

Отсутствие ООП. Отдельно стоит сказать об объектно - ориентированном программировании, точнее, о его отсутствии в языке Странник-Модула. Тема ООП заслуживает отдельной статьи, поэтому автор счел возможным привести здесь одно из главных возражений на этот счет. Дело в том, что ООП в том виде, в каком оно реализовано в современных языках программирования (например, Си++, Яве или Borland Pascal) не является “объектным” в полном смысле этого слова. ООП – это лишь надстройка над механизмом процедур, а вызовы методов и по внешнему виду, и по способам реализации не являются передачей сообщения от объекта к объекту, а всего лишь замаскированным вызовом соответствующей процедуры. В языках системного программирования такие “надстройки” приносят больше вреда (скрывая от программиста структуру программы), чем пользы. Хорошим примером применения ООП можно считать внуреннюю стрктуру Windows или OS/2. Окна в этих ОС являются полноценными объектами и управляются с помощью посылки сообщений друг другу. Разумеется, критика ООП не означает, что оно не содержит рациональной составляющей. Однако должно пройти время (и мода на ООП), что бы это рациональное зерно можно было выделить из массы существующих инструментов ООП.

Странник-Модула (отличия и расширения)

Что исключено. В версии языка Модула-2 для компилятора Странник был переработан (в сторону упрощения) механизм модулей; за основу был взят механизм раздельной компиляции, реализованный в Borland Pascal. Из числа операторов языка был исключен бесконечный цикл (loop) и все, связанное с типом “множество” (константы, типы, операции). Не были включены в язык стандартные процедуры, реализующие механизмы параллельного программирования, поскольку в Win32 есть собственные средства реализации сопрограмм. Не вошли в состав Странник-Модула стандартные модули, созданные Виртом для ввода-вывода (они ориентированы на устаревший алфавитно-цифровой интерфейс). Исключены редко применяемые переменные типа “процедура” и запрещены вложенные процедуры (которые отсутствуют в Си).

Что добавлено. В Модулу были добавлены два типа, предназначенные для работы со строками. Тип pstr является аналогом типа char* из Си. Тип string[ДлинаСтроки] введен в язык для замены более длинного варианта array[0..ДлинаСтроки-1]of char, и является аналогом типа char[ДлинаСтроки] из Си. В Модулу была добавлена возможность задавать структурные константы (массивы и/или записи). В состав языка включен оператор asm, внутри которого можно записывать ассемблерные инструкции, включая инструкции арифметического сопроцессора Intel. Добавлена возможность использовать ключевые слова, написанные маленькими буквами (как это делается в большинстве современных языков программирования) и строчные комментарии. В состав программы можно включать описания ресурсов exe-файла Windows (диалоги, картинки и иконки).

Одновременно с развитием языка Модула для него создавались новые компиляторы, однако, ни один из них не мог соперничать с лучшими реализациями языков Паскаль и Си, например, разработанных фирмой Борланд. В этот переходный для языка Модула период лучшей считались реализации выполненные фирмой Logitech, которые по своим характеристикам проигрывала Турбо Паскалю и Турбо Си. Только в 1988 году после появления на американском рынке системы Top Speed, Модула-2 заняла достойное место среди процедурных языков, предназначенных для системного программирования.
Возраставшей популярности системы Top Speed способствовало несколько факторов: удобное и, кроме того, легко изменяемая по желанию пользователей операционное окружение, быстрый компилятор и селективный редактор связей. Но наиболее существенным оказалось то, что создаваемые программы отличались большим быстродействием и занимали не много места в памяти.

home.perm.ru

sapr.mgsu.ru

Сайт создан в системе uCoz