许多编写游戏程序和其他应用程序的人将一种语言嵌入到应用程序中,以允许用户编写小程序。
据我所知,最流行的嵌入式语言(尽管“更流行”并不一定意味着“更好”)似乎是:
- 为这一特定应用程序定制的领域特定语言,其他任何地方都没有使用
- 卢阿_
- Tcl
- Python a b,通常是简化的子集,例如 PyMite c
- 向前
- JavaScript一个
- 语言
- 天使脚本
- XPL0 a b
- 松鼠_
- 哈斯克尔_ _
- NPCI(纳米伪 C 解释)
- 机器人对话
- 解释一些硬件机器语言(为什么这是最不受欢迎的选择?有充分的理由,如下所述)。
您可能想查看 Gamedev StackExchange,特别是诸如“如何将脚本语言添加到游戏中?”之类的问题。.
您可能想在 StackOverflow 上查看标记为“嵌入式语言”的一些问题;例如
“选择一种嵌入式语言”、
“我可以在我的软件中使用什么好的可嵌入语言来编写脚本?”
“Lua 作为嵌入式语言的替代品?”
“哪种游戏脚本语言更好用:Lua 还是 Python?” , ETC。
这些语言的许多实现在内部使用某种
字节码。通常,同一高级编程语言(如 JavaScript)的两种不同实现在内部使用两种完全不同的字节码语言(a)。通常几种高级编程语言编译成相同的底层字节码语言——例如,Python 的 Jython 实现、JavaScript 的 Rhino 实现、Tcl 的 Jacl 实现、JScheme 和 Scheme 的其他几种实现,以及 Pascal 的几种实现;全部编译为相同的 JVM 字节码。
细节
为什么要使用脚本语言而不是解释某些硬件机器语言?
为什么要“交替硬软层”?获得简单性和更快的开发。
更快的发展
人们通常使用脚本语言而不是编译语言来更快地工作。
使初始原型工作通常要快得多——解释器在幕后处理一堆机器语言强制你明确写出的东西:将变量的初始值设置为零、子程序序言和子程序结语代码, malloc 和 realloc 以及 free 和相关的内存管理东西,当容器装满时增加容器的大小等。
一旦有了初始原型,添加新特性就会更快:脚本语言具有快速的编辑-执行-调试周期,因为它们避免了编译语言的编辑-编译-执行-调试周期的“编译”阶段。
简单
我们希望嵌入式语言语言在两个方面“简单”:
当人们构建 CPU 时,硬件限制总是会限制指令集。许多概念上“简单”的操作——人们一直在使用的东西——最终需要大量的机器语言指令来实现。
嵌入式语言没有这些硬件限制,允许我们实现更复杂的“指令”来完成(对人类而言)在概念上看起来很简单的事情。这通常使系统在上述两种方式上都更简单:
直接用该语言编写的人(或为该语言编写编译器的人)最终编写的代码要少得多,花更少的时间单步调试代码等等。
对于每个这样的高级操作,我们将复杂性从编译器转移到解释器内的指令实现。与其(您编写代码)编译器将一些更高级别的操作分解为中间语言中的一个短循环(并在运行时在解释器中反复单步执行该循环),不如编译器以中间语言发出一条指令(并且您在解释器对该中间“指令”的实现中编写相同的一系列操作)。使用编译语言(“内部”复杂指令)实现所有 CPU 密集型的东西,极其简单的解释器通常足够快。(即,您避免花费大量时间构建 JIT 或尝试以其他方式加快速度)。
由于这些原因和其他原因,许多游戏程序员使用“脚本”语言作为他们的“嵌入式语言”。
(我现在看到 Javier 已经建议“使用嵌入式脚本语言”,所以这变成了长篇大论,为什么这是解释硬件机器语言的一个很好的替代方案,并在一种特定的脚本语言似乎不存在时指出替代方案合适的)。