在tinycolinux上編譯pypy和hippyvm
本文關鍵字:在tinycolinux上編譯pypy和hippyvm,pypy上的php,hippyvm on rpython, hippyvm vs phalanger
在《發布wordpress on .net》時我們談到clr上的php實現,即phalanger,在《pypy:一種新的DSL框架》中我們說到pypy才是真正的vmlangsys allinone,因為它走JIT,使來自原生c語言的擴展變得不再必要。在PYPY上就能實現效率和生態全包,這才是不拖泥帶水最正統的VM編程語言體系,比CLR,JVM正統多了:就如同彙編之後進入os編程的時代C是作為高一階語言生成機器碼彙編的一樣,在新時代VM和腳本時代的混合語言中py與c即是這樣的關係,把這個自動化過程做進語言系統的pypy即是這樣的大語言思維方案。
在那裡我們還提到,比起clr,jvm,它也具有多語言前端和統一後端,實際上這個統一後端是統一工具(這裡並沒有一個像CLR一樣的統一後端),把rpy當工具set,把其它語言當前端,我們可以在rpy工具鏈上實現多種語言,且帶來更多更好的新功效:比如在《pypy:一種新的DSL框架》末尾我們提到它可以促成py與js的混編,在後端使用PY生成瀏覽器中中的JS。
實際上該如何理解py和rpy的關係?rpy是工具,也是語言(靜態py子集),它與py共同作用,py+rpy是作為元語言系統來生成其它語言系統的,py又是這個關係中rpy的metaprogramming lang(實際上就是rpy受py調用而已,相當於terralang中的lua+terra,只不過它們是非C的且兼容的PY語法版本。),因為這二者使用基本一樣的語法。所以使發明新語言的過程變得簡單,可以使用PY+RPY生成多種前端(雖然多種語言其實地位是平等的,但用於產生新語言時,還是用傾向於用PY,因為它是RPY上的主語言,類CLR上的主C#)。而用它們來生成PYPY時,就等同於說,PY生成了自己(假設我們用cpy+rpython生成pypy,這個pypy跟cpy是兼容的)。整個過程rpython只是工具,並不影響我們得到一個原生的pypy。即生成得到的pypy是最終jitted to c的,其實跟cpy是一樣的c based python實現性能上一點不差還較Cpy快。一般說pypy就是pypy實現+rpy工具鏈。源碼和生成結果都是這樣。接下來會看到。
而pypy上也是有php實現的,作為例子,我們來介紹pypy的編譯,順便介紹其上多語言 - 一個PHP實現hippyvm。hippyvm也是PyHyp的一部分,PyHyp is a composition of PyPy and HippyVM., a single file can contain multiple fragments of PHP and Python code,當然我們本文主要講編譯,並不會過多涉及到混編的內容。
我的環境是tinycolinux+cpy2.7.14+gcc481+php561
準備工作
由於編譯過程會使用到大量內存,官方說大約2.5G內存時間上大約總是會用1.5個小時以上,我使用的是1G雲主機,只能時間換空間了,先開啟3G交換文件內存,但實測在使用交換文件1.5G左右,編譯進程會很慢,形似卡住,實際上也卡住了。換成4G內存的雲主機照樣開啟3G交換內存,才最終通過編譯,/tmp下生成的臨時文件倒是不大,畢竟,預處理多久都可以,但是會因為內存少而卡住,這個就不能接受了.
按如下在tinycolinux上開啟交換內存:
sudo dd if=/dev/zero of=/swapfile bs=1024k count=3072 創建大小為3g交換文件
sudo mkswap /swapfile
臨時開啟:sudo swapon /swapfile
或者做到/etc/fstab中:/swapfile none swap defaults 0 0
除了bootstrap py,編譯過程中會用到php-cli,我們分別用這樣的參數來編譯,記得下載對應缺失的4.x tcz pkgs然後重啟生效:
cd Python-2.7.14 && sudo ./configure && sudo make && sudo make install
(以上需expat2,bzip2,libffi,ssl,curses這幾個事先安好重啟)
cd php-5.6.31 && sudo ./configure --enable-fpm --enable-zip --enable-mbstring --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-zlib --with-gd --with-curl --with-jpeg-dir=/usr/local CFLAGS=-D_FILE_OFFSET_BITS=64 CXXFLAGS=-D_FILE_OFFSET_BITS=64 --enable-opcache --with-openssl -with-openssl-dir=/usr/local/include/openssl && sudo make && sudo make install
(jpeg6在4.x tcz mirror中無對應tcz,需要自行下載jpeg-6b源碼以--enable-static --enable-shared configure並編譯出,因為hippy編譯中會用到php,py的bin和lib,默認在/usr/local下,圖方便所以不需加--prefix參數)
添加py支持:cpython:get-pip.py,pycparse,hippyvm src/requires.txt中的東西
然後準備hippy的源碼,github/hippyvm/hippyvm,按readme.md檢出https://bitbucket.org/pypy/pypy/,形成可用的源碼結構,我這裡是2018.2.15左右都是最新的源碼。注意這裡都選取默認branch,不要檢出我們上面提到的PyHyp相關的brands,即https://github.com/hippyvm/hippyvm/pypy_bridge,按其readme.md,它對應的pypy在bitbuket的bitbucket.org/softdevteam/pypy-hippy-bridge/,它使用的是它修改了的pypy源碼,這個修改的pypybridge也需要修改的bridge的hippyvm/pypy_bridge.
因為不支持prefix且默認是就地生成,所以把整個源碼目錄移到/usr/local/hippy,處理一下源碼,把targetthispy.py移到hippy src根下,然後將hippy目錄中的hippy也移到src root中。將goal/targetpypystandalone.py也移到src root下,這樣就基本準備妥當了
編譯
其實未編譯就能運行,稱為untranslated,非jit版本。是cpython邏輯,就跟rpy一樣,這個比普通的cpy還慢。直接python ./bin或pypyinteractive.py就可以了,而我們要得到的是-Ojit的版本
源碼目錄中那個rpython就是工具鏈,在源碼中rpy雖然是源碼形式,但一直也是可立即待用的工具。,你可以把rpy想像成一堆py工具,用cpy或pypy執行它,會產生C的本地代碼(translated),這跟C項目通過makefile產生exe是一個道理只不過這是py的構建系統。且這裡是產生編譯器和語言套件。
而lib_py,lib_pypy,就是pypy生成後支持的額外平台模塊,lib_py是純py的,lib_pypy是pypy支持的獨有模塊
好了,先構建pypy。
cd /usr/local/hippy
sudo python ./rpython/bin/rpython --continuation -Ojit targetpypystandalone.py
漫長編譯過程結束後(期間因為經常會出錯,重新編譯不會續編,所以上面 --continuation),最後結束,看到可以分為幾個步驟,
annotate,rtype,pyjitpl,backendopt,stackcheckinsertion,database,source,compile,build_cffi
2核4G內存+3G交換內存下,除了pyjitpl和stackcheckinsertion用了約半小時,其它都是十分鐘之內,耗時最大的是stackcheckinsertion,
編譯好的pypy可以刪除rpy,但是最好還是保留,因為根本就不大,接下來會看到。因為更能清希化:pypy就是pypy實現+rpy的事實。
如果不開啟jit即不帶-Ojit,那麼編譯好後的pypy實際上就是一個普通pypy解釋器,就跟上面untranlated的cpy直接運行一樣(非C,且未帶jit)甚至更慢。至於rpy,你是在開頭和結尾都不必由用戶涉及的,只在編譯pypy的過程中出現(作為工具鏈控制產生過程和目標pypy解釋器選型),只對採用rpy來發明新語言的用戶有意義。
然後用高速的pypy還構建hippy,這個pypy-c就是translated版本且with jit的pypy
sudo pypy-c ./rpython/bin/rpython --continuation -Ojit targetthispy.py
完工,同樣是jit的新語言-php!
--------
當然目前這個hippyvm是很初級的,wordpress都運行不了,未來把OC移殖其上,當pypy源碼中集成了php或其它語言前端,其實它也完全可當成語言的裁剪器如busybox
TAG:shaolonglee公號 |