Ruby和Python如何实现它们的交互式控制台?

8
实现我编程语言的解释器时,我一开始想到了一个简单的控制台窗口,允许用户输入一些代码,然后作为 shell 程序执行。
但是存在严重问题:如果用户输入的每行代码都被处理为独立的程序,则必须通过标记器和解析器进行处理,然后由解释器执行 - 那函数怎么办呢?
Python/Ruby 交互式控制台(IDLE、irb)如何“共享”代码?输入的代码是如何处理的?
例如:
>> def x:
>>  print("Blah")
>> 
>> x()

这个函数存储在哪里,以便随时再次调用?

交互式控制台如何将所有输入的内容显然地作为一个程序而不是一遍又一遍地执行所有内容?

3个回答

4
对于Python来说,一个表达式只有在所有括号、方括号等匹配之后才算完整。这很容易检测到。一个函数/类定义只有在输入完全空白的一行之后才算完成。编译器然后编译输入的表达式或定义,并运行它。
与普通函数、类、模块等类似,REPL有它自己的本地作用域。正是这个作用域用于变量和定义输入到REPL中。

3
你可以通过阅读code模块的文档来了解Python交互式控制台的更多信息:

code模块提供了在Python中实现读取-求值-打印循环的功能。它包括两个类和方便函数,可用于构建提供交互式解释器提示的应用程序。

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


3
大多数编程语言都使用一种类似于“token流”的解析器——也就是说,解析器从输入流中获取标记(字符串、符号、运算符等),直到它获得完整的表达式,然后返回已解析的表达式,这些表达式可能会被编译成字节码或以其他方式执行。在这种结构下,处理REPL循环相对简单,因为解析器基本上会请求更多的输入,你只需要给用户一个提示,并让用户输入更多的内容即可。你可能需要一些来自解析器到读取器的通信,以便使其呈现像连续提示之类的东西。
Python和Ruby都会立即按顺序执行语句(函数声明是一条语句)。因此,您可以在解释器中逐个语句地执行代码,效果与源文件中的效果基本相同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接