Введение
Исторический язык программирования
MAD (Michigan Algorithm Decoder) — это язык программирования и компилятор для компьютеров IBM 704, а затем IBM 709, IBM 7090, IBM 7040, UNIVAC 1107, UNIVAC 1108, Philco 210 211 и, в конечном итоге, мейнфреймов IBM System/370. Разработанный в 1959 году в Мичиганском университете Бернардом Галлером, Брюсом Арденом и Робертом М. Грэмом, MAD является вариантом языка ALGOL. Он широко использовался для обучения программированию в колледжах и университетах в 1960-х годах и сыграл небольшую роль в разработке операционных систем Compatible Time-Sharing System (CTSS), Multics и Michigan Terminal System. Первоначальная версия чат-бота ELIZA была написана на MAD SLIP. В архивах Исторической библиотеки Бентли Мичиганского университета содержатся материалы о разработке MAD и MAD/I, включая три линейных фута распечаток с рукописными пометками и оригинальные печатные руководства.
Формат ввода
MAD-программы представляют собой последовательность операторов, записанных на перфокартах, как правило, по одному оператору на карту, хотя оператор может занимать несколько карт. Столбцы 1–10 содержат необязательную метку оператора, комментарии или замечания обозначаются буквой "R" в столбце 11, а столбцы 73–80 не используются и могут содержать идентификатор последовательности. Пробелы не имеют значения где бы то ни было, за исключением строковых констант. Для GOM ввод имеет свободный формат, без поля последовательности, и строки могут быть длиной до 255 символов; строки, начинающиеся со звездочки (*), являются комментариями; а строки, начинающиеся со знака плюс (+), являются строками продолжения.
Имена
Имена переменных, имена функций и метки операторов имеют одинаковый формат: буква, за которой следует от нуля до пяти букв или цифр. Имена функций заканчиваются точкой. Все имена могут иметь индексы (имя, за которым следуют круглые скобки, с несколькими индексами, разделенными запятыми). Для GOM имена могут быть длиной до 24 символов и могут включать символ подчеркивания (_). В языке немного зарезервированных слов, поскольку большинство из них длиннее шести букв или заключены в точки. Существует стандартный набор сокращений, которые можно использовать для замены более длинных слов. Они состоят из первой и последней букв ключевого слова с апострофом между ними, например, W'R для WHENEVER и D'N для DIMENSION.
Массивы и матрицы
Количество измерений не ограничено. Допускаются отрицательные, нулевые и вещественные индексы. Матрицы хранятся в последовательных ячейках памяти в порядке, определяемом изменением крайнего правого индекса. К матрицам можно обращаться, используя индекс для каждого измерения, NAME(s1, s2, s3), или используя один индекс, NAME(s1). Списки ввода-вывода, операторы VECTOR VALUES и некоторые подпрограммы позволяют использовать блочную нотацию, которая имеет вид A,,B или A B, что является ссылкой на всю область от A до B включительно. Для вектора A(1) A(N) означает A(1), A(2), A(3), ..., A(N). Предусмотрены средства для изменения размеров во время выполнения, позволяющие программисту изменять положение начального элемента в массиве внутри выделенного для него блока памяти, а также определять произвольное сопоставление памяти.
Относительные операторы
L. (меньше)
LE. (меньше или равно)
E. (равно)
NE. (не равно)
G. (больше)
GE. (больше или равно)
LE. (less than or equal)
E. (equal)
NE. (not equal)
G. (greater than)
GE. (greater than or equal)
Булевые операторы
НЕ. (унарное логическое отрицание)
ИЛИ. (логическое ИЛИ)
ИСКЛ_ИЛИ. (логическое исключающее ИЛИ)
И. (логическое И)
ТОГДА. (импликация)
ЭКВИВ. (эквивалентность)
OR. (logical or)
EXOR. (logical exclusive or)
AND. (logical and)
THEN. (implies)
EQV. (equivalence)
Операторы бит (только GOM)
SETBIT. (установить бит в 1)
RESETBIT. (сбросить бит в 0)
BIT. (проверить бит)
RESETBIT. (reset bit to 0)
BIT. (test bit)