为什么没有其他可编译为Python字节码的编程语言?


51

在Java中,有多种语言可以编译为Java字节码,并且可以在JVM上运行-Clojure,Groovy和Scala是我能记住的主要语言。

但是,在由Python解释器运行之前,Python也会转换为字节码(.pyc文件)。我可能只是一无所知,但是为什么没有其他可编译为python字节码的编程语言呢?

仅仅是因为没有人打扰,还是因为某种固有的限制或障碍使得这样做变得如此困难?


30
...因为他们不想处理GIL?;)
Mason Wheeler

4
本能会告诉我,这与JVM的成熟程度(定义明确)有很大关系,并且JVM实际上在所有平台上还是很容易获得。
钻机2012年

4
我还怀疑大多数JVM都比python的解释器快得多。
彼得·史密斯

19
通过定位Java字节码,您可以获得JVM的所有功能(安全性,性能,可移植性,可伸缩性等)。定位Python字节码并不能帮助您。
David Schwartz 2012年

3
更高版本的Python解释器无法识别Python字节码。谁能实现编译为Python字节码的编程语言?
Gus 2012年

Answers:


77

很简单-上一次我检查时,Python没有正式规范,包括其字节码。CPython是规范,不需要字节码可移植性IIRC。因此,这是针对特定语言而设计的一个移动的,未记录的目标。


22
实际上,字节码格式的细节经常在次要版本之间变化,甚至99%兼容的PyPy甚至都不会尝试(实际上,它们添加了自己的字节码指令)。

注意:Python(该语言)具有正式规范(请参阅“ PEP”)。“ Python虚拟机”还没有。实际上,这与(例如)同时指定了两者的Java不同。
艾伯特

56

JVM语言有多种,因为有一些才华横溢的人想编写可与现有Java代码一起使用的代码,但他们不想编写Java

显然,没有程序员想使用现有的Python代码,但又讨厌Python足以将另一种语言移植到Python字节码解释器中。

您可以通过两种方式看待这种情况:由于Java如此广泛,因此JVM有替代语言,而Python字节码解释器没有替代语言,因为Python不烂。


7
我希望您不是在暗示Java比Python更烂:-)
Giorgio

8
@ Giorgio:我的意思是Groovy,Scala,Clojure等的创建者认为还有很大的改进空间。您是在暗示Python很烂吗?
凯文·克莱恩

8
使用python后,我会说“低吸系数”将是不准确的。它推卸了太多普遍接受的东西,而整个“自我”的东西却适得其反。其实很蠢。类方法怎么不知道它属于什么地方?
钻机

6
@Rig我个人认为Python的方法更优雅。OO是从语法上自然地遵循的,而不是需要一个看起来像变量的特殊关键字。至于为什么类方法不知道它们在哪里,这是因为Python类定义只是代码,而该代码没有特权,因为它恰好位于类定义内。您可以在任何地方定义方法,然后在运行时将它们添加到类中。实际上,您可以采用相同的功能,并将其用作多个类中的方法,这种方式实际上不适用于该this范例。
锑2013年

6
我认为这是虚拟机而不是语言的问题。JVM是具有代代垃圾收集器,JIT等的高性能VM。CPython使用引用计数,并且是解释器。CPython作为平台很烂。顺便说一句hyhy存在。
PuercoPop 2014年

26

尽管存在技术缺陷,例如CPython中的GIL,但是几乎没有语言缺陷,因此运行时并不是Python社区的卖点。恰恰相反,由于对GIL / CPython实现的不满意,有更多的后端运行时选项。

Java语言比JVM更加残酷(即使在Java社区中)。

JVM在大多数圈子中都广受好评。因此,通过高度优化的后端JVM带来的好处结束了对不同/更好语言前端的需求。


10

我说梅森·惠勒是对的。全局解释器锁主要是一个问题,这使得并发成为一个非常棘手的问题。相对而言,由于还有其他VM确实能够很好地实现并发,因此为这些VM开发语言是有意义的。另外,Python最近发生了重大的语言变化,许多库都没有赶上兼容性,有时使兼容性成为一场噩梦。例如,因为我使用PIL进行视觉工作,所以我必须使用Python 2.7或更低版​​本进行编码。JVM或CLI设置不是这种情况,尤其是在JVM或CLI的情况下,设计时要考虑语言互操作。

做了更多的研究,显然有两个GIL,而不仅仅是一个。其他控件Imports


1
“无GIL”是Python Wiki中 “ CPython程序员可能对IronPython感兴趣的原因”中提到的技术原因之一。
扬尼斯2012年

1
@YannisRizos:当然,访问.NET框架并不是完全无关紧要的。当然,CPython用户可能对此完全不感兴趣。
罗伯特·哈维

@RobertHarvey Ninja对此进行了编辑。尽管我不认为“获得精美玩具”是技术原因(不是玩具不好),但Wiki还提到IronPython易于扩展。
扬尼斯,2012年

8

其他答案很有道理,但实际上实际上已经有一些语言可以编译为Python。有意愿的地方...

我对这些语言一无所知,但是它们似乎可以通过将其源代码转换为Python AST并让Python将树编译为字节码来工作,从而避免了其他答案中提到的问题。

根据评论,我们目前知道使用Python VM的三种替代语言(可在此处随意添加其他语言):

  • Mochi将自己描述为一种用于函数式编程和演员风格编程的动态类型编程语言
  • Hy:将自己描述为嵌入在Python中的Lisp的方言
  • dg:将自身描述为一种(技术上)简单的语言,可以编译为CPython字节码

2
还值得一提的是HyLang
ideaman42 '16

1
dg
博多士

6

另一个原因是,JVM是高度优化,完善且极其完整的生态系统。就其本身而言,它与任何其他编译语言都具有非常好的竞争能力。(我不会说这是目前最好的通用VM,但是我当然将自己的职业归功于此。)因此,不需编写字节码即可获得对JVM的访问本身是可取的。

但是,Python VM很好,但是(没有Python反对)有一些严重的缺点。Python运行时环境非常适合该语言的动态性质,但是当您熟悉其内存使用情况,全局锁定或线程模型时,确实会让您感到惊讶。

在面对面的比较中,JVM通常是Python VM的两倍。基于JVM所执行的“热”优化,它甚至与本机编译的代码竞争良好。甚至还不包括更复杂的线程处理等。

我真的很喜欢Python,但我讨厌这样说,但是有时候性能让我大吃一惊-否则,为什么重要的Python库(例如numpy或scipy)必须退回到C代码中?

换句话说,喜欢 Python的人之所以这么做是因为他们喜欢该语言。但是,如果您想编写一种适合自己喜好的全新语言,则最好编译到JVM,因为新的特有语言将在可用的最佳(主观上,也许是最佳)操作环境之一中开始。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.