Модула-3
Семантика: |
императивный, структурный, модульный, объектно-ориентированный, обобщённое |
---|---|
Тип исполнения: | |
Появился в: | |
Автор: | |
Система типов: |
строгая, статическая |
Основные реализации: |
[www.opencm3.net CM3], [modula3.elegosoft.com/pm3 PM3], [www.cvsup.org/ezm3 EzM3], HM3 |
Испытал влияние: | |
Повлиял на: | |
Сайт: |
[www.modula3.org/ ula3.org] |
Мо́дула-3 (Modula-3, M3) — это системный язык программирования, который является продолжением языка Модула-2. Разработан в исследовательском центре System Research Center (SRC) корпорации Digital Equipment Corporation (DEC), совместно с Olivetti. Разработчики: Лука Карделли (Luca Cardelli), Джим Донахью (Jim Donahue), Мик Джордан (Mick Jordan), Билл Калсоу (Bill Kalsow) и Грег Нельсон (Greg Nelson). Язык не получил широкого распространения в промышленности, хотя используется в академических кругах. Во время разработки, на язык было оказано значительное влияние со стороны языка Modula-2+, использующегося в то время в SRC для написания ПО для многопроцессорной рабочей станции DEC Firefly.
Основными особенностями Модулы-3 являются: простота, типобезопасность и возможность применения для написания системного ПО. Модула-3 поддерживает обобщённое программирование, многозадачность, автоматическое управление памятью (сборка мусора), обработку исключений, объектно-ориентированное программирование (включая сокрытие данных и методов). Разработчики языка преследовали цель дополнить Модулу-2 новыми средствами современных языков программирования. В то же время, потенциально опасные и сложные средства, такие как множественное наследование и перегрузка операторов, не были включены в язык.
Содержание
История
Разработка Модулы-3 началась в 1986 году. Морис Уилкс (Maurice Wilkes) написал Никлаусу Вирту некоторые идеи по созданию новой версии Модулы. Уилкс, до этого работавший в DEC, вернулся в Англию и устроился в исследовательский центр Olivetti. Вирт в это время был занят разработкой нового языка программирования Oberon, но не отказал Уилксу в помощи. Описание Модулы-3 было закончено в августе 1988 и исправлено в январе 1989 года. Тогда же появились компиляторы от DEC SRC и Olivetti, а также начали появляться компиляторы от сторонних фирм.
В девяностые годы XX века Модула-3 получила распространение преимущественно в академической среде, как язык для обучения программированию, и почти не использовалась в промышленности. Причиной этого могла послужить гибель DEC — основного разработчика языка. В то же время корпорацией Critical Mass был предложен коммерческий компилятор CM3 и интегрированная среда разработки Reactor. В 2000 году Critical Mass прекратила свою деятельность. В настоящее время техническую поддержку Модулы-3 предоставляет корпорация Elego Software Solutions GmbH, которая унаследовала от Critical Mass исходные коды компилятора CM3. Интегрированная среда Reactor сейчас переименована в CM3 IDE и распространяется с исходными текстами. В марте 2002 года Elego получила исходные тексты компилятора PM3, до этого разрабатывавшегося в Ecole Polytechnique de Montreal.
Возможности языка
Обработка исключений в блоках TRY … EXCEPT … END и TRY … FINALLY … END. Конструкция EXCEPT реализована подобно конструкции CASE. Modula-3 также поддерживает цикл LOOP … EXIT … END.
Реализована поддержка объектно-ориентированного программирования. Объектным типом является OBJECT. Этот тип отличается от записей (RECORD) тем, что является ссылочным, и позволяет создавать процедуры, связанные с типом (методы), а также, поддерживает перегрузку методов. Все методы являются виртуальными. Например, конструкция:
TYPE A = OBJECT a: INTEGER; METHODS p():=AP END;
определяет объектный тип, содержащий поле a целого типа и метод p. Процедура AP является реализацией метода p и имеет следующий вид:
PROCEDURE AP(self: A) = BEGIN … END AP;
Вызов метода осуществляется так: o.p();, где o — переменная (объект) типа A.
Конструкция REVEAL обеспечивает простой, но в то же время очень мощный механизм сокрытия деталей реализации объекта от клиентов.
Модула-3 — один из немногих языков, который требует, чтобы программные единицы, импортированные из внешних моделей, строго квалифицировались. Например, если модуль A использует переменную x из модуля B, обращение к этой переменной должно быть записано в такой форме: B.x. Другими словами, Модула-3 не позволяет импортировать все объекты, экспортируемые каким-либо модулем. Благодаря этому, практически невозможно вывести из строя программу, добавив в неё новую функциональность. Большое количество пользователей могут одновременно расширять программу, не боясь, что это приведёт к сбоям. Также, Модула-3 устанавливает различие между объявлением сигнатуры метода (блок METHODS) и его перегрузкой (блок OVERRIDES).
Свойства языка
- Модули состоят из интерфейса (INTERFACE) и тела (MODULE);
- Модули, содержащие небезопасный код, помечаются ключевым словом UNSAFE;
- Автоматическое управление памятью (сборка мусора);
- Строгая типизация, составные (RECORD) и расширяемые (OBJECT) типы;
- Обработка исключительных ситуаций;
- Поддержка многопоточности;
- Обобщения (GENERIC, аналог шаблонов С++).
Примеры
Программа Hello World! может выглядеть так:
MODULE Main;
IMPORT IO;
BEGIN
IO.Put ("Hello World\n")
END Main.
или так (используется модуль работы с потоком вывода):
MODULE Hello EXPORTS Main;
IMPORT Wr, Stdio;
BEGIN
Wr.PutText(Stdio.stdout, "Hello, World!\n");
Wr.Close(Stdio.stdout);
END Hello.
Некоторые модули, входящие в стандартную библиотеку
Аналогично языку C, большинство процедур для написания программ на Модуле-3 реализованы в стандартной библиотеке. Операции ввода-вывода также реализованы в стандартной библиотеке.
- IO — интерфейс ввода-вывода.
- Rd/Wr — интерфейсы, реализующие потоки чтения/записи соответственно.
- Text — интерфейс для работы со строками (тип TEXT).
- Word — процедуры для работы с беззнаковыми целыми.
- Fmt — форматирование данных различных типов для печати.
Также, в состав стандартной библиотеки входят интерфейсы для работы с числами с плавающей точкой, словарями, списками и т. д.
Низкоуровневое программирование
Модула-3, помимо ссылок, также поддерживает и указатели. Тип ADDRESS является аналогом типа void* в Си. Указатель на переменную целого типа будет выглядеть так:
TYPE IntPtr = UNTRACED REF INTEGER;
Для получения адреса переменной используется встроенная функция ADR(), которая является аналогом операции & в Си. Важно отметить, что сборщик мусора не следит за указателями (об этом говорит слово UNTRACED). Все указатели нужно освобождать вручную, используя встроенную процедуру DISPOSE.
Также, Модула-3 поддерживает все типы данных, имеющиеся в языке Си. Благодаря этому, код на Модуле-3 может свободно компоноваться с кодом на языке Си. Все определения типов содержатся в модуле Ctypes.
Основные реализации
Большинство компиляторов имеют статус Open Source.
- DEC SRC M3 — оригинальный компилятор Модулы-3 от DEC.
- Critical Mass CM3 — наиболее развитый преемник DEC SRC M3.
- Polytechnique Montreal Modula-3 PM3 — другой преемник DEC SRC M3 (сейчас слился с CM3).
- EzM3 — легковесный независимый компилятор, построенный на основе PM3. Развивается совместно с CVSup
- HM3 — преемник PM3 (версии 1.1.15), с поддержкой POSIX Threading (NPTL).
Все реализации поддерживают большое количество платформ (более 20). Типы данных бинарно совместимы с типами языка C, что позволяет использовать совместно эти два языка.
Напишите отзыв о статье "Модула-3"
Литература
Некоторые из этих книг можно найти в зарубежных интернет-магазинах. Большинство из них доступно бесплатно в сети Интернет.
- Greg Nelson, ed. Systems Programming with Modula-3 The definitive reference on the Modula-3 language with interesting articles on object-oriented systems software construction and a documentation of the discussion leading to the final features of the language.
- Samuel P. Harbison, Modula-3 Easy to use class textbook.
- Robert Sedgewick, Algorithms in Modula-3
- Laszlo Boszormenyi & Carsten Weich, Programming in Modula-3: An Introduction in Programming with Style
- Renzo Orsini, Agostino Cortesi Programmare in Modula-3 : introduzione alla programmazione imperativa e a oggetti an italian book of the language explaining its main features.
Проекты, использующие Модулу-3
- Операционная система SPIN (en) была написана на Модуле-3. Интерфейсы ядра совместимы с DEC Unix.
- CVSup — программа для синхронизации репозиториев, также написана на Модуле-3.
Ссылки
- [www.modula3.org Modula-3 resource page] — ресурсы по языку Modula-3 (англ.)
- [www.opencm3.net Open CM3] — сайт компилятора CM3 (англ.)
- [www.elegosoft.com Elego Software Solutions] (англ.)
- Группа новостей, посвящённая Модуле-3 (англ.)
Отрывок, характеризующий Модула-3
– Нет, моя душа (граф был смущен тоже. Он чувствовал, что он был дурным распорядителем имения своей жены и виноват был перед своими детьми но не знал, как поправить это) – Нет, я прошу тебя заняться делами, я стар, я…– Нет, папенька, вы простите меня, ежели я сделал вам неприятное; я меньше вашего умею.
«Чорт с ними, с этими мужиками и деньгами, и транспортами по странице, думал он. Еще от угла на шесть кушей я понимал когда то, но по странице транспорт – ничего не понимаю», сказал он сам себе и с тех пор более не вступался в дела. Только однажды графиня позвала к себе сына, сообщила ему о том, что у нее есть вексель Анны Михайловны на две тысячи и спросила у Николая, как он думает поступить с ним.
– А вот как, – отвечал Николай. – Вы мне сказали, что это от меня зависит; я не люблю Анну Михайловну и не люблю Бориса, но они были дружны с нами и бедны. Так вот как! – и он разорвал вексель, и этим поступком слезами радости заставил рыдать старую графиню. После этого молодой Ростов, уже не вступаясь более ни в какие дела, с страстным увлечением занялся еще новыми для него делами псовой охоты, которая в больших размерах была заведена у старого графа.
Уже были зазимки, утренние морозы заковывали смоченную осенними дождями землю, уже зелень уклочилась и ярко зелено отделялась от полос буреющего, выбитого скотом, озимого и светло желтого ярового жнивья с красными полосами гречихи. Вершины и леса, в конце августа еще бывшие зелеными островами между черными полями озимей и жнивами, стали золотистыми и ярко красными островами посреди ярко зеленых озимей. Русак уже до половины затерся (перелинял), лисьи выводки начинали разбредаться, и молодые волки были больше собаки. Было лучшее охотничье время. Собаки горячего, молодого охотника Ростова уже не только вошли в охотничье тело, но и подбились так, что в общем совете охотников решено было три дня дать отдохнуть собакам и 16 сентября итти в отъезд, начиная с дубравы, где был нетронутый волчий выводок.
В таком положении были дела 14 го сентября.
Весь этот день охота была дома; было морозно и колко, но с вечера стало замолаживать и оттеплело. 15 сентября, когда молодой Ростов утром в халате выглянул в окно, он увидал такое утро, лучше которого ничего не могло быть для охоты: как будто небо таяло и без ветра спускалось на землю. Единственное движенье, которое было в воздухе, было тихое движенье сверху вниз спускающихся микроскопических капель мги или тумана. На оголившихся ветвях сада висели прозрачные капли и падали на только что свалившиеся листья. Земля на огороде, как мак, глянцевито мокро чернела, и в недалеком расстоянии сливалась с тусклым и влажным покровом тумана. Николай вышел на мокрое с натасканной грязью крыльцо: пахло вянущим лесом и собаками. Чернопегая, широкозадая сука Милка с большими черными на выкате глазами, увидав хозяина, встала, потянулась назад и легла по русачьи, потом неожиданно вскочила и лизнула его прямо в нос и усы. Другая борзая собака, увидав хозяина с цветной дорожки, выгибая спину, стремительно бросилась к крыльцу и подняв правило (хвост), стала тереться о ноги Николая.
– О гой! – послышался в это время тот неподражаемый охотничий подклик, который соединяет в себе и самый глубокий бас, и самый тонкий тенор; и из за угла вышел доезжачий и ловчий Данило, по украински в скобку обстриженный, седой, морщинистый охотник с гнутым арапником в руке и с тем выражением самостоятельности и презрения ко всему в мире, которое бывает только у охотников. Он снял свою черкесскую шапку перед барином, и презрительно посмотрел на него. Презрение это не было оскорбительно для барина: Николай знал, что этот всё презирающий и превыше всего стоящий Данило всё таки был его человек и охотник.
– Данила! – сказал Николай, робко чувствуя, что при виде этой охотничьей погоды, этих собак и охотника, его уже обхватило то непреодолимое охотничье чувство, в котором человек забывает все прежние намерения, как человек влюбленный в присутствии своей любовницы.
– Что прикажете, ваше сиятельство? – спросил протодиаконский, охриплый от порсканья бас, и два черные блестящие глаза взглянули исподлобья на замолчавшего барина. «Что, или не выдержишь?» как будто сказали эти два глаза.
– Хорош денек, а? И гоньба, и скачка, а? – сказал Николай, чеша за ушами Милку.
Данило не отвечал и помигал глазами.
– Уварку посылал послушать на заре, – сказал его бас после минутного молчанья, – сказывал, в отрадненский заказ перевела, там выли. (Перевела значило то, что волчица, про которую они оба знали, перешла с детьми в отрадненский лес, который был за две версты от дома и который был небольшое отъемное место.)
– А ведь ехать надо? – сказал Николай. – Приди ка ко мне с Уваркой.
– Как прикажете!
– Так погоди же кормить.
– Слушаю.
Через пять минут Данило с Уваркой стояли в большом кабинете Николая. Несмотря на то, что Данило был не велик ростом, видеть его в комнате производило впечатление подобное тому, как когда видишь лошадь или медведя на полу между мебелью и условиями людской жизни. Данило сам это чувствовал и, как обыкновенно, стоял у самой двери, стараясь говорить тише, не двигаться, чтобы не поломать как нибудь господских покоев, и стараясь поскорее всё высказать и выйти на простор, из под потолка под небо.
Окончив расспросы и выпытав сознание Данилы, что собаки ничего (Даниле и самому хотелось ехать), Николай велел седлать. Но только что Данила хотел выйти, как в комнату вошла быстрыми шагами Наташа, еще не причесанная и не одетая, в большом, нянином платке. Петя вбежал вместе с ней.
– Ты едешь? – сказала Наташа, – я так и знала! Соня говорила, что не поедете. Я знала, что нынче такой день, что нельзя не ехать.
– Едем, – неохотно отвечал Николай, которому нынче, так как он намеревался предпринять серьезную охоту, не хотелось брать Наташу и Петю. – Едем, да только за волками: тебе скучно будет.
– Ты знаешь, что это самое большое мое удовольствие, – сказала Наташа.
– Это дурно, – сам едет, велел седлать, а нам ничего не сказал.
– Тщетны россам все препоны, едем! – прокричал Петя.
– Да ведь тебе и нельзя: маменька сказала, что тебе нельзя, – сказал Николай, обращаясь к Наташе.
– Нет, я поеду, непременно поеду, – сказала решительно Наташа. – Данила, вели нам седлать, и Михайла чтоб выезжал с моей сворой, – обратилась она к ловчему.
И так то быть в комнате Даниле казалось неприлично и тяжело, но иметь какое нибудь дело с барышней – для него казалось невозможным. Он опустил глаза и поспешил выйти, как будто до него это не касалось, стараясь как нибудь нечаянно не повредить барышне.
Старый граф, всегда державший огромную охоту, теперь же передавший всю охоту в ведение сына, в этот день, 15 го сентября, развеселившись, собрался сам тоже выехать.
Через час вся охота была у крыльца. Николай с строгим и серьезным видом, показывавшим, что некогда теперь заниматься пустяками, прошел мимо Наташи и Пети, которые что то рассказывали ему. Он осмотрел все части охоты, послал вперед стаю и охотников в заезд, сел на своего рыжего донца и, подсвистывая собак своей своры, тронулся через гумно в поле, ведущее к отрадненскому заказу. Лошадь старого графа, игреневого меренка, называемого Вифлянкой, вел графский стремянной; сам же он должен был прямо выехать в дрожечках на оставленный ему лаз.
Всех гончих выведено было 54 собаки, под которыми, доезжачими и выжлятниками, выехало 6 человек. Борзятников кроме господ было 8 человек, за которыми рыскало более 40 борзых, так что с господскими сворами выехало в поле около 130 ти собак и 20 ти конных охотников.
Каждая собака знала хозяина и кличку. Каждый охотник знал свое дело, место и назначение. Как только вышли за ограду, все без шуму и разговоров равномерно и спокойно растянулись по дороге и полю, ведшими к отрадненскому лесу.
Как по пушному ковру шли по полю лошади, изредка шлепая по лужам, когда переходили через дороги. Туманное небо продолжало незаметно и равномерно спускаться на землю; в воздухе было тихо, тепло, беззвучно. Изредка слышались то подсвистыванье охотника, то храп лошади, то удар арапником или взвизг собаки, не шедшей на своем месте.
Отъехав с версту, навстречу Ростовской охоте из тумана показалось еще пять всадников с собаками. Впереди ехал свежий, красивый старик с большими седыми усами.
- Появились в 1986 году
- Языки программирования по алфавиту
- Языки программирования семейства Модула
- Процедурные языки программирования
- Многопоточные языки программирования
- Объектно-ориентированные языки программирования
- Языки программирования с автоматическим управлением памятью
- Языки программирования с ручным управлением памятью
- Языки программирования со статическим распределением памяти