it-swarm.cn

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

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

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

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

166
newdayrising

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

我怀疑,它将成为网络的“机器语言”,其他更好的设计语言和API编译到它(并迎合不同的运行时引擎缺点)。

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

28
Adam Wright

我认为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

我想我们将长期使用JavaScript,但这迟早会改变。有很多开发人员愿意在浏览器中使用其他语言。

19
Manuel Ceron

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

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

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

  • 你的稳定性落后了。
  • 你落后于复杂性(方式,方式,背后因为你试图推广多种语言)
  • 在采用方面你落后了

所以,不,它没有意义。

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

在功能方面,我们可能只是 真的 无论如何使用DOM,所以这实际上是一个语法和语言的问题,在这一点上,它确实有意义,“这真的值得它?”

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

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

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

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

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

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

这没有意义。

18
the happy moron

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

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

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

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

14
bobince

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

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

已经存在一些编译为JavaScript的实验语言,但是定义VM会(可能)允许更好的性能。

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

12
Aivar

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

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

10
user4903

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

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

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

7
Jeremy Bell

虽然Javascript是唯一可以直接控制页面的受到良好支持的脚本语言,但Flash为更大的程序提供了一些非常好的功能。最近它有一个JIT,并且还可以动态生成字节码(检出 运行时表达式评估 例如,他们使用flash将用户输入数学表达式一直编译为本机二进制)。 Haxe语言为您提供了带有推理的静态类型,并且您可以使用字节码生成功能实现您选择的几乎任何运行时系统。

6
jjrv

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

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

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

广告A.

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

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

广告B.

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

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

广告C.

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


除此之外:

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

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

5
stefs

快速更新这个老问题。

每个肯定“网页都包含字节代码而不是像JavaScript这样的高级语言”的人都不会发生。

2015年6月 W3C announce WebAssembly

一种新的便携式,大小和加载时间有效的格式,适合编译到Web上。

这仍然是实验性的,但是在Firefox和Chrome Canary中已经有一些原型实现,并且已经 一些演示工作

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

随着WebAssembly的发展,它将支持比C/C++更多的语言,我们希望其他编译器也支持它

我让你仔细看看 官方页面 项目,这真是令人兴奋!

5
Quentin Roy

你的推理有一些错误。

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

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

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

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

4
ydebilloez

确实。 Silverlight实际上只是一个客户端基于.Net的VM。

4
redcalx

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

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

我喜欢的一些功能是:

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

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

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

3
Rontologist

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

3
naasking

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

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

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

3
p-static

我会欢迎除了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将负责安全性,所以我们不必担心 - 至少不会更多我们应该在浏览器中运行任何东西。

3
Gerbrand

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

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

2
PhiLho

这个问题问得好。

这不仅仅是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等竞争的应用程序,那么为网络浏览器供应商制作适当的(免费)工具是符合他们的。

2
user561168

看看这个 http://www.visitmix.com/Labs/Gestalt/ - 允许你使用python或Ruby,只要用户安装了silverlight。

2
mcintyre321

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

2
Jeff Olhoeft

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

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

一个古老的网站,但仍然是一个很好的起点: Douglas Crockford的网站

2
Dustman

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

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

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

1
HappySmileMan

也许您正在寻找Google的Native Client。

1
Ebrahim Mohammadi

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

1
Grav

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

对不起,我认为Chrome(V8)编译为IA32机器代码。

0
Stephen

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

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

0
Marko Dumic

... 你的意思是...

Java和Java applet Flash和Adobe AIR等。

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

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

0
obesga

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

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

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

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

0
Paweł Hajdan