JavaScript引擎虚拟机运行时环境是一回事儿吗?

JavaScript05

JavaScript引擎虚拟机运行时环境是一回事儿吗?,第1张

js引擎通常被称作一种虚拟机(可能是js并没有明确的VM的概念吧),是专门用来解释和执行js脚本的。js虚拟机是一种进程虚拟机,就是能运行一个进程或程序。每个js引擎都实现了ECMAScript规范(当然,有的实现并不全或者未能实现最新规范)ActionScript也支持这种规范。早期的js脚本只包含很简单的逻辑,所以处理js脚本的引擎性能自然也好不到哪里去,非常早期的“Mocha”引擎只包含字节码解释器、引用计数方式的自动内存管理方式。js引擎从原始的遍历语法树,到字节码方式到引入JIT编译方式(即时编译),性能得到了质的飞跃  。现如今一些比较知名的js引擎有:SpiderMonkey, Mozilla的JavaScript 引擎,使用C/C++编写;V8(第一个用上JIT技术的虚拟机),chrome的js引擎,使用C++/汇编  编写,使用初级编译器 + 优化编译器。还有Safari的JavaScriptCore引擎,IE/Edge的Chakra引擎。当然,Node.js/IO.js也是使用V8引擎(虚拟机)。参考:game-server-development/node.js-V8引擎相关的性能优化.md at master · xiecc/game-server-development · GitHub runtime 翻译过来就是“运行时”,或者运行时环境,是说一个程序正在执行的状态,js runtime就是运行js的环境,也就是虚拟机(engine)。runtime它的底层可能是一些标准库函数。js引擎和虚拟机存在相似之处,但有足够的差异,因为JavaScript的动态特性。

作者:知乎用户

链接:https://www.zhihu.com/question/29170563/answer/94419176

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

用一个 JavaScript 平台来做嵌入式开发,确实是简单的事情复杂化了。

表面上来看,所谓用 JavaScript 来点亮一个 LED 什么的,代码是简单了,但是它简单,是基于一个复杂的平台基础上的,很多产品如何搭载和使用这个平台本身就是很难解决的问题,这个问题比用什么语言编程复杂多了。

譬如,一个设备,电路板只有一个硬币大小,为了配合设备的结构,形状也有特定要求,有3个按键,控制一个可调光的 LED ,以及开关机,用电池供电,具备低电量提醒和自动休眠功能,必须尽可能延长电池使用时间。

这就是在嵌入式开发中遇到的需求,一个 PIC12 单片机就可以解决。

而为了让一套 JavaScript 平台运行在上面,我要不要设计一个专门的软硬件环境?那徒增了很多不必要的工作量,仅仅是为了用另一种语言,更抽象地控制一个 LED 灯?

还是说你能帮我设计这套平台,那么怎么收费?如果我要出货 100 万套,成本控制,生产,各种 EMC 之类的测试,都是你帮我解决吗?

那不是变成了外包了吗?

嵌入式开发门槛太高,最大的问题在于和实体世界太接近,无法做太多抽象,不同的需求,最佳解决方案会根据实际情况产生非常大的差异;越是抽象了,就离嵌入式越远,抽象本身就是和嵌入背道而驰的。

而且,对硬件做抽象,那不就是相当于重新走了一次发明软件的路了吗?

电脑就是一种经过抽象的“嵌入式设备”。我要做一个产品,直接把一部 PC 塞进去是不是更好?

或者其他运行 Linux 的设备,我喜欢用什么语言,什么环境开发不可以? JavaScript 可以,Python 可以,或者其他什么 ooxx 语言都可以。

所以是没必要的?那当然不是,部分细分市场的需求还是可以满足的。

像 http://ruff.io 这种,虽然对于真正的嵌入式开发领域而言基本没什么意义,但是却为初学者和一般爱好者提供了一个相当不错入门环境。

三种嵌入式开发

第一种单片机

第二种是DSP

这2类编程一般用C,偶尔用汇编。这2类做的系统有的是裸机,有的运行实时操作系统。但是不要被操作系统这几个字迷惑了,他跟Windows,linux之类的差别非常大,怎么说呢,举个例子吧,我们部门做dsp的,他们写程序用c,但是不同于我们学习的C,因为他们没有标准库,没有浮点数运算,基本不用乘法(没有硬件乘法器,一般用移位),然后内存非常小,一般就几k,这种条件下不大可能写的出js虚拟机,就算google逆天写出来了,ram也不够用,他们经常用掉90%多内存,然后我听他们讨论最多的就是内存不够。哦,对了,他们操作系统用的是ucos,这个系统是开源的,有兴趣你可以去看下,5500行代码,有个德国人移植到Windows上了,csdn上有下载,不过是用lcc编译器编译的,改一点点就可以用vc或者gcc编译,当然,这个和在dsp上运行有本质区别,他是用多线程模拟硬件时钟中断的。

第三类是ARM M系列

其实也是单片机,功能稍微强大点。

第四类是ARM9系列 ,ARM A系列

这类可以运行高级操作系统了,比如linux,android,虽然性能和资源比pc差很多,但是编程方式已经差不多了。我们部门就用ARM9,运行linux,有屏幕的设备界面用qt,没界面的一般用php或者是cgi提供网页(web服务器用boa),逻辑一般用c,不过现在貌似要全面切换成qt和lua。

其实可以仿照vmprotect写一个js版本的,vmprotect思想来源于门电路 。

原理是,把加减乘除都用nor指令实现,nor = not not and

于是原来很容易看出逻辑的 and xor not or 都加密成了整齐划一的单一操作字符nor

再从nor还原回去变的极为困难 。

目前为止vmp虚拟机加密只能半自动甚至手工还原,还原vmp至今是仍然有很大难度(爆破是另一回事) 。

javascript也可以这么做,也就是在js虚拟机上再搞vmp虚拟机 。

但是似乎js界和搞加密解密的交集太少,没有人去做这个事情 。

也可能是js并没有那么高的价值值得如此保护。