2009-11-06 92 views
10

我见过here,除了脚本语言之外,还有一种编程语言是脚本引擎。但我不明白它是如何工作的,所以我不知道它们的区别。什么是脚本引擎?

例如,我在导入的库中看到Java调用方法的代码,但它与Python或Ruby代码看起来“不够” - 都是脚本语言,对吧?我想这也与程序和面向对象的范例有关,但最终我不明白他们为什么按照它们的方式分类。

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

+5

是的,Java(和C#)的典型实现在虚拟机中运行字节码,也就是解释器,就像Python或Ruby的典型实现(实际上它可以是_same_解释器;-)。正如你所注意到的那样,这个区别是相当糟糕的。 – 2009-11-06 23:36:41

+1

Java不是一种解释型语言。您有一个名为javac的编译器和(虚拟)机器对象二进制文件,称为类文件。 – alphazero 2009-11-06 23:41:59

+1

Java不被视为解释型语言。你编写Java代码,然后你有一个明确的编译步骤,在那里Java代码变成字节码。然后在Java虚拟机中解释字节码。通常当人们说“解释型语言”时,他们指的是一种语言,您可以直接运行代码而无需显式编译步骤。 (“解释者”可能会使用Just-In-Time编译作为速度优化。)这很模糊:即使是所谓的“编译”语言,每个人都同意的语言也可以有解释器。 (谷歌搜索“C解释器”!) – steveha 2009-11-06 23:54:43

回答

12

“脚本语言”和“编程语言”之间并没有硬而快的界限。 “脚本语言”的

属性往往包括:

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

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

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

  • 不需要显式的编译或链接步骤;你只需编写代码并运行它。 (A“脚本语言”仍然可以刚刚在时间内编制; Python做这个,例如)

除了这些基本的“脚本语言”的范围可以从一些原始的和琐碎,像MS-DOS中的“批处理”语言,直至Python,Ruby等表达力强大的语言。

+1

,除了第一点:这不是真的;我知道的唯一不是垃圾回收的语言是C/C++。 – hasen 2009-11-07 09:43:24

+3

@hasanj,你是什么意思“这不是真的”?我声称任何需要你自己'malloc()'和'free()'内存的语言都被取消为“脚本语言”。我没有声称“非脚本语言”必须强制你管理内存。 – steveha 2009-11-07 22:47:41

+0

@hasanj,如果你看看它,你会发现很多没有垃圾回收的语言。 FORTRAN,Pascal和C/C++都可以想到,但有很多。当我第一次了解它时,AWK对我来说是一件大事,因为你甚至不必声明列表会有多长;你可以随时加入它!确实,许多现代语言都会进行垃圾回收,但是当“脚本语言”首次出现时,垃圾回收的缺乏就成了一件大事。请阅读下面的“历史概述”:http://en.wikipedia.org/wiki/Scripting_language – steveha 2009-11-08 07:34:45

2

也许是最接近你正在谈论什么是interpreter

在计算机科学,口译员 通常意味着 执行,即执行一个计算机程序,指令 用编程语言。 虽然解释和编译 是由 编程语言实现的两种主要手段, 这些都不是完全不同的 类别,其中一个原因是 大多数口译系统也 执行一些翻译工作,只是 一样的编译器之一。

基本上是一个intepreter(如果你喜欢或脚本引擎)是负责在执行时转动脚本成机器代码(相对于它创建之前执行时间机器代码的编译器)的组件。

6

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

0

“脚本语言”可能被称为口语化。这个术语没有很好的定义,你会发现关于哪些语言是脚本语言的一些不同意见。传达语言属性的模糊概念有时很有用(请参阅steveha's answer)。

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

0

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

3

我知道你已经接受了答案,但是有一些含糊不清。

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

脚本语言通常需要没有编译步骤,因此能够更简单地作为一个运行,或者,从一个壳脚本。这包括诸如awk,perl,tcl,python,ruby等等。这些语言通常需要简洁并且类型安全通常是可选的。 Windows支持多种语言,它的脚本主机设施。这为Windows内的各种组件公开了脚本语言。

所以后来完全编译语言如Java可能也会运行的字节码和解释,可以考虑,但问题是,有一个明确的编译步骤,也没有解释(与Sun JRE反正),它提供了Java代码的运行时可执行环境。

嵌入了其他语言(如VBA),上面的许多语言都可以嵌入。嵌入式语言也可以作为主机应用程序的脚本引擎。

在我看来,脚本引擎解释程序化指令,并依次指示更大的主机应用程序或系统。这些指令立即执行,不用担心任何剩余的指令。

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