1

首先我在网上阅读了一些东西后对脚本语言的理解是,我们可以将其归类为用户可以直接运行而无需编译的脚本语言。最近我在开源产品 xwiki 上工作,我看到他们使用 groovy 作为脚本语言,即从用户界面我可以编写小程序,一旦我保存它,它就会在后端编译和执行。他们是如何做到的,只是简单地将程序作为字符串传递,然后使用 groovy 编译器编译和运行它。如果这种方式 groovy 可以被视为编译语言,因为为了用户体验,他不必编译代码并即时运行(尽管在内部它也被编译成字节码)。

如果这是真的,我们也可以用 java 实现类似的东西,即

Process process1 = Runtime.getRuntime().exec("javac "+stringContainingProgram);

并从输入流中获取编译代码而不是运行它。

我可以说在这方面我们可以将 java 视为脚本语言吗?

4

4 回答 4

3

我认为您混淆了“脚本语言”和“解释语言”这两个术语。

解释语言是一种在运行前没有预编译的语言。

脚本语言通常是一种允许任务自动化(脚本)的语言。

Java 有点令人困惑,因为它确实有一个编译阶段,其中 Java 代码被翻译成 JVM 字节码,然后在运行时解释这个字节码,因此 Java 具有编译和解释语言的特性。

使用 Runtime.GetRuntime().exec() 您可以在运行时调用命令,但这与拥有执行相同操作的 bash 脚本相同(或为此将它们输入到终端中)。

在这种情况下,您概述了您正在使用 java 显式调用编译器,下一个逻辑步骤是运行它,但是代码不是从您的 Java 代码中运行的,您的 Java 代码只是在调用它。

简短的回答是否定的,Java 不是一种完全解释型的语言。

于 2012-06-03T03:28:05.047 回答
2

IMO 术语“脚本语言”太模糊,无法以有意义的方式进行辩论。Groovy 是一种脚本语言吗?它可以提前编译,也可以及时编译。

纯解释语言是脚本语言吗?IMO 语言的执行方式并不重要,因为我不会将早期解释的 BASIC 称为“脚本语言”。

静态类型语言是脚本语言吗?在这里尝试一些有趣的东西......但是带有可选类型的语言呢?

对我来说,归结为“我是否必须手动编译代码”。Java可以是脚本语言吗?Tricky ... 是一个符合“用户脚本”界面的编辑器插件,还是只是“编辑器代码库的一部分”?我没有一个我可以肯定地捍卫的答案,并且可以看到双方都在争论。

如果走投无路,honey badger 也不在乎,并说 Java 不是脚本语言,而 Groovy可以。但是巨大的系统是用“脚本”语言编写的,比如 Perl。(它们是否应该是……值得商榷。)现在要归结为“脚本语言与编程语言的区别是什么?”

真的没什么。IMO 区分几乎总是毫无意义的。

于 2012-06-03T03:40:15.700 回答
1

您在示例中拥有的不是 Java。它是一种具有类似 Java 语法的表达式语言。在真正的 Java 中,必须将声明嵌入到类或方法中。

因此,基于该示例,您不能说 Java 是一种脚本语言。您可以创建类似 Java 的脚本语言,但您需要解决一些可用性问题。就像导入的不同语法一样……如果您希望脚本语言具有交互性。

还有一个问题是,要求用户显式声明变量及其类型的脚本语言不是人们想要的。真正的 Java 从根本上说是一种具有显式类型声明的静态类型语言。脚本语言(一般来说)是动态类型的。


我可以说 java 不是脚本语言,因为它不是动态类型语言吗?

并不真地。“脚本语言”是通常用于脚本的语言。这就是你所能说的。我们甚至无法清楚地定义什么是“脚本”。

没有基本的自然法则说您不能使用静态类型语言编写脚本。这只是......好吧......不是人们想要的。

关于编译是否及时或提前,这不是将任何语言限定为脚本语言的标准。对?

那是对的。它不会从根本上影响用于脚本目的的语言的可用性。

现在,您可能会争辩说,如果用户必须在运行脚本之前显式编译它们,那么这不是脚本。也许这是将“普通”编程与“脚本”区分开来的东西。然而,这样做的风险是我们隐含地限制“脚本语言”和“脚本”以适应/适合我们的特定偏见。


如果您通读此答案和其他答案,我们基本上都同意一点。没有关于什么是脚本语言的有用定义,因此无法说 Java 是否是一种。

一个更容易回答的问题是 Java 是否会成为一种很好的脚本语言……我的回答是我不这么认为。

于 2012-06-03T03:31:24.543 回答
1

我知道我的回答会被否决,但是..Dave Newton 是绝对正确的。这个词太笼统了...

在您的示例中,不必编译常规代码。恕我直言,在这种情况下更典型的 groovy 用法是使用 groovy 解释器。

是的:java 可以用作脚本语言。我见过企业产品,您可以在其中使用 Java 代码编写小脚本。该程序将其包装在一个类中,编译并执行它。

因此,如果您比较这些方法,用户是否使用像 groovy 这样的“真正的脚本”语言或通过小技巧将 Java 变成一种语言对用户来说并不重要。

顺便说一句:大多数 java 语句也在 groovy 中运行......所以如果你只看一下像这样的代码片段

res = 5 * 16 + 2

您无法判断这是脚本还是未编写脚本的内容的一部分。您甚至无法分辨它是用哪种语言编写的!

所以,回到你原来的问题:

我不会说您可以java 视为一种脚本语言,但在某些情况下您可以使用 java满足您的脚本需求,但是人们会错过像动态语言这样的“真正的”脚本语言所附带的快捷方式。

更新:

正如您所说的“java 可以用作脚本语言。我已经看过企业产品,您可以在其中使用 java 代码编写小脚本”如果您能简要介绍一下您在这里谈论的小脚本类型会很有帮助?

我说的是扩展产品超出正常功能的小脚本:MS Office 产品中的 Visual Basic、Bonita(工作流产品)中的 Groovy 以及 Jasper iReports(报告生成器)中的 Groovy、JavaScript 和 Java(是的!Java!)

顺便说一句:你会在这里找到在 Jasper 中使用 Java 和 Groovy 的一个很好的比较:http: //jasperforge.org/uploads/publish/ireportwebsite/IR%20Website/iReport_groovy.html

它向您展示了 Java 可以用作脚本语言,但其他解决方案更好:-)

我问这个是因为大多数网络都说脚本语言通常是一种允许任务自动化(脚本)的语言。如果我按照这个定义,那么每种语言都成为脚本语言,因为我们可以使用任何语言自动执行一种或其他类型的任务。

对我来说,脚本语言不仅仅是一种允许任务自动化的语言。对我来说,PHP、Javascript、Visual Basic 和 Groovy 也是脚本语言。还有关于 Post* Script *?

顺便说一句:刚刚发现http://www.beanshell.org/ - 一种完全兼容 Java 的脚本语言。

正如我已经提到的,恕我直言,许多语言都可以用作脚本语言,但有些更适合:-)

于 2012-06-03T07:12:39.780 回答