Каковы ограничения для JShell?

Я нашел этот вопрос, и этот другой, настолько интригующий, что это вызывает несколько вопросов, по крайней мере для меня:

Скорее открытый вопрос, но где это jshell ограничен? Очевидно, что приложения с графическим интерфейсом не находятся в домене для jshell решения или замена IDE:

Из области видимости выходят графические интерфейсы и поддержка отладчика. JShell API предназначен для обеспечения функциональности JShell в IDE и других инструментах, но инструмент jshell не предназначен для IDE.

Бонусные баллы за диаграммы Венна или другие визуальные эффекты.

Конечно, фрагменты должны быть ограничены в размерах. Я больше спрашиваю, какие проблемы нельзя решить с помощью фрагментов кода.

смотрите также:

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

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

2 ответа

Решение

Отвечая на обновленный вопрос

Все проблемы могут быть решены с помощью фрагментов кода (и с помощью достаточно сложного сценария оболочки). Но JShell лучше всего использовать для отладки и изучения Java - полноценная программа гораздо более гибкая для всех других вариантов использования.

JShell,.jsh и java MyClass.java

JShell - это интерактивная оболочка для тестирования Java-кода. По сути, это REPL для Java.

Поскольку JShell - это все, что вы вводите во фрагментах кода, которые он затем оценивает, и часто имеет смысл помещать эти фрагменты в файл, а не записывать их несколько раз, JShell поддерживает .jsh скрипты, которые содержат коллекции фрагментов, которые будут интерпретироваться JShell. В этом смысле это похоже на принятие Bash .sh файлы или command.com принимают .bat файлы - ввод их построчно эквивалентен их импорту.

Выполнение Java-файла из одного источника - это совсем другой зверь. Это сахар, который заменяет, начиная с 11 JDK,

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 может хранить эти классы в памяти). Так как у них уже было 3 других режима выполнения в java (для классов, jar-файлов и модулей) нет ничего сложного в том, чтобы добавить это в качестве четвертого.

Так как ОП хотела картинку:

Java как язык сценариев

Теперь, когда различие ясно (.jsh предназначен для использования с JShell, исполняемые файлы Java с одним исходным кодом предназначены только для, как вы уже догадались, исполняемых файлов Java с одним исходным кодом), как насчет использования Java в качестве языка сценариев?

У вас всегда была возможность написать программу запуска; например,

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

работал целую вечность. Технически было возможно дать имя классу напрямую, но не слишком полезно, поскольку файлы JAR намного удобнее при распространении двоичных файлов - во-первых, они избегают зеркального отображения структуры пакета в виде набора папок. Однако наличие сценария запуска отдельно от реального кода Java все еще было несколько недружелюбным: теперь вам нужно держать оба вместе или, по крайней мере, иметь возможность запуска фактического.jar для запуска.

Теперь они также представили следующий ярлык: независимо от имени файла или расширения, вы можете распространять свой исходный код Java с "префиксом shebang" следующим образом:

#!/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
  • Вы можете выполнять короткие программы намного проще

Ну, конечно, он ограничен использованием обычной утилиты REPL с точки зрения определения возможностей, которые могут обеспечить IDE и графические пользовательские интерфейсы. Я бы хотел больше рассказать о его возможностях по сравнению с программами с одним исходным кодом. Функции, которые держат его отдельно от программ с одним исходным кодом:

  • история с редактированием
  • Вкладка-завершение
  • автоматическое добавление необходимых конечных точек с запятой и
  • настраиваемый предопределенный импорт и определения

Как уже упоминалось в альтернативах JEP-файлам с одним файлом:

Мы могли бы делегировать задачу "разовых пробегов" jshell инструмент Хотя на первый взгляд это может показаться очевидным, это было явной нецелевой задачей при разработке jshell,

jshell Инструмент был разработан, чтобы быть интерактивной оболочкой, и было принято много дизайнерских решений в пользу обеспечения лучшего интерактивного опыта.

Нагрузка на него дополнительными ограничениями того, чтобы быть участником серии, отвлекла бы от интерактивного опыта.


!!! Ограничения и поведение!!!

С другой стороны, несколько ограничений (предполагаемых функциональных возможностей), которые можно было бы найти при выполнении практической работы с использованием JShell, а не просто при чтении документов:

!!! Особенности и многое другое!

Подробнее о ссылках, которые дают ему преимущество над программами с одним исходным кодом:

Другие вопросы по тегам