哪些语言生成字节码,并且可以在C++中加载/执行

What languages generates bytecodes and can be load/executed in C++

本文关键字:C++ 加载 执行 语言生成 字节      更新时间:2023-10-16

我想知道什么语言适合这种情况:

我正在编写一个应用程序(C++),我需要为它添加某种类型的脚本支持,但这种语言必须能够"编译"。

此编译将生成一些人类无法读取的"字节码"。然后我需要能够获得这个字节码,将它加载到C++应用程序中并执行它

必须将c++应用程序函数导出到脚本并调用回脚本函数。

其主要思想是在不接触C++代码的情况下扩展应用程序功能,但用户一定很难阅读这些脚本。

我可以使用什么语言?

也许是Brainfuck?当然很容易找到解释器,而且可读性比一般的机器代码或字节码低得多。

我很乐意推荐ChaiScript,但我们没有内置任何加密或字节码支持。

也就是说,您没有理由不使用任何现有的C++脚本引擎。如果您提供自己的加密和解密函数将脚本输入引擎,ChaiScript、luabind等都可以使用。

据我所知,AngelScript是一个支持c++和字节码的脚本引擎,而且相对来说比较晦涩。它们有一个关于加载预编译的字节码的页面。

也许Vox*能满足您的需求?

脚本可以预先编译成可移植的字节码,并且非常容易嵌入,使用类似于Lua:的基于堆栈的API

// most basic embedding example
VoxVM* v = vox_open(1024);
vox_aux_seterrorhandlers(v);
vox_pushroottable();
vox_dofile(v, "somescript.vx", false, true);
vox_pop(v, 1);
vox_close(v);

有关更完整的示例,请参阅etc/minimal.cpp和src/frontend/frontend.cpp


*Vox是一个项目,我一直致力于取代Lua的个人目的。它基于squirrel3的VM的高度修改版本(但不再与松鼠兼容!)。

语法也发生了一些变化:它没有对新插槽使用<-,而是使用:=,以避免语法混乱。

Core已经完成,可以在嵌入式项目中使用,但stdlib仍然没有完成,因为Vox是一个非常年轻的项目(因此,目前缺乏文档,但stdib是嵌入式编程的一个很好的例子,也是通用脚本的例子)。

我建议您使用LLVM。LLVM的中间表示可以以字节码格式存储。您需要为脚本语言使用现有的前端,或者开发自己的前端。您的C++应用程序可以加载字节码文件并对其进行JIT。以下是基于LLVM的现有项目列表。你可能会找到一个适合你需求的解决方案。

LuaJIT是一个很好的、快速的Lua解释器,它将Lua集成到本机代码中。与常规Lua不同,LuaJIT字节码是独立于平台的。

自己看看:http://luajit.org/luajit.htmlhttp://luajit.org/extensions.html