Цикл чтения-оценки-печати
Эта статья нуждается в дополнительных цитатах для проверки . ( июнь 2015 г. ) |
Цикл чтения-оценки-печати ( REPL ), также называемый интерактивной оболочкой верхнего уровня или языковой оболочкой , представляет собой простую интерактивную среду компьютерного программирования , которая принимает вводимые пользователем данные, выполняет их и возвращает результат пользователю; программа, написанная в среде REPL, выполняется кусочно. [1] Этот термин обычно относится к программным интерфейсам, подобным классической интерактивной среде машины Lisp . Общие примеры включают командной строки оболочки и аналогичные среды для языков программирования , и этот метод очень характерен для языков сценариев . [2]
История [ править ]
В 1964 году выражение READ-EVAL-PRINT было использовано Л. Питером Дойчем и Эдмундом Беркли для реализации Lisp на PDP-1 . [3]
По крайней мере, с 1980-х годов аббревиатуры REP Loop и REPL засвидетельствованы в контексте Scheme . [4] [5]
Обзор [ править ]
В REPL пользователь вводит одно или несколько выражений (а не всю единицу компиляции ), а REPL оценивает их и отображает результаты. [1] Название цикла read-eval-print происходит от названий примитивных функций Lisp, которые реализуют эту функциональность:
- Функция чтения принимает выражение от пользователя и анализирует его в структуру данных в памяти. Например, пользователь может ввести s-выражение
(+ 1 2 3)
, который анализируется в связанный список, содержащий четыре элемента данных. - Функция eval берет эту внутреннюю структуру данных и оценивает ее. В Лиспе вычисление s-выражения, начинающегося с имени функции, означает вызов этой функции для аргументов, составляющих остальную часть выражения. Итак, функция
+
вызывается по аргументам1 2 3
, что дает результат6
. - Функция печати принимает результат, полученный eval , и распечатывает его пользователю. Если это сложное выражение, его можно напечатать красиво, чтобы его было легче понять.
Затем среда разработки возвращается в состояние чтения, создавая цикл, который завершается при закрытии программы.
REPL облегчают исследовательское программирование и отладку , поскольку программист может проверить напечатанный результат, прежде чем решить, какое выражение предоставить для следующего чтения. Цикл чтения-оценки-печати вовлекает программиста чаще, чем классический цикл редактирования-компиляции-запуска-отладки.
Поскольку функция печати выводит данные в том же текстовом формате, который функция чтения использует для ввода, большинство результатов печатаются в форме, которую можно скопировать и вставить обратно в REPL. Однако иногда необходимо напечатать представления элементов, которые нельзя разумно прочитать обратно, например дескриптор сокета или сложный экземпляр класса. В этих случаях должен существовать синтаксис для нечитаемых объектов. В Python это <__module__.class instance>
нотации, а в Common Lisp #<whatever>
форма. REPL CLIM , SLIME и Symbolics Lisp Machine также могут считывать нечитаемые объекты. Для каждого вывода они записывают, какой объект был напечатан. Позже, когда код будет прочитан обратно, объект будет извлечен из печатного вывода.
REPL могут быть созданы для поддержки любого текстового языка. Поддержка REPL для компилируемых языков обычно достигается путем реализации интерпретатора поверх виртуальной машины, который обеспечивает интерфейс для компилятора. Например, начиная с JDK 9, Java включала JShell в качестве интерфейса командной строки для языка. Для различных других языков доступны для загрузки сторонние инструменты, которые обеспечивают аналогичное взаимодействие оболочки с языком.
Использует [ править ]
В качестве оболочки среда REPL позволяет пользователям получать доступ к соответствующим функциям операционной системы, а также предоставляет доступ к возможностям программирования. Наиболее распространенное использование REPL вне оболочек операционной системы — интерактивное прототипирование . [6] Другие области применения включают математические расчеты, создание документов, объединяющих научный анализ (например, IPython ), интерактивное обслуживание программного обеспечения, сравнительный анализ и исследование алгоритмов.
Специфика Лиспа [ править ]
Реализация [ править ]
Минимальное определение:
(define (REPL env)
(print (eval env (read)))
(REPL env) )
где env
представляет собой начальный eval
-условная среда. Также предполагается, что 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) также принимают графический ввод и вывод.
См. также [ править ]
Ссылки [ править ]
- ↑ Перейти обратно: Перейти обратно: а б Гриллмейер, О. (2013). Изучение информатики с помощью Scheme . Тексты для бакалавриата по информатике. Спрингер Нью-Йорк. п. 239. ИСБН 978-1-4757-2937-5 . Проверено 26 июня 2021 г.
Центральным компонентом интерпретатора Scheme является цикл чтения-оценки-печати . Команды считываются, затем оцениваются. Наконец, оцененный результат распечатывается.
- ^ Привет, Тони; Папай, Дюри (2014). Компьютерная вселенная: путешествие через революцию . Издательство Кембриджского университета. п. 76 . ISBN 978-1-316-12322-5 «Основной характеристикой современных языков сценариев является их интерактивность, иногда называемая средой программирования REPL . ... Характеристики простоты использования и немедленного выполнения в среде REPL иногда принимаются за определение языка сценариев».
{{cite book}}
: CS1 maint: постскриптум ( ссылка ) - ^ Л. Питер Дойч; Эдмунд Беркли, Реализация LISP для компьютера PDP-1 (PDF) , стр. 15
- ^ Смит, Джерри Д. (1988). Введение в схему . Энглвуд Клиффс, Нью-Джерси: Прентис Холл. п. 8 . ISBN 978-0-13-496712-7 .
- ^ Хэнсон, Крис (1986). "rep.scm — первоначальная версия MIT-Scheme от 1986 года" . Гитхаб . Проверено 11 июня 2023 г.
- ^ ван Бинсберген, Л. Томас; Верано Мерино, Маурисио; Жанжан, Пьер; ван дер Шторм, Тийс; Коммбаль, Бенуа; Барэ, Оливье (17 ноября 2020 г.). «Принципиальный подход к интерпретаторам REPL». Материалы Международного симпозиума ACM SIGPLAN 2020 года, посвященного новым идеям, новым парадигмам и размышлениям о программировании и программном обеспечении . Нью-Йорк, штат Нью-Йорк, США: ACM. стр. 84–100. дои : 10.1145/3426428.3426917 . ISBN 978-1-4503-8178-9 .
Внешние ссылки [ править ]
- Пол Грэм написал описание реализации REPL в Common Lisp.
- Жоэля Франусика Список онлайн-REP и REPL