Ruby和Python是如何实现它们的交互式控制台的?
在我为自己的编程语言实现解释器的时候,我最开始想到的是一个简单的控制台窗口,用户可以在里面输入一些代码,然后这些代码就像一个独立的程序一样被执行。
但是,这里有个大问题:如果用户输入的每一行代码都被当作一个独立的程序来处理,那它就得经过分词器和解析器,然后再由解释器执行——那函数怎么办呢?
- 像Python和Ruby的交互式控制台(比如IDLE和irb)是怎么“共享”代码的?用户输入的代码是怎么处理的?
举个例子:
>> def x:
>> print("Blah")
>>
>> x()
那函数是存在哪里的,以便随时可以调用呢?
交互式控制台是怎么把所有输入的内容当作一个完整的程序,而不是一次又一次地执行每一行代码的呢?
3 个回答
你可以通过阅读代码模块的文档来了解更多关于Python交互式控制台的信息:
代码模块提供了一些工具,可以在Python中实现读-评-打印循环。里面包含了两个类和一些方便的函数,可以用来构建提供交互式解释器提示的应用程序。
大多数编程语言都有一个叫做解析器的东西,它会处理输入的内容,形成一种“标记流”。简单来说,解析器会不断从输入中提取标记(比如字符串、符号、运算符等),直到它收集到一个完整的表达式。然后,它会返回这个解析好的表达式,接下来可能会把它转换成字节码,或者直接执行。REPL循环的处理相对简单,因为解析器基本上会请求更多的输入,而你只需要给用户一个提示,让他们输入更多内容。为了让用户更好地理解,可能需要解析器和用户之间有一些沟通,比如显示继续输入的提示。
Python和Ruby这两种语言会立即执行语句,按照顺序执行(一个函数声明就是一个语句)。所以在解释器中,你可以逐行执行代码,效果和在源文件中几乎是一样的。
在Python中,一个表达式要完整,所有的括号、方括号等都必须配对好。这一点比较容易检查。一个函数或类的定义也要等到输入一个完全空白的行才算完成。然后,编译器会把你输入的表达式或定义编译并运行。
就像普通的函数、类、模块等一样,REPL(交互式解释器)也有自己的局部作用域。这个作用域用来存放你在REPL中输入的变量和定义。