JavaScript的替代方案

151

目前在浏览器中,唯一得到全面支持且成为DOM树操作的事实标准的语言是JavaScript。它看起来存在深层次的设计问题,使得对于新手来说,它会成为错误和安全漏洞的雷区。

你是否了解任何现有或计划中的倡议,旨在引入一种更好(重新设计过的)语言,用于下一代浏览器中的DOM树操作和HTTP请求?如果是,请问它被整合进Firefox的路线图是什么,如果不是,除了互操作性之外,为什么JavaScript应该是浏览器平台上唯一受支持的语言呢?

我已经使用过jQuery,并阅读了《JavaScript高级程序设计》。这些建议确实很好,但我无法理解的是:为什么只有JavaScript?在服务器端(您喜爱的操作系统平台)上,我们可以使用任何语言来操作DOM树,甚至是Fortran。为什么客户端(浏览器平台)只支持JavaScript呢?


4
谷歌Dart、Script#、CoffeeScript、JSX(JavaScript的两种不同实现)、JavaScript Harmony等都是编译成JavaScript的语言。请参考此链接获取更多信息:https://github.com/jashkenas/coffee-script/wiki/List-of-languages-that-compile-to-JS - nawfal
2
为什么只有JavaScript?在服务器端(您最喜欢的操作系统平台)上,我们可以使用任何语言操纵DOM树,甚至是Fortran。为什么客户端(浏览器平台)只支持JavaScript?在服务器端,您可以安装任何您想要的东西,但我无法强制您的客户安装其他插件/附加组件。此外,如果我们在JavaScript中有这么多错误和安全问题,那么如果我们再添加几个,我们会有多少错误和安全问题呢? - Peter
6
@Peter,我不确定你的论点是认真的还是开玩笑。如果有一个可替代JavaScript且良好运作的选项,商业服务提供商会要求用户下载必要的内容来运行它,就像他们一直以来对Flash和一段时间内对Silverlight所做的那样。在所有可能导致客户端没有出现替代品的原因中,确保用户拥有你的平台并不是一个重要的原因。安装平台对人们来说非常容易。 - ely
1
@ely:结果怎么样?Flash?Java小程序?Silverlight?我甚至从未安装过Silverlight的实例。 - Sebastian Mach
@SebastianMach 是的,这些第三方运行时非常出色,为它们的母公司带来了很多市场份额和回报。事实上,我认为DRM技术可能是单个最成功(从企业角度)的运行时框架,而且它的存在比以往任何时候都更加重要,在浏览器和其他地方都有应用。关于这一论点需要考虑的另一件事是,任何人都可以制作一个浏览器运行时环境来操作DOM。只是用不同的语言变体做这件事并不值得。Javascript仅仅是意外赢得了这场争夺。 - ely
@ely:是的,网站所有者可能会因其运行时间而获得报酬。但是Flash对于小型实体店是否有所回报呢?这些网站很昂贵,无法被搜索引擎索引,现在经常出现故障。当即使我社交圈中的非IT人士抱怨“呃,Flash……好吧,那我就去找另一个”,那么它可能不是适合古老商店的正确技术。 - Sebastian Mach
18个回答

46

JavaScript本身并没有问题 - 它是一种完全良好的原型和动态语言。如果你来自面向对象的背景,那么可能需要花费一点时间学习,但这不是语言本身的错。

大多数人认为Javascript与Java相似,因为它们有类似的语法和名称,但实际上它更像Lisp。它非常适合用于DOM操作。

真正的问题在于浏览器编译它,这意味着它的工作方式取决于客户端而异。

不仅实际的DOM因浏览器而异,性能和布局也有很大差别。


根据问题的澄清编辑

假设支持多种解释型语言 - 你仍然会遇到同样的问题。各种浏览器仍然会存在错误并且具有不同的DOM。

此外,你必须在每种语言的浏览器中内置一个解释器或以某种方式安装为插件(在提供页面之前进行检查),这需要很长时间才能使Javascript保持一致。

你不能以相同的方式使用编译型语言 - 这样你就引入了一个难以轻易审查其执行内容的可执行文件。许多用户会选择不运行它。

那么编译代码的某种沙盒呢?对我来说,听起来像是Java Applets。或者Flash中的ActionScript。或者Silverlight中的C#。

那么某种IL标准呢?这有更大的潜力。用任何语言开发,然后将其编译为IL,浏览器 JITs 它。

除了,Javascript已经是那个 IL - 看看GWT。它允许你使用Java编写程序,但作为HTML和JS进行分发。


根据问题的进一步澄清编辑

JavaScript不是,或者说曾经不是,浏览器唯一支持的语言:在Internet Explorer的黑暗年代,你可以在IE中选择使用JavaScript或VBScript。技术上,IE甚至并没有运行JavaScript - 它运行的是JScript(主要是为了避免向Sun支付“java”这个词的费用,Oracle仍然拥有“JavaScript”的名称)。

问题在于,VBScript是专有的Microsoft技术,而且它本身也不是很好。尽管JavaScript在其他浏览器(如FireBug)中添加功能并获得顶级调试工具,但VBScript仍然只能在IE中使用,并且几乎无法调试(IE4/5/6中的开发工具根本不存在)。同时,VBScript还扩展成为操作系统中相当强大的脚本工具,但这些功能在浏览器中都不可用(当它们可用时,它们成为了巨大的安全漏洞)。

仍然有一些公司内部应用程序使用VBScript(有些依赖这些安全漏洞),它们仍在运行IE7(他们只停止使用IE6是因为微软最终将其淘汰了)。

让JavaScript达到目前的状态是一场噩梦,并花费了20年的时间。它仍然没有一致的支持,在某些浏览器中缺少语言特性(在1999年规定),需要大量的shim来补充。

向浏览器添加另一种解释语言面临两个主要问题:

  • 让所有浏览器厂商实现新的语言标准 - 他们20年来仍未能做到这一点,即使对于JavaScript。

  • 第二种语言可能会削弱您已经拥有的支持,例如允许IE拥有次等的JavaScript支持,但VBScript的支持很好(再次)。我真的不想为不同的浏览器编写不同语言的代码。

需要注意的是,JavaScript并不是“完成”的 - 它仍在不断发展,以在新的浏览器中变得更好。 最新版本比浏览器的实现要领先几年,而且他们正在开发下一个版本。


5
我会说它是由浏览器“解释”,而非“编译”。 - Flavius Stef
20
新版本的浏览器会对JavaScript进行即时编译(JIT compilation)。 - Nosredna
4
我已经搜索了“jit claim”的相关信息,结果表明Firefox 3.1将内置支持该功能。请访问http://andreasgal.com/2008/08/22/tracing-the-web/ 或 http://people.mozilla.com/~schrep/tm-image-adjustment.swf查看详情。 - Flavius Stef
2
V8 JavaScript 引擎(Chrome)直接编译。 - Dave W. Smith
4
我强烈不同意你的第一个回答“JavaScript的问题并不在于语言本身”。我认为它在语法上是一种非常丑陋的语言,缺少大多数其他语言所具备的特性。这些特性至少对于我而言,在大型应用程序中仍然是必需的(如加载依赖项、易读的面向对象原则)。如果我们现在重新开始做(互联网),我不认为JavaScript会是最好的语言选择。 - Len
显示剩余17条评论

29

编译成Javascript

目前来看,使用一种可以编译成Javascript的语言似乎是实现在所有平台上编写更智能代码的唯一现实方式,而且这种情况可能会长期存在。对于任何新的提供方案,总会有一些原因使得一个或多个供应商不会急于推出它。

(但我并不认为这是一个问题。Javascript现在已经被很好地优化了。如果手写机器码也是不安全的,但作为编译目标和执行语言却可以正常工作。)

如此多的选择

有越来越多的语言可以编译成Javascript。你可以在这里找到一个相当全面的列表:

值得注意的

我将提到一些我认为值得注意的语言(同时无疑忽略了一些我不知道的宝石):

  • Spider于2016年出现。它声称吸取了Go、Swift、Python、C#和CoffeeScript的最佳思想。它没有类型安全,但确实有一些较小的安全功能

  • Elm:Haskell可能是最聪明的语言,而Elm是一种基于JavaScript的Haskell变体。它高度类型感知且简洁,并提供函数响应式编程作为对响应式模板或MVC混乱的一个不错的替代方案。但对于过程式程序员来说,可能会是一种震撼

  • 谷歌的Go旨在简洁、简单和安全。Go代码可以通过GopherJS编译成JavaScript。

  • Dart是谷歌后来试图取代JavaScript的尝试。它通过类似于C/Java的语法提供接口和抽象类,可选类型。

  • Haxe类似于Flash的ActionScript,但它可以针对多种语言,因此您的代码可以在Java、C、Flash、PHP和JavaScript程序中重用。它提供类型安全和动态对象。

  • Opalang将语法糖添加到JavaScript中,以提供直接数据库访问,智能续集,类型检查并帮助客户端/服务器分离。(与NodeJS和MongoDB相关联。)

  • GorillaScript"一种编译到JavaScript的语言,旨在授权用户,同时尝试防止一些常见错误。"类似于Coffeescript,但更全面,提供了一堆额外的功能,以增加安全性并减少重复的样板模式。

  • LiteScript介于Coffeescript和GorillaScript之间。它为“内联”回调提供了异步/产出语法,并检查变量拼写错误。

  • 微软的TypeScript是JavaScript的一个小超集,允许您在函数参数上放置类型限制,这可能会捕获一些错误。同样,BetterJS允许您应用限制,但在纯JavaScript中,通过添加额外的调用或在JSDoc注释中指定类型来实现。现在Facebook提供了Flow,它还执行类型推断。

  • LiveScript是Coffeescript的一个衍生版本,因其简洁而受欢迎,但我认为它看起来不太可读。可能不是最适合团队的选择。

如何选择?

选择另一种编程语言时,需要考虑以下因素:

  • 如果未来其他开发人员加入项目,他们学习这种语言需要多长时间,或者他们已经熟悉该语言的可能性有多大?

  • 该语言是否功能过少(代码仍将充满样板),或者功能过多(需要很长时间才能掌握,并且在此之前一些有效的代码可能无法理解)?

  • 它是否具有您项目所需的功能?(您的项目是否需要类型检查和接口?是否需要智能连续体以避免嵌套回调地狱?是否存在大量反应性?它是否需要针对其他环境?)

未来...

Jeff Walker写了一系列引人深思的博客文章,关于“Javascript问题”,包括为什么他认为既不是TypeScript,也不是DartCoffeescript提供了足够的解决方案。在结论中,他建议一些改进语言的理想特性。

ES6通过一系列功能扩展了Javascript,使得类的定义更加清晰,并且可以通过生成器实现“内联异步”。但仍然是动态类型! - joeytwiddle
Elm的方法类似于Nitrogen或N2O(erlang框架),这就是我喜欢它的原因。 - DenisKolodin
现在我们在ES8和TypeScript中拥有了一些CoffeeScript的语法糖,以及async-await。 TypeScript在我的工作场所防止了很多错误,尽管仍然存在一些意外的机会! - joeytwiddle
现在还有Wasm,它允许其他各种语言在浏览器中运行。但是与DOM的通信仍然通过JavaScript进行。 - joeytwiddle

22

浏览器平台上只应支持JavaScript吗?

答案是肯定和否。谷歌推出了一种名为Dart的替代语言,它可以编译成JavaScript,就像jQuery一样,试图使DOM操作更加简单易用。如果你感兴趣,可以尝试一下。

另外还有:


15

的确,曾经JavaScript非常难处理,但随着网络开发社区的发展,情况已经有了很大改观。我建议您看看jQuery。它易于使用,可以将各种问题抽象化处理。

实际上并没有通用的替代方案。Flash可能会想到,但那也是ECMA脚本语言,对于大多数事情来说可能过于复杂了。


1
或者MooTools、Prototype和Dojo。http://jqueryvsmootools.com是一个很好的比较MooTools和jQuery的网站。 - Ryan Florence
JavaScript 本身并没有什么问题。您可能指的是 IE 的 JScript 以及各种浏览器的渲染问题和不一致性。 - Gavin

7

短期内,我会使用jQuery等技术来隐藏浏览器不兼容性。长期来看,像Silverlight或Adobe AIR这样的技术可能会使这个问题变得非常不同(但仍然是一个问题)。


1
使用jQuery隐藏浏览器不兼容性是个好主意。我读过一本书,解释了其中一些机制的工作原理,相信我,jQuery在这方面为程序员节省了很多麻烦。 - Vivian River
1
回顾技术答案总是一种奇怪的视角。现在我们知道,Web 赢了:Silverlight、Flash 和 Air 都已经死亡,剩下的胜利者是 JavaScript 以其所有奇妙和神秘的变化形式。 - oligofren

6

Doug Crockford 在Google发表演讲,详细介绍了JavaScript的优缺点以及其未来。自1999年以来,它实际上并没有太多改变——这可以说是一件好事情(只要你了解它们的限制,几乎所有浏览器都可以运行相同的代码),Doug展示了其中好的部分大多是被误解为非常强大的东西。

对于DOM操作,可以看看JQuery作为一个客户端库,用它替换大部分可怕的DOM API,将繁琐的操作转换为相当优雅的代码片段,更易于编写。


5
如果你认为JavaScript存在深层次的问题,我建议阅读道格·克罗福德(Doug Crockford)的书籍《JavaScript语言精粹》。(或者搜索"Crockford JavaScript"找到他做过的几个视频演讲。) 克罗福德概述了一组安全子集和实践,并明确列出了一些应避免使用的语言部分。
我不知道有没有计划用其他方式来操作DOM以取代JavaScript作为事实上的标准。所以最好学会安全地和好地使用它。

1
请再读一遍。很明显他在阅读答案后编辑了他的问题。 - Dave W. Smith

4

在客户端方面,Javascript是操作DOM的唯一途径。在服务器端方面,则有许多种方法。


4

Internet Explorer支持可插拔的脚本语言,除了JScript之外,VBScript是IE唯一可靠的脚本语言。

就我所见,浏览器中似乎存在对动态语言的普遍偏好,而JavaScript似乎足以满足这种需求,以至于网络效应使得任何其他语言都无法启动。虽然其在浏览器中的实现仍有很多不足,但该语言实际上非常强大。


1
不要在IE中使用VBScript - 它是一种可怕的VB变体,大型MS认为它会起飞,但实际上它并不像普通的VB或VBScript那样工作,并且比Javascript慢。 - Keith
1
WebKit或Gecko的JavaScript/ECMAScript实现中缺少哪些在非浏览器实现中可用的功能?那个评论对我来说完全令人困惑。 - eyelidlessness

4

如果你愿意将你的客户/访客限制在特定的浏览器上,并可能愿意要求他们安装插件,那么可以考虑使用 MS Silverlight -- 一个可读的概述位于 wikipedia。通过Silverlight 2,你可以在客户端运行你用C#、IronPython、IronRuby、VB.NET等编写的代码;来自Mono项目的免费Moonlight 克隆版本承诺将同样的功能带到Linux系统。

实际上,大多数Web应用程序和网站开发者更喜欢达到比Silverlight(最终包括Moonlight)当前能够提供的更广泛的受众群体 -- 这意味着坚持使用Javascript,或者可能是使用Flash(它使用类似的编程语言Actionscript)。

因此,即使对于拥有大量工程师和营销预算以及一个免费软件项目(可能有助于减轻专有锁定的担忧)的微软来说,获得其他任何东西的实质性心智份额、采用率和牵引力都证明是一场艰苦的战斗——这也可能解释了为什么Mozilla基金会等机构很少表现出推动这样一个目标的兴趣。你说:“除了互操作性”:但显然,就我们观察到的Silverlight的进展而言,互操作性问题是最重要的问题...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接