JavaScript 起源于 Netscape 公司的 LiveScript 语言,这是一种基于对象和事件驱动的客户端脚本语言,最初的设计是为了检验 HTML 表单输入的正确性。
早些年,JavaScript 由于其复杂的文档对象模型(DOM)、糟糕的实现和调试工具、不一致的浏览器实现而不受开发者的待见。而随着技术的发展, JavaScript 变得越来越的强大、完善,比如, Ajax 技术可以创建更加迷人的 Web 应用,Node.js 将 JavaScript 的应用范围扩展到了服务器端,各种层出不穷的框架使得 JavaScript 的开发更加简捷,尤其是近几年 HTML5 的出现,将 JavaScript 提升到了前所未有的高度。
如今 JavaScript 已经变成了 Web 开发必备的语言,甚至开始逐步向移动领域渗透,由于 JavaScript 的跨平台特性,使得它在移动互联网时代有更大的作为。
凡是可以用 JavaScript 来写的应用,最终都会用 JavaScript 来写。——Atwood 定律(Jeff Atwood 在 2007 年提出)
不会 JavaScript 怎么办?
如今 JavaScript 已经成为了 Web 开发的“标配”语言,不管你喜不喜欢,在 Web 开发中,必定要涉及到 JavaScript。JavaScript 可以实现真正的“一次编写,到处运行”,并可以控制所有常用的浏览器,因此,JavaScript 还被称作“Web 的虚拟机”以及“Web 上的汇编语言”。
尽管如此,但是如果你还没开始学习 JavaScript,这也不影响你编写 Web 应用。你完全可以用你喜欢的语言(Java、.NET、C/C++、Python、Ruby……)来编写应用程序,然后将它们编译为 JavaScript 语言,然后再运行于浏览器上。
如果你对 JavaScript 的语法不满意,你也可以使用一些 JavaScript 的增强版语言。比如,如果你更喜欢经典的面向对象方式,并想要一些语法糖,那么你可以试试 CoffeeScript;如果你希望有一个更严格的类型系统,那么你可能会发现 Dart 或 TypeScript 更有趣一些;如果你更喜欢函数式编程,那么 ClojureScript 或 Roy 可以帮助你。
将你擅长的语言编译为 JavaScript
将 Java 代码编译为 JavaScript
尽管 JavaScript 名字中包含“Java”,实际上 JavaScript 和 Java 没有任何关系,只是由于当时 Java 火得一塌糊涂,为了借助 Java 的名气来推广,就起名为 JavaScript 了。
各种强大的工具的出现,使得 JavaScript 代码和 Java 代码之间有了一定的联系,就是可以将 Java 代码编译为 JavaScript 代码,以便在浏览器中运行。当然,除了 Java 外,其他基于 JVM 的语言都可以如此做。
可以实现此类操作的工具如下。
将C/C++代码编译为 JavaScript
C/C++如今也可以用来编写 Web 应用程序,同样可以将它们编译为 JavaScript。一些工具如下。
由于 Emscripten 可以将 LLVM 二进制代码编译成 JavaScript,LLVM 是一种很流行的中间编译格式,几乎所有语言都有 LLVM 编译器,因此 Emscripten 也可以作为大部分语言转换为 JavaScript 的通用工具。
将 Python 代码编译为 JavaScript
可以使用如下工具将 Python 代码编译为 JavaScript 代码。
将 Ruby 代码编译为 JavaScript
在 Ruby 领域,有一个使用 JavaScript 实现的 Ruby 标准库—— RubyJS,它实现了 Ruby 中的所有方法,如 Array、Numbers、Time 等。Ruby 之父松本行弘称“如果我必须编写 JavaScript 代码,我会使用 RubyJS”。
另外,你也可以使用如下工具将 Ruby 代码编译为 JavaScript 代码。
将 .NET 代码编译为 JavaScript
你可以使用如下工具将C#、F#以及其他 .NET 代码编译为 JavaScript 代码。
将 Scala 代码编译为 JavaScript
你可以使用如下工具将 Scala 代码编译为 JavaScript 代码。
将 Flash 转换为 JavaScript
HTML5(HTML/JavaScript/CSS3 技术组合)的最大对手就是 Flash,尽管目前 Flash 的市场份额还高居 70%,但也不可否认,未来将是 HTML5 的天下。
就连 Flash 的开发商 Adobe 也开始拥抱 HTML5,并发布了 Toolkit for CreateJS 工具,方便 Web 开发者将 Flash 转换为 HTML5 格式。
去年,Google 曾发布了一套基于网页的的工具——Swiffy,在线即可将 SWF 格式的 Flash 文件转化为 HTML5 格式。
除了转换外,Mozilla 还推出了一个新的解决方案——Shumway,这是一个“基于 JavaScript 的 Flash 虚拟机和运行时”,目的是在浏览器中构建一个可靠有效的 SWF(Flash 文件格式)渲染器,无需插件直接在浏览器中运行 Flash。
由此可见,这些工具将进一步加速 HTML5 取代 Flash 的步伐。
其他编译工具
编译为 JavaScript 后的问题
调试问题
由于是交叉编译,导致输出的代码很难被跟踪调试。
一些工具在编译的过程中会生成映射文件(将编译后的 JavaScript 代码映射到源语言),可以通过这些文件来进行调试。
性能问题
由于 JavaScript 在浏览器中运行问题,本地代码编译为 JavaScript 后的执行速度可能会下降。
对于此类问题,Mozilla 给出了一个解决方案—— asm.js(见《 asm.js:JavaScript 的“汇编语言”》)。asm.js 是一个 JavaScript 的一个严格的子集,提供了一个类似于C/C++虚拟机的抽象实现,包括一个可有效负载和存储的大型二进制堆、整型和浮点运算、高阶函数定义、函数指针等,可以被用来作为一个底层的、高效的编译器目标语言。
此外,还可以使用 Mozilla 开发的 JavaScript 引擎 OdinMonkey 来获得更快的执行速度。开发者可以将编写的代码编译为 JavaScript,然后手动编写为 asm.js 代码,当浏览器执行该程序时,OdinMonkey 引擎会让程序的执行速度更接近于本地应用。Mozilla 未来可能会开发一些工具(类似于 LLJS)来自动生成 asm.js 代码。
随着技术的发展,未来 JavaScript 也许会跑得和 native C 一样快。
一些演示
2012 年,Mozilla 曾推出一款 Web 版的第一人称射击游戏演示 BananaBread,今年 5 月份,Mozilla 宣布与 Epic Games 合作将虚幻引擎3(C/C++实现)移植到浏览器上,并发布了基于虚幻引擎 3 的 HTML5 演示游戏 Epic Citadel,这些游戏都是基于 WebGL、 Emscripten 和高性能的 JavaScript 子集 asm.js 实现,重新定义了 3D 游戏在浏览器中运行的性能,展示了高端游戏也可以很容易地移植到 JavaScript 和 WebGL 平台,同时不失性能和画面效果。
Mozilla 的另一款支持多人在线的 HTML5 游戏—— BrowserQuest。
随着 HTML5 新特性 Full Screen API、Gamepad API 和 Mouse Lock API 的完善,浏览器或将成为未来游戏的新战场。
增强版的 JavaScript
JavaScript 大量的扩展,在很大程度上弥补了 JavaScript 某些方面特性的不足。比如你可以使用如下这些工具或扩展来让 JavaScript 更强大。
安全性增强
静态类型特性
JavaScript 的衍生品
JavaScript 如今在 Web 开发界的地位无法撼动,但是仍不断有一些新的语言出现,希望能够通过提供更强大、更完善、更优雅的特性来代替 JavaScript。
更多工具可参见: http://altjs.org/
最后
几乎所有主流的语言都可以编译为 JavaScript,进而能够在所有平台上的浏览器中执行,这也体现了 JavaScript 的强大性和在 Web 开发中的重要性。此外,互联网中还存在大量的工具,使得这些语言可以与 JavaScript 进行互操作,我们将在以后的文章中详细介绍。
以上这些工具中,大部分都是开源项目,如果感兴趣,你也可以通过源码来了解这些语言之间进行转换的相关原理和技术。