我听到过这样的说法:Python太慢了,无法在浏览器中使用。
我认为JavaScript仅在这方面具有优势,因为Google之类的公司之所以需要它(并且使其变得很快)是因为他们需要它才能生存,但是我可能错了。
Python和Javascript的设计方式是否存在差异,从而影响它们(将)在浏览器中的执行方式?
由于到目前为止还没有客户端Python实现,所以我的问题来自某人发表的声明,因此也许它与语言本身有关(尽管我不相信)。
would
?
我听到过这样的说法:Python太慢了,无法在浏览器中使用。
我认为JavaScript仅在这方面具有优势,因为Google之类的公司之所以需要它(并且使其变得很快)是因为他们需要它才能生存,但是我可能错了。
Python和Javascript的设计方式是否存在差异,从而影响它们(将)在浏览器中的执行方式?
由于到目前为止还没有客户端Python实现,所以我的问题来自某人发表的声明,因此也许它与语言本身有关(尽管我不相信)。
would
?
Answers:
首先,我们必须明确区分语言和实现。语言是抽象的事物,实现是可以衡量性能的具体事物。例如,Lisp曾经被认为对于实际使用而言效率太低,但是编译器不断成熟,最终为它开发了专用硬件。在1980年代的某一时刻,它是高性能工作站开发的首选开发平台。
就是说,最简单的答案是,像Google的V8这样的快速Javascript实现将Python(CPython)的标准实现引人注目。V8是带有JITer的高度优化的虚拟机,而JITer的速度惊人地快,相比之下CPython是相当简单的VM。使用JIT实现了Python的实现,但仍仅快5-6倍。
五年前,情况将完全不同。浏览器的Javascript实现过于简单,因为速度不是问题,因为没有人用它构建“真正的”软件,而Python甚至可以更快地实现。
在Web的较早时期,当Java applet 成为客户端交互内容的主要唯一形式时,人们意识到需要有一种在网页上获取表单的方法,以便能够与网页上的applet进行交互。
由此,创建了将Java小程序链接到网页的脚本语言,其名称为... javascript。
可以看到带有[ 1 ],[ 2 ],[ 3 ] 等SO问题的遗留痕迹,以及两个官方文档:从Applet调用JavaScript代码和从JavaScript代码调用Applet方法
有了这样一种可用的语言,当时的浏览器(Netscape是主要的浏览器)使javascript成为一种竞争优势(在Netscape上设计的 javascript -Netscape是最早的服务器端javascript,其服务器可追溯到94年-距节点大约二十年前.js)。其他浏览器也紧随其后。人们编写的页面使用的是javascript,其他尝试进行客户端脚本编写的页面则意味着工作正常的页面与无效的页面之间完全不兼容-或代码重复(此处的{insert language here}块可对非javascript执行此操作浏览器,这里是其他所有人的javascript块)。
由于Netscape在一段时间内是主要的浏览器,因此javascript占据了上风。尽管Netscape的遗留物被遗忘在Mozilla的源文件的脚注中,但是javascript仍然存在,并且没有任何东西可以取代它。
对于任何其他客户端幻灯片脚本语言,问题仍然存在。每个浏览器都支持Javascript。如果要制作一个支持python(例如)而不是javascript的浏览器,它将无法使用绝大多数网站。此外,除非该浏览器能够获得相当大的浏览器流量份额,否则Web设计人员不希望为同一页面创建两组具有不同脚本语言的页面。
有人可能会尝试为某些启用了页面上的python脚本的浏览器制作一个python脚本插件,类似于vrml如今的工作方式。但是,除非您听说过使用vrml的网页,否则可能会发现另一网页使用了另一种脚本语言。
我认为Python不会太慢。没有什么语言可以阻止它运行得足够快以至于至少不能匹配JavaScript。可以将其编译为JavaScript,因此,如果没有其他问题,您可以在浏览器中包含编译器,并且仅可能增加页面加载时间。
更新:请参阅下面的评论,讨论为什么将Python编译为JS比此处暗示的要昂贵得多。
问题是试图说服浏览器供应商和W3C首先选择Ruby,而不是Ruby或任何其他不错的脚本语言,然后定义一个标准化的子集,因为它们不允许系统调用等等,然后一直很好地实现仍支持JavaScript。那不会发生,但是如果真的发生了,我怀疑速度会变成一个严重的问题。
我认为Python有自己的虚拟机。我没有使用Python的丰富经验,但是我看不出没有任何理由无法像未优化的JavaScript引擎那样表现出色。
一些随机的想法:
(1)您可能可以使用Jython通过Java小程序在本地运行Python。我在这里看到的困难部分是applet的限制非常严格,因此您可能需要修改Jython使其适合访问限制。例如,如果它写入日志文件,则可能需要删除日志记录代码。小程序不需要明显可见。
(2)有人可以构建一个Python到JavaScript的“编译器” /转换器。这将是很多工作。
Someone could build a Python-to-JavaScript "compiler"/converter
好吧,已经有人做过了。
Brython
有趣的是,它的运行速度非常快,至少对于页面上相当孤立的部分(与的互动度较低DOM tree
)。
它取决于语言的实现方式,不一定取决于语言本身。大多数JavaScript解释器比几乎所有Python实现都要快得多。
这并不意味着Python语言的使用速度几乎不能与JavaScript相同。Opal通过将Ruby代码编译成封装在闭包中的JavaScript代码,在浏览器中几乎实现了完整的Ruby语言和标准库。除了包括Opal库的开销外,它的速度比我所知的任何其他Ruby解释器都快得多,比纯JavaScript更快。
我不知道是否有Python等同于Opal,但是这样的项目可能意味着您的问题的答案为“否”。随着JavaScript作为“ Web汇编语言”的使用越来越多,如果将它越来越多地用作其他语言的平台,这也就不足为奇了,尤其是随着移动计算能力的提高以及使用该语言的开销用JavaScript实现的错误越来越严重。
编辑:这是针对在JavaScript上编译/运行的浏览器的Python实现的列表。
https://github.com/jashkenas/coffeescript/wiki/list-of-languages-that-compile-to-js#python
如果您有兴趣,可以查看我真正喜欢的Opal。
由于我怀疑浏览器是否会支持单独的解释器,因此就使用JavaScript以外的语言而言,此类编译器可能是未来的方式。即使是现在,您仍将在大多数领域获得可比的性能。但是,这是我的观点,因此请记住这一点。
即使您问了这个问题,JavaScript中也已经有许多可用的python实现,如今可以在网页上使用。
对于初学者,请访问http://www.skulpt.org/或http://www.brython.info/。
性能似乎还不错,但是您应该自己对其进行测试并找出答案。
Python是一种“控制台”语言,在服务器上运行
Javascript是一种“浏览器”语言,在客户端上运行
因此,他们不会直接竞争
...当然有node.js以及可能的python浏览器插件,但这是一个关于特定实现的性能的问题。
而且,对于大多数应用程序,python都可以正常工作,除非您必须进行某种形式的大量计算并减少CPU周期。
最后一点,python和javascript有很多相似之处。由于它们的动态性质,两者都必须在运行时进行解释,并且不能像静态类型的语言一样强大地进行编译。因此,我认为它们可以实现的性能是相似的。