QtScript JavaScript比较

QtScript JavaScript比较

最近测试Qt Application程序的脚本化以及与Webview的混合编程,结合原来的JavaScript集成比较了一下QtScript的实现.在比较两者异同的过程中看到了原来接触过的Node.js,于是一并复习.下面结合三者的异同说下ECMAScript,也算是近期对《Node.js开发指南》这本书的一个读书总结。

JavaScript被大家广泛认识是在浏览器端,初期用于简单的客户端页面跟新和逻辑校验(如表单有效性校验等),其大规模编程的广泛应用出现在Web2.0时代以后。拜各个浏览器飚性能这股潮流的福,目前JavaScript的运行环境近几年已经过质的变化,成为解释性语言中性能最好的一类。据统计其性能超越了php、python等其他解释性语言,距C++等编译性语言的距离也在缩小。
自JavaScript大规模编程开始后,其语言特性才被大家所认识。这里要先讲一下ECMAScript。
ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会)通过ECMA-262标准化的脚本程序设计语言,目前其实现形式有以下几种:JavaScript(Chrome、FireFox等浏览器),JScript(IE),QtScript(Qt4.3以后集成的开发语言),ActionScript(Flash编程)等。比较成功和应用最广的属JavaScript(简称JS),其运行环境也有很多,目前相关的处理引擎高的是Chrome的V8。 目前浏览器竞争激烈,JS引擎的性能也在不断飙高,版本和品种也在不断出新。从上个月浏览器厂商的动态可见战场之惨烈:Google宣布更新引擎到 以进一步提升Chrome性能;Opera宣布转投Webkit;Mozilla宣布。
关于各个浏览器的JS引擎介绍,大家可以参阅这里:http://www.cnblogs.com/gdutbean/archive/2012/02/21/2362003.html

这里先说下JavaScript和ECMAScript的区别。ECMAScript是一种语言标准,定义了其基本语法和语言结构;JavaScript可以理解成各个开发商对这种语言的一种实现,只不过这种实现加入了各浏览器的独有部分(BOM和DOM),来更方便的实现浏览器环境下编程。从这个意义上,JavaScript与QtScript一样,都是ECMAScript的一种方言。(当然实际情况比这个要复杂的多,有兴趣的请Google下JavaScript的历史)。

回来说一下QtScript,QtScript也是ECMAScript的一种实现.开始于集成在Qt中实在Qt V4.3版本,其运行需要libQtScript.so的支持.由于Qt语言信号和槽的实现机制,QtScript也支持这种信号与槽的关联,方便了js脚本与C++代码的交互,这一点是其他版本的ECMAScript中未实现的.由于QtScript运行在自身的QScriptEngine引擎中,其语法较常见的JavaScript语法较为严格,限制了一些不太常规的语言组织方式和使用习惯.比如,QtScript中变量必须var声明,而这点在JavaScript中并不是强制的(JS中未使用var声明的变量默认声明为全局变量).


为了后面描述JS中大量异步处理的方便,我们这里用JavaScript来模拟一下Qt的信号槽机制:
Qt中的信号槽描述如下:

QLabel  *label  = new QLabel; 
QScrollBar *scroll = new QScrollBar; 
QObject::connect( scroll, SIGNAL(valueChanged(int)), label,  SLOT(setNum(int)) );

简单起见,此处只模拟这一种连接方式.
JS中参数时灵活的,不想C++/Qt中那么严格,所以此处稍作改动.

//构建基本对象
function QObject(objInitParm){
  this.info = objInitParm;
  this.objSession = new DateTime();
}
//增加一个自身的信号槽维护池
QObject.connection = {};


//增加信号发射函数
QObject.prototype.signal = function(signalInfo){
  var callBacks = this.connection["signal_0"];  //QObject.getConnetctions(this.objSession);
  for(var i=0;i<callBacks.length;i++){
     callBacks[i]["slotFunc"].call(callBacks[i]["objSlot"], signalInfo);
  }
}


//增加槽函数
QObject.prototype.signal = function(signalInfo){
  //do somthing with signalInfo
}


//增加信号与槽的关联
QObject.prototype.connect = function(objEmit, signalFunc, objSlot, slotFunc){
  
}

当然Node中也大量使用了信号或者说事件这个概念,

比较一下Qt和Node在信号/事件这方面的不同:

Qt的信号和槽,是借助编译器实现的特殊函数或代码片段,最终存在的形态是C++函数.而信号和槽的概念是Qt这一层面对C++封装和抽象的结果。Qt的信号同时存在发射者 接受者 信号类型 信号参数四个概念,在建立关联关系时这四者也同时确定,任何一个信息的变更都会影响一个关联关系的建立。特殊的,同一个信号名称,携带不同的参数类型时,响应的事件可以是不一样的。

Node中的事件,关注的是事件名称,而不太关注发射者或者触发者。也就是说在这边对应过去应该是接受者和信号类型两种属性。

未完待续。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值