Python编程语言的核心是什么?

开发 后端
我们需要一个用于WebAssembly的Python实现,这已经不是什么秘密了。它不仅将Python引入到浏览器中,而且由于iOS和Android都支持将JavaScript作为应用的一部分运行,它也将Python引入到移动端。这一切都让我兴奋。

 为什么问这个问题?

我们需要一个用于WebAssembly的Python实现,这已经不是什么秘密了。它不仅将Python引入到浏览器中,而且由于iOS和Android都支持将JavaScript作为应用的一部分运行,它也将Python引入到移动端。这一切都让我兴奋。

但是,当想到创建一个新的Python实现这一令人生畏的任务时,我的大脑也开始问这个问题:Python到底是什么?我们与CPython一起生活了这么长时间,我怀疑我们中的大多数人只是简单地认为“Python == CPython”。PyPy试图做到兼容,以便实现CPython的实现细节。基本上,我所知道的大多数Python实现都努力通过CPython的测试套件,并尽可能地与CPython兼容。

这是令人生畏的。由CPython实现的Python是非常动态的,并且暴露了许多只有在使用解释器实现Python时才有意义的东西。例如,PyPy有一个用于JIT的基线解释器,但是在Python中可以使用许多东西来强制PyPy关闭JIT并坚持使用字节码。仅靠REPL就可以使事情变得非常动态,因为解释器会立即对进入REPL的所有内容进行动态解析、编译和执行。

这让我开始思考Python到底是什么?这门语言的核心是什么?所有的Python实现需要涵盖什么样的基线,才能真正能够将自己称为人们仍能认出的Python实现?或者从我的角度来看,一个人需要实现多少才能直接编译Python到WebAssembly,并且仍然被认为是Python实现?

 

[[335938]]

 

Python需要REPL吗?

真正让我开始思考这个问题的是当我开始思考如何将Python编译成WebAssembly?没有实现另一个解释器,但实际上发出静态WebAssembly从Python源代码,并仍然合理地称为“Python”。

我知道的一件事是,通过eval()或compile()进行动态编译可能不太容易,因为WebAssembly的安全模型在加载时验证模块。这就意味着在其他代码的内存空间中并不存在运行任意代码的结构,这可能会使REPL的实现变得棘手。

但这让我思考:Python真的需要REPL吗?不要误解我的意思,它非常方便,但是如果一个实现没有REPL,它就不再是Python了吗?我认为没有应答的Python仍然是Python,它只是缺少一个(潜在的关键)特性。

这让我开始思考Python的哪些部分需要被认为是“Python”?

没有当地人你能生活吗?它是一个非常动态的事情,能够任意地收集所有定义的局部变量和它们的值到一个字典。如果你在一个像CPython这样的intepreter中,你只需要从当前执行框架中获取一些局部变量。但是在编译语言中,这需要做更多的工作,因为您必须知道何时收集所有这些信息,因为调用local()时,这些信息并不一定是到处都有的。

或者人们重写local()本身怎么样?在CPython中,这不是什么大问题,因为builtins模块有一个__dict__,你可以覆盖它,它将简单地传播到任何未来的调用。但是在编译语言中,进行这种检测需要花费更多的精力,而且这样的检查最终会降低性能。

关于sys.settrace ()呢 ?它实际上会触发每个字节码的回调,如果代码被编译,它就不能正常工作。您可以通过检查是否在每一行后面设置了跟踪函数来伪造它,但是当您大多数时候没有设置这样的钩子时,这样做似乎有点过分(不过,它可能是在这种支持下编译的编译器标志)。

那么sys._getframe()呢?编译语言并不一定要直接访问执行框架,所以您需要费心去模拟它吗?由于执行帧可以被任何函数请求,所以您需要随时准备按需提供执行帧。

正如您所看到的,Python中有很多东西使得编译变得困难(Nuitka因此更有能力接受这个挑战)。但我敢打赌,我上面提到的东西你在99.9%的时间里都不会用到,所以如果一个实现没有使用它们,它还能被认为是“Python”吗?

有多少兼容性是有用的?

我对这个问题没有很好的答案。但是它的答案说明了实现Python的难度以及它与现有软件的兼容性。我想说的是,我认为WebAssembly不需要支持大量的Python软件就可以发挥作用。WebAssembly可以访问其他语言生态系统,比如Rust和JavaScript,所以用其他语言实现需要的东西的可能性绝对大于零。

我没有答案

开发一个将Python代码直接转换为WebAssembly并牺牲一些兼容性以提高性能的编译器可能是有意义的。开发一个以WebAssembly的设计为目标,同时又能保持与现有代码的兼容性的解释器可能是有意义的。在他们的WebAssembly努力中,简单地支持RustPython可能是有意义的。也许Pyodide能帮我们到达那里。我不认为这些可能性在本质上都是错误的,它可能只会归结为引起人们足够兴趣的那一个,从而看到它对别人有用。

责任编辑:华轩 来源: 今日头条
相关推荐

2021-11-09 23:15:20

编程语言本质

2012-05-16 13:11:28

编程语言开发语言Java

2022-08-17 17:57:37

GoGo语言

2022-08-26 09:51:49

索引签名编程语言

2018-04-04 14:29:33

2021-03-15 14:00:56

PythonC语言编程语言

2020-03-10 11:00:22

CIO核心竞争力竞争力

2021-02-07 09:18:07

JavaScript 前端编程语言

2021-07-07 10:01:13

编程语言计算机斯坦福大学

2010-03-19 09:39:17

Python编程语言

2009-07-20 15:42:59

JDBC是什么

2022-09-21 13:53:15

C++移动语义

2017-02-05 14:49:39

2015-08-26 09:54:19

物联网

2009-07-08 14:51:10

2009-09-23 15:50:57

Python 3.1

2020-05-28 10:08:06

云计算Python编程语言

2014-07-02 09:56:33

2021-02-07 23:07:00

PythonJavaScript语言

2015-08-12 13:23:37

运营商
点赞
收藏

51CTO技术栈公众号