Как Ruby и Python реализуют свои интерактивные консоли? - PullRequest
8 голосов
/ 16 апреля 2010

При реализации интерпретатора для моего языка программирования я сначала подумал о простом консольном окне, которое позволяет пользователю вводить некоторый код, который затем выполняется как отдельная программа в качестве оболочки.

Но есть серьезные проблемы: если каждая строка кода, которую вводит пользователь, обрабатывается как отдельная программа, она должна проходить через токенизатор и анализатор и затем просто выполняться интерпретатором - что тогда с функциями?

  • Каким образом интерактивные консоли Python / Ruby (IDLE, irb) могут «делиться» кодом? Как обрабатывается введенный код?

Пример:

>> def x:
>>  print("Blah")
>> 
>> x()

Где хранится функция, чтобы ее можно было снова вызывать в любое время?

Как интерактивная консоль может воспринимать все введенное как единую программу, не выполняя все снова и снова?

Ответы [ 3 ]

4 голосов
/ 16 апреля 2010

Для Python выражение не является полным, пока не будут совпадать все скобки, скобки и т. Д. Это довольно легко обнаружить. Определение функции / класса не завершено, пока не будет введена полностью пустая строка. Затем компилятор компилирует введенное выражение или определение и запускает его.

Как и обычная функция, класс, модуль и т. Д., REPL имеет свою локальную область видимости. Именно эта область используется для переменных и определений, введенных в REPL.

3 голосов
/ 16 апреля 2010

В большинстве этих языков используется синтаксический анализатор, который имеет своего рода «поток токенов», то есть анализатор продолжает извлекать токены (строку, символ, оператор и т. Д.) Из входного потока до тех пор, пока он не получит полное выражение, затем он возвращает это проанализированное выражение, где оно может быть скомпилировано в байт-код или выполнено иным образом. Цикл REPL относительно прост в обращении, учитывая эту структуру, так как синтаксический анализатор в основном запрашивает больше ввода, и вы даете пользователю подсказку, и пользователь вводит больше ввода. Вам может потребоваться немного связи от анализатора до читателя, чтобы он отображал такие вещи, как запросы на продолжение.

Python и Ruby оба выполняют операторы сразу, по порядку (объявление функции - это один оператор). Таким образом, вы можете выполнять код за оператором в интерпретаторе, чтобы получить практически тот же эффект, что и в исходном файле.

3 голосов
/ 16 апреля 2010

Подробнее об интерактивной консоли Python можно узнать, прочитав документацию для модуля кода:

Модуль кода предоставляет средства для реализации циклов read-eval-print в Python. Включены два класса и вспомогательные функции, которые можно использовать для создания приложений, предоставляющих интерактивный запрос интерпретатора.

http://docs.python.org/library/code.html

...