在tinycolinux上编译pypy和hippyvm

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 本文关键字:在tinycolinux上编译pypy和hippyvm,pypy上的php,hippyvm on rpython, hippyvm vs phalanger

本文关键字:在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


(此处不设回复,扫码到微信参与留言,或直接点击到原文)

qrcode.png

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
JavaScript 前端开发 Java
11 个最佳的 Python 编译器和解释器
11 个最佳的 Python 编译器和解释器
464 1
|
7月前
|
Rust 编译器 Linux
Rust编译过程讲解与环境准备
目前主流编译平台有,GNU、MSVC、LLVM。因为rustc调用了llvm,因此我们以LLVM为例,我们从C语言的编译过程聊,再对比Rust,看它们的编译过程有何差异。
139 0
|
2月前
|
Rust 监控 编译器
解密 Python 如何调用 Rust 编译生成的动态链接库(一)
解密 Python 如何调用 Rust 编译生成的动态链接库(一)
55 2
|
2月前
|
Rust 安全 Python
解密 Python 如何调用 Rust 编译生成的动态链接库(二)
解密 Python 如何调用 Rust 编译生成的动态链接库(二)
44 1
|
3月前
|
编译器 Linux C语言
编译并运行 Cython 代码的几种方式
编译并运行 Cython 代码的几种方式
77 0
|
4月前
|
自然语言处理 编译器 开发者
|
5月前
|
机器学习/深度学习 人工智能 数据挖掘
Numba是一个Python库,用于对Python代码进行即时(JIT)编译,以便在硬件上高效执行。
Numba是一个Python库,用于对Python代码进行即时(JIT)编译,以便在硬件上高效执行。
|
5月前
|
机器学习/深度学习 编译器 测试技术
什么是 Python 编译器
**Python 编程语言以解释型为主,但也有编译器用于提升性能。CPython是默认解释器,先转为字节码再解释执行。PyPy是JIT编译器,执行速度快。Numba是针对数值计算的JIT编译器,优化数学运算。选择Python编译器要考虑性能、兼容性、内存使用及社区支持。对于机器学习,需支持科学库和GPU加速。**
|
JavaScript 前端开发 Java
Python 既是解释型语言,也是编译型语言
Python 既是解释型语言,也是编译型语言
|
存储 自然语言处理 Java
Python编译过程和执行原理
hello,这里是Token_w的文章,主要讲解python的基础学习,希望对大家有所帮助 整理不易,感觉还不错的可以点赞收藏评论支持,感谢!
144 0
下一篇
DataWorks