Python 编程语言的核心是什么?
01
Python 编程语言的核心是什么?
为什么要问这个问题?
我想要用Python实现WebAssembly,这并不是什么秘密。这不仅可以让Python进入浏览器,而且由于iOS和Android都支持将JavaScript作为应用的一部分运行,因此Python也可以进入移动开发。想到这些我就觉得兴奋。
但是每当想到创建一个新Python实现的艰巨任务时,我就会不断地问自己:
“Python究竟是什么?”
我们使用CPython已经很长时间了,以至于我怀疑我们大多数人都认为“ Python == CPython”。PyPy试图将兼容做到极致,所以他们打算实现CPython的实现细节。基本上,我所知道的大多数Python实现都会为通过CPython的测试套件而努力,并尽可能与CPython兼容。
这就有点可怕了。
CPython实现的Python非常动态,它公开了许多东西,只有当你以某种方式使用解释器实现Python才有意义。例如,PyPy有一个基本的解释器使用JIT,但是你可以通过Python中的很多东西来迫使PyPy关闭JIT并坚持使用字节码。仅凭REPL就让Python变得十分动态,因为输入到REPL的所有内容都会由解释器动态地解析、编译和执行。
因此我开始思考:Python到底是什么的问题?这门语言的核心究竟是什么?究竟Python实现需要覆盖到哪些基本功能,才能成为人们心目中认可的Python实现?还有以我来看,将Python直接编译成WebAssembly的实现需要付出多少代价?
Python是否需要REPL?
我真正开始思考这个问题是当我开始思考将Python编译成WebAssembly都需要什么的时候。这并不是要实现另一个解释器,而是从Python源代码产生静态的WebAssembly,并且它依然可以称为“Python”。
我知道的,通过eva()或compile()进行动态编译可能不容易实现,因为WebAssembly的安全模型会在加载时验证模块。这意味着没有办法在其他代码的内存空间内运行任意代码,这可能会加剧实现REPL的难度。
但这让我思考:Python真的需要REPL吗?别误会我的意思,它非常方便,但是我的意思是,如果某个实现不包含REPL,那么它还是Python吗?我认为无REPL的Python仍然是Python,只是缺少(可能是关键的)功能。
这不禁让我思考必须将Python的哪些部分视为“ Python”的想法。
没有locals()行不行?能够将定义的所有局部变量及其值都收集到一个字典中,这是非常动态的东西。如果你使用像CPython这种解释器,那么只需要从当前的执行帧里取一些东西就能获得locals。但在编译语言中,实现这一点需要大量工作,因为你必须知道应当何时收集这些信息,因为调用locals()的时候并不一定所有信息都存在。
如果有人重载了locals()怎么办?同样,在CPython中这也不是什么问题,因为builtins模块有一个__dict__属性,只需要重载它,就会向下传递到以后的调用中。但在编译语言中,做类似的检测需要大量的工作,最终会影响性能。
那么sys.settrace()呢?它会触发每个字节的回调,而如果代码已经编译,这一点是无法实现的。尽管你可以通过检查每行末尾是否设置了跟踪函数来模仿这一行为,但这似乎有点过了,因为绝大多数情况下这种钩子并不存在(尽管可以实现为编译器开关)。
那么sys._getframe()呢?编译语言并不一定能够直接访问每个执行帧,那么你还要不要模拟这一行为?由于任何函数都可以请求执行帧,你必须时刻准备着提供执行帧。
可见,Python中有很多东西加剧了编译的难度(因此Nuitka拥有更大的能力来应对这一挑战)。但是我敢打赌,上面提到的内容在99.9%的情况下都不会使用,因此,如果这些功能没有实现,那么是否仍可以将其视为“Python”?
具备多少兼容性才有意义?
这个问题我没有很好的答案。但是这个问题的答案标志着实现Python的难度以及与现有软件的兼容性。我会说,我认为WebAssembly不需要支持大量的Python软件。WebAssembly可以访问Rust和JavaScript等其他语言生态系统,因此你需要的某个东西完全有可能在其他语言中已经实现了。
我没有答案
也许我们可以开发一个将Python代码直接转换为WebAssembly并牺牲性能兼容性的编译器。也许我们可以开发针对WebAssembly设计的解释器,同时与先前已有的代码保持兼容性。也许可以仅在其WebAssembly工作中支持RustPython。也许Pyodide可以实现这一点。我认为这些都有可能,这些都有可能激发人们的兴趣,进而产生更好的结果。
Python 编程语言的核心是什么?的更多相关文章
- 中小学Python编程语言教学
中小学Python编程语言教学 作为一名高中信息技术老师,被技术的发展潮流推动着,不断更新教学内容和方法,以适应快速发展的信息社会. 以前的中小学信息技术课程,老师们各显神通,身怀绝技,教PS,Fal ...
- 《简明Python编程》核心笔记(1~5章)
2014年8月20日 <简明Python编程>核心笔记 (1~5章) 昨天和今天两天时间里.把<简明Python编程>这一本书学完了,包含书上的代码.现把核心笔记记录下来,以 ...
- 3.Python编程语言基础技术框架
3.Python编程语言基础技术框架 3.1查看数据项数据类型 type(name) 3.2查看数据项数据id id(name) 3.3对象引用 备注Python将所有数据存为内存对象 Python中 ...
- 使用Python编程语言连接MySQL数据库代码
使用Python编程语言连接MySQL数据库代码,跟大家分享一下: 前几天我用python操作了mysql的数据库,发现非常的有趣,而且python操作mysql的方法非常的简单和快速,所以我把代码分 ...
- python编程语言 函数的形参
python编程语言 函数的形参的讲解: 我在交互模式中写了个函数: def adder(**args): sum=0 for x in args.keys(): sum+=args[x] retur ...
- 类型系统(type system)是一门编程语言最核心也是最基础的部分---编程语言最终的目标,本质上无非是回答两个问题:如何表示信息、如何处理信息
https://www.cnblogs.com/feng9exe/p/9712059.html 类型系统(type system)是一门编程语言最核心也是最基础的部分.无论该语言基于何种编程范式,都必 ...
- Python 编程语言要掌握的技能之一:使用数字与字符串的技巧
最佳实践 1. 少写数字字面量 “数字字面量(integer literal)” 是指那些直接出现在代码里的数字.它们分布在代码里的各个角落,比如代码 del users[0] 里的 0 就是一个数字 ...
- Python 编程语言要掌握的技能之一:编写条件分支代码的技巧
Python 里的分支代码 Python 支持最为常见的 if/else 条件分支语句,不过它缺少在其他编程语言中常见的 switch/case 语句. 除此之外,Python 还为 for/whil ...
- Python 编程语言要掌握的技能之一:善用变量来改善代码质量
如何为变量起名 在计算机科学领域,有一句著名的格言(俏皮话): There are only two hard things in Computer Science: cache invalidati ...
随机推荐
- junit基本介绍视频笔记1
程序员每天工作的基本流程: 1.从svn检出代码: 2.运行单元测试,测试无误,进入下一步: 3.开始一天的代码编写工作: 4.代码提交到服务器之前进行单元测试: 5.单元测试通过提交到svn服务器. ...
- MySQL8.0窗口函数实践及小结
MySQL8.0之前,做数据排名统计等相当痛苦,因为没有像Oracle.SQL SERVER .PostgreSQL等其他数据库那样的窗口函数.但随着MySQL8.0中新增了窗口函数之后,针对这类统计 ...
- 基于 Angular Material 的 Data Grid 设计实现
自 Extensions 组件库发布以来,Data Grid 成为了使用及咨询最多的组件.最开始 Data Grid 的设计非常简陋,经过一番重构,组件质量有了质的提升. Extensions 组件库 ...
- TCP协议粘包问题详解
TCP协议粘包问题详解 前言 在本章节中,我们将探讨TCP协议基于流式传输的最大一个问题,即粘包问题.本章主要介绍TCP粘包的原理与其三种解决粘包的方案.并且还会介绍为什么UDP协议不会产生粘包. 基 ...
- .Net Core 集成ExceptionLess分布式日志框架之本地化部署
前言 公司目前使用的项目中关于日志记录这块,之前一直都是使用的Log4net 存放于后台文件中的,对于异常错误啊,或者需要查看一些详情错误的时候感觉很不方便,要到服务器上去打开日志文件检索错误,降低了 ...
- 服务消费者(Feign-下)
上一篇文章中已经讲述 Feign的基本用法,本章主要概述 FeignClient GET/POST/PUT/DELETE restful写法以及 Feign 拦截器,与配置优化方案,关闭HttpCli ...
- 一个ACE 架构的 Socket Client
.h /************************************************************** * Filename: TcpClient.h * Copyrig ...
- 多种CSS变量技术 带入进入老司机行业
CSS 变量技术 具体用法 使用 -- 声明变量,使用 var() 函数获取变量. :root{ --header-height: 70px; } body { --color: white; } . ...
- 包含min函数的栈(剑指offer-20)
题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法 ...
- asp.net mvc使用jwt简单例子
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准.该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景.JWT的声 ...