Как Ruby и Python реализуют их интерактивные консоли?

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

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

  • Как может Python/Ruby, интерактивные консоли (НЕАКТИВНЫЙ, irb) "совместно используют" код? Как код вводится обработанный?

Пример:

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

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

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

8
задан Adam Crossland 15 April 2010 в 22:02
поделиться

3 ответа

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

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

3
ответ дан 5 December 2019 в 17:35
поделиться

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

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

4
ответ дан 5 December 2019 в 17:35
поделиться

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

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

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

3
ответ дан 5 December 2019 в 17:35
поделиться