我正在搜索两种(一种?)语言。其中一个是主机,能够运行一些“环境”,第二个,可以用来编写在这种环境中运作的“代理”。
一些细节:
主机应该能够运行多个“代理”(嵌入式语言的线程),理想情况下能够限制每个线程一次执行的指令数量(尽管欢迎采用更复杂的控制方式)
嵌入式线程只能访问主机明确公开的对象
应该隔离嵌入式线程。没有共享内存,所有通过主机进行通信
嵌入式语言应该相当简单,动态类型
托管语言应该是高级别的
表现不是主要问题
我在考虑Python是嵌入Lua的主机,例如Lunatic Python,还是某些JVM语言(Scala / Groovy?),但我不确定嵌入式线程的真正隔离的可能性(见2,3)。所以我正在寻找任何想法,框架,成功实施等......
答案 0 :(得分:4)
我认为您列出的条件并不是非常严格,您将找到大量的主机/线程脚本语言对,这些语言符合您的六项要求。
因此,我最重要的建议是,您选择目标用户最喜欢的语言。
有几种方法可以解决这个问题。如果您决定开始选择主语,那么我认为您有以下选择:
C / C ++ :如果您的目的是为线程语言提供更多自由选择,那么拥有C或C ++主机将为您提供最多选择,因为大多数解释的脚本语言都是在C / C ++中,具有嵌入到C / C ++应用程序中的简单机制。线程语言的选择可以是Lua,Javascript,Python,Ruby,PHP,Basic,Scheme,Pascal,Lisp等等。
Java :使用Java作为宿主语言,您可以使用少量嵌入语言的脚本语言。 Here is a list
.NET :如果您打算在Windows上运行,我只会使用此功能,如果不是,我会避免使用它。与Java一样,您可以找到可嵌入.NET应用程序的解释器列表。
其他东西:如果你不喜欢C / C ++或Java作为宿主语言,那么你必须决定你喜欢什么样的宿主语言,但无论选择什么,对于嵌入式语言,您将拥有一组非常有限的选项。你建议Python作为一种可能的宿主语言,我认为这是一个不错的选择。我建议不要使用Lua而不是Python,如果您需要在语言VM级别进行调试,这可能是调试的噩梦。相反,我可以提供两个建议:(1)也使用Python作为线程语言,然后在整个系统中有一个很好的统一语言; (2)找到一个脚本语言,它有一个用Python编写的本机解释器(我所知道的并不多)。您可以使用Ruby,PHP或任何其他主要脚本语言代替Python,但在所有情况下,嵌入式语言的选项都不多。
现在,您可以先选择嵌入式语言,然后找到可以嵌入该语言的宿主语言,而不是寻找宿主语言。您建议使用Lua作为嵌入式语言,这也是一个非常好的选择。如果您开始使用Lua,那么我认为C或C ++应该是您的主语言,因为这将为您提供最佳的嵌入体验。
总而言之,我推荐以下两种方法之一来选择您的语言:
(a)选择一种语言,其中嵌入式语言解释器以宿主语言实现。示例:Lua和C ++,Javascript和C ++,Python和C ++,Scheme和C ++,Jython和Java,JRuby和Java,Rhino和Java等。
或
(b)为主机和线程选择相同的高级脚本语言,并在没有嵌入式脚本的统一平台上工作。示例:Python和Python,Lua和Lua,Ruby和Ruby等。
祝你好运!
答案 1 :(得分:1)
使用javascript / v8作为嵌入式语言,c ++作为宿主语言可能是一个很好的解决方案。有关如何嵌入的信息,请参阅this。
V8提供Contexts,其中每个都有自己的Security Context。这些允许您为不同的客户端创建多个单独的线程,每个客户端都在自己的沙箱中。
另一种选择是java / javascript(rhino),它也允许embedding。限制对其他对象的访问在java中会更难(您必须使用安全管理器),但是您可以限制允许脚本执行的时间,请参阅javadocs here中的示例。
答案 2 :(得分:1)
您还可以通过SBCL实施使用 Common Lisp 。
答案 3 :(得分:0)
我知道这个问题现在已经有几年了,但我建议使用ObjectScript语言。
ObjectScript,简称OS,是一种新的编程语言。它是免费的,跨平台的,轻量级的,可嵌入的和开源的。它结合了多种语言的优点,包括:JavaScript,Lua,Ruby,Python和PHP。操作系统具有Javascripts的语法,来自lua的“多重结果”功能,来自Ruby的语法shugar以及来自PHP和Ruby的魔术方法 - 甚至更多!
答案 4 :(得分:0)
这里的一个很好的例子是SnapScript它可以在任何兼容Java的环境中运行。除了标准的JRE之外,它还可以在Android(Dalvik和ART)上运行而无需任何修改。
IDE实际上管理代理池以进行热执行。