6

这是一个奇怪的问题,我搜索但找不到任何令人满意的答案。

我有一个编译tcl文件,即一个.tbc文件。那么有没有办法将此.tbc文件转换回.tcl文件。

我在这里读到有人提到::tcl_traceCompile并说这可以用来反汇编.tbc文件。但是作为一个新手 tcl 用户,我不确定这是否可能,或者说更多,如何准确地使用它。

虽然我知道 tcl 编译器不会编译所有语句,因此这些语句可以很容易地在文件中看到,但我们可以从文件.tbc中获取整个语句。tcl.tbc

任何评论都会很棒。

4

2 回答 2

5

不,或者至少不是没有大量工作;您正在做一些努力来防止的事情(TBC 格式旨在保护商业代码不被窥探)。


TBC文件格式是Tcl的字节码的一种编码,一般情况下根本不保存;TBC代表T cl字节代码。TBC 格式数据仅由一种工具生成,即商业“Tcl 编译器”(最初由 Sun 或 Scriptics 编写;该工具的日期大约是过渡时期),它实际上是利用内置编译器,每个 Tcl 系统都有一些序列化代码。它还尽可能多地剥离原始源代码。使用的编码令人不快;如果可以的话,你想避免编写自己的加载器,而是使用扩展来完成工作。tbcload

然后,您需要将它与 Tcl 的自定义构建一起使用,该构建禁用一些防御性检查,以便您可以使用tcl::unsupported::disassemble命令反汇编加载的代码(通常拒绝分解来自 的任何内容tbcload);该命令从 Tcl 8.5 开始存在。之后,您必须从字节码中拼凑出代码在做什么;我根本不知道有任何工具可以做到这一点,但字节码大多是相当高级的,所以对于小段代码来说并不太难。

没有手册页disassemble;毕竟它是正式不受支持的!但是,我链接到的那个 wiki 页面应该涵盖了您入门所需的大部分内容。

于 2013-01-31T22:34:26.507 回答
0

我可以部分地说“是”,也可以有条件地说。该条件是如果原始 tcl 代码是在命名空间中编写的,并且过程是在命名空间花括号中定义的。然后您在 tkcon/wish 中获取 tbc 文件并使用 info procs 和命名空间命令查看代码。当然,您需要知道命名空间名称。不过也能找到。

于 2015-11-19T09:14:53.083 回答