本篇内容介绍了“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实现?
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能帮我们到达那里。我不认为这些可能性在本质上都是错误的,它可能只会归结为引起人们足够兴趣的那一个,从而看到它对别人有用。
“Python编程语言的核心是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!