为了加速脚本的执行,Tcl引入了字节码(ByteCode)。
ByteCode实际上像是一种汇编指令。通过把Tcl脚本源代码转换为字节码,Tcl解释器不再需要频繁调用命令对应的函数,而是执行一条条的指令。
Tcl 8.5开始引入了命令tcl::unsupported::disassemble
可以用来观察代码编译成字节码之后的结果。
下面的例子可以大致说明其用法和输出结果。
proc t-append {s} { append s "abc" append s2 "def$s" append [set s2] "hij" } tcl::unsupported::disassemble proc t-append ByteCode 0x02E58658, refCt 1, epoch 3, interp 0x009B40F8 (epoch 3) Source "\n append s \"abc\" \n append s2 \"def$s\" \n append [set s" Cmds 4, src 64, inst 38, litObjs 3, aux 0, stkDepth 2, code/src 0.00 Proc 0x02E76898, refCt 1, args 1, compiled locals 2 slot 0, scalar, arg, "s" slot 1, scalar, "s2" Commands 4: 1: pc 0-4, src 3-17 2: pc 5-22, src 21-38 3: pc 23-36, src 42-62 4: pc 32-33, src 50-55 Command 1: "append s \"abc\" " (0) push1 0 # "abc" (2) appendScalar1 %v0 # var "s" (4) pop Command 2: "append s2 \"def$s\" " (5) startCommand +17 1 # next cmd at pc 22 (14) push1 1 # "def" (16) loadScalar1 %v0 # var "s" (18) concat1 2 (20) appendScalar1 %v1 # var "s2" (22) pop Command 3: "append [set s2] \"hij\"" (23) startCommand +14 2 # next cmd at pc 37, 2 cmds start here Command 4: "set s2" (32) loadScalar1 %v1 # var "s2" (34) push1 2 # "hij" (36) appendStk (37) done
TODO