JShell 有哪些限制?

我发现这个问题,以及一个问题,非常有趣,以至于它引出了几个问题,至少对我来说是这样:

相当开放的问题,但仅限于哪里?显然,GUI应用程序不在解决方案或IDE替代的领域中:jshelljshell

超出范围的是图形界面和调试器支持。JShell API 旨在允许在 IDE 和其他工具中使用 JShell 功能,但 jshell 工具并非旨在成为 IDE。

维恩图或其他视觉效果的奖励积分。

当然,代码段的大小应该受到限制。我更多的是在问什么样的问题不能用片段来解决。

另请参阅:

https://openjdk.java.net/jeps/222

https://openjdk.java.net/jeps/330


答案 1

回答更新后的问题

所有问题都可以通过代码段来解决(也可以使用足够复杂的shell脚本)。但是JShell最好用于调试和学习java - 一个成熟的程序对于所有其他用例来说要灵活得多。

JShell、.jsh 和 java MyClass.java

JShell 是一个用于尝试 Java 代码的交互式 shell。从本质上讲,它是Java的REPL

由于 JShell 就是关于您键入代码片段,然后对其进行评估,并且将这些代码片段放在文件中而不是多次写入它们通常是有意义的,因此 JShell 支持脚本,这些脚本包含要由 JShell 解释的代码段集合。从这个意义上说,这类似于 bash 接受文件或 command.com 接受文件 - 逐行键入它们等效于导入它们。.jsh.sh.bat

单源java文件执行是一个非常不同的野兽。从JDK 11开始,它是糖取代的,

java MyClass.java arg1 arg2 arg3

通过您的本地脚本编写相当于编写

TMPDIR=$(mktemp -d)
javac -d $TMPDIR MyClass.java
java -cp $TMPDIR MyClass arg1 arg2 arg3
rm -rf $TMPDIR

这允许使用单个命令从命令行快速执行单源文件,而无需将其编译的类留在任何地方(不需要创建实际的临时目录,因为可以将这些类存储在内存中)。由于他们已经有3种其他执行模式(用于类,jar文件和模块),因此将其添加为第四种模式并不夸张。javajava

由于OP想要一张图片:Venn diagram showing how JShell, .jsh and JEP330 intersect

Java作为脚本语言

现在区别已经很清楚了(.jsh用于JShell,单源java可执行文件仅适用于,你猜对了,单源java可执行文件),那么使用Java作为脚本语言呢?

您始终可以选择编写启动器;例如

 #!/bin/bash
 java -jar MyApp.jar

已经工作了很长时间。从技术上讲,直接命名一个类是可能的,但不是太有用,因为在分发二进制文件时,jar文件更方便 - 首先,它们避免将包结构镜像为一堆文件夹。然而,将启动器脚本与实际的java代码分开仍然有些不友好:您现在需要将两者放在一起,或者至少让启动器能够找到要启动的实际.jar。

现在,他们还引入了以下快捷方式:无论文件名或扩展名如何,您都可以使用“shebang前缀”分发java源代码,如下所示:

#!/path/to/java --source 11
<source of MyClass.java>

将其标记为可执行文件,并从命令行启动它,就像您可以启动任何其他可执行文件一样。例如,将其复制并粘贴到文件中(并在尝试运行之前修复jdk位置):helloworld

#!/opt/jdk-11.0.1/bin/java --source 11 
public class Test {
    public static void main(String ... args) {
        System.out.println("Hello " + (args.length == 0 ? "world!" : args[0]));
    }
}

将其标记为可执行文件后,您可以直接使用

$ ./helloworld
Hello world!

它甚至认为它的论点是正确的:

$ ./helloworld Bob!
Hello bob!

对于小程序,如果你不需要走出JDK来拉入其他库,现在分发java代码以供命令行使用将变得容易得多。

Java仍然不会是一种“脚本语言”(它永远不会与python竞争),但是

  • 它有一个非常好的REPL循环
  • 你可以更容易地执行短程序

答案 2

好吧,当然,它仅限于在确定IDE和图形用户界面可以提供的范围方面带来正常的REPL实用程序。与单一源代码程序相比,我会更多地谈论它的功能。使它与单个源代码程序保持一致的功能:

  • 带编辑的历史记录
  • 制表符完成
  • 自动添加所需的终端分号和
  • 可配置的预定义导入和定义

正如单文件源代码程序 JEP 的替代方案中提到的:

我们可以将“一次性运行”的任务委托给 jshell 工具。虽然这在最初看起来似乎很明显,但在 设计中,这是一个明确的非目标。jshell

该工具被设计为交互式 shell,并且做出了许多设计决策,以支持提供更好的交互式体验。jshell

给它带来作为批处理运行者的额外约束会减损交互式体验。


!!!限制和行为!!!

另一方面,在使用JShell进行动手操作而不是简单地阅读文档时,人们通常会发现一些限制(假设的功能):

!!!功能和更多!!!

链接的更多详细信息,使其在单文件源代码程序中占据上风:


推荐