June 17, 2010

透過 libtcc 來擴充 C 語言

在「libacc : Android 2.0 內建的輕量級 C Compiler」一文,筆者提過 Fabrice Bellard 的大作 [OTCC] (Obfuscated Tiny C Compiler),而 OTCC 進一步開發則成為 [TCC] (Tiny C Compiler),這是世上最完整的迷你 C compiler 實做。如同 Fabrice Bellard 的其他作品,TCC 也提供一個驚喜,可參見 TCC 網頁的特徵描述,其中有一項:
    "With libtcc, you can use TCC as a backend for dynamic code generation."
本文就是透過 libtcc,試圖擴展 C 語言,並探討新的應用型態。

在 Ubuntu Linux 上,libtcc 是以 statically-linked library 的形式存在,安裝方式相當便利:
$ sudo apt-get install libtcc-dev
不過還需要 "libtcc1",也就是 TCC runtime library,最簡單的安裝方式就是直接安裝 TCC:
$ sudo apt-get install tcc
到底哪些檔案是必要的呢?先來看看目錄結構:
$ tree /usr/lib/tcc/
/usr/lib/tcc/
├── bcheck.o
├── include
│   ├── float.h
│   ├── stdarg.h
│   ├── stdbool.h
│   ├── stddef.h
│   ├── tcclib.h
│   └── varargs.h
└── libtcc1.a

1 directory, 8 files
可發現,"/usr/lib/tcc/libtcc1.a" 就是 runtime library,會在呼叫 libtcc 時被引入。實務上,可以不必安裝 TCC 套件,只要提供位於 "/usr/lib/tcc/" 目錄的若干檔案即可。張羅了必要的套件後,我們可展開一些實驗。筆者設定的目標是,將之前的 [qsort 與 shellcode] 程式範例,用 libtcc 適度改寫,使其成為架構在 C 語言上的 Lambda expression 實現。在我們設定的目標中,基本概念是動態時做出「匿名函式」(anonymous function) 的機制,,也就是建立特別的 function object 以供後續操作,不過因為 C 語言可直接操作記憶體與堆疊。動手寫個程式吧 (lambda-in-c.c):
編譯方式如下:
$ gcc -o lambda-in-c lambda-in-c.c -ltcc -ldl
執行驗證看看:
$ ./lambda-in-c 
1 2 3 4 5 6 7 8 9 10 
--- done ---
看來透過 libtcc 動態編譯的 "lambda" 函式實做,被帶入 qsort() 函式,並正確執行,確認其標榜的 "use TCC as a backend for dynamic code generation" 功能。那麼,如此的機制到底有什麼實務上的價值?當然不是為了動態編譯而編譯的,事實上,Mesa/3D 函式庫很早就透過 libtcc,進行動態編譯,進而產生某些特定的機械碼。可參考 XORG-6_8_0_.tar.gz 裡面的 xc/extras/Mesa/src/mesa/swrast/s_tcc.c 檔案,這是為了輔助同目錄下的 s_fragprog_to_c 檔案,以下引用其註解:
    An amusing little utility to print ARB fragment programs out as a C function. Resulting code not tested except visually.
在程式碼可見到,Mesa 動態輸出若干 Texture samplers,libtcc 給予開發者很大的彈性,能用 C 語言來作動態建立 texture 處理函式的實做。另外還有 SQL Stored Procedures,依據其定義就是:
    A stored procedure is a group of Transact-SQL statements compiled into a single execution plan.
在 MySQL 的處理中,也可透過 libtcc,詳情可參考這兩篇精彩的文章: 為何我們該搞懂進階的 Compiler 技術?為了技術突破!試想,SQL 有 Stored procedures;OpenGL 2.0 有 GLSL;JavaScript 有一堆 engine, ... 這些背後的技術,都直接與 compiler 有關,希望筆者也能持續分享探討這些美妙的技術。
由 jserv 發表於 June 17, 2010 2:05 AM
迴響
發表迴響









記住我的資訊?