我在这里看到,区分编程语言和脚本语言之间的关键在于脚本引擎。但是我不明白它是如何工作的,所以我不知道它们之间有何区别。
例如,我看到Java代码调用导入库中的方法,但它似乎与Python或Ruby代码并没有“足够的不同” - 它们都是脚本语言,对吗?我想这也与过程式和面向对象的范式有关,但最终,我仍然看不出它们被分类为什么样的。
编辑: 关于脚本引擎是一个解释器... 那Java不是一种解释型语言吗?我知道有编译好的字节码,但是这对我来说还是不合理。
我在这里看到,区分编程语言和脚本语言之间的关键在于脚本引擎。但是我不明白它是如何工作的,所以我不知道它们之间有何区别。
例如,我看到Java代码调用导入库中的方法,但它似乎与Python或Ruby代码并没有“足够的不同” - 它们都是脚本语言,对吗?我想这也与过程式和面向对象的范式有关,但最终,我仍然看不出它们被分类为什么样的。
编辑: 关于脚本引擎是一个解释器... 那Java不是一种解释型语言吗?我知道有编译好的字节码,但是这对我来说还是不合理。
在“脚本语言”和“编程语言”之间没有硬性的界限。
“脚本语言”的特点通常包括:
垃圾回收内存管理器,无需显式分配和释放对象
能够简单地执行命令,不需要大量样板代码。 Java通常被用作反例。 在Python中,您只需输入print("Hello, world!")
即可完成,但在Java中,您需要更多的语法(此示例 有七行代码)。
与上述相关的是,在“脚本语言”中通常不需要显式声明变量,而且很少需要声明变量类型。一些脚本语言(例如JavaScript)会狂暴地强制转换类型,而其他一些(例如Python)则是强类型的,并在类型不匹配时引发异常。
无需显式编译或链接步骤; 您只需编写代码并运行它即可。(“脚本语言”仍然可以在内部进行即时编译;例如Python就是这样做的。)
除了这些基础知识外,“脚本语言”可以从类似于MS-DOS中的“批处理”语言这样原始和琐碎的东西,一直到像Python、Ruby等表达力强大的语言。
malloc()
和free()
分配和释放内存的语言都不符合“脚本语言”的标准。我没有声称“非脚本语言”必须强制你管理内存。 - steveha我知道你已经接受了一个答案,但是还存在一些不确定性。
当提到一个“脚本引擎”时,通常指的是一个嵌入在模板中的小型语言,用于生成文本输出或文档。例如,Freemarker和Velocity经常被称为脚本引擎。Erb也可以放在这里,但奇怪的是它并没有经常被称为脚本引擎。
一个“脚本语言”通常不需要编译步骤,因此可以更简单地作为shell脚本运行或从shell脚本中运行。这包括awk、perl、tcl、python、ruby等等。这些语言通常需要简洁,并且类型安全通常是可选的。Windows支持许多语言在其“脚本主机”设施中。这使得脚本语言可以暴露给Windows中的各种组件。
因此,像Java这样的完全编译的语言可能会以字节码形式运行,并且可以被认为是解释的,但关键是有一个明确的编译步骤,没有解释器(至少在Sun JRE中)为Java代码提供运行时可执行环境。
其他语言如VBA是嵌入式的,上述许多语言也可以被嵌入。嵌入式语言可以被称为主机应用程序的脚本引擎。
在我看来,脚本引擎解释程序指令,并反过来指示更大的主机应用程序或系统。这些指令立即执行,不考虑任何剩余的指令。
许多Lisp没有数据和代码之间的区别,可能在运行时动态编译。解释、编译和执行步骤可供Lisp程序员像其他语言中操作数据一样操作。
基本上,解释器(或脚本引擎,如果您愿意)是将脚本在执行时转换为机器代码的组件(与在执行时间之前创建机器代码的编译器相对)。在计算机科学中,解释器通常指执行编程语言指令的计算机程序。尽管解释和编译是实现编程语言的两种主要方式,但它们并不完全不同,其中一个原因是大多数解释系统也执行一些翻译工作,就像编译器一样。