Цикл чтения-оценки-печати ( REPL ), также называемый интерактивной оболочкой верхнего уровня или языковой оболочкой , представляет собой простую интерактивную среду компьютерного программирования , которая принимает вводимые пользователем данные, выполняет их и возвращает результат пользователю; программа, написанная в среде REPL, выполняется кусочно. [1] Этот термин обычно относится к программным интерфейсам, похожим на классическую машинную интерактивную среду Lisp . Общие примеры включают оболочки командной строки и аналогичные среды для языков программирования , и этот метод очень характерен для языков сценариев . [2]
В 1964 году выражение READ-EVAL-PRINT было использовано Л. Питером Дойчем и Эдмундом Беркли для реализации Lisp на PDP-1 . [3]
По крайней мере, с 1980-х годов аббревиатуры REP Loop и REPL засвидетельствованы в контексте Scheme . [4] [5]
В REPL пользователь вводит одно или несколько выражений (а не всю единицу компиляции ), а REPL оценивает их и отображает результаты. [1] Название цикла чтение-оценка-печать происходит от названий примитивных функций Лиспа, которые реализуют эту функциональность:
(+ 1 2 3)
, которое преобразуется в связанный список , содержащий четыре элемента данных.+
вызывается по аргументам 1 2 3
и дает результат 6
.Затем среда разработки возвращается в состояние чтения, создавая цикл, который завершается при закрытии программы.
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 ), интерактивное обслуживание программного обеспечения, сравнительный анализ и исследование алгоритмов.
Минимальное определение:
( определить ( окр . REPL ) ( распечатать ( окр. eval ( прочитать ))) ( окр . REPL ) )
где env
представляет собой исходную eval
среду. Также предполагается, что файл env
может быть деструктивно обновлен с помощью eval
.
Типичная функциональность, предоставляемая Lisp REPL, включает в себя:
*
ссылается на последний результат **
и ***
на результаты до него.Центральным компонентом интерпретатора Scheme является цикл чтения-оценки-печати . Команды считываются, затем оцениваются. Наконец, оцененный результат распечатывается.
{{cite book}}
: CS1 maint: постскриптум ( ссылка )