【在主画面加入捷径】
       
【选择语系】
繁中 简中

技术杂谈:JavaScript - 程序设计史上最美丽的错误

【赞助商连结】

    JavaScript 可以说是程序语言史上最美丽的错误,在短短十天内匆忙开发的新语言,竟然可以跨越前端 (front end)、后端 (back end)、桌面端 (desktop)、行动端 (mobile) 等不同应用情境,成为新一代的当红炸子鸡。应该很少会有程序语言的函式库和框架有 JavaScript 的那么丰富。在 2017 的 StackOverflow 的调查中,JavaScript 荣登最常用的程序语言,在各大语言排名中,JavaScript 都位居前几名。

    曾经有数个技术,试图取代 JavaScript,以下是一些实例:

    • VBScript (retired)
    • Java Applet (retired)
    • ActiveX (legacy and dangerous)
    • Flash (almost retired)
    • Silverlight (retired)
    • CoffeeScript (fading out)
    • Dart (well designed but not popular)

    这些技术的出现,不仅仅是技术上的理由,往往有政治上的考量;如果,所有的网页设计师都用某一家的技术,那么,这个市场将会相当地庞大。由于网页自由开放的特性,前述的事情实际上不会发生;经过自由软件运动后,程序设计者对于有独占性质的技术会更加审慎评估。Dart 就是一个最好的实例,Dart 本身设计上算是完善,相关工具也是相当完整,但是,Dart 意图取代 JavaScript 这件事情犯了政治上的错误,使得 Dart 无法进一步成为主流。目前各大浏览器背后的势力都乐于接受 JavaScript 做为网页共通的语言,即使是 Web Assembly 也不会完全取代 JavaScript,而会以 JavaScript 模块的角色和目前的网络技术互补。

    然而,JavaScript 的坑,也是相当地多。就像是「JavaScript 优良部分」和其他讨论 JavaScript 的书籍中,如何避免这些坑坑洞洞,就成为每个 JavaScript 程序设计者的天堂路。然而,依靠人的力量去克服这些东西,有许多缺点:第一个,每个程序设计者都要重覆学习,浪费大量人力资源;第二,人类不像机器,每次动作都可以一模一样不出错,即使是老练的程序设计者偶而也会犯错。对于资讯人来说,如果能用工具自动完成的事情,为什么要耗费自己宝贵的时间呢?于是,JavaScript trans-compiler 出现了,像是 CoffeeScript、Dart、Babel (ES6)、TypeScript 等。

    一开始,就像一部分读者,笔者对于 trans-complier 这种技术很不能接受。但是,其实人类早就在用这种技术了。早期的人需要手动撰写组合语言,但自从 C 发明后,现在还在写组合语言的人就少了。大部分的高阶语言,像是 Python 或 Ruby 或 R,也都是用 C 写的;这些语言都保留 C API,必要时可以和 C 程序代码桥接。当然,JavaScript transpiler 和 C 编译器略有不同,我们不是将这些语言的程序代码转为机械码,而是转为 JavaScript。这一部分是现实上的考量,因为目前浏览器中只能执行 JavaScript;另外一个原因则是转为 JavaScript 后程序代码可在不同情境中重覆利用。

    早期试图突破 JavaScript 困境的方案是 CoffeeScript,这个语言采用类似 Ruby 的语法,说实在的,CoffeeScript 的程序代码还蛮赏心悦目的,笔者也曾经跟风学了一阵子。然而,CoffeeScript 其实有一些问题,由于 CoffeeScript 和 JavaScript 语法不兼容,程序代码无法直接利用,通常需要转换后才能使用。而大部分在线的 JavaScript 程序代码范例都是以原生的 JavaScript 来撰写,如果使用 CoffeeScript 来改写必需要在自己心里转换一次,而 CoffeeScript 最后又把我们想的程序代码转回 JavaScript。这样一来一往,最后笔者索性回头写原生的 JavaScript。

    后来,笔者又接触到 Babel 和 TypeScript 这两个工具。这两个工具较 CoffeeScript 来说,有一个额外的优势,这两个工具大抵上其语法兼容于原生的 JavaScript,Babel 直接把 ECMAScript 6 拿来用,而 TypeScript 则是采用类似 ECMAScript 7 的内容;由于可以衔接原有的 JavaScript 的知识,学习曲线较小。为了兼容于现有的 JavaScript,这两种语言都会将程序代码转为原生的 JavaScript,也就是说,可以把这两个工具新增的语法视为一种语法糖 (syntactic sugar)。

    一开始笔者比较看好 Babel,因为 Babel 是直接拿 ECMAScript 6 直接转为现有的 JavaScript,我们等于是预先学习未来的 JavaScript。但实质上的益处并没有想像的那么大。以目前来说,浏览器对 ECMAScript 6 的支援仍在缓步进行中,如果目前 (2017) 就要上线的项目,仍然要回头用 ECMAScript 5 的语法。而动态类型语言的缺点,并没有消失。

    最近,笔者在国外讨论区注意到 TypeScript 这个新的语言。简单地说,TypeScript 在原来的 JavaScript 语法外,额外增加一些类似 Java 或 C# 等静态类型语言的语法和特性。目前的趋势看来,TypeScript 受到较多的注目,甚至 Google 的 Angular 2 也优先使用 TypeScript。最近笔者也试着用 TypeScript 写一些小型项目,大体上印象还不错;偶尔会碰到一些小问题,需要上网搜寻解决方法。

    比较几个 JavaScript trans-compilers,也可以发现 TypeScript 是最热门的:

    除了 JavaScript transpiler 外,JavaScript 的生态圈也是相当庞杂,像是工作流程自动化就有 Grunt 和 Gulp 等方案,套件管理也有 UMD、AMD、SystemJS、Browserify 等不同方案,更不要提前令人眼花瞭乱的前端框架,如果读者想知道 JavaScript 的生态圈,可以到 The State of JavaScript 那里看一看。说实在的,光是要了解这些工具的差异,从中选择适合自己的工具,就要花上不少的时间。短时间内,JavaScript 的战国时代应该还不会结果。

    【赞助商连结】