javascript是应用在什么端的脚本语言

JavaScript010

javascript是应用在什么端的脚本语言,第1张

较早的时候,JavaScript一般是用在客户端(浏览器)上执行的脚本语言。因此通常将JavaScript叫做客户端脚本语言。

首先,JavaScript是一种脚本语言。所谓脚本语言即不需要经过编译,是一种解释性语言。

其次,JavaScript在设计之初是用在浏览器上的,浏览器即客户端的一种,故JavaScript叫做客户端脚本语言。

目前JavaScript已经不再局限于在客户端使用,服务器端也可以用JavaScript语言,如用Node.js搭建的服务器。甚至JavaScript可以用来开发硬件编程。所以,虽然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。

JavaScript 获取客户端计算机硬件及系统信息

通过WMI来实现获取客户端计算机硬件及系统信息:

复制代码代码如下:

function getSysInfo(){

var locator = new ActiveXObject ("WbemScripting.SWbemLocator")

var service = locator.ConnectServer(".")

//CPU信息

var cpu = new Enumerator (service.ExecQuery("SELECT * FROM Win32_Processor")).item()

var cpuType=cpu.Name,hostName=cpu.SystemName

//内存信息

var memory = new Enumerator (service.ExecQuery("SELECT * FROM Win32_PhysicalMemory"))

for (var mem=[],i=0!memory.atEnd()memory.moveNext()) mem[i++]={cap:memory.item().Capacity/1024/1024,speed:memory.item().Speed}

//系统信息

var system=new Enumerator (service.ExecQuery("SELECT * FROM Win32_ComputerSystem")).item()

var physicMenCap=Math.ceil(system.TotalPhysicalMemory/1024/1024),curUser=system.UserName,cpuCount=system.NumberOfProcessors

return {cpuType:cpuType,cpuCount:cpuCount,hostName:hostName,curUser:curUser,memCap:physicMenCap,mem:mem}

}

代码实现主要包括这几部分:

先通过new ActiveXObject ("WbemScripting.SWbemLocator")访问到WbemScripting对象。

通过locator.ConnectServer(".")连接我们本地电脑(.代表本地电脑,当然

也可以访问其他计算机)。

通过service.ExecQuery("SELECT * FROM Win32_Processor")这个类似sql的语句(其实系统信息也是存储在计算中一个类似数据库的文件中)获取我们需要的对象的记录集。

通过new Enumerator来创建一个可枚举的对象,下面就可以遍历取信息了。

注意:运行的前提是要修改浏览器安全设置,“允许对未标记为可安全执行的ActiveX

脚本的运行”。