【问题标题】:Tcl bytecode and namespacesTcl 字节码和命名空间
【发布时间】:2017-03-16 09:08:43
【问题描述】:

据我了解,如果调用者的命名空间与原始命名空间不同,则 Tcl 字节码将失效。 到目前为止,一切都很好。 我不完全理解的棘手问题是它如何与 procs 一起工作。

如果我在全局命名空间中有一个 proc,并且我从特定命名空间调用它,那么 proc 的字节码是否会位于全局命名空间的特定命名空间下? 特定命名空间的字节码会因为从不同的命名空间调用proc而失效吗?

如果 proc 位于特定的但与调用者不同的命名空间中,它会改变答案吗?

当我们从不同的 proc 调用 proc 时会发生什么?

当 proc 中的 upvar 1 必须链接到来自不同命名空间的变量时,它是否可以工作?

非常感谢。

【问题讨论】:

    标签: namespaces tcl bytecode


    【解决方案1】:

    从另一个命名空间调用过程不会使该过程的字节码无效。当前命名空间是过程运行时的命名空间,与调用栈帧的命名空间不同。

    使用rename 命令将过程从一个命名空间移动到另一个命名空间——在生产代码中很少见的操作——通常会使字节码失效。 (问题是不同的命名空间可能会将命令名称解析为不同的东西,这可能反过来意味着正确的字节码序列是不同的。)

    TclOO 方法的工作方式不同,尽管我第一段中的事实——一个堆栈帧中的当前命名空间不一定是调用者堆栈帧中的当前命名空间,并且永远不会使字节码无效——继续适用。


    如果您有一个定义了调试选项compile 的Tcl 构建,您可以将特殊的全局tcl_traceCompile 设置为1,以便在每次编译时打印一些调试信息。 (您可以通过将其设置为 2 来获得详细信息,但 tcl::unsupported::disassemble 命令是一种非常 更方便的方式。)这可以帮助您了解编译实际何时完成; Tcl 尽量避免重新编译,即使它的编译器相当快。

    【讨论】:

    • 所以只要我不使用重命名或编译函数,过程字节码和调用方字节码都不应该失效,即使它们有不同的命名空间,对吧?非常感谢。
    • 我肯定希望从一个过程到另一个过程的调用——无论涉及到什么命名空间——来调用编译引擎,除非代码实际上不是在编译之前。您可以通过打开我提到的编译跟踪来确认这一点;它有相当多的开销,因此您不希望在生产代码中使用它,但如果您试图确定在您描述的情况下事情是否按预期发生,它会很有用。更好地询问代码并确保而不是在论坛上询问一些随机的人并得到一个(n受过教育的)猜测。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多