写点什么

谁将取代 JavaScript?

  • 2019-10-30
  • 本文字数:3527 字

    阅读完需:约 12 分钟

谁将取代JavaScript?

谁能取代 JavaScript 似乎是一个老生常谈的话题,很多人都提出过各自不同的看法。本文作者则提出了一个新的视角供你参考:JavaScript 风头正劲,但 WebAssembly 可能已经敲响了它的丧钟。


有些编程语言很受欢迎,还有些语言只是一种"必需品"而已。对于许多程序员来说,JavaScript 就属于后者——每一位前端开发人员都需要理解这门语言,但人们用不着真心喜爱它。


十年前,我们还很难看出 JavaScript 将会统治世界。Java、Flash 和 Silverlight 等平台曾位于舞台中心。这三大技术都需要使用浏览器插件来完成工作,它们也都用另一种用户界面方法取代了 HTML。这种方法使它们在功能层面遥遥领先于 JavaScript——比如,早在video元素、CSS 动画规范或 HTML 画布诞生之前,我们就可以添加视频、动画和绘图。但这种方法也让它们走入了黄昏。当移动浏览需求爆炸式增长,HTML 开始拥抱这一趋势的时候,其他平台就成为了时代的眼泪。


这段讽刺的历史如今要重演了。在 JavaScript 征服世界的同时,有人播下了一颗小小的种子,这颗种子可能在将来的某一天成长为参天大树,敲响 JavaScript 的丧钟——这就是名为 asm.js 的实验性技术。


不过展开这个故事之前,我们先退后一步看一看现状。

转译:当前方法

自从我们有了 JavaScript,开发人员就一直在设法绕开它。早期的一种方法是使用插件把代码从浏览器中剥离(结果失败了)。另一个想法是开发出可以转换代码的开发工具,换句话说就是采用另一种更受人尊敬的语言编写代码,然后将其转换为 JavaScript。这样开发人员就可以获得他们需要的全平台支持,同时并不会弄脏自己的双手。


将一种语言转换为另一种语言的过程称为 转译(transpiling),其存在一些明显的缺陷。高级语言有着各自不同的功能、语法和习惯表达,你不可能把一种语言中的每一行都映射到另一种语言中的等效构造上。就算你能做到这一点也会留下许多坑。如果社区停止开发你最喜欢的转译器该怎么办?如果转译器自己就引入了许多错误该怎么办?想要插入 Angular、React 或 Vue 这样的 JavaScript 框架又要怎么解决?如果你会的语言和同事不一样,你又该如何与团队协作?


编程行业中很多情况本质都是一样的,那就是一种工具的水平主要取决于它背后社区的繁荣程度。



如今转译器是很常见的,但它们的用途几乎只有一条——那就是处理向后兼容性。


开发人员可能会编写最前沿的 JavaScript,然后使用 Babel 这样的转译器将其代码转换为等效(但不太优雅)的老式 JavaScript 代码,以便在所有位置运行。或者更好的办法是,他们使用 TypeScript(一种现代化的 JavaScript,添加了强类型、泛型和非空类型等功能),然后将其转换为 JavaScript。但不管是哪种方法,你都逃不出 JavaScript 的手掌心。

Asm.js:垫脚石

全新可能性的第一缕曙光来自 asm.js,这是 Mozilla 的开发人员在 2013 年完成的一项古怪的实验。当时他们正在寻找在浏览器中运行高性能代码的方法。但 asm.js 并没有像插件那样尝试在浏览器外部运行;相反,它的目标是直接通过 JavaScript 虚拟机打出一条通道。


从本质上讲,asm.js 是简洁且优化的 JavaScript 语法。它比普通的 JavaScript 运行得更快,因为它避免了这种语言中较慢的动态部分。而且支持它的 Web 浏览器也可以应用其他优化,从而显著提升性能。换句话说,asm.js 遵循黄金法则——不要破坏 Web——同时提供了一条未来改进的途径。Firefox 团队使用 asm.js 以及称为 Emscripten 的转译工具把用 C++ 构建的实时 3D 游戏放入 Web 浏览器中,需要的条件仅仅是 JavaScript 和达成目标的雄心壮志。



运行在 asm.js 上的虚幻引擎


asm.js 的最大意义在于,它迫使开发人员重新思考 JavaScript 扮演的角色。Asm.js 代码是 JavaScript,但这些代码并不是让程序员手工读写的。相反,asm.js 代码是由自动化流程(转译器)构建,并直接提供给浏览器的。JavaScript 是媒介,但不是信息本身。

WebAssembly:一项新技术

尽管 asm.js 实验做出了一些令人眼花缭乱的演示,但主流开发人员大都无动于衷。对他们来说,这只是又一项有趣的技术概念而已。但随着 WebAssembly 的诞生,情况发生了变化。


WebAssembly 既是 asm.js 的后继产品,又是一项截然不同的技术。这是一种紧凑的二进制代码格式。像 asm.js 一样,WebAssembly 代码也被输入到 JavaScript 执行环境中。它具有相同的沙箱和相同的运行时环境。与 asm.js 一样,WebAssembly 的转译机制也可以进一步提升效率。但是现在这种潜力比以前大得多,并且浏览器可以完全跳过 JavaScript 解析阶段。对于一段普通的逻辑(例如一段很费时的计算)来说,WebAssembly 的执行速度远远快于常规的 JavaScript,几乎与原生编译的代码一样快。



WebAssembly 处理流水线的简化视图


想知道 WASM 长什么样的话,可以想象你有一个 C 函数,如下所示:


int factorial(int n) {  if (n == 0)    return 1;  else    return n * factorial(n-1);}
复制代码


它编译成 WASM 代码后就成了下面这个样子:


get_local 0i64.eqzif (result i64)    i64.const 1else    get_local 0    get_local 0    i64.const 1    i64.sub    call 0    i64.mulend
复制代码


开始向网络中传送时,WASM 代码会进一步压缩为二进制编码。


WebAssembly 设计为编译器的目标。你永远用不着亲自动手写它的代码。(但如果你想深入探索一番,自己写也是可以的。)


WebAssembly 诞生于 2015 年。今天,桌面和移动设备上的四大浏览器(Chrome、Edge、Safari 和 Firefox)都完全支持它。Internet Explorer 是不支持的,尽管可以将 WebAssembly 代码转换为 asm.js 来实现向后兼容。(兼容性的代价是性能损失。请让 IE 走进历史吧!

WebAssembly 与 Web 开发的未来

WebAssembly 是开箱即用的,为开发人员提供了一种(通常使用 C++)编写优化代码逻辑的途径。这是强大的能力,但应用范围相对较窄。当你需要改善复杂计算的性能时这种方法很有用(例如,fastq.bio 使用 WebAssembly 加快了他们的 DNA 测序计算。。如果你要移植高性能游戏或编写在浏览器中运行的模拟器,这种能力也很重要。但如果这就是 WebAssembly 的全部实力,那其实也没什么可激动的——光是这点东西可没希望取代 JavaScript。但是 WebAssembly 还为框架开发人员提供了一条狭窄的路径,使他们可以将其平台塞入 JavaScript 环境中。


这下事情就变得有趣了。WebAssembly 无法绕开 JavaScript,因为它已锁定在 JavaScript 运行时环境中了。实际上,WebAssembly 需要与最起码 少量 的普通 JavaScript 代码搭配运行,因为前者无法直接访问网页。这意味着如果不经过 JavaScript 层,WASM 就无法操纵 DOM 或接收事件。


听起来这个限制是致命的。但是聪明的开发人员已经找到了通过 WebAssembly 塞进他们自己的运行时的办法。例如,微软的 Blazor 框架会下载一个小型 .NET 运行时作为已编译的 WASM 文件。这个运行时处理 JavaScript 互操作,并提供基本服务(如垃圾回收)和更高级别的功能(布局、路由和用户界面小部件等)。换句话说,Blazor 使用了一个驻留在另一个虚拟机中的虚拟机,堪称《盗梦空间》级别的悖论,也是一种在浏览器中运行非 JavaScript 应用程序框架的巧妙方法。


Blazor 并不是唯一一个由 WebAssembly 支持的实验。还可以看看 Pyodide,其旨在将 Python 放入浏览器中,它带有用于数据分析的高级数学工具包。


这就是未来。WebAssembly 最初是为了满足 C++ 和 Rust 等需求而诞生的,却很快就被用来开发目标更加远大的实验。不久的将来,它就会支持非 JavaScript 框架与 Angular、React 和 Vue 等基于 JavaScript 的对手同台竞技。


而且 WebAssembly 仍在迅速发展。它目前的实现只是一款最小可行产品——只够在一些重点场景中使用,还不是万能的 Web 开发方法。随着 WebAssembly 的推广,它也会不断进化。如果像 Blazor 这样的平台流行起来,WebAssembly 可能会增加对直接 DOM 访问的支持。浏览器开发商还在计划添加垃圾回收和多线程支持,这样运行时就不需要自己实现这些细节。


看起来这条发展道路漫长而充满变数,但请回想一下 JavaScript 的历史。首先,我们发现 JavaScript 能做到的事情都会写成 JS 代码。然后我们意识到,如果一件事情重复的次数够多,浏览器就会让它做得更好,如此循环。如果 WebAssembly 开始流行,它将进入一个良性循环,不断发展,很容易就能超越 JavaScript 的固有优势。


人们经常说,WebAssembly 并不是用来代替 JavaScript 的。但这句话对所有革命性平台都是一样的。JavaScript 当初并不是要取代嵌入浏览器的 Java。Web 应用程序并非旨在替代桌面应用。但一旦能做到这些,它们必然会走上那条路。


作者介绍:


Matthew MacDonald 是教师、程序员和许多大部头的作者。


原文链接:


https://medium.com/young-coder/what-replaces-javascript-a6493b4e2d6e


2019-10-30 19:193200
用户头像
王文婧 InfoQ编辑

发布了 126 篇内容, 共 72.9 次阅读, 收获喜欢 275 次。

关注

评论 2 条评论

发布
用户头像
Flutter/Dart会取代JS
2019-11-01 07:34
回复
用户头像
webassembly 开发成本比较高,而且很多场景也未必用得到他,javascript 明显更容易编写。
2019-10-31 19:24
回复
没有更多了
发现更多内容

如何设计与构建 FinOps 流程、团队、体系与目标

阿里巴巴云原生

阿里云 云原生 FinOps

设备二维码怎么生成?三分钟即可搞定

草料二维码

二维码 二维码生成 草料二维码 设备巡检二维码 设备二维码

算法人生(16):从“K均值 & C均值”看“为人处事之道”

养心进行时

人工智能 机器学习 算法 K-Means #算法

6个步骤解析“用户运营”

养心进行时

运营 产品运营 用户分析 用户运营

用户研究系列之“心流”解析

养心进行时

用户研究 心流 用户画像分析 用户特征分析 福流

云效 Pipeline as Code 来了!这些场景,用好它效率翻倍!

阿里巴巴云原生

阿里云 云原生 云效

软件测试学习笔记丨黑盒测试-边界值

测试人

软件测试

程序员口头禅:一张嘴就知道是青铜还是王者

高端章鱼哥

C#实现多线程的几种方式

EquatorCoco

Java C# JVM

云效 Pipeline as Code 来了!这些场景,用好它效率翻倍!

阿里云云效

阿里云 云原生 云效

Polygon市值机器人

开发丨飞机丨 @aivenli

3分钟讲透服装行业数字化转型新方案!附服装数字化成功案例

优秀

数字化转型 服装产业

数智制造:机器学习与人工智能的全方位渗透

不在线第一只蜗牛

人工智能 机器学习 数智制造

低代码赋能物流,助力数字物流更高效

EquatorCoco

软件测试学习笔记丨JIRA-Bug管理流程定制

测试人

软件测试

算法人生(17):从“课程学习”到“逐步暴露心理疗法”

养心进行时

人工智能 机器学习 AI 算法 #算法

用户研究之全面解析Persona

养心进行时

用户研究 用户行为分析 用户分析 用户画像 用户特征分析

拿捏这12个Java开发框架,轻松拿到30K+

伤感汤姆布利柏

XTransfer5月产研岗位热招

XTransfer技术

海外云手机解决海外社交媒体运营难题

Ogcloud

云手机 海外云手机 云手机海外版 美国云手机 海外云手机推荐

使用Lambda表达式和接口的简单Java 8 Predicate示例

码语者

如何打破数据管理僵局,释放数据资产价值?[AMT企源案例]

AMT企源

数据库 数据资产 数据管理 主数据

Swagger 中 allOf 的详细解读

Liam

程序员 后端 接口文档 API swagger

共赴科技盛会“2024南京智博会”11月在南京国际博览中心召开

AIOTE智博会

南京智博会 物联网展 大数据展 智慧城市展

HTTP 报文详解

快乐非自愿限量之名

网络协议 网络 HTTP

开发大型体育赛事直播平台:现成源码解决方案有哪些功能

软件开发-梦幻运营部

阿里云可观测 2024 年 4 月产品动态

阿里巴巴云原生

阿里云 云原生 可观测

通义灵码企业版正式发布,满足企业私域知识检索、数据合规、统一管理等需求

阿里巴巴云原生

阿里云 云原生 通义灵码

利用预训练模型优化大模型训练

百度开发者中心

人工智能 深度学习 大模型

TikTok海外运营:云手机的四种快速变现方法

Ogcloud

云手机 海外云手机 云手机海外版 跨境云手机 tiktok运营

谁将取代JavaScript?_大前端_Matthew MacDonald_InfoQ精选文章