ПОП-2 - POP-2

ПОП-2 (также называемый POP2) это язык программирования разработан примерно в 1970 году на основе более раннего языка POP-1 (разработанный Робином Попплстоуном в 1968 году, первоначально названный КОУСЕЛЬ ) к Робин Попплстоун и Род Берстолл на Эдинбургский университет.[1] Он получил корни из многих источников: языков LISP и АЛГОЛ 60, и теоретические идеи из Питер Дж. Ландин. Он использовал инкрементный компилятор, что дало ему некоторую гибкость интерпретируемый язык, включая разрешение новых определений функций во время выполнения и изменение определений функций во время работы программы (оба из которых являются особенностями динамическая компиляция ), без накладных расходов на интерпретируемый язык.

Описание

Куча

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

а: = 3;

один написал

3 -> а;

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

3;

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

-> а;

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

f (x, y, z);

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

х, у, z; f ();

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

х, у, z.f;

или же

(x, y, z) .f;

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

если a> b, то c -> e, иначе d -> e close;

и

если a> b, то c иначе d закрыть -> e;

были эквивалентны (обратите внимание на использование Закрыть, в качестве endif еще не изобрели).

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

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

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

3 -> а (4);

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

средство обновления (а) (3, 4);

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

Функции

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

функция max x y; если x> y, то x else y close end;

и

vars max; лямбда x y; если x> y, то x else y close end -> max;

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

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

функция poly2 x a b c; а * х * х + б * х + с конец;

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

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

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

меньше1квадрат (3)

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

поли2 (3, 1, -2, 1)

т.е.

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

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

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

vars operation 3 + *; лямбда x y; x * x + y * y конец -> nonop + *

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

История

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

В середине 1970-х годов ПОП-2 был перенесен на БЭСМ-6 (Система POPLAN).

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

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

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

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

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

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

  • ПОП-11 язык программирования
  • Поплог среда программирования

Рекомендации

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

внешняя ссылка

Рекомендации

  1. ^ [1]
  2. ^ Справочное руководство по POP-2, стр. 217, и Введение в изучение языков программирования, Дэвид Уильям Бэррон, стр. 75