您好,登錄后才能下訂單哦!
這篇文章主要講解了“如何在tinycolinux上編譯pypy和hippyvm”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何在tinycolinux上編譯pypy和hippyvm”吧!
在《發布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
感謝各位的閱讀,以上就是“如何在tinycolinux上編譯pypy和hippyvm”的內容了,經過本文的學習后,相信大家對如何在tinycolinux上編譯pypy和hippyvm這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。