【问题标题】:How do Ruby and Python implement their interactive consoles?Ruby 和 Python 如何实现它们的交互式控制台?
【发布时间】:2011-02-08 14:33:03
【问题描述】:

在为我的编程语言实现解释器时,我首先想到了一个简单的控制台窗口,它允许用户输入一些代码,然后作为 shell 的独立程序执行。

但是有一个严重的问题:如果用户输入的每一行代码都作为一个独立的程序处理,它必须经过分词器和解析器,然后才被解释器执行——那么函数呢?

  • Python/Ruby 交互式控制台(IDLE、irb)如何“共享”代码?输入的代码如何处理?

例子:

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

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

交互式控制台如何在不一遍又一遍地执行所有内容的情况下将输入的所有内容视为一个程序?

【问题讨论】:

    标签: python ruby interpreter command-line-interface interactive


    【解决方案1】:

    这些语言中的大多数使用具有一种“令牌流”的解析器——也就是说,解析器不断从输入流中获取令牌(字符串、符号、运算符等),直到它具有完整的表达式,然后它返回解析后的表达式,在那里它可能被编译为字节码或以其他方式执行。考虑到这种结构,REPL 循环处理起来相对简单,因为解析器基本上要求更多输入,并且您给用户一个提示并让用户输入更多输入。您可能需要从解析器与阅读器进行一些沟通,以使其呈现诸如继续提示之类的内容。

    Python 和 Ruby 都立即按顺序执行语句(函数声明就是一个语句)。因此,您可以在解释器中逐语句执行代码,效果与在源文件中大致相同。

    【讨论】:

      【解决方案2】:

      您可以通过阅读代码模块的文档来了解有关 Python 交互式控制台的更多信息:

      代码模块提供了在 Python 中实现 read-eval-print 循环的工具。包括两个类和便利函数,可用于构建提供交互式解释器提示的应用程序。

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

      【讨论】:

        【解决方案3】:

        对于 Python,直到所有括号、方括号等都匹配后,表达式才算完整。这很容易检测到。在输入一个完全空白的行之前,函数/类定义是不完整的。然后编译器编译输入的表达式或定义,并运行它。

        与普通函数、类、模块等很相似,REPL 有自己的本地范围。正是这个作用域用于输入 REPL 的变量和定义。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-06-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-08
          • 2016-07-12
          • 2017-02-11
          相关资源
          最近更新 更多