1、为什么提出python编程核心?我想要一个Python实现已经不是什么秘密了。WebAssembly不仅将Python带入了浏览器,而且iOS和Android都支持将JavaScript作为应用程序的一部分运行,这一事实也将Python带入了移动平台。这一切都让我兴奋。但是当想到创建一个新的Python实现的艰巨任务时,我的大脑也开始问它到底是什么。是蟒蛇吗?我们使用CPython已经很长时间了,以至于我怀疑我们中的大多数人只是认为“Python==CPython”。Pipi尝试这样做是为了与他们将在CPython中实现的实现细节兼容。基本上,据我所知,大多数Python实现都力求通过CPython的测试套件,并尽可能与CPython兼容。这太可怕了。由CPython实现的Python非常动态,并且公开了许多只有在使用解释器实现Python时才有意义的东西。例如,PyPy有一个基线解释器,他们使用JIT,但是有很多东西可以在Python中使用,这迫使PyPy关闭JIT并继续使用字节码。REPL本身就使事情变得非常动态,因为您键入REPL的所有内容都会由解释器动态解析、编译和执行。这让我开始思考Python究竟是什么?语言的核心是什么?所有Python实现都需要覆盖哪些基线才能真正称自己为Python实现,并且人们仍然认可它?或者从我的角度来看,要将Python直接编译为WebAssembly并仍被视为Python实现,还需要实现多少?2.Python需要REPL吗?真正让我想到这个的是当我开始思考如何将Python编译为WebAssembly时?没有实现另一个解释器,但实际上从Python源代码发出静态WebAssembly,并且仍然合理地称它为“Python”。我知道的一件事是WebAssembly安全模型很难通过动态编译eval()或compile()来在加载时验证模块。这意味着没有结构化的结构可以在其他代码的内存空间中运行任意代码,这会使REPL实现变得棘手。但这让我开始思考:Python真的需要REPL吗?别误会,这很方便,但是如果一个实现没有REPL,它不会不再是Python了吗?我认为没有REPL的Python仍然是Python,它只是缺少一个(可能是关键的)特性。3.Python的哪些部分需要被认为是“Python”?你能在locals()中幸存下来吗?能够任意地将所有定义的局部变量和它们的值收集到字典中是一件非常动态的事情。如果你在一个整数中(比如CPython),你只需要从当前的执行框架中收集一些东西,你就会得到局部变量。但是在编译语言中,它需要做更多的工作,因为你必须知道所有这些信息是什么时候收集的,因为它不一定只是在调用时就坐在那里。当地人()。或者locals()本身?同样,这在CPython中不是什么大问题,因为内置模块有一个__dict__可以覆盖,它会简单地传播到任何未来的调用。但是在编译语言中,做这种检查需要更多的努力,而这种检查最终会降低性能。关于sys.settrace()?它实际上触发了每个字节码的回调,如果代码被编译,这实际上不起作用。您可以通过检查是否在每一行之后设置了跟踪函数来伪造它,但是当大多数时候没有设置这样的钩子时,这似乎有点麻烦(尽管使用此支持进行编译可能是编译器徽标)。你怎么认为?sys._getframe()?编译语言不一定能直接访问执行框架,所以你需要模拟吗?由于任何函数都可以请求执行框架,因此您需要准备好按需提供执行框架。如您所见,Python中有很多东西使编译变得困难(因此Nootka足以应对挑战)。但我敢打赌我上面提到的东西-你不会在99.9%的时间使用它们,所以如果一个实现忽略它们,它仍然可以被认为是“Python”吗?4.需要多大的兼容性才有用?我对这个问题没有很好的答案。但它的答案决定了Python的实现难度,以及它与现有软件的兼容性。我会说我不认为WebAssembly需要支持很多Python软件才有用。WebAssembly可以访问其他语言生态系统,例如Rust和JavaScript,因此您需要使用您可以使用的另一种语言来实现其他语言的可能性绝对高于零。我不知道开发一个直接将Python代码转换为WebAssembly并为性能牺牲一些兼容性的编译器是否有意义。开发一个专为WebAssembly设计但与现有代码保持很大兼容性的解释器可能是有意义的。只需在他们的WebAssembly工作中支持RustPython。也许皮皮会带我们去那里。我不认为这些可能性中的任何一种在本质上是错误的,它可能会归结为任何一个足够有趣以至于看到它对其他人有用的程度。以上就是本次分享的全部内容。现在想学编程的朋友可以微信指导公众号-Python技术大本营,欢迎来到~
