簡體   English   中英

JShell的限制是什么?

[英]What are the limits to JShell?

我發現了這個問題,而另一個 ,這個有趣的是它引出了幾個問題,至少對我而言:

相當開放的問題,但jshell 局限在哪里? 顯然,GUI應用程序不在jshell解決方案或IDE替換的域中:

超出范圍的是圖形界面和調試器支持。 JShell API旨在允許IDE和其他工具中的JShell功能,但jshell工具並非旨在成為IDE。

維恩圖或其他視覺效果的獎勵積分。

當然,片段的大小應該是有限的。 我更想問一下使用片段無法解決哪些問題。

也可以看看:

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

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

回答更新的問題

所有問題都可以通過片段解決(並且使用足夠復雜的shell腳本)。 但JShell最適合用於調試和學習java - 一個成熟的程序對於所有其他用例更加靈活。

JShell,.jsh和java MyClass.java

JShell是一個用於嘗試java代碼的交互式shell。 從本質上講,它是Java的REPL

由於JShell是關於你輸入代碼片段然后進行評估的所有內容,並且將這些片段放在一個文件中而不是多次編寫它們通常是有意義的,JShell支持.jsh腳本,其中包含要解釋的片段集合。 JShell。 從這個意義上說,這類似於bash接受.sh文件或command.com接受.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

這允許使用單個命令從命令行快速執行單源文件,而無需將所編譯的類全部留在原位(不需要創建實際的臨時目錄,因為java可以將這些類存儲在內存中)。 由於他們已經在java有其他3個執行模式(對於類,jar文件和模塊),因此將其添加為第四個並不是很好。

由於OP想要一張圖片: 維恩圖顯示JShell,.jsh和JEP330是如何相交的

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>

將其標記為可執行文件,並從命令行啟動它,就像啟動任何其他可執行文件一樣。 例如,將其復制並粘貼到helloworld文件中(並在嘗試運行之前修復jdk位置):

#!/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循環
  • 你可以更容易地執行短程序

嗯,當然,它僅限於在確定IDE和圖形用戶界面可以提供的范圍方面帶來正常的REPL實用程序。 與單一源代碼程序相比,我會談到它的功能。 保持與眾不同的功能仍然來自單個源代碼程序:

  • 有編輯的歷史
  • 制表完成
  • 自動添加所需的終端分號和
  • 可配置的預定義導入和定義

正如單文件源代碼程序JEP的替代方案中所提到的那樣:

我們可以將“一次性運行”的任務委托給jshell工具 雖然這可能起初看起來很明顯,但這是jshell設計中明確的非目標。

jshell 工具被設計成一個交互式shell ,並且做出了許多設計決策,有利於提供更好的交互式體驗。

由於成為批處理運行程序的額外限制而使其負擔將減損交互式體驗。


限制和行為!

另一方面,使用JShell執行動手而不是簡單地閱讀文檔時,人們通常會發現的限制(假設功能)很少:

功能和更多!!!

鏈接的更多細節使其優先於單個文件源代碼程序:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM