ScriptX
全能的脚本引擎抽象层
---
[](README.md) [](https://www.apache.org/licenses/LICENSE-2.0) [](https://github.com/Tencent/ScriptX/actions/workflows/unit_tests.yml)    [](https://coveralls.io/github/Tencent/ScriptX)

ScriptX是一个脚本引擎抽象层。对下封装多种脚本引擎,对上暴露统一的API,使得上层调用者可以完全隔离底层的引擎实现(后端)。
ScriptX不仅隔离了几种JavaScript引擎,甚至可以隔离不同脚本语言,使得**上层仅需修改一个编译选项即可无缝切换脚本引擎和脚本语言**。
ScriptX的术语中,"前端"指对外的C++ API,"后端"则指不同的底层引擎,目前已经实现的后端有:V8, node.js, JavaScriptCore, WebAssembly, Lua.
# 状态
| 后端 | 语言 | 版本 | 状态 |
| :----: | :----: | :----: | :----: |
| V8 | JavaScript | 7.4+ | done |
| JavaScriptCore | JavaScript | 7604.1.38.0.7+
(iOS 10+/macOS10.12+) | done |
| Node.js | JavaScript | 14.x+ | done |
| QuickJs | JavaScript | 2021-03-27 | done |
| WebAssembly | JavaScript | Emscripten-2.0.5+ | done |
| Lua | Lua | 5.4+ | done |
| CPython | Python | | todo |
| YARV | Ruby | | todo |
| Mono | C# | | todo |
# 简介
ScriptX 的接口使用现代C++特性。并且做到100%符合C++标准,完全跨平台。
所有API以`ScriptX.h`聚合头文件暴露出来。
设计目标: **多语言** | **多引擎实现** | **高性能** | **API易用** | **跨平台**
# 第一印象
我们通过一段比较完整的代码来对ScriptX留下一个整体印象。
```c++
EngineScope enter(engine);
try {
engine->eval("function fibo(x) { if (x<=2 ) return 1; else return fibo(x-1) + fibo(x-2) }");
Local fibo = engine->get("fibo").asFunction();
Local ret = fibo.call({}, 10);
ret.asNumber().toInt32() == 55;
auto log = Function::newFunction(
[](const std::string& msg) {
std::cerr << "[log]: " << msg << std::endl;
});
// or use: Function::newFunction(std::puts);
engine->set("log", log);
engine->eval("log('hello world');");
auto json = engine->eval(R"( JSON.parse('{"length":1,"info":{"version": "1.18","time":132}}'); )")
.asObject();
json.get("length").asNumber().toInt32() == 1;
auto info = json.get("info").asObject();
info.get("version").asString().toString() == "1.18";
info.get("time").asNumber().toInt32() == 132;
Local