JavaScript 何以跻身最伟大编程语言之列?
JavaScript 从诞生之初作为 Web 开发的替补工具,不断发展并打败挑战者,在成就现代 Web 的同时,发展成为了伟大的编程语言之一。
如果你在 1999 年预测,20 年后 JavaScript 会成为编程领域最流行的语言之一,那你要么是通灵未来,要么就是精神错乱。
世纪之交的JavaScript 不仅无法做到专业语言能够做到的,它甚至没有被设计为一种严肃的编码工具。毕竟,需要创建Web 应用程序的开发者已经拥有了他们喜欢使用的程序工具——Java,通过 applet 嵌入系统的方式。
但是在 1995 年,具有开拓精神的 Web 浏览器公司 Netscape 就已经意识到他们需要为人们提供一种更简单的选项来创建 Web 应用程序。他们处在一个困难的节点
——与微软在市场上开战,与 Sun Microsystems 处在关闭主要战略合作关系的边缘,而且时间紧迫。他们雇佣 Brendan Eich 在一个几乎不可能的严苛时间线内创造一种新语言。Brendan Eich 在 10 天内打磨出 JavaScript 的第一个版本,正好赶上了这个漂亮的浏览器:
2005 年的 Google Maps
Eich 真正想要做的是构建一个浏览器承载的类似 Scheme ">https://en.wikipedia.org/wiki/Scheme_(programming_language) 的学术性的编程语言。但是 Netscape 有一个不同的愿景。他们想要一个看起来像 Java 的语言,尽管它表现得不一样。相似的名字——Java 和 JavaScript——导致了数年的混淆。
“我在市场命令下,使它看起来像 Java,但是又不要使它太庞大。它只是一种蠢弟弟式的语言,对吧?它只是 Java 的副手。”—— Brendan Eich
动态按钮的时代
JavaScript 诞生的最初五年,它只是不愿用 Java 编程的人们的一种替补工具。这些受众包括业余人员、爱好者以及时间紧迫的人。它还包括 Web 设计师——一种新的科技工作者,负责使 Web 页面的用户界面看起来美观和图形化。他们需求一些比<blink>标签更美观以及比旋转的地球仪 GIF 图片更摩登的功能。
在专业领域,这是 JavaScript 的主要工作——创建将设计好的 Web 页面粘在一起的 UI 粘合剂。每当你需要一个交互式按钮、一个弹出式菜单、一个飞越图片效果,你就需要 JavaScript。
谁需要一个动态按钮呢?每个人。
2000 年左右的动态按钮
不久之后,JavaScript 被大量用于世界上最不重要的工作——每当鼠标经过时切换图片。
尽管开发人员会使用代码来自动化发光效果的按钮,然后和他们的 Web 页面一起发布,这种事看起来很疯狂,但这就是每个人做的事——一遍又一遍地重复。(如今,CSS 提供了这种装饰效果,而且是以一种更可控的方式,样式配置和动画而不是预生成的图片文件。)没有人期望 JavaScript 可以做更多事情。而且许多编程人员更乐意使用一种可以根据命令快速生成 JavaScript 的服务端编程语言。JavaScript 可以负责一个应用程序中的业务逻辑的想法,就如想象你将使用 Excel 宏来代替数据库存储过程一样可笑。
沙箱囚徒
当人们今天批评 JavaScript 的时候,通常是由于这个语言本身的限制——面向对象编程功能缺失、弱类型安全、笨拙的 DOM 模型、==与===的混淆等等。但是这些都不是 JavaScript 在早期看起来是如此糟糕的编程工具的原因。毕竟,有大量丑陋的编程语言因为在对的时间处在对的位置而成为必不可少的。(例如 BASIC、COBOL、SQL 和 PHP。)JavaScript,作为在每个 Web 浏览器中被原生支持的唯一语言,正如网站占领世界,它在对的时间处于对的位置。
JavaScript 的真正限制是沙箱——一种将代码牢牢控制在里面的环境。沙箱将 JavaScript 与桌面世界隔离开。例如,JavaScript 代码不能直接访问文件系统、显示器和任何硬件。更严重的是,它将 JavaScript 与 Web 服务器上的任何东西隔离,例如存储客户列表和产品目录的数据库,以及运行业务逻辑的服务端代码。被迫独立运行,因此 JavaScript 除了在页面上旋转按钮之外几乎无事可做一点也不奇怪。
##使用 XMLHttpRequest 开启一条管道
奇怪的是,确实是微软救了 JavaScript。而且不是今天这个庆祝在每个操作系统上进行开源开发的公司,而是那个赤裸裸地反开源的以“拥抱、扩展、消灭”理念消耗竞争对手的斗士。
事情的经过如下。就在全世界都为动态按钮疯狂的同时,微软的一个团队正在研究一种使 Outlook 成为更具响应性的 Web 前端的方法。他们构建了一款称为 Outlook Web Access 的产品,看起来是这样的:
2000 年的 Outlook Web Access
微软团队的目标相对谦虚。他们想要让一个高效的邮件阅读器运行在浏览器上。大部分人不希望每过几秒就刷新整个页面。相反,他们使用了一种可以使 Web 页面悄悄在后台检查新邮件信息的技术。这个目标可能看起来不是那么惊天动地,但是——要知道——Gmail 那时候还没有被发明呢。事实上,整个谷歌公司那时才刚成立了几年。
微软团队使用 ActiveX 组件创建了一个称为 XMLHttpRequest 的管道。XMLHttpRequest 的基础理念很简单——它给予 JavaScript 代码一种发起 Web 请求的方式。正如 Web 浏览器可以联系 Web 服务器并发起一个请求(例如,“嗨,请给我那个页面!”),JavaScript 代码可以使用 XMLHttpRequest 对象来发起自己的请求(例如,“嗨,请发给我更多邮件信息”)。
突然之间,Web 页面可以访问 Web 服务器的所有资源。需要从数据库获取数据?向服务器请求这些数据。需要服务器执行一次计算、一次安全测试、一项超级私密校验?也可以向服务器请求这些服务。而且最妙的是,请求发生在后台而页面不受影响。
XMLHttpRequest 也并非没有特异之处。首先,它的奇怪命名,大小写不一致而在像 JavaScript 这样的大小写敏感的语言中令人头痛。其次,这个名字暗示你的代码将发送和接收 XML 信息。而现实是,信息可以是几乎任何类型——普通的文本、HTML 片段或者序列化为 JSON 的 JavaScript 对象。但是,最大的问题是 XMLHttpRequest 是基于 ActiveX 构建的,这意味着它只能在 Windows 电脑的 Internet Explorer 浏览器上工作。
这些怪异之处都没有阻挡它的流行。短短几年内,其它浏览器都提供了它们的 XMLHttpRequest 实现——对象在代码上相同,但没有使用令人头痛的 ActiveX。尽管创建了 XMLHttpRequest,微软在他们自己的 Web 开发中利用这项技术方面却很迟缓。他们对于在他们公开的基于 Web 的邮箱系统——Hotmail 使用这项技术犹豫不决。相反,他们一直等待,直到 Google 使用 XMLHttpRequest 震惊了 Web 开发世界,最开始是 2004 年的 Gmail,然后是 2005 年的 Google Maps。这是一个真正的圣杯:基于 Web 的程序以桌面应用程序的响应性运行。
2005 年的 Google Maps
现代化之路
XMLHttpRequest 是改变 JavaScript 进程的关键因素。然而,在那之后还有其它一些影响的因素。
JavaScript 语言曾数年之内一成不变。问题在于,占市场领先地位的 Web 浏览器——Internet Exploerer,是随着操作系统的时间周期更新的,也就是说,更新非常慢。开发者被迫写代码来检查浏览器版本并尝试动态适应。
在 2006 年,开发者得到了 jQuery 解决方案。尽管 jQuery 今天已经有点过时了,但是在 10 年前,它是一款必备工具,如果想要将时间花在构建功能上而不是定位浏览器兼容性问题上。
在 2008 年,谷歌发布了一款称为 V8 的新 JavaScript 引擎。和 jQuery 一开始给予开发者广泛兼容性一样,V8 给予他们惊人的性能。而且由于 V8 引擎是一个独立的开源组件,所以其它项目也可以使用它。不久之后,这将开启 Node.js 和 Electron 之类创新的大门。
然后在 2008 年,HTML5 的第一份草案公布。HTML5 本身与 JavaScript 无关,但是它配套了一波新的 JavaScript API。突然之间,开发者拥有了存储本地数据的工具、可以管理浏览器历史、使用音频以及运行后台任务。而且再一次缩小了Web 功能与桌面能力之间的差距。
##现代JavaScript
JavaScript 的成功是其在浏览器中的特殊地位的必然结果吗?或者,这只是需要运气和完美时机的侥幸?
有一件事是确定的——JavaScript 是被迫发展的。大部分时候,JavaScript 都不是所有人的最爱。其他人支持 Java applets,然后是 Flash,甚至是 Silverlight。
JavaScript 面临这些挑战者并打败了他们。
也许最中肯的评价是,JavaScript 证明了某件事——深入基层——即每个开发者都知道。顾名思义,对于一项技术来说,最重要的因素是它的普及度。如果你的技术有更好的普及度,那么它不需要一开始就成为最好的。你所需要的只是足够好就可以了。
JavaScript 正沿着一条快速发展的道路迈向未来。我们现在使得 JavaScript 运行在 Web 服务器上并赋能桌面应用程序(感谢 Node.js 和 Electron )。我们有可以编译成 JavaScript 的一步到位的语言 TypeScript ,为开发者提供了一种编写 Web 页面而不违背他们的原则的方法。而且将来, WebAssembly 可能会彻底打破语言限制,为开发者提供一种方法来在 JavaScript 引擎上使用他们想使用的任何高级语言。
是时候承认了。JavaScript,尽管有许多漏洞和不一致的地方,但它确实是最伟大的语言之一。Brendan Eich 将 JavaScript 融入 Netscape Navigator。而我们将整个世界都塞进了浏览器。这造就了现代 Web。
作者:Matthew MacDonald
译者:张健欣
来源:InfoQ