溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在tinycolinux上編譯pypy和hippyvm

發(fā)布時(shí)間:2021-07-27 18:41:06 來(lái)源:億速云 閱讀:165 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要講解了“如何在tinycolinux上編譯pypy和hippyvm”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“如何在tinycolinux上編譯pypy和hippyvm”吧!

在《發(fā)布wordpress on .net》時(shí)我們談到clr上的php實(shí)現(xiàn),即phalanger,在《pypy:一種新的DSL框架》中我們說(shuō)到pypy才是真正的vmlangsys allinone,因?yàn)樗逬IT,使來(lái)自原生c語(yǔ)言的擴(kuò)展變得不再必要。在PYPY上就能實(shí)現(xiàn)效率和生態(tài)全包,這才是不拖泥帶水最正統(tǒng)的VM編程語(yǔ)言體系,比CLR,JVM正統(tǒng)多了:就如同匯編之后進(jìn)入os編程的時(shí)代C是作為高一階語(yǔ)言生成機(jī)器碼匯編的一樣,在新時(shí)代VM和腳本時(shí)代的混合語(yǔ)言中py與c即是這樣的關(guān)系,把這個(gè)自動(dòng)化過(guò)程做進(jìn)語(yǔ)言系統(tǒng)的pypy即是這樣的大語(yǔ)言思維方案。

在那里我們還提到,比起clr,jvm,它也具有多語(yǔ)言前端和統(tǒng)一后端,實(shí)際上這個(gè)統(tǒng)一后端是統(tǒng)一工具(這里并沒(méi)有一個(gè)像CLR一樣的統(tǒng)一后端),把rpy當(dāng)工具set,把其它語(yǔ)言當(dāng)前端,我們可以在rpy工具鏈上實(shí)現(xiàn)多種語(yǔ)言,且?guī)?lái)更多更好的新功效:比如在《pypy:一種新的DSL框架》末尾我們提到它可以促成py與js的混編,在后端使用PY生成瀏覽器中中的JS。

實(shí)際上該如何理解py和rpy的關(guān)系?rpy是工具,也是語(yǔ)言(靜態(tài)py子集),它與py共同作用,py+rpy是作為元語(yǔ)言系統(tǒng)來(lái)生成其它語(yǔ)言系統(tǒng)的,py又是這個(gè)關(guān)系中rpy的metaprogramming lang(實(shí)際上就是rpy受py調(diào)用而已,相當(dāng)于terralang中的lua+terra,只不過(guò)它們是非C的且兼容的PY語(yǔ)法版本。),因?yàn)檫@二者使用基本一樣的語(yǔ)法。所以使發(fā)明新語(yǔ)言的過(guò)程變得簡(jiǎn)單,可以使用PY+RPY生成多種前端(雖然多種語(yǔ)言其實(shí)地位是平等的,但用于產(chǎn)生新語(yǔ)言時(shí),還是用傾向于用PY,因?yàn)樗荝PY上的主語(yǔ)言,類CLR上的主C#)。而用它們來(lái)生成PYPY時(shí),就等同于說(shuō),PY生成了自己(假設(shè)我們用cpy+rpython生成pypy,這個(gè)pypy跟cpy是兼容的)。整個(gè)過(guò)程rpython只是工具,并不影響我們得到一個(gè)原生的pypy。即生成得到的pypy是最終jitted to c的,其實(shí)跟cpy是一樣的c based python實(shí)現(xiàn)性能上一點(diǎn)不差還較Cpy快。一般說(shuō)pypy就是pypy實(shí)現(xiàn)+rpy工具鏈。源碼和生成結(jié)果都是這樣。接下來(lái)會(huì)看到。

而pypy上也是有php實(shí)現(xiàn)的,作為例子,我們來(lái)介紹pypy的編譯,順便介紹其上多語(yǔ)言 - 一個(gè)PHP實(shí)現(xiàn)hippyvm。hippyvm也是PyHyp的一部分,PyHyp is a composition of PyPy and HippyVM., a single file can contain multiple fragments of PHP and Python code,當(dāng)然我們本文主要講編譯,并不會(huì)過(guò)多涉及到混編的內(nèi)容。

我的環(huán)境是tinycolinux+cpy2.7.14+gcc481+php561

準(zhǔn)備工作

由于編譯過(guò)程會(huì)使用到大量?jī)?nèi)存,官方說(shuō)大約2.5G內(nèi)存時(shí)間上大約總是會(huì)用1.5個(gè)小時(shí)以上,我使用的是1G云主機(jī),只能時(shí)間換空間了,先開(kāi)啟3G交換文件內(nèi)存,但實(shí)測(cè)在使用交換文件1.5G左右,編譯進(jìn)程會(huì)很慢,形似卡住,實(shí)際上也卡住了。換成4G內(nèi)存的云主機(jī)照樣開(kāi)啟3G交換內(nèi)存,才最終通過(guò)編譯,/tmp下生成的臨時(shí)文件倒是不大,畢竟,預(yù)處理多久都可以,但是會(huì)因?yàn)閮?nèi)存少而卡住,這個(gè)就不能接受了.

按如下在tinycolinux上開(kāi)啟交換內(nèi)存:

sudo dd if=/dev/zero of=/swapfile bs=1024k count=3072 創(chuàng)建大小為3g交換文件
sudo mkswap /swapfile

臨時(shí)開(kāi)啟:sudo swapon /swapfile

或者做到/etc/fstab中:/swapfile none swap defaults 0 0

除了bootstrap py,編譯過(guò)程中會(huì)用到php-cli,我們分別用這樣的參數(shù)來(lái)編譯,記得下載對(duì)應(yīng)缺失的4.x tcz pkgs然后重啟生效:

cd Python-2.7.14 && sudo ./configure && sudo make && sudo make install

(以上需expat2,bzip2,libffi,ssl,curses這幾個(gè)事先安好重啟)

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中無(wú)對(duì)應(yīng)tcz,需要自行下載jpeg-6b源碼以--enable-static --enable-shared configure并編譯出,因?yàn)閔ippy編譯中會(huì)用到php,py的bin和lib,默認(rèn)在/usr/local下,圖方便所以不需加--prefix參數(shù))

添加py支持:cpython:get-pip.py,pycparse,hippyvm src/requires.txt中的東西

然后準(zhǔn)備hippy的源碼,github/hippyvm/hippyvm,按readme.md檢出https://bitbucket.org/pypy/pypy/,形成可用的源碼結(jié)構(gòu),我這里是2018.2.15左右都是最新的源碼。注意這里都選取默認(rèn)branch,不要檢出我們上面提到的PyHyp相關(guān)的brands,即https://github.com/hippyvm/hippyvm/pypy_bridge,按其readme.md,它對(duì)應(yīng)的pypy在bitbuket的bitbucket.org/softdevteam/pypy-hippy-bridge/,它使用的是它修改了的pypy源碼,這個(gè)修改的pypybridge也需要修改的bridge的hippyvm/pypy_bridge.

因?yàn)椴恢С謕refix且默認(rèn)是就地生成,所以把整個(gè)源碼目錄移到/usr/local/hippy,處理一下源碼,把targetthispy.py移到hippy src根下,然后將hippy目錄中的hippy也移到src root中。將goal/targetpypystandalone.py也移到src root下,這樣就基本準(zhǔn)備妥當(dāng)了

編譯

其實(shí)未編譯就能運(yùn)行,稱為untranslated,非jit版本。是cpython邏輯,就跟rpy一樣,這個(gè)比普通的cpy還慢。直接python ./bin或pypyinteractive.py就可以了,而我們要得到的是-Ojit的版本

源碼目錄中那個(gè)rpython就是工具鏈,在源碼中rpy雖然是源碼形式,但一直也是可立即待用的工具。,你可以把rpy想象成一堆py工具,用cpy或pypy執(zhí)行它,會(huì)產(chǎn)生C的本地代碼(translated),這跟C項(xiàng)目通過(guò)makefile產(chǎn)生exe是一個(gè)道理只不過(guò)這是py的構(gòu)建系統(tǒng)。且這里是產(chǎn)生編譯器和語(yǔ)言套件。

而lib_py,lib_pypy,就是pypy生成后支持的額外平臺(tái)模塊,lib_py是純py的,lib_pypy是pypy支持的獨(dú)有模塊

好了,先構(gòu)建pypy。

cd /usr/local/hippy

sudo python ./rpython/bin/rpython --continuation -Ojit targetpypystandalone.py

漫長(zhǎng)編譯過(guò)程結(jié)束后(期間因?yàn)榻?jīng)常會(huì)出錯(cuò),重新編譯不會(huì)續(xù)編,所以上面 --continuation),最后結(jié)束,看到可以分為幾個(gè)步驟,

annotate,rtype,pyjitpl,backendopt,stackcheckinsertion,database,source,compile,build_cffi

2核4G內(nèi)存+3G交換內(nèi)存下,除了pyjitpl和stackcheckinsertion用了約半小時(shí),其它都是十分鐘之內(nèi),耗時(shí)最大的是stackcheckinsertion,

編譯好的pypy可以刪除rpy,但是最好還是保留,因?yàn)楦揪筒淮螅酉聛?lái)會(huì)看到。因?yàn)楦芮逑;簆ypy就是pypy實(shí)現(xiàn)+rpy的事實(shí)。

如果不開(kāi)啟jit即不帶-Ojit,那么編譯好后的pypy實(shí)際上就是一個(gè)普通pypy解釋器,就跟上面untranlated的cpy直接運(yùn)行一樣(非C,且未帶jit)甚至更慢。至于rpy,你是在開(kāi)頭和結(jié)尾都不必由用戶涉及的,只在編譯pypy的過(guò)程中出現(xiàn)(作為工具鏈控制產(chǎn)生過(guò)程和目標(biāo)pypy解釋器選型),只對(duì)采用rpy來(lái)發(fā)明新語(yǔ)言的用戶有意義。

然后用高速的pypy還構(gòu)建hippy,這個(gè)pypy-c就是translated版本且with jit的pypy

sudo pypy-c ./rpython/bin/rpython --continuation -Ojit targetthispy.py

感謝各位的閱讀,以上就是“如何在tinycolinux上編譯pypy和hippyvm”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)如何在tinycolinux上編譯pypy和hippyvm這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI