QQ交流群:523723780(ChakraCore)
ChakraCore是什么?
一个微软开源的,用于Windows IE/Edge内核的高效JS脚本引擎。
前不久微软开源了ChakraCore,并且支持跨平台。在Github可以搜到。即使在开源之前,Windows SDK也支持你的程序去Hosting JS,只需要简单的包含jsrt.h,链接jsrt.lib即可调用JSRT的API。只是旧版本的Windows系统所带引擎性能没有Windows10 Edge性能好.
关于Chakra与JSV8的性能比较
http://browserbench.org/JetStream/是一个浏览器评分工具(越高越好),在我平板的得分Chrome54(JSV8)是126.59,Edge(Chakra)是152.06。在cnblog某个用户的渲染评测中,Chrome54是83秒,Edge是110秒,越快越好。所以我也不好说哪个更快,就浏览器日常使用,肯定是Edge更快,更节能。
JS脚本支持有哪些优势?
在流行的脚本语言中,Lua的小巧高性能(性能指LuaJit的性能),Python的功能性一直受开发者青睐。有什么理由使用JS脚本呢?
JS脚本有众多的库支持
JS脚本被用于HTML网页开发,开发者众多
JS有众多大公司的支持
JS有优秀的即时编译(JIT)性能
JS有无敌的开发工具Visual Studio的支持
JS语言特性更类似C/C++,相比Lua要舒服很多
Chakra的嵌入优势:相比Lua的堆栈式API,Chakra的API更容易写胶水代码。
很多游戏使用Lua的原因是比Python性能好,没有其他可选方案了。Chakra的开源,应该带动开发者去使用JS脚本。Chakra对于大型Windows游戏开发者更大的好处在于系统支持,Lua需要去下载编译,而Chakra只需要包含头文件,链接lib。
如何在Windows嵌入Chakra?
请看我以前的文章。
如何在linux嵌入ChakraCore去实现一个JavaScript运行时容器?
如果你像Windows上一样使用ChakraCore,用动态链接的方式,那肯定会产生JsErrorNoCurrentContext错误。
我询问过微软,这是因为在Windows下,系统加载DLL时会调用DLL的入口DllMain,而Linux没有这个机制,而Linux下的Chakra却有这样的设计。
所以在Linux加载动态库(libChakraCore.so)以后,应该显式的调用DllMain。下面是我的实现,非官方。官方接受了我的意见,大概会在以后版本中改进linux版本的初始化方式。
2016年11月19日,我写这段话时的两天前,官方正则讨论这方面的设计细则。Github链接
#ifdef __linux__
typedef int (*DllMainPtr)(void* hmod, DWORD dwReason, void* pvReserved);
DllMainPtr dllmain;
void* handle = dlopen("libChakraCore.so", RTLD_LAZY); if (handle == nullptr)
throw runtime_error("Failed load library libChakraCore.so"); char* errstr = dlerror();
if (errstr != nullptr)
throw runtime_error(errstr); dllmain = (DllMainPtr)dlsym(handle, "DllMain");
errstr = dlerror();
if (errstr != nullptr)
{
dlclose(handle);
throw runtime_error(errstr);
}
if (dllmain == nullptr)
{
dlclose(handle);
throw runtime_error("find not DllMain");
} //模拟WIN DLL加载
dllmain(, , );
dllmain(, , ); dlclose(handle);
#endif // __linux__
可以列出全局对象或函数吗?
可以,除了Intl,这是个特例
JS可以使用引用(c++的&,c#的ref)参数吗?
不可以,即使你为传入Native的函数参数修改值也是没用的。
如果一定要用,那只能传一个引用类型的对象,在函数内部修改此对象的成员。var arr=[];(function (v){v[1]=1;})(arr);//arr[1] == 1
Chakra的API支持多线程吗?
支持,据我当前的研究,不同线程必须有各自的runtime对象,每个runtime可以有多个环境(context),同一个runtime下的多个环境可以*交换数据,但环境之间不共享数据。也就是说api级别可以把环境1的数据带到环境2,但是脚本里,环境2是看不到环境1的数据的。
Chakra支持ES6的Symbol吗?
完全支持。
Chakra如何在原生函数里支持JS的闭包?
函数(function)也是对象(object),可以有自定义属性,所以,在原生API级别操作Chakra时,可以把需要闭包的变量放在函数的属性里。如果希望在脚本中是只读的,那么可以设置属性描述。如果希望在脚本中是隐藏的,那么可以用符号属性。
如何用API实现原生对象的多次继承?
假设需要我们有一个移动设备类,手机类从它继承,iPhone从手机继承,那么应该这样:
一个JsObject(用JsCreateObject),用来表示移动设备,可以添加成员,另一个JsObject用来表示手机,再有一个ExternalObject(用JsCreateExternalObject)用来表示一个实际的原生对象实例(iPhone)。
手机JsObject从移动设备JsObject继承(JsSetPrototype),iPhone从手机继承。
ChakraCore API的对象管理该如何做?
ChakraCore API的都在操作核心对象JsValueRef,Chakra内部会把生成的对象放在堆上。用API生成一个JsValueRef对象后,运行一段时间会垃圾回收掉。所以如果在你的程序中长期使用JsValueRef,需要保存它,那么应该调用调用JsAddRef为其添加引用计数。在不用时调用JsRelease减少引用计数。【2017/5/27】
附录:
1、JS的符号 ES6-Symbol
ChakraCore/JSRT使用问题汇总的更多相关文章
-
常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)
前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...
-
异常处理汇总 ~ 修正果带着你的Net飞奔吧!
经验库开源地址:https://github.com/dunitian/LoTDotNet 异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983 ...
-
UWP开发必备:常用数据列表控件汇总比较
今天是想通过实例将UWP开发常用的数据列表做汇总比较,作为以后项目开发参考.UWP开发必备知识点总结请参照[UWP开发必备以及常用知识点总结]. 本次主要讨论以下控件: GridView:用于显示数据 ...
-
Oracle手边常用70则脚本知识汇总
Oracle手边常用70则脚本知识汇总 作者:白宁超 时间:2016年3月4日13:58:36 摘要: 日常使用oracle数据库过程中,常用脚本命令莫不是用户和密码.表空间.多表联合.执行语句等常规 ...
-
Oracle 数据库知识汇总篇
Oracle 数据库知识汇总篇(更新中..) 1.安装部署篇 2.管理维护篇 3.数据迁移篇 4.故障处理篇 5.性能调优篇 6.SQL PL/SQL篇 7.考试认证篇 8.原理体系篇 9.架构设计篇 ...
-
Vertica 数据库知识汇总篇
Vertica 数据库知识汇总篇(更新中..) 1.Vertica 集群软件部署,各节点硬件性能测试 2.Vertica 创建数据库,创建业务用户测试 3.Vertica 数据库参数调整,资源池分配 ...
-
读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
-
关于DDD的学习资料汇总
DDD(Domain-Driven Design)领域驱动设计,第一次看到DDD是在学习ABP时,在其中的介绍中看到的.what,DDD是个什么鬼,我不是小白,是大白,没听过.于是乎,度娘查查查,找到 ...
-
Oracle 列数据聚合方法汇总
网上流传众多列数据聚合方法,现将各方法整理汇总,以做备忘. wm_concat 该方法来自wmsys下的wm_concat函数,属于Oracle内部函数,返回值类型varchar2,最大字符数4000 ...
随机推荐
-
使用批处理文件在FTP服务器 上传下载文件
1.从ftp服务器根目录文件夹下的文件到指定的文件夹下 格式:ftp -s:[配置文件] [ftp地址] 如:ftp -s:c:\vc\ftpconfig.txt 192.168.1.1 建立一个 ...
-
JS中的 new 操作符简单理解
首先上一一个简单的 new 操作符实例 var Person = function(name){ this.name = name; this.say = function(){ return &qu ...
-
Ambari2.6.0 安装HDP2.6.3(离线安装)
一.下载安装包 因为使用在线安装特别慢,所有的安装包加起来有9个G左右,所以本教程是通过迅雷下载包,然后上传到服务器,通过配置本地源的方式来实现的离线安装.通过ambari安装需要下载下面的三个主要包 ...
-
Spark Streaming + Flume整合官网文档阅读及运行示例
1,基于Flume的Push模式(Flume-style Push-based Approach) Flume被用于在Flume agents之间推送数据.在这种方式下,Spark Stre ...
-
mysql之数据库的增删改查
一.DDL 1.创建数据库 create database 数据库名 *数据库名不能中文, 不能数字正常英文 , 关键字会自动变大写 2.删除数据库 drop database 数据库名 3.使用数据 ...
-
一套能体现 RBAC 的表结构设计
1.RBAC 概述 2.表结构设计 2.1.用户表 2.2.角色表 2.3.权限表 2.4.用户角色(关系)表 2.5.角色权限(关系)表 3.总结 1.RBAC 概述 RBAC(Role-Based ...
-
Java正则解析HTML一例
import java.util.regex.Matcher;import java.util.regex.Pattern; public class Test { static String tes ...
-
JS基础---->;javascript的基础(一)
记录一些javascript的基础知识.只是一起走过一段路而已,何必把怀念弄的比经过还长. javascript的基础 一.在检测一个引用类型值和 Object 构造函数时, instanceof 操 ...
-
nohup 日志切割
最近遇到日志切割的问题,即程序是通过命令: nohup python *.py & 放到后台执行的,这样程序的日志输出到了nohup自动生成的nohup.out文件. 问题就来了,nohup. ...
-
testlink问题--linux环境下
搭建testlink 时出现问题,相关解决办法: 1.Maximum Session Idle Time before Timeout 修改php.ini文件,修改成session.gc_maxlif ...