有没有一种类似Lua的可沙盒化编译型编程语言?

我正在制作一个人群模拟器。想象一下二维城市中的人们走来走去。城市建筑用灰色矩形表示,人用彩色点表示。现在我想让其他人编写可以控制这些人的程序,同时不需要他们接触到后端核心。

我也不希望他们能够使用我未提供给他们的方法以外的任何功能。这意味着他们无法访问文件、网络、随机数等等。

他们将获得像“你刚刚被指示去X”或“你已经到达P”之类的事件。

脚本应该允许他们做一些事情,例如移动_forward 或 how_many_people_are_in_front_of me 等等。

现在我发现Lua和Python的速度都比编译型语言慢数千倍(我以为它会比10倍还慢一个数量级),这对于我的模拟来说太慢了。

所以我的问题是:有没有一种编程语言是FOSS的,可以让我限制系统访问(沙盒化)整个语言,通过仅允许使用我提供的函数来限制脚本具有的信息量,并且速度相当快,类似于比Java慢小于10倍的东西,我可以在该语言内向对象发送事件,通过这些事件我可以在运行时加载新的类/对象。

点赞
用户4687565
用户4687565

你不觉得如果有一种比 Lua 和 Python 更快的脚本语言,那么它至少会被像它们一样广泛讨论吗?

脚本语言的速度是一个相当模糊的概念。脚本语言本质上转换为一系列快速编译语言编写的函数调用。但是,这些函数通常编写为通用的,具有许多检查和故障保护,而不是为了速度。对于某些问题,重复操作很少积累,脚本翻译结果与编译程序本身的机器码本质上相同。对于其他问题,了解该语言的人可能会迫使其翻译为本质相同的机器码。对于其他问题,方便的价格将永远保留在脚本中。

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

通过查看基准中类似任务的语言速度,以判断语言在您的任务中的速度是否合适。那么,哪一个问题与您的最接近?我猜没有。


现在,进入您程序中的用户程序问题。

这就是脚本语言首次出现的方式。您可以阅读有关为什么此类语言可能会很慢的内容,例如SICP。

如果您评估您期望人们在其程序中编写的内容,您可能会决定不需要为他们提供整个编程语言。然后,您可以为他们提供一组简单的指令,他们可以使用这些指令来描述几个分支决策和值查询。然后,您自己非常高效的程序将构建一个包含所描述逻辑的对象。这个技巧已经被描述,如此

但是,如果您不断添加越来越复杂的命令供用户调用,最终您只会发明自己的语言。在那时,您可能希望从一开始就使用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 问题,进行机器学习或进行其他矩阵乘法等操作,则会很慢,前提是有人真的费心实现该功能。

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

2019-06-09 13:17:03