2013-01-31 300 views
4

這是一個奇怪的問題,我搜索了但找不到任何滿意的答案。.tbc to .tcl文件

我有一個編譯的tcl文件,即一個.tbc文件。那麼有沒有辦法將這個.tbc文件轉換回.tcl文件。

我看了here和有人提到關於::tcl_traceCompile,並說這可以用來反彙編.tbc文件。但作爲新手tcl用戶,我不確定這是否可能,或者說更多,如何使用它。

雖然我知道tcl編譯器沒有編譯所有的語句,所以這些語句可以很容易地在.tbc文件中看到,但我們可以從.tbc文件中得到整個tcl

任何評論會很好。

+1

您知道使用.tbc格式的整個目的是停止轉換爲可讀的.tcl文件。這當然不是爲了表現;實際上不使用.tbc格式的速度更快。 (奇怪的,但是是真的!) –

回答

4

不,或者至少不是沒有很多工作;你正在做一些相當費力的事情來防止(TBC格式旨在保護商業代碼免受窺視)。


TBC文件格式是Tcl的字節碼的編碼,通常不會保存; TBC代表T cl B yte C ode。 TBC格式數據僅由一種工具生成,即商業的「Tcl編譯器」(最初由Sun或Scriptics編寫;該工具可以從轉換時間開始計算),這實際上是利用內置編譯器每個Tcl系統都有一些序列化代碼。它也會盡可能多地去除原始源代碼。使用的編碼令人不快;如果可以的話,你想避免編寫自己的裝載器,而是使用tbcload擴展來完成這項工作。

然後,您就需要使用Tcl的的自定義生成禁用一些防禦性的檢查使用它,這樣就可以拆卸與tcl::unsupported::disassemble命令加載的代碼(通常拒絕採取任何除了從tbcload未來);該命令從Tcl 8.5開始就存在。在那之後,你必須將代碼正在做的字節碼拼湊在一起;我不知道有什麼工具可以做到這一點,但字節碼大部分是相當高的水平,因此難以用於小塊代碼。

有沒有關於disassemble的手冊頁;畢竟它是正式的不受支持的!然而,我鏈接的那個wiki頁面應該涵蓋你開始所需的大部分內容。

+0

另外,'tcl_traceCompile'不會有太大幫助,因爲代碼已經被編譯,並且即使啓用了該功能以防止泄露TBC定義代碼的內容,也會進行檢查。 ('tcl_traceExec'稍微有點相關,但實際上沒什麼用處。) –

0

我可以說部分「是」,也有條件。這種情況是,如果原始tcl代碼被寫入命名空間,並且proc被定義在命名空間大括號內。然後,您在tkcon/wish中輸入tbc文件,並使用info procs和namespace命令查看代碼。 Offcourse你需要知道命名空間的名字。但是,也可以找到。