ПОП-2 - POP-2

POP2 (называемый также POP2 ) является языком программирования , разработанный в 1970 году из ранее языка POP-1 (разработано Робином Попплстон в 1968 году, первоначально названный COWSEL ) по Робиному Попплстону и Род Burstall в Университете Эдинбурга . Он получил корни из многих источников: языков LISP и ALGOL 60 , а также теоретических идей Питера Дж. Ландина . Он использовал инкрементный компилятор , который давал ему некоторую гибкость интерпретируемого языка , включая возможность определения новых функций во время выполнения и изменения определений функций во время работы программы (оба из которых являются функциями динамической компиляции ) без накладных расходов. интерпретируемого языка.

Описание

Куча

Синтаксис POP-2 был похож на Алгол, за исключением того, что присваивания были наоборот: вместо написания

a  := 3;

один написал

3 -> a;

Причина этого заключалась в том, что в языке было явное понятие стека операндов ; таким образом, предыдущее присвоение можно было бы записать как два отдельных оператора:

3;

который оценил значение 3 и оставил его в стеке, и

-> a;

который извлекает верхнее значение из стека и присваивает его переменной 'a'. Аналогично вызов функции

f(x, y, z);

можно было бы записать как

x, y, z; f();

(запятые и точки с запятой в основном взаимозаменяемы) или даже

x, y, z.f;

или

(x, y, z).f;

Из-за парадигмы, основанной на стеке, не было необходимости различать операторы и выражения ; таким образом, две конструкции

if a > b then
       c -> e
   else
       d -> e
   close;

а также

if a > b then
       c
   else
       d
   close -> e;

были эквивалентны (обратите внимание на использование close, поскольку endifеще не стало общепринятой нотацией конца-если-клауса).

Массивы и дублетные функции

Не существовало специальных языковых конструкций для создания массивов или структур записей, как они обычно понимаются: вместо этого они были созданы с помощью специальных встроенных функций, например newarray (для массивов, которые могут содержать любой тип элементов) и newanyarray для создания ограниченных типов. пунктов.

Таким образом, средства доступа к элементу массива и полю записи были просто частными случаями функции дублета : это была функция, к которой в качестве средства обновления была присоединена другая функция , которая вызывалась на принимающей стороне присваивания. Таким образом, если переменная aсодержала массив, то

3 -> a(4);

был эквивалентен

updater(a)(3, 4);

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

Функции

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

function max x y; if x > y then x else y close end;

а также

vars max;
   lambda x y; if x > y then x else y close end -> max;

были эквивалентны.

Интересной операцией над функциями было частичное применение (иногда называемое « каррированием »). При частичном применении некоторое количество крайних правых аргументов функции (которые будут последними, помещенные в стек перед вызовом функции вовлекается) были заморожены до заданных значений, чтобы произвести новую функцию меньшего числа аргументов, что является закрытие из оригинальная функция. Например, рассмотрим функцию для вычисления общих многочленов второй степени:

function poly2 x a b c; a * x * x + b * x + c end;

Это может быть связано, например, как

vars less1squared;
   poly2(% 1, -2, 1%) -> less1squared;

так что выражение

less1squared(3)

применяет замыкание poly2 с тремя замороженными аргументами к аргументу 3, возвращая квадрат (3 - 1), который равен 4. Применение частично примененной функции вызывает замороженные значения (в данном случае 1, -2, 1 ) для добавления к тому, что уже находится в стеке (в данном случае 3), после чего вызывается исходная функция poly2. Затем он использует четыре верхних элемента в стеке, давая тот же результат, что и

poly2(3, 1, -2, 1)

т.е.

1*3*3 + (-2)*3 + 1

Определение оператора

В POP-2 появилась возможность определять новые операции (операторы в современных терминах).

vars operation 3 +*;
    lambda x y; x * x + y * y end -> nonop +*

Первая строка объявляет новую операцию + * с приоритетом (приоритетом) 3. Вторая строка создает функцию f (x, y) = x * x + y * y и присваивает ее вновь объявленной операции + *.

История

Первоначальная версия POP-2 была реализована на компьютере Elliott 4130 в Эдинбургском университете (только с 64 КБ ОЗУ, удвоенное до 128 КБ в 1972 году).

В середине 1970-х POP-2 был перенесен на BESM -6 (POPLAN System).

Более поздние версии были реализованы для серий CTL Modular One, PDP-10 , ICL 1900 (под управлением операционной системы George). Джулиан Дэвис из Эдинбурга реализовал расширенную версию POP-2, которую он назвал POP-10, на компьютере PDP-10, на котором работает TOPS-10 . Это был первый диалект POP-2, который рассматривал регистр как важный в именах идентификаторов, использовал нижний регистр для большинства системных идентификаторов и поддерживал длинные идентификаторы, содержащие более 8 символов.

Вскоре после этого новая реализация, известная как WPOP (от WonderPop), была реализована Робертом Рэй и Алланом Рамзи в Эдинбурге в рамках проекта, финансируемого исследовательским советом. Эта версия представила клеточные адресные пространства, некоторую синтаксическую типизацию во время компиляции (например, для целых и действительных чисел), а также некоторые конструкции сопоставления с образцом для использования с различными структурами данных.

Параллельно с этим Стив Харди из Университета Сассекса реализовал подмножество POP-2, которое он назвал POP-11, который работал на компьютере DEC PDP-11/40. Первоначально он был разработан для работы в операционной системе DEC RSX-11D в режиме разделения времени для обучения, но это вызвало так много проблем, что вместо него была установлена ​​и использовалась ранняя версия Unix . Эта версия Pop-11 была написана на ассемблере Unix, и код постепенно компилировался в промежуточный байтовый код, который интерпретировался. Этот порт был завершен примерно в 1976 году, и в результате Pop-11 использовался в нескольких местах для обучения. Для поддержки обучающей функции были изменены многие синтаксические особенности POP-2, например, была заменена функция ... end на define ... enddefine и добавлено более широкое разнообразие конструкций цикла с закрывающими скобками, чтобы соответствовать их открывающим скобкам вместо использование закрытия для всех петель в ПОП-2. Pop-11 также представил средство сопоставления шаблонов для структур списков, что значительно упростило обучение программированию ИИ.

Примерно в 1980 году Pop-11 был перенесен на компьютер VAX-11/780 Стивом Харди и Джоном Гибсоном, и вскоре после этого он был заменен полным инкрементным компилятором (производящим машинный код вместо интерпретируемого промежуточного кода). Существование компилятора и всех его подпрограмм во время выполнения позволило поддерживать гораздо более богатые языковые расширения, чем это было возможно с помощью макросов, и в результате Pop-11 был использован (Стив Харди, Крис Меллиш и Джон Гибсон) для создания реализация Пролога с использованием стандартного синтаксиса Пролога и объединенная система стала известна как Poplog , к которому позже были добавлены Common Lisp и Standard ML . Эта версия была позже перенесена на различные машины и операционные системы, и в результате Pop-11 стал доминирующим диалектом POP-2, все еще доступным в системе Poplog.

Примерно в 1986 году новая компания Cognitive Applications Ltd., занимающаяся ИИ, в сотрудничестве с членами университета Сассекса разработала вариант Pop-11 под названием AlphaPop, работающий на компьютерах Apple Mac со встроенной графикой. Это использовалось для ряда коммерческих проектов, а также для обучения программированию ИИ в нескольких университетах. Тот факт, что он был реализован на раннем диалекте C с использованием своеобразного компилятора, очень усложнял поддержку и обновление до новых версий операционной системы Mac. Вдобавок к этому AlphaPop не был «32-битным чистым» из-за использования старших битов адреса в качестве «битов тегов» для обозначения типа объектов, что было несовместимо с использованием памяти более 8 МБ на более поздних Macintosh.

Смотрите также

  • Язык программирования POP-11
  • Среда программирования Poplog

использованная литература

  • Burstall, R .; Collins, J .; Popplestone, R. (1968). Программирование в Pop-2 . Эдинбург: Издательство Эдинбургского университета.
  • Дэвис, DJM (1976). «Руководство пользователя ПОП-10». Отчет по информатике (25).
  • Smith, R .; Сломан, А .; Гибсон, Дж. (1992). «Поддержка двухуровневой виртуальной машины POPLOG для интерактивных языков». В Д. Слиман и Н. Бернсен (ред.). Направления исследований в когнитивной науке . 5: Искусственный интеллект. Лоуренс Эрлбаум Ассошиэйтс. С. 203–231.
  • Ссылки POP

внешние ссылки

использованная литература