首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >PyPy自己翻译吗?

PyPy自己翻译吗?
EN

Stack Overflow用户
提问于 2011-12-09 14:16:15
回答 2查看 12.1K关注 0票数 50

我明白了吗?PyPy解释器实际上是自己解释自己,然后自己翻译吗?

我现在的理解是:

  • RPython的工具链包括部分执行要翻译的程序,以获得某种预处理版本以进行注释和翻译。
  • 运行在PyPy之上的CPython解释器执行部分解释自己,此时它将控制权交给执行翻译的RPython半部分。

如果这是真的,那么这是我所见过的最令人难以置信的事情之一。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-19 17:54:18

实际上,PyPy的翻译过程在概念上没有听上去那么递归。

实际上,它只是一个处理Python函数/类/其他对象(而不是 Python源代码)并输出C代码的Python程序。当然,它不只是处理任何对象;它只能处理特定的表单,如果用RPython编写要翻译的代码,就会得到特定的表单。

因为翻译工具链是Python程序,所以可以在任何Python解释器之上运行它,这显然包括PyPy的python解释器。所以这没什么特别的。

因为它翻译了RPython对象,所以可以使用它来翻译PyPy的python解释器,该解释器是用RPython编写的。

但是您不能在翻译框架本身上运行它,即而不是 RPython。只有PyPy的python解释器本身是RPython。

事情之所以有趣,只是因为RPython代码也是Python (但不是相反的),而且因为RPython从来没有在源文件中“真正存在”,而是只存在于运行中的Python进程中,该进程必然包括其他非RPython代码(例如,没有“纯-RPython”导入或函数定义,例如,因为转换器对已经定义和导入的函数进行操作)。

请记住,转换工具链对内存中的Python代码对象进行操作。Python的执行模型意味着在某些Python代码运行之前这些代码是不存在的。您可以想象,如果高度简化翻译过程,那么开始翻译过程就会有点像这样:

代码语言:javascript
运行
AI代码解释
复制
from my_interpreter import main
from pypy import translate

translate(main)

众所周知,只要导入main,就会运行大量的Python代码,包括所有其他模块my_interpreter导入。但是,翻译过程开始分析函数对象main;它从未看到、也不关心执行了什么代码来生成main

考虑这一点的一种方法是,“RPython中的编程”意味着“编写一个生成RPython程序的Python程序,然后将其提供给翻译过程”。这相对容易理解,并且有点类似于其他编译器的工作方式(例如,用C编写编程的一种方法是编写C预处理器程序,生成C程序,然后将C程序输入C编译器)。

在PyPy情况下,事情只会变得混乱,因为所有三个组件(生成RPython程序、RPython程序和翻译过程的Python程序)都被加载到中--相同的解释器。这意味着很可能有一些参数调用的函数是RPython,而不是其他参数调用的函数,从翻译框架调用助手函数是生成RPython程序的一部分,还有很多其他奇怪的事情。因此,情况变得相当模糊,而且您不一定要将源行清晰地划分为“要翻译的RPython”、"Python生成我的RPython程序“和”将RPython程序交给翻译框架“。

运行在PyPy之上的CPython解释器执行以部分解释自身。

我认为你在这里暗示的是PyPy在翻译过程中使用了流对象空间来做抽象的解释。就连这也不像一开始看上去那么疯狂和扭曲。我对PyPy的这一部分知之甚少,但据我所知:

PyPy通过将它们委托给一个“对象空间”来实现Python解释器的所有操作,该对象空间包含所有基本内置操作的实现。但是您可以插入不同的对象空间以获得不同的效果,只要它们实现相同的“对象空间”接口,解释器仍然能够“执行”Python代码。

RPython转换工具链处理的PyPy代码对象是PyPy代码,可以由解释器执行。因此,通过插入流对象空间,PyPy重新使用了部分Python解释器作为翻译工具链的一部分。当使用这个对象空间“执行”代码时,解释器实际上并不执行代码的操作,而是生成流程图,类似于许多其他编译器使用的中间表示形式;它只是一个简单的机器可操作的代码表示,需要进一步处理。这就是如何将常规(R)Python代码对象转换为翻译过程的其余部分的输入。

由于翻译过程中通常要翻译的东西是PyPy的Python解释器,所以它确实用流对象空间“解释自己”。但这实际上意味着,您有一个正在处理Python函数的Python程序,包括那些执行处理的函数。它本身并不比将装饰器应用到自己,或者让包装类包装自己的实例(或者包装类本身)更令人费解。

嗯,有点乱七八糟的。我希望这能帮上忙,我希望我没有说错什么,如果我说了,请纠正我。

票数 66
EN

Stack Overflow用户

发布于 2011-12-09 14:37:27

免责声明:我不是PyPy方面的专家--特别是,我不理解RPython翻译的细节,我只是引用我以前读过的东西。有关RPython翻译如何工作的更具体的文章,请查看此回答

答案是,是的,它可以(但只有在第一次使用CPython编译之后)。

较长的描述:

起初,它似乎高度弯曲和自相矛盾,但一旦你理解它,这是容易的。在维基百科上查看答案。

程序开发中的引导开始于20世纪50年代,当时每个程序都是用十进制代码或二进制代码,一点一点地(1s和0)构建的,因为没有高级计算机语言,没有编译器,没有汇编程序,也没有链接器。一个小型汇编程序是为一台新计算机(例如IBM 650)编写的,它将一些指令转换成二进制或十进制代码: A1。然后,这个简单的汇编程序用它定义的汇编语言重新编写,但是有了扩展,可以使用一些额外的助记符来处理更复杂的操作代码。

这个过程被称为软件引导。基本上,您构建了一个工具,比如一个C++编译器,它使用的是一种已经生成的较低的语言(所有的东西都必须从二进制中编码),比如ASM。既然已经有了C++,现在可以在C++中编写C++编译器,然后使用ASM C++编译器编译新的编译器。一旦编译了新编译器,现在就可以使用它来编译自己了。

所以基本上,用手工编写第一个计算机工具,用那个解释器再做一个稍微好一点的,用那个来做一个更好的,最终你会得到今天所有复杂的软件!:)

另一个有趣的例子是CoffeeScript语言,它是用.CoffeeScript。(虽然这个用例仍然需要使用外部解释器,即Node.js)

--运行在CPython之上的PyPy解释器执行以部分解释自己,此时它将控制权交给它的RPython一半,后者执行翻译?

您可以使用已经编译的PyPy解释器来编译PyPy,也可以使用CPython来编译它。但是,由于PyPy现在有一个JIT,所以使用自己而不是CPython来编译PyPy会更快。(多数情况下为PyPy现在比CPython快)

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8452396

复制
相关文章
什么是pypy?
PyPy是用Python实现的Python解释器,集成了一种即时 (JIT) 编译器。这与能够以革命性的方式改变 Java 性能的知名技术 HotSpot 属于同一种技术的不同形式。
the5fire
2019/02/28
3K0
PyPy简单介绍
总结了这段时间在PyPy上的折腾,早上给同事分享了一下,不过关于PyPy里面还有很多东西需要去理解。这里先把简单介绍版拿出来,其实是做成一个html5的ppt的rst源码。稍后找个地方放ppt,效果应该不错。
the5fire
2019/02/28
1.4K0
用python破解有道翻译,打造属于自己的翻译软件!
Hi~大家好!本文利用爬虫+tkinter打造一个属于自己的简易翻译软件,代码较简单,但篇幅较长。
Python与Excel之交
2021/08/05
1.2K0
爬虫练习 | 利用有道翻译,做个自己的翻译程序
欢迎大家关注 【佛系学python】~ 今天利用有道翻译在线网站做个简单的翻译程序 首先打开有道翻译的网址: ”http://fanyi.youdao.com/“ 按 f12 打开检查工具 点击ele
佛系编程人
2019/08/14
8390
爬虫练习 | 利用有道翻译,做个自己的翻译程序
install pypy from source
hg clone https://bitbucket.org/pypy/pypy cd pypy/pypy/goal python ../../rpython/bin/rpython --opt=jit targetpypystandalone.py [config opt](http://pypy.readthedocs.org/en/latest/config/opt.html)
pydata
2018/08/02
3770
Python, CPython, Pypy, Jython的简单介绍
摘要总结:
红色石头
2017/12/28
2.3K0
python程序的pypy加速
我们知道,python作为一种几乎是脚本语言的语言,其优点固然有,但是其有一个最大的缺点,就是运行速度没有办法和c,c++,java比。最近在些一些代码的时候也是碰到了这样的问题。
钱塘小甲子
2019/01/28
1.1K0
用Python抓取百度翻译内容并打造自己的翻译脚本!
英文不好一直是我的一个短板,尤其是在学习代码的阶段,经常需要查询各种错误,很是苦逼,一直就想自己做个翻译的脚本,省去打开网页的时间,但是查询之后发现网上的教程都是百度翻译改版之前的爬虫,不得已只好自己上手了!
云飞
2018/09/13
2K0
高质量编码-(听歌时自己翻译歌词)
周末的一个下午,外面下着大雨,或者暑天阳光火一般的暴晒热烈,呆在屋里,准备一杯咖啡或热茶,安静的阅读技术博客。听着音乐更加惬意,但还是偶尔想知道歌词里描述的是什么,尤其是外文歌。
MiaoGIS
2021/07/19
7810
高质量编码-(听歌时自己翻译歌词)
pypy 打包_手机按键精灵脚本编写
我们可以在ArcGIS之外调用arcpy站点包运行python独立脚本,从而批量化任务提高工作效率。 如果可以把做好的脚本打包成exe是不是就更方便了呢?想想一键式处理也挺开心的。
全栈程序员站长
2022/09/30
7080
创建基于pypy的virtualenv虚拟环境
关于pypy这个东西,搞python有段时间的人应该都知道,我博客之前也写过两篇pypy的文章,有兴趣的可以看看:
the5fire
2019/02/28
1.7K0
pypy运行django+mysql简单教程
官网:http://pypy.org/ 下载的1.9的,下载完成之后用tar xf 文件名,解压缩。复制pypy-1.9到~/.local/目录下。
the5fire
2019/02/28
1.3K0
【翻译】Golang语言-是面向对象语言吗?
原文:http://spf13.com/post/is-go-object-oriented 前言 为了真正理解面向对象的含义,我们需要回顾一下这个概念的起源。第一个面向对象语言-simula问世于19世纪60年代。它引入了对象(object)、类(class)、继承(inheritance)、子类(subclass)、虚方法(virtual method)、协程(coroutine)等概念。然而simula最重要的贡献可能是它引入颠覆性的思想——将数据和逻辑完全分离。 你可能不熟悉simula语言,但你肯
李海彬
2018/03/21
1.8K0
(含源码!)「Fun Paper」见过语音翻译,但你见过嘴型翻译吗?
本文“Face-To-Face Translation”是指的要建立这么一个系统:它能够自动地将说a语言的人的视频翻译成目标语言B,并实现唇同步。简单来说就是:视频中有一个人说话,将这个人说的英语实时的翻译成中文并且将说英语的嘴型也通过图像的方法翻译成中文的嘴型。
ShuYini
2020/03/12
1.5K0
CentOS 上安装 PyPy 做简单测试
以前没有关注过pypy,但是看到rasperry pi上pypy效果不错,我在服务器上也测试一下。
星哥玩云
2022/07/03
5010
Python3 动手自己写谷歌翻译(学员作品)
本篇为实现谷歌翻译的功能,在编写的时候以为只是一个接口的问题。 没想到的是每次翻译都会触发一次JS的执行,在请求参数中生成一个tk。 文中tk的实现是复用的网上大神的代码生成tk。 好了,不说了直接看代码吧! # /usr/bin/env python # -*- coding: utf-8 -*- import urllib.parse import execjs,requests,termcolor class Return_tk(): def __init__(self):
IT苦逼一枚
2020/11/25
8500
Python3 动手自己写谷歌翻译(学员作品)
pypy真的能让python比c还快?
最近 “pypy为什么能让python比c还快” 刷屏了,原文讲的内容偏理论,干货比较少。我们可以再深入一点点,了解pypy的真相。
州的先生
2021/06/21
7220
pypy真的能让python比c还快?
测试PyPy运行Django项目对比Python
继续昨天的文章,终于用pypy跑起了Django和MySQL,今天就把blog用pypy在本地跑一下试试。然后顺便用ab测一下,看看效果。
the5fire
2019/02/28
2.1K0
​在tinycolinux上编译pypy和hippyvm
本文关键字:在tinycolinux上编译pypy和hippyvm,pypy上的php,hippyvm on rpython, hippyvm vs phalanger
minlearn
2020/09/28
5800
1024,还记得自己为啥敲代码吗?
今天是 1024,虽说是商家的诡计,但不管怎么说,也算是程序员的节日,虽然在今天可能还是无法避免加班,但是在今天回顾一下入行的故事,也可以鞭策自己继续前行。
江南一点雨
2023/01/04
2310

相似问题

PYPY翻译异常

11

PyPy翻译64位

10

为什么PyPy翻译这么慢?

11

翻译在pypy中意味着什么?

22

使用PyPy或Cython加速PyPy循环吗?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文