ПОП-2
![]() | Эта статья включает список общих ссылок , но в ней отсутствуют достаточные соответствующие встроенные цитаты . ( Апрель 2010 г. ) |
Парадигма | Мультипарадигмальность : структурированная , рефлексивная , процедурная. |
---|---|
Семья | Лисп : ПОП |
Разработано | Робин Попплстоун ; Род Берстолл , Стив Харди; Роберт Рэй, Аллан Рэмзи |
Разработчики | Эдинбургский университет Университет Сассекса |
Впервые появился | 1970 год |
Стабильная версия | 1975 год
/ 1975 |
Дисциплина набора текста | динамичный |
Язык реализации | сборка |
Платформа | Эллиотт 4130 , ИКТ 1909 , БЭСМ-6 , ПДП-10 , ПДП-11 |
ТЫ | Джордж , TOPS-10 , Unix |
Лицензия | Собственный |
Основные реализации | |
WPOP | |
Диалекты | |
ПОП-10 | |
Под влиянием | |
Lisp , ALGOL 60 , COWSEL (переименованный в POP-1) | |
Под влиянием | |
ПОП-11 |
POP-2 (также называемый POP2 ) — язык программирования , разработанный примерно в 1970 году на основе более раннего языка POP-1 (разработанного Робином Попплстоуном в 1968 году, первоначально называвшегося COWSEL ) Робином Попплстоуном и Родом Берстоллом в Эдинбургском университете . Он черпал корни из многих источников: языков Lisp и ALGOL60 , а также теоретических идей Питера Дж. Ландина . Он использовал инкрементный компилятор , который давал ему некоторую гибкость интерпретируемого языка , включая возможность определения новых функций во время выполнения и модификации определений функций во время работы программы (оба из которых являются функциями динамической компиляции ), без накладных расходов на интерпретируемый язык. [1]
Описание [ править ]
Стек [ править ]
POP-2 Синтаксис аналогичен ALGOL , за исключением того, что назначения выполняются в обратном порядке: вместо записи
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
не стал обычным явлением end-of-if-clause
обозначения еще).
Массивы и дублетные функции [ править ]
Не существует специальных языковых конструкций для создания массивов или структур записи в обычном понимании: вместо этого они создаются с помощью специальных встроенных функций, например, newarray
[2] (для массивов, которые могут содержать элементы любого типа) и newanyarray
[3] для создания ограниченных типов предметов.
Таким образом, средства доступа к элементу массива и полю записи являются просто частными случаями дублетной функции : это функция, к которой в качестве средства обновления прикреплена другая функция , [4] который вызывается на принимающей стороне задания. Таким образом, если переменная 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 появилась возможность определять новые операции (операторов в современном понимании). [5]
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 году). [6]
POP-2 был портирован в серию ICT 1900 в 1909 году в Ланкастерском университете Джоном Скоттом в 1968 году.
В середине 1970-х годов ПОП-2 была портирована на БЭСМ-6 (Система ПОПЛАН).
В 1978 году Хэмиш Дьюар реализовал версию POP-2 специально для использования студентами Эдинбургского университета на уроке AI2 (искусственный интеллект, уровень 2-го курса) с использованием операционной системы EMAS . Эта реализация была написана с нуля на эдинбургском языке программирования IMP . [7]
Более поздние версии были реализованы для Computer Technology Limited (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 , которое работало на компьютере PDP-11/40 Digital Equipment Corporation (DEC). Первоначально он был разработан для работы в операционной системе DEC RSX-11D в режиме с разделением времени для обучения, но это вызвало столько проблем, что вместо него была установлена и использовалась ранняя версия Unix . Эта версия Pop-11 была написана на ассемблере Unix , а код инкрементно компилировался в промежуточный байт-код , который интерпретировался. Этот порт был завершен примерно в 1976 году, и в результате Поп-11 использовался в нескольких местах для обучения. Для поддержки обучающей функции многие синтаксические особенности POP-2 были изменены, например, заменены function ... end
с define ... enddefine
и добавление более широкого разнообразия циклических конструкций с закрывающими скобками, соответствующими открывающим скобкам, вместо использования close
для всех шлейфов в POP-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.
См. также [ править ]
Ссылки [ править ]
- Общий
- Берстолл, Р.; Коллинз, Дж.; Попплстоун, Р. (1968). Программирование в Pop-2 . Эдинбург: Издательство Эдинбургского университета.
- Дэвис, DJM (1976). «Руководство пользователя POP-10». Отчет по информатике (25).
- Смит, Р.; Сломан, А.; Гибсон, Дж. (1992). «Поддержка двухуровневой виртуальной машины POPLOG для интерактивных языков». В Д. Слимане и Н. Бернсене (ред.). Направления исследований в когнитивной науке . Том. 5: Искусственный интеллект. Лоуренс Эрлбаум Ассошиэйтс. стр. 203–231.
- POP-ссылки
- В соответствии
- ^ Берстолл, РМ ; Коллинз, Дж. С.; Попплстоун, Р.Дж. (1968). Документы POP-2 (PDF) . Лондон: Круглый стол.
- ^ Рубинштейн, Марк; Сломан, А. (октябрь 1985 г. - апрель 1989 г.). «Помощь Newarray» . Университет Бирмингема . Проверено 22 марта 2024 г.
- ^ Харди, Стивен; Уильямс, Джон; Сломан, А. (январь 1978 г. - апрель 1986 г.). «Помощь Ньюаньярраю» . Университет Бирмингема . Проверено 22 марта 2024 г.
- ^ Сломан, А. (апрель 1985 г.). «Помощь обновлению» . Университет Бирмингема . Проверено 21 марта 2024 г.
- ^ Справочное руководство POP-2 , стр. 217, и «Введение в изучение языков программирования» Дэвида Уильяма Бэррона, стр. 75.
- ^ Данн, Раймонд Д. (февраль 1970 г.). «Руководство пользователя POP-2/4100» (PDF) . Школа искусственного интеллекта . Эдинбургский университет . Проверено 3 июня 2022 г.
- ^ Дьюар, Хэмиш. «Исходный код EMAS Pop-2» .