首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >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

复制
相关文章
sql中对嵌套查询的处理原则_sql的多表数据嵌套查询
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/169416.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
5.8K0
java中sql如何嵌套查找_SQL 查询嵌套使用[通俗易懂]
id int primary key auto_increment, — 主键id
全栈程序员站长
2022/09/22
4.5K0
java中sql如何嵌套查找_SQL 查询嵌套使用[通俗易懂]
python 中的嵌套类
能够看到 类中 又定义了 类 ,这种情况我们称之为嵌套类 。给一个简单 demo 来认识嵌套类 。
py3study
2020/01/10
4.1K0
python中的嵌套类
在.NET和JAVA语言中看到过嵌套类的实现,作为外部类一个局部工具还是很有用的,今天在python也看到了很不错支持一下。动态语言中很好的嵌套类的实现,应该说嵌套类解决设计问题同时简化了程序,值得学习。
py3study
2020/01/08
3.6K0
单脉冲测角处理
本文介绍的雷达系统采用单脉冲体制,具备精密跟踪的能力。每发射一个脉冲,天线能同时形成若干个波束,将各波束回波信号的振幅和相位进行比较,当目标位于天线轴线上时,各波束回波信号的振幅和相位相等,信号差为零;当目标不在天线轴线上时,各波束回波信号的振幅和相位不等,产生信号差,驱动天线转向目标直至天线轴线对准目标,这样可测出目标的方位角与俯仰角。从各波束接收的信号之和,可测出目标的距离,从而实现对目标的测量和跟踪功能。单脉冲雷达已经广泛应用,在军事上主要用于目标识别、靶场精密跟踪测量、导弹预警和跟踪、导弹再入弹道测量、火箭和卫星跟踪、武器火力控制、炮位侦查、地形跟随、导航、地图测绘等,在民用上主要用于交通管制。
数字芯片社区
2020/07/20
5.2K1
单脉冲测角处理
如何在JavaScript中访问暂未存在的嵌套对象
JavaScript 是个很神奇的东西。但是 JavaScript中的一些东西确实很奇怪,让人摸不着头脑。其中之一就是当你试图访问嵌套对象时,会遇到这个错误
前端小智@大迁世界
2019/07/02
8.3K0
sql中的嵌套查询_sql的多表数据嵌套查询
测试的时候发现取出的是一条数据, 因为测试的时候是一天中的两条数据, 没有不同的日期,所以当日以为是正确的 ,然而第二天写入数据了,要取出数据,却发现没有数据, 返回空的行, 以为都是代码又有问题 了,找了半天都没有 ,仔细看看了存储过程中的代码,发现这样返回的数据的确是空的。
全栈程序员站长
2022/09/22
7.3K0
如何使用Python中Django模板?
https://www.mattlayman.com/understand-django/templates-user-interfaces/
程序员小猿
2021/01/19
4K0
如何使用Python中Django模板?
如何使用Vue中的嵌套插槽(包括作用域插槽)
最近我弄清楚了如何递归地实现嵌套插槽,包括如何使用作用域插槽来实现。起因是我想看看是否可以构建一个复制v-for指令但仅使用template组件。
前端小智@大迁世界
2020/05/27
5.1K0
nginx 如何实现if嵌套
nginx 不支持 if 嵌套,也不允许在 if 中使用逻辑判断,会报如下错误: nginx: [emerg] "if" directive is not allowed 当业务需要多个条件判断时,可以借助中间变量来实现 如:我们的网站在 pc 端有多个子域名, 而移动端只有一个域名,对应关系如下: www.test.com --> m.test.com sub1.test.com --> m.test.com/sub1 sub2.test.com --> m.test.com/sub2 sub3.tes
章鱼喵
2019/11/27
2K0
一段批处理脚本(for 嵌套)
可以看到,按日期生成了目录。以20170619目录下的文件举例,前两个文件其实大小都一样,是重复的。判断规则就是红色部分重名。
黯然销魂掌
2018/09/27
1.5K0
Elasticsearch聚合的嵌套桶如何排序
在elasticsearch的聚合查询中,经常对聚合的数据再次做聚合处理,例如统计每个汽车品牌下的每种颜色汽车的销售额,这时候DSL中就有了多层aggs对象的嵌套,这就是嵌套桶(此名称来自《Elasticsearch 权威指南》),如下图所示:
程序员欣宸
2019/05/27
4K0
Swift代码中的嵌套命名法
Swift支持与其他类型嵌套命名,尽管它还没有专用的命名关键词。下面我们来看看,如何使用类型嵌套来优化我们代码的结构。
莫空9081
2021/03/01
1.7K0
选择块参照中嵌套的实体
在利用ObjectARX进行CAD二次开发时,如何选择块参照中嵌套的实体,并进行进行下一步操作?这个问题的难点是:如何判断用户选中的实体到底是块参照里面的非嵌套对象实体?还是块参照中嵌套的块参照的实体?本文利用全局函数acedNEnsSelP解决了这个问题,并可实现:如果用户选择块参照中嵌套的实体,直接视为用户选择了这个嵌套的块参照,效果如图。
用户3519280
2023/07/31
3051
iframe嵌套页面拒绝访问_苹果cms模板修改导航
在模板里面 友情链接里面得A标签里面添加{$field.target} 标签 即可
全栈程序员站长
2022/11/08
2.6K0
Android中RecyclerView嵌套RecyclerView
这两天在做一个新的APP,在考虑用户体验上要一个两级的列表嵌套,于就想看看RecyclerView是否能做出这样的效果,自己写了一个DEMO来做一下测试,最后的效果还是比较满意的。下面我就说一下RecyclerView嵌套RecyclerView的实现。
Vaccae
2019/07/25
7.8K0
Java中嵌套类用法
在Java中,可以在另一个类中定义一个类。这些类称为嵌套类。它们使您能够对只在一个地方使用的类进行逻辑分组。因此,这增加了封装的使用,并创建了更具可读性和可维护性的代码。
程序你好
2018/09/29
2.1K0
myeclipse 2017 CI 中如何修改Servlet模板
  在实际开发中,这些生成的代码和注释一般我们都用不到的,每次都要手工删除这些注释和代码,很麻烦,因此可以根据开发的实际情况修改Servlet的模板代码,改成符合实际开发需求的模板代码。
黑泽君
2018/10/11
9860
myeclipse 2017 CI 中如何修改Servlet模板
从嵌套结构中取值时如何编写兜底逻辑
对a解构时赋予的默认值(空数组),仅当b.a的值为undefined时才会生效,如果b.a的值为null,默认值就无法生效,使得第二行调用map方法的代码直接报错,所以第一行代码兜底并没有做好。
大史不说话
2020/11/03
3K0
Linux内核18-中断和异常的嵌套处理
讲解这部分之前,我们先阐述一个概念-内核控制路径:就是一段在内核态执行的代码,比如说,异常处理程序,中断处理程序,系统调用处理,内核线程等等在内核态执行的代码。所以,内核态程序被激活的方式有:
Tupelo
2022/08/15
2.2K0
Linux内核18-中断和异常的嵌套处理

相似问题

角获取ng-绑定来处理嵌套指令

66

ng-模板内的角6嵌套ViewChild为空。

30

角js中的嵌套ng-重复

23

角ng-递归模板中的选项

11

如何在角中实现指令(ng-模板)?

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档