Н. Вирт - Программирование на языке Модула-2 (1160777), страница 28
Текст из файла (страница 28)
Но, поскольку Модула была задумана и как инструмент созданияоперационных систем, включение соответствующих средств работы с устройствами ипрерываниями было неизбежно. Их использование, однако, должно быть ограничено такназываемыми автономными системами, которые не поддерживаются (и не обременены)конкретной операционной системой.Сообщение о языке программирования Модула-21. ВВЕДЕНИЕЯзык Модула-2 возник из практических нужд как универсальный и эффективный языксистемного программирования для мини-ЭВМ.
Его предшественниками были Паскаль и Модула. Отпоследнего он унаследовал имя, важное понятие модуля и систематический современныйсинтаксис, а от первого - почти все остальное. Сюда входят, в частности, структуры данных, т.е.массивы, записи, записи с вариантами, множества и указатели. В число структурных оператороввходят условный оператор, оператор выбора, цикл с условием окончания, цикл с условиемпродолжения и оператор присоединения. Синтаксис структурных операторов таков, что каждыйоканчивается специальным символом.Язык по существу машинно-независим. Исключение составляют ограничения, связанные сдлиной слова.
Может показаться, что это противоречит понятию языка системногопрограммирования, в котором должна быть возможность выразить все операции базовой машины.Эта дилемма разрешается при помощи понятия модуля. Машинно-зависимые понятия вводятся139при помощи специальных модулей, поэтому их использование может быть очерченоопределенными рамками. В частности, в этих случаях язык дает возможность ослабить правиласовместимости типов.
На хорошем языке системного программирования должна бытьвозможность написать процедуры преобразования при вводе-выводе, подпрограммы обработкиФайлов, распределения памяти, управления процессами и другие. Поэтому такие возможностидолжны быть не элементами самого языка. а модулями (как говорят, низкого уровня),являющимися компонентами большинства написанных программ. Поэтому такой наборстандартных модулей является существенной частью реализации Модулы-2.Вместо процессов и их синхронизации с помощью сигналов, введенных в Модуле, вМодуле-2 используется низкоуровневое понятие сопрограммы .
При этом, однако, можносформулировать (стандартный) модуль, реализующий эти процессы и сигналы. Преимуществотого, что они не включаются собственно в язык, состоит в том, что программист,запрограммировав самостоятельно соответствующий модуль, имеет возможность выбрать такойалгоритм управления процессами, который отвечает его нуждам. В простых (но частовстречающихся) случаях, например когда взаимодействующие процессы выступают только какдрайверы устройств, эти программы могут быть вообще опущены.Современный язык системного программирования должен поддерживать разработкубольших программ, возможно, создаваемых несколькими людьми. Модули, написанные каждымиз них, имеют хорошо специфицированные интерфейсы.
Формулируемые независимо отреализации. В Модуле-2 это поддерживается разделением модулей определений и модулейреализации. Первые определяют все объекты, экспортируемые из соответствующего модуляреализации. В некоторых случаях, таких, как процедуры и типы, в модуле определенийспецифицируется только то, что существенно для описания интерфейса, т.е. для пользователямодуля.Данное сообщение отнюдь не учебник по языку Модула-2. Его цель - дать сжатое и(надеемся) ясное описание.
Оно предназначено быть справочным пособием для программистов,реализаторов и авторов руководств и арбитром в сомнительных случаях.2. СИНТАКСИСЯзык - это бесконечное множество предложений, удовлетворяющих его синтаксису. Вслучае Модулы-2 предложения называются единицами компиляции. Они представляют собойконечные последовательности символов из конечного словаря.
Словарь Модулы-2 состоит изидентификаторов, чисел, строк, операций и ограничителей. Они называются лексическимисимволами (лексемами) и состоят из последовательности литер.Для описания синтаксиса используются расширенные Формы Бэкуса-Наура (РБНФ).Квадратные скобки [] означают, что заключенная в них сентенциальная Форма можетотсутствовать, а Фигурные скобки О означают ее повторение (возможно, 0 раз).
Синтаксическиепонятия (нетерминальные символы) обозначаются словами, выражающими их интуитивныйсмысл. Символы словаря языка (терминальные символы) изображаются словами, написаннымипрописными буквами (резервированные слова) или цепочками литер, заключенными в кавычки(далее просто цепочки). Синтаксическим правилам (продукциям) предшествует символ $ в началестроки.3. СЛОВАРЬ И ИЗОБРАЖЕНИЕИзображение терминальных символов посредством литер зависит от имеющегося наборалитер. В данном сообщении используется набор ASCII; при этом надо иметь в виду следующиелексические правила. Пробелы не должны встречаться внутри символов (исключение составляютцепочки). Пробелы и концы строк игнорируются, если они несущественны для разделениясимволов.1.
Идентификаторы - последовательности букв и цифр. Первым символом должна бытьбуква.140$Идентификатор = Буква {Буква | Цифра }.Примеры:х scan Modula ETH ВзятьСимвол перваяБуква2. Числа могут быть целыми (возможно, без знака) или действительными. Целое —последовательность цифр. Если за числом следует буква В, оно рассматривается каквосьмеричное; если буква Н - как шестнадцатеричное; если буква С - число рассматривается каклитера с данным (восьмеричным) порядковым номером (и имеющая тип CHAR, см. п.6.1). (* Здесьи далее, если не оговорено особо, имеются в виду ссылки на настоящее сообщение.
-Прим.перев.*)Целое i в диапазоне 0<=i<=MaxInt можно рассматривать как типа INTEGER, так и типаCARDINAL. Если оно лежит в диапазоне MaxInt<=i<=MaxCard, то имеет тип CARDINAL. Для 16разрядных машин: MaxInt=32767, MaxCard=65535.Действительное число всегда обычно содержит десятичную точку. Кроме того, оно можетсодержать порядок. Буква Е означает "десять в степени".
Действительное число имеет тип REAL.$Число=Целое | Действительное.$Целое - Цифра { Цифра } | ВосьморичнаяЦиФра${ ВосьмеричнаяЦиФра } ("В"|"С") |$Цифра { ШестнадцатеричнаяЦиФра } "Н".$$Действительное = Цифра {Цифра}"." {Цифра} [Порядок].$Порядок = "Е" [ "+" | "-" ] Цифра { Цифра }.$ШестнадцатеричнаяЦиФра =$Цифра |"A"|"B"|"C"|"D"|"E"|"F".$Цифра = ВосьмеричнаяЦиФра |"8"|"9".$ВосьмеричнаяЦиФра =$"0"|"1"|"2"|"3"|"4"|"5"|"6"|"7".Примеры:1980 3764В 7ВСН ЗЗС 12.3 45.67Е-83. Цепочки - последовательности литер, заключенные в кавычки. В качестве кавычек могутиспользоваться как одиночные кавычки (апострофы), так и двойные кавычки. Однакооткрывающей и закрывающей кавычкой должна быть одна и та же литера, не встречающаяся встроке.
Цепочка литер не может переноситься на другую строку.$Цепочка = "'" { Литера } "'" | '"' { Литера } '"'.Цепочка, состоящая из п литер, имеет тип (см. п.6.4)ARRAY [0..n-1] OF CHARПримеры: "MODULA" "C'est chic!" 'Шлягер "Бразилия"'1414. Операции и ограничители - специальные литеры, пары литер или резервированныеслова, перечисленные ниже. В резервированные слова входят только прописные буквы, и они немогут выступать в качестве идентификаторов. Символы # и о - синонимы, как и символы & иAND, ~ и NOT.+=ANDFORQUALIDENT=#ARRAYFROMRECORD*<BEGINIFREPEAT/>BYIMPLEMENTATION RETURN:=<>CASEIMPORTSET&<=CONSTINTHEN.>=DEFINITION LOOPTO,..DIVMODTYPE;:DOMODULEUNTIL()ELSENOTVAR[]ELSIFOFWHILE{}ENDORWITH^|EXITPOINTEREXPORTPROCEDURE~5. Комментарии - произвольная последовательность литер, заключенная в скобки (* и *).Комментарии могут помещаться между любыми двумя символами программы.
Они могут бытьвложенными и не влияют на смысл программы.4. ОПИСАНИЯ И ПРАВИЛА ВИДИМОСТИКаждый идентификатор, встречающийся в программе, должен быть описан, если он неявляется стандартным идентификатором. Последние считаются предописанными и допускаютиспользование в любой части программы. Поэтому они называются проникающими. Описания служатдля задания объект локален. Это правило видимости дополняется следующими случаями:1.
Если идентификатор х, определенный описанием D1, используется в другом описании(но не в операторе) D2, то D1 должно текстуально предшествовать D2.2. Тип Т1 может использоваться в описании типа указателя Т (см. п.6.7), текстуальнопредшествующего описанию Т1, если как Т, так и Т1 описаны в одном и том же блоке. Этонекоторое ослабление правила 1.3. Если идентификатор, определенный в модуле Ml, экспортируется, в область еговидимости включается блок, содержащий Ml.
Если Ml - единица компиляции (см. гл. 14), то вобласть . видимости включаются все единицы компиляции, импортирующие Ml.4. Использование идентификаторов полей записи (см. п.6.5) допустимо только вобозначениях полей и в операторах присоединения, ссылающихся на переменную этого типазаписи.Идентификатор может быть квалифицирован.
В этом случае в качестве приставки к немуиспользуется другой идентификатор, обозначающий модуль (см. гл. 11), в котором определен142квалифицируемый идентификатор. Эти идентификаторы разделяются точкой. Ниже перечисленыстандартные идентификаторы с указанием пунктов, где они вводятся. $КвалИдент =Идентификатор {.
"." Идентификатор }.ABS(10.2) INCL(10.2)BITSET(6.6)INTEGER(6.1)BOOLEAN(6.1)LONGINT(6.1)CAP(10.2) LONGREAL(6.1)CARDINAL(6.1)MAX(10.2)CHAR(6.1)MIN(10.2)CHR(10.2) NIL(6.7)DEC(10.2) ODD(10.2)EXCL(10.2) ORD(10.2)FALSE(6.1)PROC(6.8)FLOAT(10.2) REAL(6.1)HALT(10.2) SIZE(10.2)HIGH(10.2) TRUE(6.1)INC(10.2)(10.2)VAL(10.2)TRUNC5. ОПИСАНИЯ КОНСТАНТОписание константы связывает идентификатор со значением константы.некоторыхнеизменных свойств объекта, таких, например, как является ли он константой, типом, переменной,процедурой или модулем.После описания идентификатор используется для ссылки на соответствующий объект.