有一些游戏允许玩家在游戏中编写/创建脚本,例如:太空工程师或Psi。
我想使用与任何一个相似的东西,但是我很难找到信息,所以我的问题是:
是否有一个编程分支涵盖了软件一旦编译后即可运行用户创建的新代码的能力?
在编程方面,我的意思是类似PTG(过程地形生成)。
为避免基于问题或观点的范围太广,请让我明确声明我不是在寻找指南或学习的地方,我想要所涉及技术的名称或定义(如果有的话)。
有一些游戏允许玩家在游戏中编写/创建脚本,例如:太空工程师或Psi。
我想使用与任何一个相似的东西,但是我很难找到信息,所以我的问题是:
是否有一个编程分支涵盖了软件一旦编译后即可运行用户创建的新代码的能力?
在编程方面,我的意思是类似PTG(过程地形生成)。
为避免基于问题或观点的范围太广,请让我明确声明我不是在寻找指南或学习的地方,我想要所涉及技术的名称或定义(如果有的话)。
Answers:
用脚本/嵌入式/解释语言编写的脚本,例如“ Lua”,“ Lisp”或“ AngelScript”(此处有更多信息),可以在游戏[*]期间进行更新,然后即时进行解释(=执行)。
您可以将这些脚本中的元素绑定到您的本机编译代码(C ++等),以便脚本随后可以从您的应用程序中执行逻辑。例如 用户可以在脚本中输入的特定命令,从而将游戏中角色在游戏世界中移动给定距离。
一些相关的链接问题:
[*] 由用户作为游戏的一部分,也由开发人员用于快速迭代/测试,而无需重新启动应用程序
interpreted
具有良好的从属关系。我们告诉OP谁不知道这个事实,即语言不需要编译但可以解释-我们以某些语言为例。Lisp会被解释吗?是。它被编译了吗?还可以!但这超出了范围。答案可能与措辞不正确,但这样做是正确的。它将OP推向正确的方向,这才是最重要的。在这里,取我的+1。
您正在寻找一种将代码更改为某些操作的方法。这正是口译员正在做的事情。
看一下Python。您运行它,ba!你土地REPL([R EAD é VAL P RINT 大号接力)。
您定义一个函数“ hello”,该函数显示“ Hello,world”。在那里,您拥有了!
请注意,您没有编译任何内容。解释器在运行时(运行时)做了一些魔术来动态创建函数,现在您可以调用它了。
游戏同样如此。您没有REPL,而是拥有带有REPL模块的游戏。游戏可能会启动REPL,然后运行该REPL中的其他所有内容,因此您可以访问数据并可以对其进行主动修改。
如果您使用的是C ++之类的大型语言,则它们的动态性可能会降低,并且可能会进行编译。您想要一些简单的方法。您可以创建自己的语言,也可以使用现有的语言(例如CoffeScript,Squirrel,Lua,Scheme等)
这些通常称为脚本语言,因为您使用它们来编写基于以其他某种语言(例如C ++)开发的游戏引擎构建的脚本。
我可以想到两个例子。两者似乎完全符合您的要求。
首先是小腿。https://screeps.com/您可以在http://support.screeps.com/hc/en-us/articles/205960931-Server-side-architecture-overview中阅读有关其如何实现此目标的大量信息。
第二个是ComputerCraft http://www.computercraft.info/ 他们没有详细介绍它的工作方式,但是可以在他们的Wiki http://www.computercraft.info/wiki/Main_Page上看到一些细节。
本质上,主游戏在单独的线程中运行解释器,然后允许该线程通过API调用来操纵游戏世界。
在这两个示例中,尽管语言几乎是无限的(出于安全原因仅阻止了某些调用),但是操作受到可以进行的API调用的限制。
通常,只需很少的工作就可以开始这样的事情。你需要
没有一个编程的分支可以处理所有这些问题。但是您将需要在多线程方面有坚实的基础,并且需要有关解释器工作原理的一般知识。
编译后的可执行文件必须包含一个能够读取外部程序代码的解析器 。程序代码不必像C或Python或xyz一样-它可以是任何适合描述目的的描述性数据。例如瑞典语或莫尔斯语。
外部程序代码需要具有一种语法,以便解析器在逐个字符地读取它时可以理解它。语法可以描述(并且代码可以包含)标识符,数值,运算符等。
解析器是固定的(已编译),但可用于灵活的外部代码。
编译后的可执行文件必须具有与其相关功能的内部API。以便解析器可以执行操作。很有可能还必须(双向)访问可执行文件的内部数据,否则解析器必须提供某种类型的数据存储和内务处理。
解析器可以在可执行文件的读取外部程序代码启动,或者它可以读取(部分)它特设,或者它可以重新读取每帧它(将是低效的),或所述代码甚至可以是手工类型和准备就绪时将其发布到解析器(例如:“将单元X向前移动5个步骤” [输入])。
本质上,外部代码不是固定的 -可以更改任何年份,日期或分钟,但是仍然无需重新编译可执行文件。仅可执行文件托管的结果行为会更改。
您当前正在阅读的文本(种类很多,甚至可以说出来)被解释是因为您在阅读时在大脑中“执行”了该文本,却不知道下一句话说的是什么(或者即使可能,也偷偷地改变了)现在)。与Stack Overflow(堆栈)将整个故事预编译为大脑中的字节码相反,然后执行该故事-然后,ofc再也无法更改了。
正在进行的现象是解释。脚本编写只是创建说明或编写代码的行为。所有的计算机编码都是imo脚本-我们描述了我们想要发生的事情。“脚本”一词的含义有些偏斜,但是可以了。我们知道我们的意思。
解释语言绝对没有什么特别之处,绝不是可争议的术语。它们存在很多,并且一些最古老的被解释为与已编译相反。例如,可以使用一种解释性语言手动键入:
袜子= Socket.New(AddressFamily.InterNetwork,SocketType.Stream ProtocolType.Tcp)[ENTER]
...然后进行30 ...不,45分钟的茶歇:-)。返回时,存在“袜子”,可以通过手动键入更多内容或让解释器的自动化继续进行来准备进一步使用。