【问题标题】:Is there a sandboxable compiled programming language simililar to lua是否有类似于 lua 的沙盒编译编程语言
【发布时间】:2019-10-23 16:46:30
【问题描述】:

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

【问题讨论】:

  • "我发现 Lua 和 python 都比编译语言慢数千倍" 真的吗?您是否已经分析了一些预期脚本,或者您是否正在使用其他人的号码?你试过 LuaJIT 吗?
  • 此外,语言的性能仅相对于这些语言的处理对您的整体程序性能的重要性而言才重要。例如,如果一个脚本基本上调用了您的一些函数,根据返回值做出有条件的决定,仅此而已,那么该代码的性能很可能将基于 您提供的函数 i>,而不是发出这些调用的脚本。
  • 大部分时间它会运行脚本代码,因为它是人民的智慧。这是我用的。 benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/… 1000 次可能是最坏的情况,但我发现慢 100 倍也是不可接受的。
  • "大多数时候它会运行脚本代码,因为它是人民的智慧。" 不要那么肯定。即使脚本很长,也完全有可能大部分时间没有花在脚本语言本身上。我想执行对how_many_people_are_in_front_of 的调用将花费 的时间来计算,而不是脚本为使用返回值所做的任何事情。始终为自己的特定用例进行基准测试;固定基准对您的特定用例没有用处。
  • 嗯好的。尽管该事件所做的只是创建一个 2D 三角形来代表一个人的视觉并简单地计算他会看到多少人。

标签: lua scripting add-on


【解决方案1】:

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

脚本语言的速度是一个相当模糊的术语。脚本语言本质上被转换为对用快速编译语言编写的函数的一系列调用。但是这些函数通常被编写为具有大量检查和故障保护的通用功能,而不是快速编写。对于某些问题,并没有太多多余的操作堆积起来,并且脚本翻译产生的机器代码与编译程序的机器代码基本相同。对于其他问题,熟悉该语言的人可能会强制将其翻译成基本相同的机器代码。对于其他问题,方便的代价永远保留在脚本中。

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

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


现在,关于你的程序中的用户程序的问题。

这就是脚本语言最初的存在方式。您可以了解为什么这种语言可能会很慢,例如在 SICP 中。

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

但是,如果您不断添加越来越复杂的命令供用户调用,您最终只会发明您的own language。那时,您可能希望从一开始就使用 Lua。

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

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 沙箱化(至少在某些语言中)。或者您可以自己编译用户代码以控制他们调用的功能,然后将其作为库插入。

【讨论】:

  • 我没有提到脚本语言。我说我想要一种编译语言。
  • 可以编译Python。
  • >> 如果您查看基准任务的时间安排,您会发现它们之间并没有一致的赢家。对于一项任务,语言是最快的,对于另一项任务,它远远落后。
  • 这不是我提供的网址,它是由提问者提供的。您可以查看每个任务的分数,有时获胜者是Rust,有时是C++。您可以查看problem statements。要点是,这些结果大多与特定的特殊任务制定相关。
  • 关键是 OP 没有比较 Rust 和 C++!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 2011-06-18
  • 2010-09-20
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
  • 2011-02-03
相关资源
最近更新 更多