Цикл чтение–оценка–печать

Среда компьютерного программирования

Цикл чтения-вычисления-печати ( REPL ), также называемый интерактивной оболочкой верхнего уровня или языковой оболочкой , представляет собой простую интерактивную среду программирования компьютера , которая принимает отдельные входные данные пользователя, выполняет их и возвращает результат пользователю; программа, написанная в среде REPL, выполняется по частям. [1] Термин обычно относится к программным интерфейсам, похожим на классическую интерактивную среду машины Lisp . Распространенными примерами являются оболочки командной строки и аналогичные среды для языков программирования , а эта техника очень характерна для языков сценариев . [2]

История

В 1964 году выражение цикл READ-EVAL-PRINT было использовано Л. Питером Дойчем и Эдмундом Беркли для реализации Lisp на PDP-1 . [3] Всего месяц спустя Project Mac опубликовал отчет Джозефа Вайценбаума (создателя ELIZA , первого в мире чат-бота), описывающий язык на основе REPL, названный OPL-1, реализованный на его языке Fortran-SLIP на совместимой системе разделения времени (CTSS) . [4] [5] [6]

В справочном руководстве Maclisp 1974 года Дэвида А. Муна на странице 89 упоминается «цикл чтения-оценки-печати», но аббревиатура REPL не используется. [7]

По крайней мере с 1980-х годов аббревиатуры REP Loop и REPL засвидетельствованы в контексте Схемы . [8] [9]

Обзор

В REPL пользователь вводит одно или несколько выражений (а не целый блок компиляции ), а REPL оценивает их и отображает результаты. [1] Название цикла read–eval–print происходит от названий примитивных функций Lisp, которые реализуют эту функциональность:

  • Функция чтения принимает выражение от пользователя и анализирует его в структуру данных в памяти. Например, пользователь может ввести s-выражение (+ 1 2 3) , которое анализируется в связанный список, содержащий четыре элемента данных.
  • Функция eval берет эту внутреннюю структуру данных и оценивает ее. В Lisp оценка s-выражения, начинающегося с имени функции, означает вызов этой функции для аргументов, составляющих остальную часть выражения. Таким образом, функция +вызывается для аргументов 1 2 3, возвращая результат 6.
  • Функция print берет результат, полученный от eval , и выводит его пользователю. Если это сложное выражение, оно может быть красиво напечатано , чтобы его было легче понять.

Затем среда разработки возвращается в состояние чтения, создавая цикл, который завершается при закрытии программы.

REPL облегчают исследовательское программирование и отладку , поскольку программист может проверить напечатанный результат, прежде чем решить, какое выражение предоставить для следующего чтения. Цикл чтение-вычисление-печать вовлекает программиста чаще, чем классический цикл редактирование-компиляция-запуск-отладка.

Поскольку функция print выводит данные в том же текстовом формате, который функция read использует для ввода, большинство результатов выводится в форме, которую можно скопировать и вставить обратно в REPL. Однако иногда необходимо вывести представления элементов, которые не могут быть разумно прочитаны обратно, например, дескриптор сокета или сложный экземпляр класса. В этих случаях должен существовать синтаксис для нечитаемых объектов. В Python это нотация <__module__.class instance>, а в Common Lisp — #<whatever>форма. REPL CLIM , SLIME и Symbolics Lisp Machine также могут считывать нечитаемые объекты. Они записывают для каждого вывода, какой объект был напечатан. Позже, когда код будет считан обратно, объект будет извлечен из напечатанного вывода.

REPL могут быть созданы для поддержки любого текстового языка. Поддержка REPL для компилируемых языков обычно достигается путем реализации интерпретатора поверх виртуальной машины, которая предоставляет интерфейс для компилятора. Например, начиная с JDK 9, Java включила JShell в качестве интерфейса командной строки для языка. Различные другие языки имеют сторонние инструменты, доступные для загрузки, которые обеспечивают аналогичное взаимодействие оболочки с языком.

Использует

Как оболочка , среда REPL позволяет пользователям получать доступ к соответствующим функциям операционной системы в дополнение к предоставлению доступа к возможностям программирования. Наиболее распространенное использование REPL вне оболочек операционной системы — интерактивное прототипирование . [10] Другие области применения включают математические вычисления, создание документов, интегрирующих научный анализ (например, IPython ), интерактивное обслуживание программного обеспечения, бенчмаркинг и исследование алгоритмов.

Специфика Lisp

Выполнение

Минимальное определение:

( определить ( REPL env ) ( распечатать ( eval env ( прочитать ))) ( REPL env ) )         

где envпредставляет начальную evalсреду -uation. Также предполагается, что envможет быть деструктивно обновлено eval.

Функциональность

Типичные функциональные возможности, предоставляемые Lisp REPL, включают:

  • История входов и выходов.
  • Переменные задаются для входных выражений и результатов. Эти переменные также доступны в REPL. Например, в Common Lisp *ссылается на последний результат **и ***на результаты до него.
  • Уровни REPL. Во многих системах Lisp, если во время чтения, оценки или печати выражения возникает ошибка, система не возвращается на верхний уровень с сообщением об ошибке. Вместо этого в контексте ошибки запускается новый REPL, на один уровень глубже. Затем пользователь может изучить проблему, исправить ее и продолжить — если это возможно. Если в таком отладочном REPL возникает ошибка, запускается другой REPL, снова на уровень глубже. Часто REPL предлагает специальные отладочные команды.
  • Обработка ошибок . REPL обеспечивает перезапуски. Эти перезапуски могут использоваться при возникновении ошибки для возврата на определенный уровень REPL.
  • Чувствительный к мыши ввод и вывод объектов данных.
  • Редактирование входных данных и контекстно-зависимое дополнение символов, путей, имен классов и других объектов.
  • Справка и документация по командам.
  • Переменные для управления считывателем. Например, переменная *read-base* управляет тем, в какой базе числа считываются по умолчанию.
  • Переменные для управления принтером. Пример: максимальная длина или максимальная глубина выражений для печати.
  • Дополнительный синтаксис команды. Некоторые REPL имеют команды, которые не следуют синтаксису s-выражения, но часто работают с данными Lisp в качестве аргументов.
  • Графические REPL. Некоторые REPL Lisp (примером является CLIM Listener) также принимают графический ввод и вывод.

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

Ссылки

  1. ^ ab Grillmeyer, O. (2013). Exploring Computer Science with Scheme. Бакалаврские тексты по Computer Science. Springer New York. стр. 239. ISBN 978-1-4757-2937-5. Получено 2021-06-26 . Центральным компонентом интерпретатора Scheme является цикл read-eval-print . Команды считываются, затем оцениваются. Наконец, распечатывается оцененный результат.
  2. ^ Эй, Тони; Папай, Дьюри (2014). Вычислительная вселенная: путешествие через революцию . Cambridge University Press. стр. 76. ISBN 978-1-316-12322-5, «Основной характеристикой современных языков сценариев является их интерактивность, иногда называемая средой программирования REPL . ... Такие характеристики, как простота использования и немедленное выполнение в среде REPL, иногда принимаются за определение языка сценариев».{{cite book}}: CS1 maint: постскриптум ( ссылка )
  3. ^ Л. Питер Дойч; Эдмунд Беркли, Реализация LISP для компьютера PDP-1 (PDF) , стр. 15
  4. ^ Джозеф Вайценбаум, OPL-I: ОТКРЫТАЯ СИСТЕМА ПРОГРАММИРОВАНИЯ В CTSS
  5. ^ Оба эти проекта, вероятно, были реализованы в 1963 году, задолго до появления соответствующих публикаций. Однако точные даты изобретения установить невозможно.
  6. ^ Между Lisp и SLIP существует сложная и интересная связь, поскольку оба являются одноименными «языками обработки списков», изобретенными учеными, связанными с Массачусетским технологическим институтом: ELIZA переосмыслена: первый в мире чат-бот вообще не был задуман как чат-бот
  7. Дэвид А. Мун (8 апреля 1974 г.), Справочное руководство MACLISP (PDF) , стр. 89
  8. ^ Смит, Джерри Д. (1988). Введение в Scheme. Энглвуд Клиффс, Нью-Джерси: Prentice Hall. стр. 8. ISBN 978-0-13-496712-7.
  9. ^ Хансон, Крис (1986). "rep.scm — Первоначальная редакция MIT-Scheme 1986 года". GitHub . Получено 11 июня 2023 г.
  10. ^ ван Бинсберген, Л. Томас; Верано Мерино, Маурисио; Жанжан, Пьер; ван дер Сторм, Тийс; Комбемейл, Бенуа; Бараис, Оливье (17.11.2020). «Принципиальный подход к интерпретаторам REPL». Труды Международного симпозиума ACM SIGPLAN 2020 года по новым идеям, новым парадигмам и размышлениям о программировании и программном обеспечении . Нью-Йорк, штат Нью-Йорк, США: ACM. стр. 84–100. doi :10.1145/3426428.3426917. ISBN 978-1-4503-8178-9.
  • Пол Грэм написал описание реализации REPL на Common Lisp.
  • Joël Franusic Online-REPs-и-REPLs список
Взято с "https://en.wikipedia.org/w/index.php?title=Read–eval–print_loop&oldid=1254543414"