最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 你应该编译你的 JavaScript 代码吗?

    正文概述 掘金(PassionPenguin)   2021-02-09   617

    你应该编译你的 JavaScript 代码吗?

    你应该编译你的 JavaScript 代码吗?

    我们都会也都喜爱 JavaScript,并且我们都通过编写代码和在我们最爱的运行环境(通常是浏览器,Node.js 和 Deno)中来执行 JavaScript 代码。但你是否曾经尝试过去编译你的 JavaScript 代码呢?

    不对,等一下,我们都知道 JavaScript 是一门动态语言啊!其实它同样也会被解析,但是与常见的运行时大不相同,它是会在运行时被一个 JIT 编译器优化的。

    这可是事实!

    但它能够被编译吗?这两个问题可不搭边呢!在运行之前编译一款动态语言(或称为 AOT,运行前编译)是可能的,这是当然的。但我们真的值得去这样做吗?

    AOT vs JIT

    首先让我们再走进 AOT 和 JIT(要不然这文章也太短太水了。当然其实还有别的相关的能够帮助你的内容可能会被你所找到)

    AOT 和 JIT 最主要的区别是它们所作用的时间。AOT 是在你的代码的执行之前运行的,而 JIT 是与你的代码的执行同时进行的。还有什么不同吗?

    几乎全都不同啊!

    AOT 通常是为那些静态语言所使用的,因为对于他们而言,没有什么需要在运行时判断和决定的动态行为。所有的规则都已经摆在代码中了,编译器可以很简单地阅读这些内容,明白其中的数据流并且有针对性的对其进行优化,并同时将这些代码转译为原生的解析语言(也叫做机器指令).

    JIT 呢,则是与之相对,一般用于动态语言,因为它会侦测代码的执行并且基于它所控制的数据的类型,会对其优化并创造一个更好的机器指令。

    如果让我们来就这些实时优化来考虑编译代码的进行优化的时间吧,AOT 会在一开始就为你提供一份最优化的代码,而你会直接执行这一份最优化的代码。但对于 JIT 而言,他会在代码运行过程中先耗费一段时间去计算分析这段代码,但会在潜在地在代码的后续执行中能够因为这个原因更多地节省和优化。它有更多去优化的角度,而不仅仅只是针对于类型定义上(例如函数的调用就只能在运行时优化)。

    对于每一种方案当然都有它们的优劣,但如果你想要概述并决定其中之一,我大概会说:

    • 如果你的代码只需要运行短时间,那就用 AOT 吧。
    • 如果你的代码会运行地比较长时间,那么就用 JIT 吧,这样可以让你的代码在一些运行时分析后获得更好的优化。

    那么对于编译你的 JavaScript ?

    同样的,为什么 JavaScript 是被解析并且 JIT 并不能直接去编译 JavaScript 为机器代码的原因:JavaScript 的动态功能让它在实时编译中更占优势。

    但需要注意的是,我并没有提及 WebAssembly 。事实上在哪些情况下,WASM 将所有代码(C、C++ 或别的什么语言的代码)编译为一个 JavaScript 运行时兼容的原生代码。这与编译 JavaScript 可不是一个东西。

    事实上,并没有那么多项目正在尝试去编译 JavaScript 代码为机器指令,因为我可以确定这是个很大的挑战 —— 我指的是,例如让我们编译下面的代码:

    let result = null;
    if (my_complex_function()) {
        result = 10;
    } else {
        result = "something else";
    }
    console.log("The result is " + result);
    

    你真的在运行之前能够判定 result 变量的类型吗?你可能需要先在心中思考一下所有可能的类型,并且同时将不同的情况判断一遍。即便你解决了这个问题,你依旧添加了不少的逻辑到你的思考与判断之中。这听起来可并不那么好啊!

    事实上,有一个专门解决这个问题的项目,尽管不一定是最佳的(至少在纸面上):NectarJS

    通过使用 NectarJS 进行编译

    该项目旨在将 JavaScript 代码编译为机器指令,以便让我们可以在任何兼容的平台上运行它。现在,兼容的名单包括了 Windows、Linux、Arduino、STM32 Nucleo、Android、Web(WASM, Android, Web (WASM)、macOS 和 SunOS。

    虽说实际上上述所有的平台基本上都有对应的,用于运行你的 JavaScript 代码的解析器,这个项目能够让最终的编译输出一个比当前可用编译器输出的更优化的一个输出。

    针对它们输出的结果而言,它们早已对 Windows 上 Node.js 的 v12 有了一些优化。在某些情况下并不是提升速度,而是内存的使用甚至是输出文件的大小。

    你应该编译你的 JavaScript 代码吗?

    当然,该项目仍然有其局限性,特别是到目前为止,该项目仅支持大约 80% 的 ES3 标准,这意味着您可以编写的 JavaScript 代码是非常有限且不符合当今的标准的。

    但是,对于你的某些项目而言你并不一定要编写兼容 ES6 的代码。而且能够去编译这些代码,并原生地在你的 Arduino 开发板上面运行这些代码,可能真的会是非常好用的

    但是话又说回来,对于特定项目而言,你可能并不需要在其中编写兼容 ES6 的代码,并且在对其进行编译并在 Arduino 板上本地运行这段代码的情况下它可能会派上用场。

    安装并测试 NectarJS

    这个项目可以直接以一个 NPM 模块的形式被安装到你的计算机,所以你所需要做的仅仅是运行下面这行代码(这里默认了你已经安装了 Node 环境):

    
    $ npm install nectarjs -g
    
    

    在安装并同时设置或导入了必要的依赖以后,你就可以简单的编写一段 HelloWorld 代码并编译这段代码:

    console.log("Hello 编译过的 world!")
    

    要去编译这段代码,简简单单的使用这段指令即可:

    $ nectar your-file.js
    

    这就是我在我的 macOS 系统上能够获得的输出:

    你应该编译你的 JavaScript 代码吗?

    需要注意的是,被创建的文件并没有一个拓展名 —— 它是一个二进制文件。如果你给予它执行的权限,你就能够执行这段代码。这很简单,并且它能够正常工作。


    这就是 JavaScript 的未来吗?

    就我个人而言我不会为之打赌。这个项目本身也还在初期,拥有着不完善的文档,并且只有对旧语言的部分支持。但是,它目前正处于活跃的开发状态并且这些可以在快速地变化。

    对于编译 JavaScript 做法的推广,我并不认为会是一个很大的趋势,毕竟事实证明了,现有的运行时已经足以满足最常见的使用情况。对于希望拥有原生性能并且不愿意切换到其他技术的朋友来说,编译 JavaScript 真的有用吗?这当然有用,但这只是 JavaScript 广泛用途的其中一种情况。

    你会考虑编译你的 JavaScript 代码吗?发表一下你的看法吧!



    起源地下载网 » 你应该编译你的 JavaScript 代码吗?

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元