不妨先来打量一下JavaScript。JavaScript是唯一至今主流且基于原型的语言,虽然说支持面向对象,但是无论是封装、继承、多态,实现起来总需要用到一些tricky的办法,而且也不甚完美。事实上,为了抢市场,从1995年JavaScript设计完成到发布,只有短短的7、8个月的时间,极度缺乏谨慎的语言特性和规范的评估。而和微软JScript的竞争,使得EcmaScript标准仓促问世,这些都是JavaScript存在诸多缺陷的重要因素。
不止如此,Google认定,JavaScript的缺陷难以以改良的方式被修复,必须革命。那么都有哪些缺陷呢?推荐大家去阅读《Using JavaScript as a Real Programming Language》,作者是曾经SUN公司的Tommi Mikkonen和Antero Taivalsaari。我挑选互联网上热议的几条观点说说:
-
语法过于松散。JavaScript对于错误的兼容性很好,不到迫不得已的时刻不随便抛出异常,这有时候会让问题定位变得困难。代码随意性很强,可以实现类和对象的封装效果,也可以随意放置全局变量、全局方法,命名污染、冲突和覆盖问题难以发现。还有像JSDoc等第三方组件用于提供额外的契约来帮助提升代码规范和约束性,但这样的契约并非来自语言本身,而是在注释中。另外,语法过于松散也使得性能提升变得较为困难。
-
缺乏模块化能力。有一些框架专门致力于解决这个问题(比如sea.js),但是语言本身未能从语法语义上提供import和cascade的依赖能力,也缺乏按需加载的能力(按需加载请参见Java的类加载机制)。缺乏模块化能力直接影响到大型项目的构建,我们不得不引入诸多框架和约束来保证大型项目在JavaScript部分的顺利进行。
-
核心库的不完备性。这点会在HTML5中逐步得到改善。JavaScript已经逐渐跳出客户端页面元素显示和行为的原本职工作了,现在可以做到更多的事,比如涉及网络、图像处理、声音处理、线程处理等等。不完备表现的另一方面就是常规操作的复杂性,比如对DOM的操作我们不得不借由JQuery等等JavaScript第三方库来帮助简化DOM操作和绑定的行为。
- JavaScript的编程语言范型不明确。它的编程模型和传统的C++、Java大相径庭。为何前后端的编程要分离开来,这是原因之一,也是让诸多前端工程师难受过的壁垒之一。
事实上,Google对于JavaScript缺陷是相当有发言权的,Ajax的兴起,靠的就是Gmail等几个Google标志性服务的功劳。为了改善JavaScript解释的性能,V8引擎通过统计学对JavaScript执行的分析,强化了JIT编译能力,发布后Chrome就一下在性能上击垮了其它浏览器,把浏览器的纷争从功能上拉到性能上,这才有其它浏览器纷纷跟上的故事,比如IE的Chakan引擎,苹果的Safari Nitro引擎等等。
推荐大家去看看Google对Dart的宣传视频(YouTube的链接在此,需要翻x墙),Dart的目标被概括为一句话:
Dart helps developers from all platforms build complex, high performance client apps from the modern web.
这里正好提及了JavaScript的三个软肋:跨平台/浏览器表现的一致性,对复杂应用的支持,以及性能。
官方说明中Dart的关键特性也包括了一些对JavaScript缺陷的修复:
- 语言层面上支持类和接口,帮助封装和重用。
- 支持可选类型,用户可以像JavaScript一样写弱类型的定义,也可以确定类型。你可以写出动态语言风格的代码,也可以写出类似于传统静态风格的代码。
- 对库的良好支持。
- 开发工具上的增强,尤其对于Dart虚拟机下运行的场景,开发工具可以做出更多更好的支持。
可是,如果你仅仅把Dart当做JavaScript修复缺陷的替代品,那你就太小看Google的野心了(关于Google在Dart上的的野心,请参见这篇文章)。Google一向对那些传统和主流的东西有敢于挑战的勇气,虽然不见得总是能够成功。不妨看看Go语言,它的诞生就是要挑战传统的C语言,在保持甚至增强C语言的性能优势的基础上,填补了C语言的一些大坑,比如类型不安全、对并发和通信支持较弱等等。可是Go的目标并不仅仅在C当前的领域,它虽然不想完全替代C,但也不想仅限于替代C,Go语言的网站就是用Go写成,可见它被寄希望的应用领域要广阔得多。
类似地,Dart的价值不仅仅在于语言层面,否则它就是第二个CoffieScript;面对纷繁复杂的浏览器,它更希望在虚拟机层面做到统一,就像Java做到的那样。因此,Dart能够转化成JavaScript仅仅是一个长期战略过程中让变化显得不那么突兀的步骤之一(参见当年Office要在中国干掉WPS,类似的做法,先兼容WPS文件,等到条件成熟,再放弃对WPS文件的兼容),毕竟程序员在JavaScript和Dart的选择上,拥有主导权。
不过需要看到的是,Dart2JS做得还远不够好,一段hello world的代码生成的JavaScript未压缩代码可以有几千行,这方面Dart的团队正在优化。例如引入tree shaking技术,简言之就是遍历代码后,寻找那些JavaScript中没有被使用的方法,并删除之。
另一方面,Dart还希望做到服务端和客户端的统一。事实上,只有Node.js或者GWT等等少数情况下能够做到这一点,而Dart本身就支持在浏览器或者命令行下运行,Dart虚拟机可以帮助你屏蔽掉这些差异。
在计划实施上,除了明确的“跳蛙战略”,Dart提供了完备的环境和组件,官方称之为“batteries included”,包括库、VM、IDE、浏览器集成和DartJS的编译器等等。

在此多了解一下Dart VM。Dart VM并非像JVM一样基于字节码的,而是没有中间代码,直接基于Dart语言本身的。基于字节码的好处在于开发者可以自行选择喜好的语言,最终编译成统一的字节码。除了Java,Scala、Groovy、Clojure等等都是在基于字节码的虚拟机上跑的,可是看看JVM,似乎就是为了Java而生的,其它语言要在JVM层面上做额外的优化就很困难(这也是一些人提出“Java快死了,但是JVM还活着”这样的观点时,我对于JVM部分的担忧)。如果是语言本身级别的虚拟机,就没有这个问题。
虚拟机常常存在启动缓慢的问题,一方面是VM本身需要启动时间,另一方面VM对于加载的代码需要经过预处理、解析、校验、初始化等等过程,为了缓解这一问题,Dart VM提供了堆快照功能,在某个时刻下,遍历应用程序堆并将所有的对象写入文件,而在以后的Dart Vm启动时,直接把这个文件dump到内存中以提高启动速度。实际上,Dart实例运行时和JavaScript类似,都是单线程的,因此它在当前执行环境的保存上,有了协程(coroutine)处理的经验,变得比较容易。而且堆快照看起来不算什么特别大的技术创新,本身也是从Smalltalk的映像中学来的,另外V8引擎也早就引入了快照功能。
很难说Dart挑战JavaScript的故事谁能获得胜利,但是可以看到的是,Google在和传统技术的大战中,表现出来的野心,还有对标准的争夺。但是JavaScript天生的缺陷,注定它要在不久后的某一天,被某个替代者逐渐蚕食,无论这个替代者是不是Dart。
文章系本人原创,转载请注明作者和出处
注:本博客已经迁移到个人站点 http://www.raychase.net/ ,欢迎大家访问收藏,本ITEye博客在数日后将不再更新。
分享到:
相关推荐
JavaScript 的历史包袱和 Dart 语言的出现 JavaScript 作为一门脚本语言,具有悠久的历史,自 Netscape 时代起步,逐步壮大,直到 AJAX 的兴起,JavaScript 成为网络应用的核心语言。然而,JavaScript 同时也存在...
Dart 编译器 ANTLR 是一个用于将 Dart 代码转换为其他语言的工具,尤其在描述中留下的(???)可能表示它能转换成多种目标语言。ANTLR 是一个强大的解析器生成器,广泛用于构建语言、工具和框架。在这个上下文中,...
只要你曾经进行过程序开发,就一定可以快速上手Dart。其简洁明了的特点,让代码更具可读性,将大大提高程序员的编程效率。 Dart语言的优势特点在于其能轻松满足多种开发方案的需要。无论是简单的单人的项目开发,...
Dart是一种由Google开发的高性能、现代的、面向对象的编程语言,它的设计目标是提供一个高效的开发平台,尤其在Web应用开发领域,旨在替代JavaScript并与其无缝集成。Dart的出现是为了应对JavaScript的一些局限性,...
2. Dart编译器:包括dart2js(将Dart代码编译为JavaScript,以便在Web上运行)和dart2native(将Dart代码编译为原生机器码,提升运行性能)。 3. DevTools:一套强大的开发者工具,包括用于调试、性能分析、内存管理...
2. **dart2js**:这是一个编译器,将Dart源代码转换为JavaScript,使得Dart应用程序能在Web浏览器中运行。 3. **dartfmt**:这是一个代码格式化工具,保持代码风格的一致性,提升团队协作效率。 4. **pub**:Dart...
1. **导入库**:在Dart代码中,你需要导入`dart:convert`库来处理JSON数据。这个库提供了`json`对象,包含了`decode`和`encode`方法,分别用于将JSON字符串解析为Map或List,以及将Dart对象编码为JSON字符串。 2. *...
- 解压下载的dart-sdk压缩文件到你选择的目录。 - 将dart-sdk/bin路径添加到系统的PATH环境变量中,这样可以在命令行中直接运行Dart工具。 - 验证安装是否成功,打开命令提示符,输入`dart --version`,如果显示...
Dart是Google推出的一种面向现代Web和移动应用的高性能、...一旦这些步骤完成,你就可以开始编写Dart代码,探索这个语言的丰富特性和强大的库,如AngularDart、Flutter等,它们能帮助你构建高效、美观的Web和移动应用。
Dart SDK 2.4 是 Dart 语言的一个重要版本,它为开发者提供...如果你正在使用 `flutter_deer-master` 项目,这通常意味着你可能在使用 Flutter 框架进行开发,因此了解 Dart SDK 2.4 的这些改进将对你的工作大有裨益。
1. **获取Dart SDK**:首先,你需要从Dart官网或者通过提供的压缩包`dart-sdk`下载最新的Dart SDK。这个压缩包包含了运行和开发Dart程序所需的所有工具,如dart2js编译器、dartfmt代码格式化工具、dartdoc文档生成器...
**Dart编程语言详解** ...通过系统学习,你将能够熟练运用Dart开发高效、健壮的应用程序,无论是在Web、移动还是服务器端领域。同时,Dart的语法简洁且现代化,易于理解和编写,这将使你的开发工作变得更加愉快和高效。
Dart is a class-based, object-oriented language that simplifies the development of structured modern apps, scales from small scripts to large applications, and can be compiled to JavaScript for use in...
在实际开发中,Dart2Json插件可以集成到你的开发环境,如Visual Studio Code或IntelliJ IDEA,通过快捷键或右键菜单操作,快速生成Dart类,提高开发效率。 总的来说,Dart2Json插件是Dart开发者不可或缺的工具,它...
dart编译器,可以将Dart代码转换为JavaScript或原生代码;还有dartdoc,用于生成API文档;以及dartfmt,用于代码格式化。 3. **Dart编译模式**:Dart有两种主要的编译模式:AOT( Ahead-Of-Time compilation)和JIT...