Каковы ограничения для JShell? - PullRequest
0 голосов
/ 20 декабря 2018

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

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

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

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

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

см. Также:

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

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

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

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

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

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

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

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

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


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

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

!!!Функции и многое другое !!!

Более подробная информация о ссылках, обеспечивающих превосходство над программами с одним исходным кодом:

0 голосов
/ 20 декабря 2018

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

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

JShell, .jsh и java MyClass.java

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

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

Поскольку 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 для запуска.

Теперь они также ввели следующий ярлык: независимо от имени файла или расширения, вы можете распространять свой 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
  • Вы можете выполнять короткие программы намного проще
...