星期六, 1月 06, 2007

[小玩具] 使用ShedSkin轉換python成為C++

http://shed-skin.blogspot.com/

Shed Skin 是國外一套還在發展中的python->C++的編譯器
雖然目前的完成度不高(應該可以說幾乎還完全在實驗性的情況)
不過在現階段仍然可以利用python取代某些需要手寫C/C++語言
來獲得速度/執行檔空間縮小的情形

1. install shedskin (extract tarball and install its dependency)

2. get inside directory , and copy ss to your bin path

3. ss yourpyfile

4. make yourpyfile

到此就算完成了

5. ldd yourpyfile
linux-gate.so.1 => (0xffffe000)
libgc.so.1 => /usr/lib/libgc.so.1 (0xb7f69000)
libstdc++.so.6 => /usr/lib/gcc/i686-pc-linux-gnu
/4.1.1/libstdc++.so.6 (0xb7e8f000)
libm.so.6 => /lib/libm.so.6 (0xb7e6a000)
libgcc_s.so.1 =>
/usr/lib/gcc/i686-pc-linux-gnu/4.1.1/libgcc_s.so.1 (0xb7e60000)
libc.so.6 => /lib/libc.so.6 (0xb7d3d000)
libdl.so.2 => /lib/libdl.so.2 (0xb7d39000)
/lib/ld- linux.so.2 (0xb7fbe000)

值得注意的是編譯出來的執行檔會需要兩個dependency
一個是libstdc++ 另一個則是libgc
在大部分系統裡面 可能會沒有libgc.so
在某些更過分的系統裡面(連C++都沒有的環境是存在的 :( )
連libstdc++.so都沒有
不過倒是可以不必用-static 連glibc都一起編進去
我們有辦法只擺脫這兩個dependency
以下就是擺脫的方法:

(follows are how we get rid of libgc libgcc_s and libstdc++.so )
(warn: your C++ code can't use dynamic feature )
(see

http://www.trilithium.com/johan/2005/06/static-libstdc/ for more info)

6. ln -s `g++ -print-file-name=libstdc++.a`

7. ss yourpyfile.py

8. edit Makefile
replace top 5 lines to (warn: replace tmp/shedskin- 0.0.16 to your
shedskin directory)
CC=g++
CCFLAGS= -static-libgcc -O3 -L . -I/tmp/shedskin- 0.0.16/lib -L
/usr/lib/libgc.a
LFLAGS = /usr/lib/libgc.a

9. make yourpyfile

10. ldd yourpyfile
linux-gate.so.1 => (0xffffe000)
libm.so.6 => /lib/libm.so.6 (0xb7f70000)
libc.so.6 => /lib/libc.so.6 (0xb7e4e000)
/lib/ld-linux.so.2 (0xb7fbe000)

現在我們就獲得一個看起來完全像是C原生程式的執行檔囉! (而確實也是)
不包含libstdc++的helloworld類型的程式大約在150k左右
在妳包含了libstdc++之後大概會躍升到850k
所以要依造你所需求的環境自行選擇是否包含囉.

不過在此鄭重說明, 目前ShedSkin發展還在實驗階段
對於python內建模組的支援度是很少的 所以不要想透過ShedSkin撰寫複雜的程式
此外 由於python的語法實在過於動態
因此在寫要能讓ShedSkin翻譯的python程式時
要特別小心一些情形, 例如不要動態轉換型別 以及在container裡置入多種型別等.
否則ShedSkin是沒辦法處理的. (這些官方網站都有寫)

基本上我認為, 以目前Shedskin的發展狀況 只能夠作一些非常簡單的處理而已
(例如檔案或字串處理 不過基本上還是可以取代掉不少Shell在做的工作)
何況大部分不需要速度也不在乎執行檔/記憶體大小的情況則可以用pyinstaller或py2exe就可以讓對方不需要python直譯器也可以執行了.
所以其實真的沒什麼太大用途.
但是如果你真的需要速度 可是因為要處理的東西實在太簡單 又懶的重頭用C/C++ 開始寫
倒是可以先試試看將某部份先用python寫過 透過ShedSkin轉換成C++之後
再修改編譯出來的C++程式碼. (當然程式碼會變的很醜囉... :P)

1 則留言:

hychen 提到...

我第一個想到的用途是拿來叫課堂作業 XD