什么是脚本引擎?

Posted

技术标签:

【中文标题】什么是脚本引擎?【英文标题】:What is a scripting engine? 【发布时间】:2010-12-14 01:18:53 【问题描述】:

我已经看到here 指出,将编程语言与脚本语言区分开来的是脚本引擎。但是我不明白它是如何工作的,所以我不知道有什么区别。

例如,我在导入的库中看到 Java 调用方法的代码,但它似乎与 Python 或 Ruby 代码没有“足够不同”——它们都是脚本语言,对吧?我想这也与过程和面向对象的范式有关,但最后,我不明白为什么它们会按现在的方式分类。

编辑:关于作为解释器的脚本引擎……Java 不是解释语言吗?我知道有已编译的字节码,但对我来说仍然没有意义。

【问题讨论】:

是的,Java(和 C#)的典型实现在虚拟机(也称为解释器)中运行字节码,就像 Python 或 Ruby 的典型实现一样(实际上它可以相同口译员;-)。因此,正如您所注意到的,这种区别的根据相当不充分。 Java 不是解释型语言。你有一个叫做 javac 的编译器和一个叫做类文件的(虚拟)机器对象二进制文件。 Java 不被视为解释语言。您编写 Java 代码,然后您有一个显式编译步骤,其中 Java 代码被转换为字节码。然后在 Java 虚拟机中解释字节码。通常当人们说“解释语言”时,他们的意思是一种语言,您可以直接运行代码而无需显式编译步骤。 (“解释器”可能使用即时编译作为速度优化。)它是模糊的:即使每个人都同意的语言是“编译”语言,如 C,也可以有解释器。 (谷歌搜索“C解释器”!) Python 做同样的事情,只是你没有注意到。你可以告诉它只编译一个文件,你会得到一个 .pyc 字节码,它本质上是编译的 Python。 【参考方案1】:

可能与您所说的最接近的是interpreter:

在计算机科学中,解释器 通常是指一个计算机程序 执行,即执行,指令 用编程语言编写的。 边解释边编译 是两个主要的手段 实现了编程语言, 这些并不完全不同 类别,原因之一是 大多数口译系统也 做一些翻译工作,只是 像编译器。

基本上,解释器(或脚本引擎,如果您愿意的话)是负责在执行时将脚本转换为机器代码的组件(与在执行时间之前创建机器代码的编译器相反)。

【讨论】:

【参考方案2】:

您基本上已经发现脚本语言和“非脚本”语言之间的区别是相当人为的。 Python 可以编译为 JVM 字节码(使用 Jython),我相信 Ruby 也可以——那么运行相关 Python 或 Ruby 代码的“引擎”将是 JVM,即运行 Java 代码(或 Scala)的“引擎”代码等)。与 .NET 和 IronPython(或 IronRuby)类似——那么“引擎”是 Microsoft 的 CLR,就像 C#、Boo 等一样。被称为“脚本”的语言通常是动态类型的……但我从未听说过用于其他重要的动态类型语言的术语,例如 Smalltalk、Mozart/OZ 或 Erlang……;-)。

【讨论】:

【参考方案3】:

“脚本语言”和“编程语言”之间没有硬性界限。

“脚本语言”的属性往往包括:

垃圾回收内存管理器,无需显式分配和释放对象

能够简单地执行命令,而无需一堆样板代码。 Java 通常用作这方面的反例。在 Python 中,您可以简单地说 print("Hello, world!"),但在 Java 中,您需要更多的语法(示例 here 是七行代码)。

与上述有关,通常在“脚本语言”中您不必显式声明变量,并且很少需要声明变量的类型。一些脚本语言(如 javascript)会强制强制类型,而另一些(如 Python)是强类型的,并在类型不匹配时引发异常。

无需显式编译或链接步骤;您只需编写代码并运行它。 (“脚本语言”仍然可以在内部进行即时编译;例如,Python 就是这样做的。)

除了这些基础知识之外,“脚本语言”的范围可以从原始和琐碎的东西(如 MS-DOS 中的“批处理”语言)到富有表现力且功能强大的语言(如 Python、Ruby 等)。

【讨论】:

大部分同意,除了第 1 点:这不是真的;我所知道的唯一不会被垃圾收集的语言是 C/C++。 @hasanj,“这不是真的”是什么意思?我声称任何需要您自己记忆malloc()free() 的语言都被取消为“脚本语言”的资格。我没有声称“非脚本语言”必须强迫你管理内存。 @hasanj,如果你调查一下,你会发现很多语言没有被垃圾回收。 FORTRAN、Pascal 和 C/C++ 都会浮现在脑海中,但还有很多。当我第一次了解 AWK 时,它对我来说很重要,因为您甚至不必声明列表的长度;你可以随时添加它!确实,许多现代语言都将进行垃圾收集,但是当“脚本语言”刚开始出现时,缺乏垃圾收集是一个大问题。在此处阅读“历史概览”:en.wikipedia.org/wiki/Scripting_language @steveha -- 确实如此。你的观点很清楚,你的写作风格既有表现力又有信息量。继续努力! @steveha 太多人混淆了“动态类型”(变量不关心其值的类型)和“弱类型”(事物将被强制转换为适当的类型,或等效的类型,以及只有当 that's 不可能时它才会失败);同样,“严格类型”(变量确实关心它们的值是什么类型,并且每个值只能有一种类型)和“强类型”(根本不强制;如果它们不符合要求,这是一个错误)【参考方案4】:

“脚本语言”可能被称为俗语。这个术语没有很好的定义,你会看到一些关于哪些语言是脚本语言的分歧。它有时对于传达一种语言属性的模糊概念很有用(参见steveha's answer)。

“脚本语言”也可能指一种语言的特定用途。例如,一个软件可能使用 Lua 作为其脚本语言——最终用户用来自动化(或“脚本”)复杂任务的语言。

【讨论】:

【参考方案5】:

脚本/解释语言和编译语言之间的一个有用区别是,您通常可以将脚本语言的解释器嵌入到编译项目中,例如游戏引擎。

【讨论】:

【参考方案6】:

我知道你已经接受了一个答案,但是有些模棱两可。

当提到 脚本引擎 时,我们通常指的是位于模板中并生成文本输出或文档的小型嵌入式语言。例如 Freemarker 和 Velocity 通常被称为脚本引擎。 Erb 也会坐在这里,但奇怪的是不经常被称为脚本引擎。

一种脚本语言通常需要没有编译步骤,因此可以更简单地作为shell脚本运行,或者从shell脚本运行。这包括 awk、perl、tcl、python、ruby 等。这些语言通常需要简洁,类型安全通常是可选的。 Windows 在其脚本宿主 设施中支持多种语言。这会将脚本语言暴露给 Windows 中的各种组件。

因此,Java 等完全编译的语言很可能作为字节码运行并且可以被视为解释型语言,但关键是有一个显式编译步骤,没有提供运行时的解释器(无论如何使用 Sun JRE) java代码的可执行环境。

内嵌VBA等其他语言,上面的很多语言都可以内嵌。嵌入式语言也可以称为宿主应用程序的脚本引擎。

在我看来,脚本引擎会解释编程指令,进而指示更大的主机应用程序或系统。这些指令会立即执行,而不用关心任何剩余的指令。

许多 Lisps 在数据和代码之间没有区别,可能在运行时动态编译。解释、编译和执行步骤可供 Lisp 程序员操作,就像程序员操作其他语言的数据一样。

【讨论】:

以上是关于什么是脚本引擎?的主要内容,如果未能解决你的问题,请参考以下文章

复杂多变场景下的Groovy脚本引擎实战

在脚本中使用应用引擎 yaml 解析器

lua引擎本身是线程安全的吗

node.js的单线程异步是什么意思呢?(转)

80 脚本引擎——js脚本引擎

为什么要使用模板引擎?