gpt4 book ai didi

tcl - 您如何在 tclsh(或其他方式)中查看 tcl 字节码

转载 作者:行者123 更新时间:2023-12-04 20:17:17 25 4
gpt4 key购买 nike

我已经看过理论并理解为什么第一个比第二个快的解释,但我想看看 tcl 中的字节码。在 python shell 中,很容易看到字节码,但我很难找到在 tclsh 中查看它的解决方案。

#first approach
expr {3 * 4}
#second approach
expr 3 * 4

如有任何帮助,我们将不胜感激。

最佳答案

要查看 Tcl 生成的字节码,请使用 tcl::unsupported::disassemble(假设您有 Tcl 8.5 或更高版本)。这是您的示例:

% tcl::unsupported::disassemble script {expr {3 * 4}}
ByteCode 0x0x103058910, refCt 1, epoch 95, interp 0x0x100829a10 (epoch 95)
Source "expr {3 * 4}"
Cmds 1, src 12, inst 3, litObjs 1, aux 0, stkDepth 1, code/src 0.00
Commands 1:
1: pc 0-1, src 0-11
Command 1: "expr {3 * 4}"
(0) push1 0 # "12"
(2) done

% tcl::unsupported::disassemble script {expr 3 * 4}
ByteCode 0x0x1030b2f10, refCt 1, epoch 95, interp 0x0x100829a10 (epoch 95)
Source "expr 3 * 4"
Cmds 1, src 10, inst 14, litObjs 4, aux 0, stkDepth 5, code/src 0.00
Commands 1:
1: pc 0-12, src 0-9
Command 1: "expr 3 * 4"
(0) push1 0 # "3"
(2) push1 1 # " "
(4) push1 2 # "*"
(6) push1 1 # " "
(8) push1 3 # "4"
(10) concat1 5
(12) exprStk
(13) done

如您所见,在一种情况下,Tcl 发现它有一个编译时常量并使用它,而在另一种情况下,它正在构建一个表达式并将其触发到运行时表达式引擎中(通过 exprStk ,我可以告诉你递归地调用编译器,在这种情况下是一个全新的对象,因此不会最终缓存任何东西,而且会很昂贵。

您可以反汇编其他东西,特别是 proc(用于过程)、lambda(用于 apply 术语)和 method(针对 TclOO 方法;此方法需要 Tcl 8.6)。


在 Tcl 8.4 及更早版本中,可以让反汇编程序打印出来。您只需将全局 tcl_traceCompile 变量设置为 2 — 如果 Tcl 库是使用正确的配置选项构建的,--enable-symbols=all是最有用的变体——然后强制编译代码;反汇编(相同格式)直接打印到真正的控制台。但这是一种糟糕的方式; 8.5 准确地在所有构建中添加了命令版本,以摆脱与全局变量的可怕困惑。 (还有 tcl_traceExec……)

8.6.3 也将有另一个反汇编器,它产生适合进一步脚本编写的输出。

关于tcl - 您如何在 tclsh(或其他方式)中查看 tcl 字节码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26165303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com