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

如何在tclsh(或其他)中查看tcl字节码,tcl,bytecode,Tcl,Bytecode,我已经看到了理论,理解了为什么第一个比第二个快的解释,但我想看看tcl中的字节码。在pythonshell中,很容易看到字节码,但是我很难找到在tclsh中查看字节码的解决方案 #first approach expr {3 * 4} #second approach expr 3 * 4 任何帮助都将不胜感激。若要查看Tcl生成的字节码,请使用Tcl::unsupported::discomble(假设您拥有Tcl 8.5或更高版本)。以下是您的示例: % tcl::unsupported:

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

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

任何帮助都将不胜感激。

若要查看Tcl生成的字节码,请使用
Tcl::unsupported::discomble
(假设您拥有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方法;这一个需要tcl8.6)


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


8.6.3还将有另一个反汇编程序,它生成适合于进一步编写脚本的输出。

您确定正确吗?第二个反汇编程序实际上比第二个快,快得多。您可能需要阅读“对不起,错序了”。Updated Better:)可能会有所帮助?该命令不受支持。格式可能随时更改,恕不另行通知。(但从8.0开始,输出格式实际上没有改变。)啊……非常感谢。假设字节码表示在这些简单的情况下从8.4->8.5没有太大变化。标题的含义是什么?主要对inst、litObjs和堆栈操作感兴趣,但对src和code/src也很好奇。再次感谢