Введение

Компьютерный язык программирования 1960-х годов. Atlas Autocode (AA) — это язык программирования, разработанный около 1963 года в Манчестерском университете. Являясь вариантом языка ALGOL, он был разработан Тони Брукером и Дерриком Моррисом для компьютера Atlas. Первоначальные компиляторы AA и AB были написаны Джеффом Роллом и Тони Брукером с использованием компилятора Brooker Morris Compiler, а позднее Джефф Ролл создал ручную, не основанную на CC реализацию (ABC). Термин "автокод" по сути был ранним названием для языка программирования, и различные автокоды могли значительно различаться.

Особенности

AA был блочным структурированным языком, который поддерживал явно типизированные переменные, подпрограммы и функции. В нём отсутствовали некоторые возможности ALGOL, такие как передача параметров по имени, что в ALGOL 60 подразумевало передачу адреса памяти короткой подпрограммы (thunk) для пересчёта значения параметра каждый раз при его использовании. Компилятор AA мог генерировать проверку границ при обращении к массивам и позволял задавать размеры массива во время выполнения, то есть массив можно было объявить как Thing (i:j) целых чисел, где i и j были вычисленными значениями. В высокоуровневые процедуры AA можно было включать машинный код, либо для повышения эффективности внутренних циклов, либо для выполнения операций, которые было бы сложно реализовать иным способом. AA включал в себя сложный тип данных для представления комплексных чисел, отчасти из-за запросов факультета электротехники, поскольку комплексные числа используются для описания поведения переменного тока. Мнимая единица, квадратный корень из -1, обозначалась i и рассматривалась как фиксированная комплексная константа. Сложный тип данных был исключён, когда Atlas Autocode в дальнейшем эволюционировал в язык Edinburgh IMP. IMP являлся расширением AA и использовался для написания операционной системы Edinburgh Multiple Access System (EMAS). Вторым значительным достижением AA (после того, как он стал основой для IMP и EMAS) было наличие многих функций оригинального Compiler Compiler. Один из вариантов компилятора AA включал поддержку времени выполнения для рекурсивного нисходящего парсера. Стиль парсера, использованный в Compiler Compiler, непрерывно применялся в Эдинбурге с 60-х годов до конца 90-х. Другие автокоды были разработаны для компьютеров Titan, прототипа Atlas 2 в Кембридже и Ferranti Mercury.

Синтаксис

Синтаксис Atlas Autocode был во многом похож на ALGOL, хотя на него повлияло выходное устройство, которое было в распоряжении автора – флексорайтер Friden. Таким образом, он допускал использование символов, таких как ½ для 0.5 и верхний индекс 2 для обозначения степени 2. Flexowriter поддерживал перепечатку (overstriking), и, следовательно, AA тоже: можно было перепечатать до трех символов, чтобы создать один. Например, в наборе символов не было символа ↑, поэтому возведение в степень реализовывалось перепечаткой символов | и *. Упомянутое подчеркивание зарезервированных слов (ключевых слов) также могло быть выполнено с помощью перепечатки. Язык подробно описан в справочном руководстве Atlas Autocode. Другими символами Flexowriter, которые использовались в AA, были: α в числах с плавающей точкой, например, 3.56α 7 для современного 3.56e 7; β для обозначения второй половины 48-битного слова памяти Atlas; π для математической константы пи. Когда AA был портирован на компьютер English Electric KDF9, набор символов был изменен на стандарт Международной организации по стандартизации (ISO). Этот компилятор был восстановлен из старой перфоленты Эдинбургским проектом по истории вычислительной техники и доступен в сети Интернет, как и высококачественное сканирование оригинальной эдинбургской версии руководства Atlas Autocode. Ключевые слова в AA отличались от остального текста подчеркиванием, которое реализовывалось с помощью перепечатки в Flexowriter (в отличие от полужирного шрифта в ALGOL). Существовало также два режима "стробирования" (stropping). Во-первых, был режим "заглавные буквы как разделители", в котором все заглавные буквы (вне строк) рассматривались как подчеркнутые строчные. Во-вторых, в некоторых версиях (но не в оригинальной версии Atlas) ключевые слова можно было "стробировать", ставя перед ними символ "%", например, ключевое слово endofprogramme можно было набрать как %end %of %programme или %endofprogramme. Это значительно сокращало ввод текста, так как требовалось только один символ вместо перепечатки всего ключевого слова. Как и в ALGOL, в языке не было зарезервированных слов, поскольку ключевые слова идентифицировались подчеркиванием (или стробированием), а не распознаванием зарезервированных последовательностей символов. В операторе if token=if then result = token, присутствует как ключевое слово if, так и переменная с именем if. Как и в ALGOL, AA допускал пробелы в именах переменных, например, integer previous value. Пробелы не имели значения и удалялись перед разбором на тривиальном этапе предварительной обработки, называемом "реконструкцией строки". В приведенном выше примере компилятор увидел бы "iftoken=ifthenresult=token". Возможность использования пробелов была обусловлена, отчасти, тем, что ключевые слова различались другими способами, а отчасти тем, что исходный код обрабатывался методом анализа без сканера (scannerless parsing), без отдельной фазы лексического анализа, что позволяло лексическому синтаксису быть контекстно-зависимым. Синтаксис выражений позволял опускать оператор умножения, например, 3a интерпретировалось как 3*a, а a(i+j) – как a*(i+j), если a не являлось массивом. В неоднозначных случаях выбиралось самое длинное возможное имя (maximal munch), например, ab не интерпретировалось как a*b, независимо от того, были ли a и b объявлены.