闲话js前端框架(6)——在浏览器标准上做文章

闲话js前端框架

前端人员=美工+设计+代码+测试
——题记

专题文章:

一、从avalonjs的模板说起
二、庞大的angularjs
三、再也不想碰DOM
四、组件化?有没有后端的事?
五、再看自己一年前设计的微型渲染引擎
六、在浏览器标准上做文章
七、抛开浏览器,构建应用容器
八、为何Flash、银光和Java都在网页端一蹶不振

本文属 西风逍遥游 原创, 转载请注明出处: 西风世界 http://blog.csdn.net/xfxyy_sxfancy

六、在浏览器标准上做文章

为了简化前端的开发,或做一些特殊的应用,我们往往需要采取某些‘非人道’的方式,才能实现某些功能。例如下面这个js库,就是为了兼容各个浏览器标准,那么就做了这样一件匪夷所思的事:

lua.vm.js——一个跑在js上的lua虚拟机
对你没听错,这是一个虚拟机!

虚拟机的历史

虚拟机有简有繁,并不是所有的虚拟机都像java虚拟机那么恐怖。谈起虚拟机的历史,那可是十分的悠久。在1965年前后,IBM的研究人员试图去测量一些计算机科学领域新概念的实际效果。他们设计了一种方案,需要把机器分割成“更小的部件”。这些部件要求能够管理他们自己的资源,以使得研究人员能够在同一时间在系统中测试测试许多不同的条件,而不用改变系统的其他“部件”。他们相信, 对于这个实验来讲,一个虚拟机的实现会工作的非常好。

于是,他们就真的将这个设计实现了出来,并且做成了一款成功的产品,一个多用户环境的操作系统来出售。这套虚拟机系统现在被称做IBM370系统(S/370)和IBM390系统(S/390)。

js上实现虚拟机的困难之处

其实本质上,lua的虚拟机并不是特别复杂,我们会发现,lua的栈式虚拟机实际上非常简短。但问题是,原来的C实现,现在改成js实现,有一个最大的困难是,js也是运行在虚拟机上的。

这会引入什么问题呢?例如跨虚拟机的循环回收,js里面有一个对象被lua对象保存,而恰好,这个lua对象又被这个js对象保存,那么好,如果只是一个虚拟机下,当然很容易就做到,但两个虚拟机的实现时,就几乎成了不可完成的任务。C语言由于是自己控制内存的申请和释放,所以被其他地址引用并不会有什么问题。但js的自动内存管理反而复杂化了这个问题。

js混合lua代码的运行

感觉很特别,用lua的风格去操作网页,确实很有趣!

    print('hello' .. ' ' .. 'world!') – 这是Lua!
    print(js.run('[0,1,2,3,4,5][3]')) – 在Lua中运行JS

    -- 使用Lua与页面交互
    local screen = js.global.screen
    print("you haz " .. (screen.width*screen.height) .. " pixels")

    local window = js.global -- window是JS中的global对象
    window.alert("hello from lua!")
    window.setTimeout(function() print('hello from lua callback') end, 2500)

    local document = js.global.document
    print("this window has title '" .. document.title .. "'")

asm.js

lua.vm.js也不是凭空出现的,他依赖一个强大的底层库,asm.js

asm.js是一个JavaScript的一个严格的子集,可以被用来作为一个底层的、高效的编译器目标语言。asm.js提供了一个类似于C/C++虚拟机的抽象实现,包括一个可有效负载和存储的大型二进制堆、整型和浮点运算、高阶函数定义、函数指针等。

简单来说asm.js是用js写的一个基本库,用来模拟计算机底层的数据类型和结构。安装asm.js的工作方式,能够模拟C++等静态类型语言的底层运行环境。

这样做有什么意义呢?
去年,Mozilla和Epic声明他们已经为Asm.js支持Unreal Engine 3——并且运行十分良好。
他们将C++的游戏引擎,编译成了javascript,然后使用WebGL进行渲染。

这里写图片描述

由于对asm.js进行单独处理,它的性能已经非常好了,对于复杂的应用(比如上面的游戏)性能仅仅比普通C++编译的慢两倍(可以和Java或者C#相媲美)。实际上,这已经比目前浏览器的运行时环境要快很多了,几乎是最新版的Firefox或者Chrome执行速度的4~10倍。

发布了84 篇原创文章 · 获赞 52 · 访问量 29万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章