为什么选择JavaScript而不是标准的浏览器虚拟机?

时间:2008-09-17 19:00:13

标签: javascript

通过浏览器中托管的标准化虚拟机支持一组语言(Java,Python,Ruby等)是否有意义,而不需要使用专门的语言 - 真的,专业的范例 - 仅用于客户端脚本?

为了澄清这个建议,网页将包含字节代码,而不是像JavaScript这样的任何高级语言。

我理解实用的现实,即由于进化原因,JavaScript正是我们现在必须处理的事情,但我正在考虑更长远的问题。关于向后兼容性,没有理由在一段时间内无法同时支持内联JavaScript,当然JavaScript可能是浏览器虚拟机支持的语言之一。

32 个答案:

答案 0 :(得分:28)

嗯,是的。当然,如果我们有一台时间机器,返回并确保许多Javascript功能的设计不同将是一个主要的消遣(这,并确保设计IE的CSS引擎的人从未进入IT)。但它不会发生,我们现在就坚持下去。

我怀疑,随着时间的推移,它将成为网络的“机器语言”,其他更好的语言和API可以编译到它(并适应不同的运行时引擎缺点)。

但是,我不认为这些“设计得更好的语言”中的任何一种都是Java,Python或Ruby。尽管能够在其他地方使用,Javascript仍然是一种Web应用程序脚本语言。鉴于该用例,我们可以做得比任何一种语言都好。

答案 1 :(得分:19)

我认为JavaScript是一种很好的语言,但我希望在开发客户端Web应用程序时有所选择。由于遗留原因,我们坚持使用JavaScript,但有些项目和想法正在寻找改变这种情况:

  1. Google Native Client:在浏览器中运行本机代码的技术。
  2. Emscripten:LLVM字节码编译器到javascript。允许LLVM语言在浏览器中运行。
  3. 创意:浏览器中的.NET CLI,由Mono的创建者:http://tirania.org/blog/archive/2010/May-03.html
  4. 我认为我们将长期使用JavaScript,但这迟早会改变。有很多开发人员愿意在浏览器中使用其他语言。

答案 2 :(得分:18)

回答问题 - 不,这没有意义。

目前,我们与多语言VM最接近的是JVM和CLR。这些并不是轻量级的野兽,尝试在浏览器中嵌入这样大小和复杂的东西是没有意义的。

让我们研究一下你可以编写一个比现有解决方案更好的新的多语言VM的想法。

  • 你的稳定性落后了。
  • 你在复杂性方面落后(方式,方式,背后因为你试图概括多种语言)
  • 你落后于领养

所以,不,它没有意义。

请记住,为了支持这些语言,你将不得不删除一些激烈的API,删除在浏览器脚本环境中没有意义的任何部分。这里有大量的设计决策,也是错误的绝佳机会。

就功能而言,我们可能只是真正与DOM一起工作,所以这实际上是语法和语言的问题,在这一点上,它确实有意义,“这真的值得吗?“

请记住,我们所讨论的唯一是客户端脚本,因为服务器端脚本已经可以使用您喜欢的任何语言。这是一个相对较小的编程领域,所以带来多种语言的好处值得怀疑。

引入哪种语言有意义? (警告,主观材料如下)

引入像C这样的语言是没有意义的,因为它是用于处理金属的,而在浏览器中,没有太多的金属真正可用。

引入像Java这样的语言没有意义,因为关于它的最好的事情就是API。

引入像Ruby或Lisp这样的语言没有意义,因为JavaScript是一种非常接近Scheme的强大动态语言。

最后,什么浏览器制造商真的想支持多种语言的DOM集成?每个实现都有自己的特定错误。我们已经走过火来处理MS Javascript和Mozilla Javascript之间的差异,现在我们想要将这种痛苦增加五倍或六倍?

没有意义。

答案 3 :(得分:14)

在Windows上,您可以使用脚本主机注册其他语言并将其提供给IE。例如,开箱即用支持VBScript(虽然它从来没有得到太多的普及,因为它的大多数用途甚至比JavaScript更糟糕。)

Python win32扩展允许人们很容易地将Python添加到IE中,但这并不是一个好主意,因为Python非常难以使用沙箱:许多语言功能暴露了足够的实现挂钩以允许所谓的受限制的应用程序爆发。

一般来说,一个问题是,您向面向网络的应用程序(如浏览器)添加的复杂性越高,出现安全问题的可能性就越大。一堆新语言肯定符合这种描述,而且这些新语言仍在快速发展。

JavaScript是一种丑陋的语言,但通过仔细使用选择的特性子集以及来自合适的对象库的支持,它通常可以被认为是相当容忍的。似乎增量,实用的JavaScript添加是Web脚本可能继续发展的唯一方式。

答案 4 :(得分:12)

我肯定会欢迎浏览器中的标准语言独立VM(我更喜欢使用静态类型语言编写代码)。

(技术上)这是非常可行的:第一个主浏览器支持它,如果当前请求来自兼容浏览器或者将代码转换为JavaScript并发送纯文本JavaScript,服务器可以发送字节码。

已经存在一些可以编译为JavaScript的实验语言,但是拥有已定义的VM(可能)可以提供更好的性能。

我承认,“标准”部分会非常棘手。此外,关于库的语言特征(例如,静态与动态类型)之间也会存在冲突(假设新事物将使用相同的库)。因此,我认为不会发生(很快)。

答案 5 :(得分:10)

如果您觉得自己的手脏了,那么您可能已经被洗脑,或者仍然感受到“DHTML年”的影响。 JavaScript非常强大,非常适合其目的,即脚本交互客户端。这就是为什么JavaScript 2.0有这么糟糕的说唱。我的意思是,为什么包,接口,类等,当它们明显是服务器端语言的一部分时。 JavaScript可以作为基于原型的语言,而不是面向对象的全面的。

如果您的应用程序缺乏无缝性,因为服务器端和客户端的通信不良,那么您可能需要重新考虑如何构建应用程序。我曾经使用过非常强大的网站和Web应用程序,我从来没有说过,“嗯,我真的希望JavaScript可以做(xyz)。”如果它可以做到这一点,那么它将不是JavaScript - 它将是ActionScript或AIR或Silverlight。我不需要那样,大多数开发人员也不需要。这些都是很好的技术,但他们试图解决技术问题,而不是......好吧,解决方案。

答案 6 :(得分:7)

我不认为标准的Web VM是不可思议的。有许多方法可以优雅地引入新的Web VM标准并具有完整的遗留支持,只要您确保您使用的任何VM字节码格式都可以快速反编译为javascript,并且结果输出将相当有效(我甚至会猜测一个智能反编译器可能会产生比人类自己产生的任何javascript更好的javascript。

使用此属性,可以在服务器上(快速),在客户端上轻松地反编译任何Web VM格式(速度很慢,但在您对服务器的控制有限的情况下可能),或者可以预生成和由客户端或服务器动态加载(最快)用于本身不支持新标准的浏览器。

原生支持新标准的那些浏览器将受益于基于web vm的应用程序的运行时速度的提高。最重要的是,如果浏览器将其传统的javascript引擎基于web vm标准(即将javascript解析为web vm标准然后运行它),那么他们就不必管理两个运行时,但这取决于浏览器供应商

答案 7 :(得分:6)

虽然Javascript是唯一可以直接控制页面的支持良好的脚本语言,但Flash为更大的程序提供了一些非常好的功能。最近它有一个JIT,并且还可以动态生成字节码(请查看runtime expression evaluation以获取一个示例,其中使用flash将用户输入的数学表达式一直编译为本机二进制文件)。 Haxe语言为您提供静态类型推理和字节码生成功能,您几乎可以实现所选择的任何运行时系统。

答案 8 :(得分:5)

对这个老问题进行快速更新。

每个肯定网页都包含字节代码的人,而不是任何高级语言,如JavaScript" "不会发生"。

2015年6月W3C宣布WebAssembly

  

适用于新的便携式,大小和加载时间效率的格式   汇编到网上。

这仍然是实验性的,但是Firefox夜间和Chrome Canary已经有一些原型实现,已经有some demonstration working

目前,WebAssembly主要设计为使用C / C ++生成,但是

  

as WebAssembly evolves it will support more languages than C/C++, and we hope that other compilers will support it as well

我让你仔细看看项目的official page,这真是令人兴奋!

答案 9 :(得分:5)

这个问题经常重现。我对此的立场是:

A)不会发生 B)已经在这里。

请原谅,什么?让我解释一下:

ad A

VM不仅仅是某种通用的神奇设备。大多数VM针对特定语言和某些语言功能进行了优化。采用JRE / Java(或LLVM):针对静态类型进行了优化,在实现动态类型或者java首先不支持的其他东西时肯定存在问题和缺点。

所以,支持许多语言功能的“通用多用途虚拟机”(尾部调用优化,静态和动态类型,foo bar boo,......)将是巨大的,难以实现并且可能更难以优化以获得出色的表现。但我不是语言设计师或vm guru,也许我错了:它实际上非常简单,只有没有人有想法吗? hrm,hrm。

ad B

已经在这里:可能没有字节码编译器/ vm,但实际上并不需要一个。 afaik javascript是turing完成的,所以应该可以:

  1. 创建一个从语言X到javascript(例如coffeescript)的翻译器
  2. 在javascript中创建解释语言X的解释器(例如brainfuck)。是的,表现会很糟糕,但是,嘿,不能拥有一切。
  3. ad C

    什么?首先没有C点!?因为还没有......谷歌NACL。如果有人能做到这一点,那就是谷歌。一旦谷歌得到它的工作,你的问题就解决了。只是,呃,它可能永远不会工作,我不知道。我最后一次读到它有一些未解决的真正棘手的安全问题。


    除此之外:

    • 自1995年以来,javascript一直在那里= 15年。仍然,浏览器的实现今天有所不同(尽管至少它不再令人难以忍受)。所以,如果你开始新的东西,你可能有一个版本在2035年左右跨浏览器工作。至少一个工作的子集。这只是微妙的不同。并需要兼容性库和层。没有必要试着改善一切。

    • 还有,可读源代码怎么样?我知道很多公司都不愿意将他们的代码作为“种类”的开源。就个人而言,如果我怀疑有些可疑或者想从中吸取教训,我很高兴我能够阅读这些来源。万岁的源代码!

答案 10 :(得分:4)

事实上。 Silverlight实际上就是这样 - 一个基于客户端.Net的VM。

答案 11 :(得分:4)

你的推理中有一些错误。

  1. 标准浏览器中的标准虚拟机永远不会是标准的。我们有4个浏览器,IE在“标准”方面存在冲突。其他三个正在快速发展,但新技术的采用率很慢。那么手机,小型设备上的浏览器呢......

  2. JS在不同浏览器中的集成及其过去的历史使您低估了JS的力量。你承诺一个标准,但不赞成JS,因为标准在早年没有成功。

  3. 正如其他人所说,JS与AIR / .NET / ...等不同。 JS目前的化身完全符合其目标。

  4. 从长远来看,Perl和Ruby可以很好地取代javascript。然而,这些语言的采用速度很慢,众所周知,他们永远不会接管JS。

答案 12 :(得分:3)

除了javascript之外,我欢迎任何语言作为可能的脚本语言。

什么是酷的是使用其他语言然后Javascript。 Java可能不太适合标签,但Haskell,Clojure,Scala,Ruby,Groovy等语言将是有益的。

前一段时间我来了一个交叉Rubyscript ...... http://almaer.com/blog/running-ruby-in-the-browser-via-script-typetextrubyhttp://code.google.com/p/ruby-in-browser/
仍处于试验阶段,但看起来很有希望 对于.Net我刚发现:http://www.silverlight.net/learn/dynamic-languages/刚刚找到该网站,但看起来也很有趣。甚至可以从Apple Mac开始工作。

不知道上面的工作在为Javascript提供替代方案方面有多好,但乍一看它看起来很酷。潜在地,这将允许人们在浏览器的沙箱中本地使用任何Java或.Net框架。

至于安全性,如果语言在JVM(或.Net引擎)内部运行,VM将负责安全性,因此我们不必担心 - 至少不会超过我们应该的在浏览器中运行的任何内容。

答案 13 :(得分:3)

你如何定义最佳?最适合浏览器,还是最适合开发人员? (加上ECMAScript与Javascript不同,但这是技术性的。)

我发现JavaScript可以同时强大而优雅。不幸的是,我见过的大多数开发人员都把它视为必要的邪恶,而不是真正的编程语言。

我喜欢的一些功能是:

  • 将职能视为一等公民
  • 能够随时向任何对象添加和删除功能(虽然不是很有用但是很有意思)
  • 这是一种动态语言。

处理它很有趣并且已经确立。享受它,因为它可能不是客户端脚本的“最佳”,它肯定是愉快的。

我同意在制作动态页面时因浏览器不兼容而令人沮丧,但这可以通过UI库来缓解。这不应该是针对JavaScript本身而不是Swing应该针对Java。

答案 14 :(得分:3)

这是一个很酷的主意。为什么不进一步呢?

  • 以相同的VM语言编写HTML解析器和布局引擎(确实是浏览器中的所有复杂位)
  • 将引擎发布到网络
  • 提供页面,声明要使用的布局引擎及其URL

然后我们可以向浏览器添加功能,而无需将新浏览器推送到每个客户端 - 相关的新位将从Web动态加载。我们还可以发布新版本的HTML,而没有保持与浏览器中所有功能的向后兼容性的荒谬复杂性 - 兼容性是页面作者的责任。我们还尝试使用HTML以外的标记语言。当然,我们可以将精美的JIT编译器编写到引擎中,这样您就可以用您想要的任何语言编写网页脚本。

答案 15 :(得分:3)

JavaScript是浏览器的标准虚拟机。例如,OCaml和Haskell现在都有可以输出JavaScript的编译器。限制不是JavaScript语言,限制是可通过JavaScript访问的浏览器对象,以及用于确保您可以安全地运行JavaScript而不会损害您的计算机的访问控制模型。当前的访问控制非常糟糕,出于安全原因,JavaScript只允许非常有限地访问浏览器对象。 Harmony项目正在寻求解决这个问题。

答案 16 :(得分:2)

这是一个非常好的问题。

这不仅仅是JS中的问题,因为缺少用于在JS中开发更大程序的良好免费IDE。我只知道一个免费的:Eclipse。另一个好的是微软的Visual Studio,但不是免费的。

为什么它是免费的?如果网络浏览器供应商希望用在线应用程序(他们想要)替换桌面应用程序,那么他们必须给我们,程序员,好的开发工具。使用简单的文本编辑器,JSLint和内置的Google Chrome调试器,您无法生成50,000行JavaScript。除非你是一个macohist。

当Borland于1987年为Turbo Pascal 4.0制作IDE时,这是一场编程革命。 24年过去了。可耻的是,在2011年,许多程序员仍然不使用代码完成,语法检查和适当的调试器。可能是因为很少有好的IDE。

如果网络浏览器供应商希望我们构建可以与Windows,Linux,MacOS,iOS,Symbian等竞争的应用程序,那么为程序员制作适当的(免费)工具符合他们的利益。

答案 17 :(得分:2)

可能,但为了做到这一点,我们需要让主流浏览器支持它们。 IE支持将是最难获得的。使用JavaScript是因为它是唯一值得信赖的东西。

答案 18 :(得分:2)

检查出来http://www.visitmix.com/Labs/Gestalt/ - 让你使用python或ruby,只要用户安装了silverlight。

答案 19 :(得分:2)

嗯,我们已经有了VBScript,不是吗?等等,只有IE支持它! 您对VM的好主意也一样。如果我使用Lua编写页面脚本,并且您的浏览器没有解析器将其转换为字节码怎么办?当然,我们可以想象一个脚本标签接受一个字节码文件,甚至是非常有效的 但经验表明,很难为网络带来新的东西:采用像这样的激进的新变化需要数年时间。有多少浏览器支持SVG或CSS3?

旁边,我看不到你在JS中发现的“脏”。如果由业余爱好者编码,传播在其他地方复制的不良做法,它可能是丑陋的,但是大师们表明它也可以是一种优雅的语言。有点像Perl:通常看起来像混淆的语言,但可以完全可读。

答案 20 :(得分:2)

我所谈到的绝大多数关于ECMAScript等的开发者。人。最后承认问题不是脚本语言,它暴露的是荒谬的HTML DOM。将DOM和脚本语言混淆是ECMAScript的痛苦和挫折的常见根源。另外,不要忘记,IIS可以使用JScript进行服务器端脚本编写,而Rhino之类的东西允许您在ECMAScript中构建独立的应用程序。尝试使用ECMAScript在这些环境中工作一段时间,看看你的意见是否有所改变。

这种绝望已经持续了一段时间。我建议您编辑此内容以包含或重新发布特定问题。你可能会对你得到的一些解脱感到惊喜。

旧网站,但仍然是一个很好的起点:Douglas Crockford's site

答案 21 :(得分:1)

也许您正在寻找Google的原生客户端。

答案 22 :(得分:1)

从某种意义上说,在浏览器中使用像Javascript这样更具表现力的语言而不是像Java字节码那样更通用的语言意味着更开放的网络。

答案 23 :(得分:1)

实际上,Javascript是任何浏览器长时间使用的唯一语言,因此虽然使用其他语言会非常好,但我看不到它。

你所谈到的这个“标准化虚拟机”非常庞大,需要被所有主流浏览器采用,大多数网站都会继续使用Javascript,因为它比其他许多浏览器更适合网站。

您必须对此VM中的每种编程语言进行沙箱化,并减少每种语言对系统的访问量,这需要对语言进行大量更改,并删除或重新实现许多功能。虽然Javascript已经考虑到了这一点,并且已经做了很长时间。

答案 24 :(得分:0)

......你的意思是......

Java和Java applet Flash和Adobe AIR 等。

一般来说,任何RIA框架都可以满足您的需求;但对于每一个人来说,使用它都需要付出代价(例如,运行时可以在浏览器或/和专有设备上使用或/和比纯桌面更少的选项) http://en.wikipedia.org/wiki/List_of_rich_internet_application_frameworks

对于使用任何非网络语言开发Web,您需要GWT:开发Java,编译为Javascript

答案 25 :(得分:0)

我不认为你“理解JavaScript是我们现在必须使用的实际问题”。实际上它是非常强大的语言。您在浏览器中使用Java applet多年了,现在它在哪里?

无论如何,你不需要“弄脏”在客户端上工作。例如,尝试GWT。

答案 26 :(得分:0)

因为它们都有具有字节码解释器的VM,并且字节码也是不同的。 {Chakra(IE),Firefox(SpiderMonkey),Safari(SquirrelFish),Opera(Carakan)。

抱歉,我认为Chrome(V8)可编译为IA32机器代码。

答案 27 :(得分:0)

我认为这是不那么容易的问题。我们可以说我们坚持使用JS,但jQuery,Prototype,scriptaculous,MooTools以及所有出色的库真的很糟糕吗?

请记住,JS是轻量级,对于V8,TraceMonkey,SquirrelFish来说更是如此 - 现代浏览器中使用的新Javascript引擎。

它也证明 - 是的,我们知道它有问题,但我们已经解决了很多问题,比如早期的安全问题。映像允许您的浏览器运行Ruby代码或其他任何东西。安全沙箱必须做好刮擦。你知道吗? Python人已经失败了两次。

我认为随着时间的推移,Javascript会被修改和改进,就像HTML和CSS一样。这个过程可能很长,但在这个世界上并非一切皆有可能。

答案 28 :(得分:0)

好吧,考虑到所有浏览器已经在使用VM,我认为为Web制作VM语言并不难。
我认为这会很有帮助,原因如下:
1.由于服务器会编译代码,因此发送的数据量较小,并且客户端不会花很多时间编译代码。
2.由于服务器可以在准备过程中编译代码并将其存储,与客户端尝试花很少的时间快速编译JS的客户端不同,它可以进行更好的代码优化。
3.将语言编译为字节码比将其编译为JS更容易。

作为最后的注释(正如某人在另一条评论中已经说过的那样),HTML和CSS会编译为一种更简单的语言,不确定是否将其视为字节码,但是您也可以将已编译的html和css从服务器发送到减少解析和获取时间的客户端

答案 29 :(得分:-1)

IMO,JavaScript,语言,不是问题。 JavaScript实际上是一种富有表现力和强大的语言。我觉得它的代表很糟糕,因为它没有经典的OO功能,但对我来说,我越喜欢原型槽,我就越喜欢它。

我认为这个问题是我们不得不在网络上支持的众多浏览器中的不稳定和不一致的实现。像jQuery这样的JavaScript库可以大大减轻这种肮脏的感觉。

答案 30 :(得分:-2)

JavaScript是您唯一可用的原生标准选项。如果你想要很多功能,那就抓住jQuery,但是如果你需要做更多的事情,可以考虑为Firefox编写一个插件吗?或类似的IE等。

答案 31 :(得分:-3)

那么你在浏览器中对所有Pythons和Rubys做了什么?!

1)。还在编写脚本化的客户端应用程序吗?嗯,用JavaScript做得很好。

2)。使用套接字编写客户端 - 服务器应用程序为什么不在没有浏览器的情况下编写它们呢?

3)。编写独立应用程序?就像你现在一样做。