Введение
Язык программирования S algol (St Andrews Algol). Технический отчет, определяющий язык, The S algol Reference Manual (1979, 1988), выражает благодарность нескольким людям за помощь, в том числе Дэвиду Тернеру за обсуждения вопросов проектирования языка примерно в 1975 году. В 1981 году в учебнике по компьютерным наукам Recursive Descent Compiling описывается реализация компилятора и процесс начальной загрузки, а в 1982 году книга An Introduction to Programming with S algol использует этот язык для обучения основам программирования. Первая реализация S algol была выполнена на компьютере PDP 11/40 под управлением операционной системы Unix и поддерживалась изобретателем языка Pascal, Никлаусом Виртом. Учитывая организацию памяти PDP 11, состоящую из 32K 16-битных слов, кодировка инструкций S-кода была разработана таким образом, чтобы каждый байт-код занимал одно слово.
S algol (St Andrews Algol) The technical report defining the language, The S algol Reference Manual (1979, 1988), thanks several people for their help, including David Turner for discussions on language design around 1975. The 1981 computer science text Recursive Descent Compiling describes the compiler implementation and bootstrapping process, and the 1982 book An Introduction to Programming with S algol uses the language to teach computer programming. The first S algol implementation was on a PDP 11/40 computer running the Unix operating system. and championed by the inventor of Pascal, Niklaus Wirth. Reflecting the memory organization of the PDP 11 as 32K 16 bit words, the S code instruction encoding was designed so that each bytecode consisted of one word.
Обзор языков
Программа S algol представляет собой последовательность объявлений и операторов. Объявляемые языковые элементы включают константы, переменные, процедуры и структуры. Объявления констант и переменных должны содержать начальное значение. Компилятор определяет тип данных объявленной константы или переменной на основе типа начального значения, поэтому тип не указывается явно. Типы данных включают целые числа, вещественные, логические, строки, указатели (на структуру) и файлы, а также векторы (массивы) этих типов. Объявления процедур указывают типы данных их аргументов и возвращаемое значение (если оно не пустое). Структуры также указывают типы данных их полей. Операторы включают выражения и структуры управления (if, case, for, while и repeat while). Структуры управления if и case могут иметь значения и могут свободно использоваться в выражениях при соблюдении правил совместимости типов. Эта языковая конструкция восходит к работам Питера Лэндина и Кристофера Стречи. Принцип абстракции – в языке должна быть возможность абстрагироваться над всеми значимыми семантическими категориями. Примеры включают функцию, являющуюся абстракцией над выражениями, и процедуру, являющуюся абстракцией над операторами. Теннент и Моррисон отмечают, что применение этого принципа затруднено, поскольку сложно определить семантически значимые конструкции, которые следует абстрагировать, а также проблемы с висячими указателями. Идентификатор управления является константой и не может быть изменен внутри цикла. Также распространены циклы while <условие> do <оператор> и repeat <оператор> while <условие>. Конструкция repeat <оператор> while <условие> обеспечивает ранний выход из цикла или цикл типа "n и половина".
Абстракции
S algol абстрагирует выражения как функции, а операторы (пустые выражения) – как процедуры. Модули обеспечивали бы абстрагирование объявлений, но S algol не включает модули из-за сложностей, которые они создают в отношении блочной структурированной области видимости. Последняя синтаксическая категория – это секвенсор, или структура управления. Теннент использовал термин "sequel" для обозначения абстракции над секвенсорами, которые представляли собой обобщения операторов `goto` и `break`. Наиболее известной абстракцией в этой категории является вызов с текущим продолжением, но она не получила широкого признания в течение нескольких лет. S algol не включает операторы `goto` или `break`, и не включает абстракцию над секвенсорами.
Декларации и параметры
Каждому объекту данных в S algol необходимо присвоить значение при объявлении. Это соответствует передаче параметров по значению и исключает возможность использования неинициализированной переменной. Фактически, передача по значению – единственный способ передачи параметров в S algol. Передача по ссылке и возврат результата отклоняются, что согласуется с запретом S algol на передачу l-значений. Структуры и векторы передаются как указатели на объекты, но это все равно является передачей по значению, поскольку поведение эквивалентно использованию значения в правой части присваивания. Каждое объявление имеет параметрический эквивалент. Необходимо указывать все типы параметров процедуры. Любая процедура, передаваемая в качестве параметра, имеет полностью определенный тип (в отличие от Pascal), и то же самое верно для класса структур.
Модель ввода-вывода
S algol предоставляет файловый тип данных для потоков ввода-вывода, и определены различные варианты операций чтения и записи для работы с базовыми типами. Предполагается, что конкретные реализации будут расширять эти базовые возможности по мере необходимости.
Конкретный синтаксис
Языки семейства ALGOL критикуют за многословность. S algol стремится исправить это, предоставляя менее строгий синтаксис. Это проявляется главным образом в синтаксисе объявления переменных. Поскольку объявления переменных всегда должны включать начальное значение, тип не требуется указывать явно. Хотя теоретически можно было бы определять типы параметров и возвращаемых значений процедуры, анализируя места её вызова, S algol требует явного указания типов параметров и возвращаемых значений. Это практичное решение, позволяющее понять процедуру, не изучая места её вызова. В большинстве языков ALGOL все объявления должны предшествовать операторам в блоке. В S algol объявления могут чередоваться с операторами, поскольку всё должно быть объявлено до использования, и отсутствует оператор goto, позволяющий переходить после объявления.