什么是脚本引擎?
我在这里看到,有人说编程语言和脚本语言的区别在于脚本引擎。但我不太明白这个引擎是怎么回事,所以搞不清楚它们之间的差别。
比如,我看到Java代码在调用导入库中的方法,但看起来和Python或Ruby的代码没什么“特别不同”——这两种都是脚本语言,对吧?我想这可能和过程式编程和面向对象编程的概念有关,但最终我还是看不出它们为什么会被分类成这样。
补充说明:关于脚本引擎是解释器的说法……难道Java不是一种解释型语言吗?我知道它有编译后的字节码,但这对我来说还是不太明白。
6 个回答
我知道你已经接受了一个答案,但这里面有些模糊的地方。
当我们提到一个 脚本引擎 时,通常指的是一种小型的嵌入式语言,它嵌入在模板中,用来生成文本输出或文档。比如,Freemarker 和 Velocity 常常被称为脚本引擎。Erb 也可以算在这里,但奇怪的是,它不常被称为脚本引擎。
一个 脚本语言 通常 不需要 编译步骤,因此可以更简单地运行,比如通过一个 shell 脚本。这包括像 awk、perl、tcl、python、ruby 等语言。这些语言通常比较简洁,类型安全性往往是可选的。Windows 支持多种语言在它的 脚本宿主 功能中,这让脚本语言可以在 Windows 的不同组件中使用。
那么像 Java 这样的完全编译语言可能会以字节码的形式运行,也可以被视为解释型的,但关键是它有一个明确的编译步骤,实际上没有解释器(至少在 Sun 的 JRE 中)为 Java 代码提供运行环境。
其他语言,比如 VBA,是嵌入式的,上面提到的许多语言也可以嵌入。嵌入式语言可以被称为宿主应用程序的脚本引擎。
在我看来,脚本引擎会解释程序指令,然后指挥一个更大的宿主应用程序或系统。这些指令会立即执行,而不需要担心剩下的指令。
许多 Lisp 语言在数据和代码之间没有区别,可能会在运行时动态编译。解释、编译和执行的步骤可以被 Lisp 程序员操作,就像其他语言的程序员操作数据一样。
你基本上发现了,脚本语言和“非脚本”语言之间的区别其实是很人为的。比如,Python可以通过Jython编译成JVM字节码,我相信Ruby也可以这样做。这样一来,运行这些Python或Ruby代码的“引擎”就是JVM,也就是运行Java代码(或者Scala代码等)的同一个“引擎”。同样的情况也适用于.NET和IronPython(或IronRuby),这时“引擎”就是微软的CLR,就像C#、Boo等语言一样。通常被称为“脚本语言”的语言往往是动态类型的……不过我从来没听说过这个词用在其他一些重要的动态类型语言上,比如Smalltalk、Mozart/OZ或Erlang……;-)
“脚本语言”和“编程语言”之间并没有明确的界限。
“脚本语言”通常有以下特点:
有垃圾回收的内存管理,不需要手动分配和释放对象。
可以简单地执行命令,不需要写很多繁琐的代码。比如,在Python中你只需要写
print("Hello, world!")
,而在Java中则需要写很多代码(这个例子 这里就有七行代码)。通常在“脚本语言”中,你不需要明确声明变量,也很少需要声明变量的类型。有些脚本语言(比如Javascript)会随意转换类型,而其他一些(比如Python)则是强类型的,如果类型不匹配会抛出异常。
不需要明确的编译或链接步骤;你只需写代码并运行它。(“脚本语言”内部仍然可以进行即时编译;例如,Python就是这样做的。)
除了这些基本特点,“脚本语言”可以从一些简单的、微不足道的东西,比如MS-DOS中的“批处理”语言,到像Python、Ruby这样表达能力强大且功能丰富的语言。