是否有类似于lua的可沙盒编译编程语言



我正在开发一个人群模拟器。这个想法是人们在2D中在城市中行走。想想建筑物的灰色矩形和人物的彩色圆点。现在我希望这些人可以被其他人编程,而不让他们访问核心后端。
我也不希望他们能够使用我为他们提供的方法以外的任何东西。这意味着没有文件访问,互联网访问,RNG,什么都没有。
他们将收到诸如"您刚刚被指示去X"或"你已经到达P"之类的事件。
然后,脚本应该允许他们执行诸如move_forward或how_many_people_are_in_front_of我之类的操作。
现在我发现Lua和python都比编译语言慢数千倍(我认为它会慢10倍的数量级),这对于我的模拟来说是慢的。
所以我的问题来了:有没有一种编程语言是 FOSS,允许我限制系统访问(沙盒)整个语言,以限制脚本的信息量,只允许它使用我提供的函数,这相当快,大约比 Java 慢 <10 倍,我可以将事件发送到该语言中的对象,我可以使用该语言即时加载新的类/对象。

你不认为如果有比lua和python更快的脚本语言,那么它至少会被谈论得和它们一样多吗?

脚本语言的速度是一个相当模糊的术语。脚本语言本质上是转换为对用快速编译语言编写的函数的一系列调用。但是这些函数通常被编写为通用的,具有大量的检查和故障保护,而不是快速。对于某些问题,没有很多冗余操作堆叠起来,脚本转换产生的机器代码与编译程序基本相同。对于其他问题,一个了解该语言的人可能会强迫它翻译成本质上相同的机器代码。对于其他问题,便利的代价永远伴随着脚本。

如果您查看基准测试任务的时间,您会发现它们之间没有一致的赢家。对于一项任务,语言是最快的,对于另一项任务,它远远落后。

通过查看基准测试中的类似任务来衡量任务的语言速度是有意义的。那么,这些问题中哪一个映射最接近你的问题?我的猜测是:没有。


现在,进入程序内部用户程序的问题。

这就是脚本语言最初出现的方式。您可以阅读为什么这种语言可能很慢,例如在 SICP 中。

如果你评估你期望人们在他们的程序中写什么,你可能会决定,你不需要给他们完整的编程语言。然后,您可以为他们提供一组简单的指令,他们可以用来描述一些分支决策和值查找。然后,您自己的高性能程序将构造一个包含所描述逻辑的对象。这里和那里描述了这个 tric。

但是,如果您不断添加越来越复杂的命令供用户调用,您最终只会发明自己的语言。在这一点上,你可能会希望你从一开始就和Lua一起去。

话虽如此,我认为下面的代码片段在编译代码、您自己的解释器对象或任何嵌入式脚本语言中不会有显着差异:

if event = "You have just been instructed to go to X":
set_front_of_me(X) # call your function
n = how_many_people_are_in_front_of_me() #call to your function
if n > 3:
move_to_side() #call to function provided by you
else:
move_forward() #call to function provided by you

现在,如果用户需要做复杂的计算机科学工作,解决np问题,做机器学习或其他矩阵乘法,那么是的,这将是很慢的,如果有人真的会麻烦自己实现它。

如果您达到这一点,似乎至少有一些可能性可以对编译的 dll 进行沙盒处理(至少在某些语言中)。或者,您可以自己编译用户的代码以控制他们调用的功能,然后将其作为库插入。

最新更新