您当前的位置:首页 > 互联网教程

QuickJS高级玩法—javascript作为脚本嵌入C++

发布时间:2025-05-21 13:44:42    发布人:远客网络

QuickJS高级玩法—javascript作为脚本嵌入C++

一、QuickJS高级玩法—javascript作为脚本嵌入C++

1、JavaScript也能像Lua一样,通过QuickJS实现作为脚本嵌入C++,创造出类似Lua的“热更新”功能。QuickJS让JavaScript拥有了Lua式的嵌入能力,尤其在C++程序中实现JavaScript运行时库,使得两者混合运行变得轻而易举。

2、在C++宿主环境中执行普通JavaScript脚本

3、支持模块化,允许JavaScript调用宿主C++编写的模块

4、能将JavaScript语句的结果返回给C++

5、宿主可读取并操作JavaScript运行时中的变量

6、双向数据交互,C++定义的变量能在JavaScript中使用

7、集成模块支持,JavaScript调用C++定义的模块,实现功能拓展

8、高级功能:宿主C++读取和运行包含模块的JavaScript文件,支持热更新

9、通过上述操作,C++程序得以充分利用JavaScript的表达能力和广泛生态,尽管QuickJS引擎在计算性能上可能不如V8,但其灵活性和流行度使其成为一种强大选择。尽管如此,阿特伍德定律告诉我们,JavaScript的应用前景广阔,将在更多领域取代其他语言。

二、如何在C++中增加给JavaScript调用的API

1、可以在地址栏中输入chrome://extensions查看已安装的扩展程序。下图示例说明了我的浏览器中已安装了GoogleMailChecker扩展程序,我们将使用它来测试新增的API(测试可以使用任何扩展程序,而不需指定这所示例的GoogleMailchecker)。

2、从上图也同时示例了如何打开Chrome网上商店,我们需要进入该页面查看已开发好的API。进入页面后按F12打开开发者工具,并将开发者工具切换到控制台。

3、在开发者工具的控制台中,输入“chrome.management.un”其将显示managementnamespace所支持的API。

4、下面我们要做的,就是在management中增加showButtonAPI,用于显示或隐藏扩展栏上(某)扩展程序的Icon。增加showButtonAPI大体上分成两大部骤。步骤一为变更C++代码,步骤二为变更management.json接口描述文件。下面逐步讲解基于ChromeR28源码的具体变更内容。

5、首先,在src\chrome\browser\extensions\api\management\management_api.h中增加一个新类的声明。当showButton在Javascript中被调用时,该类将负责进行后续处理,其RunImpl方法将会被调用。

6、classManagementShowButtonFunction:publicManagementFunction{

7、DECLARE_EXTENSION_FUNCTION("management.showButton", MANAGEMENT_UNINSTALL)

8、virtualboolRunImpl() OVERRIDE;

9、接着,在src\chrome\browser\extensions\api\management\management_api.cc中增加新类的实现。RunImpl方法根据JavaScript所传入的两个参数调用SetBrowserActionVisibility函数,实现对扩展程序Icon的显示和隐藏。第一个参数为扩展程序的ID,第二个参数是一个布尔变量,用于指示是显示(true)抑或隐藏(false)扩展程序的Icon。

10、有了以上的变更后,在编译Chrome项目之前,需手动重新编译api项目,因为Chrome项目并不依赖于api项目。重新编译将使得在自动生成的GeneratedFunctionRegistry::RegisterAll函数内增加对ManagementShowButtonFunction的注册。

11、程序编译完成后,我们可以在开发者工具的控制台上测试showButton函数。下图示例说明了通过调用该函数隐藏和显示GoogleMailChecker扩展程序的Icon。

12、上面示例了如何在已存在的managementnamespace中增加一个API。在Chrome中,JavaScriptAPI的使用存在权限的概念。如果新增API的同时也需新增namespace的话,需要注意在APIPermissionInfo::RegisterAllPermissions方法中注册新增namespace的权限,否则会出现页面无法访问新增API的问题。

三、有没有用JavaScript开发的C/C++、Java/C#等语言的编译器

1、目前在我的印象里面,没有使用js语言开发的编译器。

2、主要原因是,js是依托浏览器网页里面执行,不能运行任何系统应用程序,也没有权限去调用系统底层的指令去执行操作,因此也就无法作为程序的编译器去编译程序了。

3、否则的话,随便登陆一个网站,就会被恶意的程序破坏自己的电脑了。