资讯专栏INFORMATION COLUMN

Asm.js的简单介绍

lijy91 / 2057人阅读

摘要:的代码采用另外一套编译器,将代码预先编译成机器指令,在编译过程或运行过程中,一旦发现语法错误或违反类型标记的情况出现,便重新将代码交予引擎解析执行。

Asm.js简介

早前流行的JavaScript将会统治世界这个梗,很好的说明了JavaScript的将来,能用JavaScript书写的都会用JavaScript来进行书写,不过JavaScript的弱类型是其被黑性能的很大不一部分,而为了解决由其他强类型语言【c++、Java】等转换为JavaScript的困扰时,各大浏览器尝试进行了不同的尝试,其中Mozilla的Asm.js最为突出,
Asm.js 来自于 JavaScript 应用的一个新领域: 编译成JavaScript的C/C++应用. 它是 JavaScript 应用的一个全新流派,由 Mozilla 的 Emscripten项目催生而来。
Emscripten 将 C/C++ 代码传入 LLVM, 并将 LLVM生成的字节码转换成 JavaScript (具体的,
Asm.js, 是 JavaScript 的一个子集).
asm.js不是一种新的语言,而是JS语法的一个子集,也就是说所有用asm.js写的程序都是合法的JS程序,asm.js与JS语言的关系有点类似C与C++的关系。因此,不支持asm.js的浏览器或JS引擎也可以无误地执行asm.js的代码。asm.js顾名思义是作为JS的汇编语言来设计的,它的语法手写起来非常困难,且难以阅读。首先,asm.js的语法利用了一些标注让JS的变量成为强类型的,这些标注与Emscripten生成的代码如出一辙,实际上asm.js的产生就是为了提高Emscripten转换后的代码执行效率的。

Asm.js实践

准确的来说,目前我们还无法来完整的使用这个功能,因为仅仅https://www.mozilla.org/zh-CN... 只有他支持asm.js,当然前文也说了,即使不支持的浏览器也可以执行,因为本质上Asm.js就是JavaScript,只不过这样书写的js的性能和可读性都不如正常书写的JavaScript,所以没有意义,asm.js本来也是不希望程序员去书写,而是JavaScript扩展到其他领域的可能,通过将c/c++的应用程序转换为Asm.js的程序,就可以在web平台跑了,
至于怎么运行的,官网上有一张图片:

由于asm.js相当于支持了强类型,因此可以直接对应编译成机器指令执行。asm.js的代码采用另外一套AOT(Ahead Of Time)编译器,将asm.js代码预先编译成机器指令,在编译过程或运行过程中,一旦发现语法错误或违反类型标记的情况出现,便重新将代码交予JS引擎解析执行。

Asm.js的本质

从本质上来说Asm.js不是新的语言,是一种新的JavaScript的使用场景、领域,他的语法都是JavaScript的语法,实现的过程就是:

使用各种黑白膜法【位运算、注解、检测】来实现了强类型;

通过各类工具【Emscripten】来将其他语言转换为asm.js格式的js,可在web平台执行;

通过浏览器的js引擎的支持,将asm.js编译成更为底层的机器码来加提高js的性能;

同时也要兼容,变异的机器码需要动态检测是引擎否能够支持这种机器码,不能就转到js执行,这样的话性能并没有提高。
准确的说Asm.js都是编译而来的机器码,但是可以根据web平台的js引擎来进行【机器码--JavaScript】的切换动作,从而兼容其他web平台。

最后列一段真是的编译后的Asm.js模块代码:

function GeometricMean(stdlib, foreign, buffer) {
  "use asm";

  var exp = stdlib.Math.exp;
  var log = stdlib.Math.log;
  var values = new stdlib.Float64Array(buffer);

  function logSum(start, end) {
    start = start|0;
    end = end|0;

    var sum = 0.0, p = 0, q = 0;

    // asm.js forces byte addressing of the heap by requiring shifting by 3
    for (p = start << 3, q = end << 3; (p|0) < (q|0); p = (p + 8)|0) {
      sum = sum + +log(values[p>>3]);
    }

    return +sum;
  }

  function geometricMean(start, end) {
    start = start|0;
    end = end|0;

    return +exp(+logSum(start, end) / +((end - start)|0));
  }

  return { geometricMean: geometricMean };
}

参考:网友解读:https://software.intel.com/zh...
官网:http://asmjs.org/spec/latest/
githu地址 https://github.com/dherman/as...
很赞的文章 http://www.oschina.net/transl...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/87033.html

相关文章

  • WebAssembly 为什么比 asm.js 快?

    摘要:并且于年月日,四个主要的浏览器一致同意宣布的版本已经完成,即将推出一个浏览器可以搭载的稳定版本。因此本文着重介绍为什么比更快。本文主要表达的是为什么应该是更快的。则不同,它是由几大主要的浏览器厂商共同设计的。 作者:Alon Zakai 编译:胡子大哈 翻译原文:http://huziketang.com/blog/posts/detail?postId=58ce80d2a6d8a0...

    Binguner 评论0 收藏0
  • 前端每周清单半年盘点之 WebAssembly 篇

    摘要:前端每周清单专注前端领域内容,以对外文资料的搜集为主,帮助开发者了解一周前端热点分为新闻热点开发教程工程实践深度阅读开源项目巅峰人生等栏目。利用降低三倍加载速度自推出之后,很多开发者都开始尝试在小型项目中实践,不过尚缺大型真实案例比较。 前端每周清单专注前端领域内容,以对外文资料的搜集为主,帮助开发者了解一周前端热点;分为新闻热点、开发教程、工程实践、深度阅读、开源项目、巅峰人生等栏目...

    Alan 评论0 收藏0
  • Emscripten教程之优化你代码

    摘要:优化项也会引发一些问题。检查你的代码是否工作并修复问题。从起,及以上的优化级别默认启动了这项设置。目前正在进行改进。代码移植系列文章代码移植主题系列文章是中文站点的一部分内容。 作者:云荒杯倾欢迎加入Wasm和emscripten技术交流群,群聊号码:939206522。 这是关于Emscripten的系列文章,更多文章请看下面链接。 Emscripten代码移植系列文章 Emscr...

    Jokcy 评论0 收藏0
  • Emscripten教程之优化你代码

    摘要:优化项也会引发一些问题。检查你的代码是否工作并修复问题。从起,及以上的优化级别默认启动了这项设置。目前正在进行改进。代码移植系列文章代码移植主题系列文章是中文站点的一部分内容。 作者:云荒杯倾欢迎加入Wasm和emscripten技术交流群,群聊号码:939206522。 这是关于Emscripten的系列文章,更多文章请看下面链接。 Emscripten代码移植系列文章 Emscr...

    bladefury 评论0 收藏0
  • Asm.js: Javascript编译目标

    摘要:来自于应用的一个新领域编译成的应用它是应用的一个全新流派,由的项目催生而来。所有外部数据在一个称为堆的对象中存储并被引用。到目前为止,大部分的使用情况下,代码性能是至关重要的比如运行游戏,图像,处理语言翻译和库。 正如许多开发者一样,我也为Asm.js的前景而感到兴奋不已。最近的新闻——Asm.js正在被Firefox支持——引起了我的兴趣。同样感兴趣的还有Mozilla和Epic声明...

    用户84 评论0 收藏0

发表评论

0条评论

lijy91

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<