S-algol

редактировать
S-algol
Paradigms Multi-paradigm : процедурный, императив, структурированный
СемьяАЛГОЛ
Разработан Роном Моррисоном, Тони Дэви
Разработчик Университет Сент-Эндрюс
Первый появился1979; 41 год назад (1979)
Язык реализацииS-algol
Платформа PDP-11 / 40, IBM System / 360, VAX, Zilog Z80, Macintosh, Sun-3
OS Unix, BOS / 360, VMS, CP / M
Под влиянием
АЛГОЛ 60
Под влиянием
PS-algol, Napier88

S-algol (St Andrews Algol) - это компьютерный язык программирования, производный от ALGOL 60, разработанный в Университете Сент-Эндрюс в 1979 году Роном Моррисоном и Тони Дэви.. Этот язык является модификацией ALGOL, чтобы содержать ортогональные типы данных, которые Моррисон создал для своей докторской диссертации. Моррисон впоследствии стал профессором в университете и заведующим кафедрой информатики. Язык S-algol использовался для преподавания в университете на уровне бакалавриата до 1999 года. На этом же языке в течение нескольких лет в 1980-х годах преподавали в местной школе в Сент-Эндрюсе, Мадрас. Колледж. Текст по информатике Recursive Descent Compiling описывает рекурсивный спуск компилятор для S-algol, реализованный на S-algol.

PS-алгол представляет собой постоянное производное S-алгола. Он был разработан примерно в 1981 году в Эдинбургском университете и Сент-Эндрюс. Он поддерживает возможность базы данных, обеспечивая долговечность данных в форме постоянной кучи, которая выдерживает завершение работы программ PS-algol.

Содержание
  • 1 История и реализации
  • 2 Обзор языка
  • 3 Семантические принципы
  • 4 Дизайн
    • 4.1 Типы данных
    • 4.2 Хранилище
    • 4.3 Управляющие структуры
    • 4.4 Абстракции
    • 4.5 Объявления и параметры
    • 4.6 Модель ввода-вывода
    • 4.7 Конкретный синтаксис
  • 5 См. Также
  • 6 Ссылки
  • 7 Внешние ссылки
История и реализации

В докторской диссертации Рона Моррисона 1979 года «О разработке языка» описывается конструкция и реализация языка S-algol. Технический отчет, определяющий язык, The S-algol Reference Manual (1979, 1988), благодарит нескольких людей за их помощь, в том числе Дэвида Тернера за обсуждения языкового дизайна примерно в 1975 году. Текст по информатике 1981 года Recursive Descent Компиляция описывает реализацию компилятора и процесс начальной загрузки, а книга 1982 года «Введение в программирование с S-algol» использует этот язык для обучения программированию на компьютере.

Первая реализация S-algol была на PDP-11 / 40 компьютер под управлением операционной системы Unix. Из-за небольшого размера 64 килобайт адресного пространства, доступного на PDP-11, была выбрана реализация интерпретируемого байт-кода. однопроходный, компилятор рекурсивного спуска, написанный на S-algol, преобразовал исходный код S-algol в S-код, байт-код для абстрактной машины на основе стека адаптирован для S-algol. Затем S-код был выполнен интерпретатором . Реализация S-algol имела много общего с работой над более ранними компиляторами Pascal. Техника использования компилятора рекурсивного спуска для создания кода для абстрактной машины была хорошо известна, и знаменитым примером из начала 1970-х был компилятор Pascal P. Компилятор S-algol был написан с использованием процесса пошагового уточнения, описанного Урсом Амманом для разработки компилятора Паскаля и отстаиваемого изобретателем Паскаля Никлаусом Виртом.

Отражая организацию памяти PDP-11 как 32K 16-битных слов, кодирование инструкций S-кода было разработано таким образом, что каждый байт-код состоял из одного слова. Первоначальный bootstrap был выполнен путем написания компилятора S-algol на Algol W на IBM / 360, который произвел S-код, и использования его для компиляции компилятор написан на S-алгоритме в S-код. Полученный файл S-кода был скопирован в PDP-11 и выполнен в интерпретаторе S-кода, написанном для PDP-11, что сделало его самостоятельным хостингом. Самостоятельный компилятор S-algol выполнил приблизительно 7,7 миллиона инструкций S-кода для своей компиляции, создав выходной файл, содержащий около десяти тысяч инструкций S-кода (16-битных слов).

Интерпретатор S-кода был написан для компьютера VAX с запущенным VMS, что сделало VAX первым S-algol портом. S-algol был также перенесен на микропроцессор Zilog Z80, работающий под управлением CP / M, включая средства растровой графики, которые были добавлены в язык. В 1983 году S-алгол был использован в качестве основы для системы PS-algol, использованной для исследования персистентности. Интерпретатор S-кода PS-algol был реализован в C, а язык S-code был расширен для включения растровой графики. Реализация PS-algol была основой для портов S-algol на Macintosh и рабочие станции Sun с компилятором, переписанным на C и ориентированным на расширенный S- code.

S-algol был основой для исследования PS-algol в 1983 году, а несколько лет спустя PS-algol стал отправной точкой для языка Napier88 и его реализации. В то время как все компиляторы S-algol производили S-код для интерпретации, более поздняя реализация Napier88 экспериментировала с генерацией кода на C и компиляцией его с помощью компилятора gcc, чтобы обеспечить реализацию нативного кода.

Обзор языка

Программа S-algol - это последовательность объявлений и предложений. Объявленные элементы языка включают константы, переменные, процедуры и структуры. Объявления констант и переменных должны указывать начальное значение. Компилятор определяет тип данных объявленной константы или переменной из типа начального значения, поэтому тип явно не указывается. Типы данных включают целые, действительные, логические, строковые, указатели (на структуру) и файлы, а также векторы (массивы) этих типов. В объявлениях процедур указываются типы данных их аргументов и возвращаемое значение (если не void). Структуры также определяют типы данных своих полей. Предложения включают выражения и управляющие структуры (if, case, for, while и repeat while). Управляющие структуры if и case могут иметь значения и могут свободно использоваться в выражениях, если соблюдаются правила совместимости типов.

! Комментарии начинаются с восклицательного знака и продолжаются до конца строки. ! Ключевое слово let вводит объявления констант и переменных! Идентификаторы начинаются с буквенного символа, за которым следуют буквенно-цифровые символы или точка (.)! Должно быть задано начальное значение, которое определяет тип данных объявления let width: = 10! : = устанавливает значение переменной, это int let animal: = "dog"! строка типа let x: = -7; пусть y: = x + x! ; разделяет предложения, требуется, только если в строке есть два или более предложений let n.a = 6.022e + 23! = используется для установки значения константы, это cfloat (константа с плавающей запятой)! if и case могут иметь значения и использоваться в выражениях let no.of.lives: = if animal = "cat" then 9 else 1! Решето Эратосфена написать "Найти простые числа до n =?" пусть n = readi! постоянные значения могут быть установлены во время выполнения программы let p = vector 2 :: n of true! вектор bool с границами от 2 до n для i = 2 для усечения (sqrt (n)) do! для индексов являются константами, поэтому они используют =, а не: = if p (i) do! векторное разыменование использует скобки как вызов процедуры для j = 2 * от i до n посредством i do p (j): = false для i = от 2 до n делать, если p (i) действительно напишет i, "'n"! 'n в буквальной строке - это новая строка! тип структуры (записи) для двоичного дерева cstrings! тип данных pntr может указывать на структуру любого типа, проверка типа выполняется во время выполнения структуры tree.node (имя cstring; pntr left, right)! вставляет новую строку в заголовок двоичного дерева процедуры insert.tree (cpntr head; cstring new ->pntr)! предложение case заканчивается обязательной опцией по умолчанию, используйте default: {}, если это не нужно case true для head = nil: tree.node (new, nil, nil) new < head(name) : { head(left) := insert.tree(head(left), new) ; head } new>head (name): {head (right): = insert.tree (голова (справа), новая); head} по умолчанию: head procedure print.tree (cpntr head) if head ~ = nil do! ~ = это оператор не равно begin print.tree (head (left)) write head (name), "'n" print.tree (head (right)) end let fruit: = nil fruit: = insert.tree (fruit, "банан") фрукт: = insert.tree (фрукт, "киви") фрукт: = insert.tree (фрукт, "яблоко") фрукт: = insert.tree (фрукт, "персик") print.tree (фрукт) ! распечатать в отсортированном порядке! Конец программы S-algol обозначается знаком? ?
Семантические принципы

Судя по названию, S-algol является членом семейства языков программирования ALGOL. Моррисон выделяет пять характеристик семейства АЛГОЛОВ:

  1. Правила области действия и структура блока - могут быть введены имена для определения локальных величин, которые не определены за пределами локальной среды, но в разных средах одно и то же имя может использоваться однозначно для представляют различные объекты.
  2. Средство абстракции - Обеспечение мощного средства абстракции для сокращения и пояснения программ. В семействе ALGOL это предлагается процедурами с параметрами.
  3. Проверка типов во время компиляции - Типы могут быть проверены с помощью статического анализа программа.
  4. Бесконечное хранилище - Программист не несет ответственности за распределение хранилища и может создавать столько объектов данных, сколько необходимо.
  5. Выборочное обновление хранилища - Программа может выборочно изменять хранилище. В семействе ALGOL это осуществляется с помощью оператора присваивания ..

S-algol был разработан, чтобы отличаться от предшествующих членов семейства ALGOL тем, что он был разработан в соответствии с семантическими принципами, чтобы обеспечить мощь за счет простоты и простоту за счет большей общности. (См. Ортогональный.) Моррисон описывает три семантических принципа, которыми руководствовался дизайн S-algol:

  1. Принцип соответствия - правила, управляющие именами, должны быть единообразными и применяться везде. В основном это касается соответствия между объявлениями и параметрами процедуры, включая рассмотрение всех режимов передачи параметров. Этот принцип был исследован Р. Д. Теннентом совместно с Паскалем, и его корни в работе Питера Ландина и Кристофера Стрэчи.
  2. Принцип абстракции - должно быть возможно абстрактное по всем значимым семантическим категориям в языке. Примеры включают функцию, которая представляет собой абстракцию по выражениям, и процедуру, абстракцию по операторам. Теннент и Моррисон отмечают, что этот принцип трудно применить, потому что трудно определить семантически значимые конструкции, которые следует абстрагировать.
  3. Принцип полноты типа данных - все типы данных должны иметь одинаковые права на языке, и его следует разрешить в общих операциях, таких как присваивание или передача в качестве параметра. (См. первоклассный гражданин.)

Моррисон также выделяет еще одно основное соображение при проектировании:

  1. Концептуальное хранилище - ключевые проектные решения, касающиеся магазина (управление памятью ), включают то, как оно используется., его связь с типами данных, реализация указателей и защита (константа местоположения, которые не могут быть обновлены).
Дизайн

Тезис Моррисона объясняет, как принципы проектирования были применены в S-алгоритме.

Типы данных

Базовыми или примитивными типами данных в S-алгоритме являются целочисленные, вещественные, логические, файловые и строка. (Позднее пиксель и типы изображений были добавлены для поддержки растровой графики.) Целое число, вещественное и логическое - это типы, общие для большинства языков программирования. Тип файла - это ввод / вывод (I / O) stream, который позволяет записывать или читать объекты данных. Строковый тип во многих языках в то время считался составным типом, но включая его как родной type упрощает использование основных операций конкатенации, выбора подстроки, длины и сравнений (равно, меньше и т. д.). Это намного приятнее, чем массивы символов, используемые в Паскале.

Векторы снабжены компонентами любого типа. Для любого типа данных T, *Tявляется типом вектора с компонентами типа T. Границы вектора не являются частью его типа, но определяются динамически, а многомерные массивы реализуются как векторы векторов.

Структура типа данных содержит любое фиксированное количество полей фиксированного типа каждое. Класс структуры не является частью типа, но может быть определен динамически.

замыкание базовых типов над векторами и структурами обеспечивает бесконечное количество типов данных. Определение языка позволяет использовать любой тип везде, где он допустим. Это не относится к инфиксным операторам, поскольку они являются синтаксическим сахаром для общих функций и не являются частью семантической модели.

Хранилище

Векторы и структуры имеют полные права и могут быть назначены как переданные в качестве параметров, но копирование при назначении и при передаче может быть неэффективным для больших объектов. Векторы и структуры рассматриваются как указатели на объекты, а указатели назначаются и передаются как параметры. Указатели как сами общие объекты, как в АЛГОЛ 68 и C, отклоняются для S-алгоритма из-за опасений C.A.R. Хоар о нулевом указателе и проблемах с висячими указателями.

S-algol предоставляет истинные постоянные значения, объекты, значение которых не может быть обновлено. Эта идея принадлежит Стрэчи, но константы во многих языках, таких как Паскаль, являются константами-манифестами, обрабатываются во время компиляции и не реализованы как защищенные расположения. Также должна существовать возможность объявления констант любого типа данных, а не только скалярных типов.

Управляющие структуры

S-algol - это язык, ориентированный на выражения, а операторы - это выражения типа void. Как следствие, некоторые управляющие структуры являются выражениями, которые дают значения.

Существует несколько условных конструкций. Двуальтернативная версия условного выражения - if , затем else , где предложения могут быть операторами или выражениями. Если это выражения, они должны иметь один и тот же тип. Одноручное условное выражение if do имеет тип void. Использование doвместо elseв условном операторе позволяет избежать синтаксической двусмысленности dangling else.

Предложение caseимеет селектор любого типа, который сопоставляется с помощью проверки на равенство с выражениями того же типа, чтобы найти выбранное предложение. Предложение case может быть оператором или выражением, поэтому все предложения результатов должны быть операторами (тип void) или выражениями одного типа. Соответствия проверяются по порядку, поэтому это похоже на защищенные команды из Эдсгар Дейкстра без недетерминированности.

Операторы цикла в основном обычные. Цикл дляаналогичен циклу Хоара. Идентификатор элемента управления является постоянным и не может быть изменен внутри цикла. Также общепринятыми являются циклы while do и repeat while . Конструкция repeat while do обеспечивает ранний выход или «n-с половиной» цикл.

Абстракции

S -algol абстрагирует выражения как функции и операторы (пустые выражения) как процедуры. Модули обеспечат абстракцию объявлений, но S-algol не включает модули из-за трудностей, которые они создают с блочно-структурированной областью видимости. Последняя синтаксическая категория - это секвенсор или управляющая структура. Теннент использовал термин «продолжение» для абстракции над секвенсорами, это были бы обобщения goto и break. Самая известная абстракция в этой категории - вызов-с-текущим-продолжением, но она будет хорошо понятна лишь через несколько лет. S-algol не включает goto или break и не включает абстракцию над секвенсорами.

Объявления и параметры

Каждому объекту данных в S-algol должно быть присвоено значение при его объявлении. Это соответствует вызову по передаче параметра значения и исключает возможность использования неинициализированного значения. Фактически вызов по значению - это единственный метод передачи параметров в S-algol. Параметры ссылки и результата отклоняются, что соответствует запрету S-алгоритма на передачу l-значений. Структуры и векторы передаются как указатели на объекты, но это по-прежнему вызывается по значению, поскольку поведение такое же, как и значение, используемое в правой части присваиваний.

Каждое объявление имеет параметрический эквивалент. Необходимо указать все типы параметров процедуры. Для любой процедуры, переданной в качестве параметра, указывается ее полный тип (в отличие от Паскаля), и то же самое верно для класса структуры.

Модель ввода-вывода

S-algol предоставляет Тип данных fileдля потоков ввода-вывода и несколько вариантов readи writeопределены для работы с основными типами. Ожидается, что отдельные реализации будут расширять эти простые возможности по мере необходимости.

Конкретный синтаксис

Языки АЛГОЛ критикуются как многословные. S-algol пытается улучшить это, обеспечивая менее ограничительный синтаксис. В основном это демонстрируется в синтаксисе объявления. Поскольку объявления переменных всегда должны включать начальное значение, тип не нужно указывать явно.

Хотя можно было бы вывести параметры процедуры и возвращаемые типы, изучив, где вызывается процедура, S-algol делает требуется указать параметры и возвращаемые типы. Это практическое решение, так как должно быть возможно понять процедуру без изучения ее вызовов.

Большинство АЛГОЛОВ требуют, чтобы все объявления располагались перед операторами в блоке. В S-algol объявления могут быть смешаны с операторами, потому что все должно быть объявлено до того, как оно будет использовано, и нет goto, который позволял бы пропустить объявление.

См. Также
Ссылки
Внешние ссылки
Последняя правка сделана 2021-06-06 02:11:23
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте