ПОП-2 - POP-2
Эта статья включает в себя список общих Рекомендации, но он остается в основном непроверенным, потому что ему не хватает соответствующих встроенные цитаты.Апрель 2010 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
ПОП-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.
Смотрите также
Рекомендации
- Burstall, R .; Collins, J .; Popplestone, R. (1968). Программирование в Pop-2. Эдинбург: Издательство Эдинбургского университета.
- Дэвис, Д.Дж.М. (1976). «Руководство пользователя ПОП-10». Отчет по информатике (25).
- Smith, R .; Сломан, А .; Гибсон, Дж. (1992). «Поддержка двухуровневой виртуальной машины POPLOG для интерактивных языков». В Д. Слиман и Н. Бернсен (ред.). Направления исследований в когнитивной науке. 5: Искусственный интеллект. Лоуренс Эрлбаум Ассошиэйтс. С. 203–231.
- Ссылки POP
внешняя ссылка
- Раннее развитие POP
- Компьютеры и мысль: практическое введение в искусственный интеллект
- Введение в язык программирования POP-2, авторы П. М. Берстолл и Дж. С. Коллинз. Справочное руководство по POP-2, П. М. Берстолл и Дж. С. Коллинз.
Рекомендации
- ^ [1]
- ^ Справочное руководство по POP-2, стр. 217, и Введение в изучение языков программирования, Дэвид Уильям Бэррон, стр. 75