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使用问题汇总的更多相关文章

  1. 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)

    前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...

  2. 异常处理汇总 ~ 修正果带着你的Net飞奔吧!

    经验库开源地址:https://github.com/dunitian/LoTDotNet 异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983 ...

  3. UWP开发必备:常用数据列表控件汇总比较

    今天是想通过实例将UWP开发常用的数据列表做汇总比较,作为以后项目开发参考.UWP开发必备知识点总结请参照[UWP开发必备以及常用知识点总结]. 本次主要讨论以下控件: GridView:用于显示数据 ...

  4. Oracle手边常用70则脚本知识汇总

    Oracle手边常用70则脚本知识汇总 作者:白宁超 时间:2016年3月4日13:58:36 摘要: 日常使用oracle数据库过程中,常用脚本命令莫不是用户和密码.表空间.多表联合.执行语句等常规 ...

  5. Oracle 数据库知识汇总篇

    Oracle 数据库知识汇总篇(更新中..) 1.安装部署篇 2.管理维护篇 3.数据迁移篇 4.故障处理篇 5.性能调优篇 6.SQL PL/SQL篇 7.考试认证篇 8.原理体系篇 9.架构设计篇 ...

  6. Vertica 数据库知识汇总篇

    Vertica 数据库知识汇总篇(更新中..) 1.Vertica 集群软件部署,各节点硬件性能测试 2.Vertica 创建数据库,创建业务用户测试 3.Vertica 数据库参数调整,资源池分配 ...

  7. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  8. 关于DDD的学习资料汇总

    DDD(Domain-Driven Design)领域驱动设计,第一次看到DDD是在学习ABP时,在其中的介绍中看到的.what,DDD是个什么鬼,我不是小白,是大白,没听过.于是乎,度娘查查查,找到 ...

  9. Oracle 列数据聚合方法汇总

    网上流传众多列数据聚合方法,现将各方法整理汇总,以做备忘. wm_concat 该方法来自wmsys下的wm_concat函数,属于Oracle内部函数,返回值类型varchar2,最大字符数4000 ...

随机推荐

  1. 今日头条面试题——LRU原理和Redis实现

    很久前参加过今日头条的面试,遇到一个题,目前半部分是如何实现 LRU,后半部分是 Redis 中如何实现 LRU. 我的第一反应应该是内存不够的场景下,淘汰旧内容的策略.LRU ... Least R ...

  2. java提高(7)---TreeSet--排序

    TreeSet(一) 一.TreeSet定义:      与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的.            1)TreeSet类概述 ...

  3. go使用context包避免goroutine泄露问题

    go是带内存自动回收的特性,因此内存一般不会泄漏.但是Goroutine确存在泄漏的情况,同时泄漏的Goroutine引用的内存同样无法被回收. 下面的程序中后台Goroutine向管道输入自然数序列 ...

  4. 使用Python开发chrome插件

    本文由 伯乐在线 - xianhu 翻译,Daetalus 校稿.未经许可,禁止转载!英文出处:pythonspot.com.欢迎加入翻译小组. 谷歌Chrome插件是使用HTML.JavaScrip ...

  5. MySQL中间件之ProxySQL(12):禁止多路路由

    返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.multiplexing multiplexing,作用是将语句分 ...

  6. Ansible常用模块介绍及使用(week5_day1_part2)--技术流ken

    Ansible模块 在上一篇博客<Ansible基础认识及安装使用详解(一)--技术流ken>中以及简单的介绍了一下ansible的模块.ansible是基于模块工作的,所以我们必须掌握几 ...

  7. Redis基础知识补充及持久化、备份介绍(二)--技术流ken

    Redis知识补充 在上一篇博客<Redis基础认识及常用命令使用(一)--技术流ken>中已经介绍了redis的一些基础知识,以及常用命令的使用,本篇博客将补充一些基础知识以及redis ...

  8. cobbler单台服务器实现批量自动化安装不同版本系统-技术流ken

    前言 在上一篇博文<cobbler批量安装系统使用详解-技术流ken>中已经详细讲解了cobbler的使用以及安装,本篇博文将会使用单台cobbler实现自动化批量安装不同版本的操作系统. ...

  9. Runtime详解(下)

    Runtime应用 1.Runtime 交换方法 应用场景:当第三方框架或者系统原生方法功能不能满足我们的时候,我们可以在保持系统原有功能的基础上,添加额外的功能. 需求:加载一张图片直接用系统的[U ...

  10. does not support SSL connections

    语言:C# 开发工具:Visual Studio 2017 问题场景介绍: nuget引用的MySql.Data版本是6.10.5,MySQL的数据库连接串如下: Server=xxx;Databas ...