### 闲话js前端框架
前端人员=美工+设计+代码+测试
——题记
**专题文章:**
一、从avalonjs的模板说起
二、庞大的angularjs
三、再也不想碰DOM
四、组件化?有没有后端的事?
五、再看自己一年前设计的微型渲染引擎
六、在浏览器标准上做文章
七、抛开浏览器,构建应用容器
八、为何Flash、银光和Java都在网页端一蹶不振
本文属 西风逍遥游 原创, 转载请注明出处: 西风世界 [http://blog.csdn.net/xfxyy_sxfancy](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进行渲染。
![这里写图片描述](https://box.kancloud.cn/2016-04-08_57071d23028b2.jpg "")
由于对asm.js进行单独处理,它的性能已经非常好了,对于复杂的应用(比如上面的游戏)性能仅仅比普通C++编译的慢两倍(可以和Java或者C#相媲美)。实际上,这已经比目前浏览器的运行时环境要快很多了,几乎是最新版的Firefox或者Chrome执行速度的4~10倍。