СУМАСШЕДШИЙ Парадигма | Императив |
Разработчик | Галлер, Арден и Грэм |
Впервые появился | 1959 г. |
Операционные системы | УМЭС, МТС, ЦТСС и др. |
Основные реализации |
IBM 704, IBM 7090, UNIVAC 1108, Philco 210-211, IBM S / 360 и IBM S / 370 |
Диалекты |
MAD, MAD / I, GOM |
Под влиянием |
IAL, АЛГОЛ 58 |
MAD ( Michigan Algorithm Decoder) - это язык программирования и компилятор для IBM 704, а затем и для IBM 709, IBM 7090, IBM 7040, UNIVAC 1107, UNIVAC 1108, Philco 210-211 и, в конечном итоге, для мэйнфреймов IBM S / 370. Разработанный в 1959 году в Университете штата Мичиган по Bernard Galler, Брюс Арден и Роберт М. Грэм, MAD является вариант Алголом язык. Он широко использовался для обучения программированию в колледжах и университетах в 1960-х годах и сыграл незначительную роль в разработке компьютерных операционных систем CTSS, Multics и Michigan Terminal System.
Архивы Исторической библиотеки Bentley при Мичиганском университете содержат справочные материалы по развитию MAD и MAD / I, в том числе распечатки трех погонных футов с рукописными пометками и оригинальные печатные руководства.
СОДЕРЖАНИЕ
- 1 MAD, MAD / I и GOM
- 2 История
- 3 MAD, MAD Magazine и Альфред Э. Нойман
- 4 Пример "Hello, world"
- 5 языковых элементов
- 5.1 Формат ввода
- 5.2 Имена
- 5.3 Типы данных
- 5.4 Массивы и матрицы
- 5.5 Операторы
- 5.5.1 Арифметические операторы
- 5.5.2 Операторы-указатели (только GOM)
- 5.5.3 Операторы отношения
- 5.5.4 Логические операторы
- 5.5.5 Битовые операторы (только GOM)
- 5.6 Заявления о декларации
- 5.7 Исполняемые операторы
- 5.8 Операторы ввода и вывода
- 5.9 Функции
- 6 Определение и переопределение оператора
- 7 См. Также
- 8 Примечания
- 9 ссылки
- 10 Внешние ссылки
MAD, MAD / I и GOM
Есть три компилятора MAD:
- Оригинальный MAD, компилятор разработан в 1959 году в Университете штата Мичиган для IBM 704 и более поздних версий в IBM 709 и IBM 7090 мэйнфреймов компьютеров под управлением Мичиганского университета исполнительной системы (UMES) и Compatible Time-Sharing System (CTSS) операционных систем. В середине 1960-х годов MAD был перенесен в Университете Мэриленда на UNIVAC 1108. Версии MAD также были доступны для Philco 210-211 и UNIVAC 1107.
- MAD / I, «расширенная» версия MAD для компьютеров серии IBM System / 360, работающих под управлением Michigan Terminal System (MTS). Работа над новым компилятором началась в 1965 году в рамках спонсируемого ARPA проекта CONCOMP в Мичиганском университете. По мере продвижения работы постепенно становилось ясно, что MAD / I был новым языком, независимым от исходной версии MAD 7090.
- GOM ( G ood O ld M AD), повторная реализация оригинального 7090 MAD для серии мэйнфреймов IBM System / 370, на которых работает Michigan Terminal System (MTS). GOM был создан в начале 1980-х Доном Беттнером в вычислительном центре Мичиганского университета.
История
Хотя MAD был мотивирован АЛГОЛОМ 58, он ни в чем не похож на АЛГОЛ 58.
Программы, написанные на MAD, включали MAIL, RUNOFF, одну из первых систем обработки текста, и несколько других утилит, все в рамках Совместимой системы разделения времени (CTSS). Была проделана работа над дизайном компилятора MAD для Multics, но он так и не был реализован.
Ниже приводится интересная цитата из интервью с Брайаном Керниганом, когда его спросили: «Что вас зацепило программированием?»:
- Я думаю, что больше всего мне нравилось программировать, когда я летом 1966 года работал в Project MAC в Массачусетском технологическом институте, где я работал над программой, которая создавала рабочую ленту для нового GE 645 в первые дни существования Multics. Я писал в MAD, что было намного проще и приятнее, чем FORTRAN и COBOL, которые я написал ранее, и я использовал CTSS, первую систему разделения времени, которая была бесконечно проще и приятнее, чем перфокарты.
MAD был довольно быстрым по сравнению с некоторыми другими компиляторами того времени. Поскольку многие люди были заинтересованы в использовании языка FORTRAN и все же хотели получить скорость компилятора MAD, была разработана система под названием MADTRAN (написанная на MAD). MADTRAN был просто переводчиком с FORTRAN на MAD, который затем производил машинный код. MADTRAN распространялся через SHARE.
MAD / I имеет синтаксическую структуру, подобную Алголом 60 вместе с важными функциями от оригинального MAD и от PL / I. MAD / I был разработан как расширяемый язык. Он был доступен для использования под MTS и предоставил много новых идей, которые перекочевали на другие языки, но компиляции MAD / I были медленными, и MAD / I никогда не распространился на широкое использование по сравнению с исходным 7090 MAD.
GOM - это, по сути, язык 7090 MAD, модифицированный и расширенный для архитектуры 360/370 с некоторой разумной адаптацией, чтобы лучше соответствовать текущим методам программирования и задачам. Система сообщений МТС была написана на языке GOM.
MAD, журнал MAD и Альфред Э. Нойман
Вывод на строчный принтер после ошибки компилятора MAD на компьютере IBM 704 в Мичиганском университете, c. 1960 г.
В предварительной версии оригинального MAD, как отсылка к тезке MAD, журналу MAD, когда программа содержала слишком много ошибок времени компиляции, компилятор печатал полностраничное изображение Альфреда Э. Ноймана с использованием ASCII-арта. Подпись гласила: «Посмотрите на этого человека о своей программе - он может захотеть опубликовать ее. Он никогда не беспокоится - но, судя по виду вашей программы, вам следует». Эта функция не была включена в окончательную официальную версию. Однако он был включен в производственную версию для IBM 7040.
А Берни Галлер вспоминает:
- К тому времени, когда мы разработали язык, который, как мы думали, стоит делать и для которого мы могли бы сделать компилятор, мы уже не могли называть его Algol; это действительно было иначе. Именно тогда мы приняли название MAD от Michigan Algorithm Decoder. У нас было забавное общение с людьми из Mad Magazine, когда мы попросили разрешения использовать имя MAD. В очень забавном письме они сказали нам, что подадут на нас в суд и все остальное, но закончили угрозу PS внизу - «Конечно, продолжайте». К сожалению, это письмо потеряно.
Пример "Привет, мир"
Программа- пример « hello, world » выводит строку «Hello, world» на терминал или экран.
PRINT FORMAT HELLOW VECTOR VALUES HELLOW=$13h0Hello, world*$ END OF PROGRAM
Первый символ строки рассматривается как логический элемент управления кареткой, в этом примере это символ «0», который вызывает печать строки с двойным интервалом.
В качестве альтернативы можно использовать сокращения, и компилятор развернет их в листинге:
P'T HELLOW V'S HELLOW=$13h0Hello, world*$ E'M
Элементы языка
MAD и GOM, но не MAD / I, состоят из следующих элементов:
Формат ввода
Программы MAD представляют собой серию утверждений, записанных на перфокартах, обычно по одному утверждению на карту, хотя утверждение может быть продолжено на нескольких картах. Столбцы 1-10 содержат необязательную метку оператора, комментарии или примечания помечаются буквой «R» в столбце 11, а столбцы 73-80 не используются и могут содержать идентификатор последовательности. Пробелы не имеют значения где-либо, кроме символьных констант. Для GOM ввод - произвольная форма без поля последовательности, и строки могут быть длиной до 255 символов; строки, начинающиеся со звездочки (*), являются комментариями; а строки, начинающиеся со знака «плюс» (+), являются линиями продолжения.
Имена
Имена переменных, имена функций и метки операторов имеют одинаковую форму: буквы, за которыми следуют от нуля до пяти букв или цифр. Имена функций заканчиваются точкой. Все имена могут иметь нижние индексы (имя, за которым следует круглые скобки, с несколькими нижними индексами, разделенными запятыми). Имена GOM могут содержать до 24 символов и могут включать символ подчеркивания (_).
Некоторые ключевые слова в языке являются зарезервированными, поскольку большинство из них длиннее шести букв или окружены точками. Существует стандартный набор сокращений, которые можно использовать для замены более длинных слов. Они состоят из первой и последней букв ключевых слов с апострофом между ними, например W'R для WHENEVER и D'N для DIMENSION.
Типы данных
MAD использует термин «режим» для своих типов данных. Поддерживаются пять основных режимов:
- Целое число, записанное с масштабным коэффициентом или без него (1, +1, -1, 1K10, 1K) или как восьмеричные константы (до 7777777777777K);
- Плавающая точка, записанная с показателем степени или без него (0., 1.5, -0.05, +100.4, -4.,.05E-2, -.05E2, 5E02, 5.E2);
- Boolean (1B для истины и 0B для false);
- Этикетка с заявлением и
- Имя функции записывается как имя, за которым следует точка (SQRT.).
Режим константы можно переопределить, добавив символ M, за которым следует одна цифра в конце константы, где 0 указывает на плавающую точку, 1 целое число, 2 логических значения, 3 имени функции и 4 метки оператора.
Для GOM добавлены шесть дополнительных режимов: CHARACTER, SHORT INTEGER, BYTE INTEGER, LONG INTEGER, POINTER и DYNAMIC RECORD.
Буквенные или символьные константы хранятся в виде целых чисел и записываются с использованием знака доллара в качестве разделителя ($ ABCDEF $) с двойными знаками доллара, используемыми для ввода истинного знака доллара ($$$. 56 $ - 56 центов). Строки длиной более шести символов представлены массивами.
Массивы и матрицы
- Нет ограничений на количество измерений.
- Допускаются отрицательные и нулевые индексы, а также индексы с плавающей запятой.
- Матрицы хранятся в последовательных ячейках памяти в порядке, определяемом первым изменением самого правого нижнего индекса.
- На матрицы можно ссылаться с использованием нижнего индекса для каждого измерения NAME (s 1, s 2, s 3) или с использованием одного нижнего индекса NAME (s 1).
- Списки ввода-вывода, операторы VECTOR VALUES и некоторые подпрограммы позволяют использовать блочную нотацию, которая имеет форму A,..., B или A... B, которая является ссылкой на всю область от A до B. включительно. В терминах вектора A (1)... A (N) будет A (1), A (2), A (3),..., A (N).
- Есть средства, позволяющие изменять размеры во время работы; разрешение программисту изменять положение начального элемента в массиве внутри всего блока, который был выделен для массива; и позволяет указать произвольное отображение хранилища.
Список операторов, операторов и функций Операторы
Арифметические операторы - .ABS. (унарное абсолютное значение)
- + (унарная идентичность)
- - (унарное отрицание)
- + (сложение)
- - (вычитание)
- * (умножение)
- / (разделение)
- .П. (возведение в степень)
- .N. (побитовое отрицание)
- .A. (побитовое и)
- .V. (побитовое или)
- .EV. (побитовое исключающее или)
- .LS. (левый "шифт)
- .RS. (сдвиг вправо)
- .REM. (остаток, только GOM)
Операторы-указатели (только GOM) - : (выбор)
- .LOC. (место нахождения)
- .IND. (косвенное обращение)
| Операторы отношения - .L. (меньше, чем)
- .LE. (меньше или равно)
- .E. (равный)
- .NE. (не равный)
- .ГРАММ. (больше чем)
- .GE. (больше или равно)
Логические операторы - .НЕТ. (унарное логическое "нет")
- .ИЛИ. (логическое или)
- .EXOR. (логическое исключающее или)
- .А ТАКЖЕ. (логично и)
- .ТОГДА. (подразумевает)
- .EQV. (эквивалентность)
Битовые операторы (только GOM) - .SETBIT. (установить бит в 1)
- .RESETBIT. (сбросить бит в 0)
- .НЕМНОГО. (тестовый бит)
|
Заявления декларации
Переменные могут быть объявлены явно или неявно. По умолчанию предполагается, что все неявно объявленные переменные имеют значения с плавающей запятой. Для изменения этого значения по умолчанию можно использовать оператор NORMAL MODE IS.
- FLOATING POINT var 1, var 2,... (может включать информацию о размерах)
- INTEGER var 1, var 2,... (может включать информацию о размерах)
- BOOLEAN var 1, var 2,... (может включать информацию о размерах)
- НАЗВАНИЕ ФУНКЦИИ имя 1, имя 2,... (может включать информацию о размерах)
- ЭТИКЕТКА ЗАЯВЛЕНИЯ ярлык 1, ярлык 2,... (может включать информацию о размерах)
- НОМЕР РЕЖИМА n, var 1, var 2,... (может включать информацию о размерах)
- НОРМАЛЬНЫЙ РЕЖИМ - это имя типа (INTEGER, BOOLEAN, FLOATING POINT, STATEMENT LABEL или FUNCTION NAME)
- НОРМАЛЬНЫЙ РЕЖИМ НОМЕР РЕЖИМА n
- Переменная DIMENSION ( max-Dimension) (объявляет массив от 0 до max-Dimension)
- РАЗМЕР переменная ( от... до)
- Переменная DIMENSION ( индекс 1, индекс 2,..., индекс n) (объявляет многомерный массив)
| - ВЕКТОРНЫЕ ЗНАЧЕНИЯ массив ( n) = c 1, c 2, c 3,...
- ВЕКТОРНЫЕ ЗНАЧЕНИЯ массив ( m)... массив ( n) = константа
- DOUBLE STORAGE MODE список режимов (удваивает объем памяти, выделенный для перечисленных режимов)
- ЭКВИВАЛЕНТНОСТЬ ( a 1, a 2,..., a m),...
- ОБЩАЯ ПРОГРАММА a, b, c,... (может включать информацию о размерах)
- СТИРАЕМЫЙ a, b, c,... (может включать информацию о размерах)
- ПАРАМЕТР A 1 ( B 1), A 2 ( B 2),..., A n ( B n)
- СИМВОЛ ТАБЛИЦА ВЕКТОР переменная
- FULL SYMBOL TABLE VECTOR переменная
- LISTING ON (по умолчанию)
- СПИСОК
- ССЫЛКИ НА
- ССЫЛКИ ВЫКЛЮЧЕНЫ (по умолчанию)
|
Исполняемые операторы
- переменная = выражение (присвоение)
- ПЕРЕДАЧА К заявлению-этикетке
- ВСЕГДА логическое-выражение, исполняемый-оператор (простое условное)
- WHENEVER логическое выражение (составное условное)
- ИЛИ КОГДА - ЛИБО логическое выражение
- ИНАЧЕ
- КОНЕЦ УСЛОВНОГО
- ПРОДОЛЖИТЬ (оператор ничего не делать, обычно используется для обозначения оператора)
| - THROUGH метка-оператора, ДЛЯ ЗНАЧЕНИЙ переменной = список-выражений (итерация)
- (где переменная может быть любым режимом, в том числе с плавающей запятой)
- УСТАНОВИТЬ СПИСОК В элемент-массив, [ выражение ]
- SAVE DATA список
- ВОССТАНОВИТЬ список ДАННЫХ
- № ПАУЗЫ восьмерично-целое число (остановить выполнение, напечатать восьмеричное число на консоли оператора, разрешить ручной перезапуск)
- КОНЕЦ ПРОГРАММЫ (последний оператор во всех программах MAD)
|
Операторы ввода и вывода
- ЧИТАТЬ ДАННЫЕ (считывает данные в самоопределяемом формате, var1 = value1, var2 = value2,..., varN = valueN
- ЧТЕНИЕ И ПЕЧАТЬ ДАННЫХ (аналогично ЧТЕНИЕ ДАННЫХ, но считанные данные передаются на принтер)
- ЧИТАТЬ ФОРМАТ формат, список
- ПРОЧИТАЙТЕ ЛЕНТУ BCD n, формат, список
- ПРОЧИТАЙТЕ БИНАРНУЮ ЛЕНТУ n, список
- Список результатов печати
- PRINT BCD РЕЗУЛЬТАТЫ список
- PRINT OCTAL РЕЗУЛЬТАТЫ список
- ПЕЧАТЬ КОММЕНТАРИЙ $ string $ (первый символ строки - это управление кареткой)
- ФОРМАТ ПЕЧАТИ формат, список
- ПЕЧАТЬ ОНЛАЙН ФОРМАТ формат, список (отображение сообщения для оператора станка)
- ЗАПИСЬ НА ЛЕНТУ BCD n, формат, список
- ЗАПИСАТЬ ДВОИЧНУЮ ЛЕНТУ n, список
| - Формат PUNCH FORMAT, список
- ПОСМОТРЕТЬ ФОРМАТ формат, список (чтение данных без перехода к следующей записи)
- ПЕРЕМОТКА ЛЕНТА n
- КОНЕЦ ФАЙЛОВОЙ ЛЕНТЫ n
- ЗАПИСЬ ЗАПИСИ ЛЕНТЫ n
- ЗАПИСЬ ЗАПИСИ ЛЕНТЫ n, оператор ПЕРЕДАЧА ТОЧКИ НАГРУЗКИ НА
- ЗАДНИЙ ФАЙЛ ЛЕНТЫ n
- BACKSPACE FILE OF TAPE n, IF LOAD POINT TRANSFER TO оператор
- УСТАНОВИТЬ ЛЕНТУ НИЗКОЙ ПЛОТНОСТИ n
- УСТАНОВИТЬ ТАБЛИЦУ ВЫСОКОЙ ПЛОТНОСТИ n
- ПЕРЕМОТКА ЛЕНТА n
- РАЗГРУЗИТЬ ЛЕНТУ n
- Список FORMAT VARIABLE (декларация, может включать информацию о размерах)
|
Функции
Имена функций заканчиваются точкой. Поддерживаются внутренние и внешние функции. Внутренние функции компилируются как часть программы, в которой они используются, и разделяют объявления и переменные с основной программой. Внешние функции компилируются отдельно и не имеют общих объявлений и переменных. Допускается определение внутренних функций одним оператором. Рекурсивные функции разрешены, хотя функция должна сама выполнять некоторые необходимые операции по сохранению и восстановлению.
- ВНУТРЕННЯЯ ФУНКЦИЯ имя-функции. ( Список-аргументов) = выражение (определение одного оператора)
- ВНУТРЕННЯЯ ФУНКЦИЯ имя-функции. ( Список-аргументов)
- ВНЕШНЯЯ ФУНКЦИЯ имя-функции. ( Список-аргументов)
- ЗАПИСЬ НА ИМЯ имя.
- КОНЕЦ ФУНКЦИИ (последний оператор в многострочном определении)
- FUNCTION RETURN [ выражение ]
| - ВОЗВРАТ ОШИБКИ (принудительный возврат ошибки в оператор или в операционную систему, если в качестве последнего аргумента вызова не задано сообщение об ошибке)
- СОХРАНИТЬ ВОЗВРАТ
- ВОССТАНОВИТЬ ДАННЫЕ
- ВОССТАНОВЛЕНИЕ ВОЗВРАТ
- ВЫПОЛНИТЬ процедуру. ( Список-аргументов) (вызвать функцию, не имеющую однозначного значения)
|
Определение и переопределение оператора
Одной из наиболее интересных функций MAD является возможность расширения языка путем переопределения существующих операторов, определения новых операторов или определения новых типов данных (режимов). Определения сделаны с использованием операторов объявления MAD и мнемоники языка ассемблера, включенной после объявления до псевдо-инструкции END, реализующей операцию.
- DEFINE BINARY OPERATOR defined-op, PRECEDENCE rank existing-op MODE STRUCTURE mode-options
- DEFINE UNARY OPERATOR defined-op, PRECEDENCE rank existing-op MODE STRUCTURE mode-options
- СТРУКТУРА РЕЖИМА mode-no = mode-no existing-op mode-no
- СТРУКТУРА РЕЖИМА режим-нет = режим-нет существующий-операционный режим-нет ТАКАЯ ПОСЛЕДОВАТЕЛЬНОСТЬ, КАК режим-нет- существующий-операционный режим-нет
куда:
- ранг может быть одним из таких же, НИЖЕ или ВЫШЕ, ЧЕМ; а также
- Параметры режима - это параметры, которые появляются в операторе MODE STRUCTURE.
Три предопределенных пакета определений (MATRIX, DOUBLE PRECISION и COMPLEX) доступны для включения в исходные программы MAD с помощью оператора INCLUDE.
Смотрите также
Примечания
использованная литература
- Сокращенное описание языка компилятора MAD, Фернандо Дж. Корбато, Джером Х. Зальцер, Нил Барта и Томас Н. Гастингс, Меморандум CC-213 вычислительного центра Массачусетского технологического института, июнь 1963 г.
- CLSYS, программа для облегчения использования MAD-транслятора для больших (размер класса) пакетов, Джером Х. Зальцер, Меморандум CC-204 вычислительного центра Массачусетского технологического института. Февраль 1963 г.
- Компьютерный учебник по безумному языку, Эллиот Ирвинг Органик, 1961.
- Внутренняя организация переводчика MAD, Арден, Б.В., Галлер, Б.А. и Грэм, Р.М., стр. 28–31, CACM Volume 4 No. 1 (январь 1961 г.)
- Введение в алгоритмические методы с использованием языка MAD, Алан Б. Марковиц и Эрл Дж. Швеппе, Macmillan, 1966.
- Введение в цифровые компьютеры и язык MAD, Брайс Карнахан, Мичиганский университет.
- Язык компьютеров, Бернард А. Галлер, Мичиганский университет, Макгроу-Хилл, 1962.
- MAD в Мичигане: его функции и особенности, Arden, BW, Galler, BA, and Graham, RM, pp27–28, Datamation, Volume 7 No. 12 (декабрь 1961 г.)
внешние ссылки