JEP proposed to target JDK 11: 330: Launch Single-File, Source-Code Programs
Thibault Kruse
tibokruse at googlemail.com
Thu May 31 13:01:29 UTC 2018
Hello, I have a few minor concerns.
# Regarding the command structure
The JEP330 (2018/05/30) states: "The source file should contain one or
more top-level classes, the first of which is taken as the class to be
executed.
No other source files are found and compiled, as if the source path is
set to an empty value."
So why should the java command not continue to take a class name as a
positional parameter, and get an additional optional parameter like
"-sourcepath" taking one sourcefile (or later maybe more) to compile?
As it is specified in the JEP, changing the order of top-level classes
in the file could affect the outcome, something that seems very
un-java-like. Also this prevents users from specifying classes to run,
or running nested classes, etc.
The effort of typing
java HelloWorld.java
vs.
java HelloWorld -sourcepath HelloWorld.java
seems small enough to be suffered for this first day of learning java,
in particular since a shell can easily run commands again from the
history (the second day of learning java would start with installing an
IDE).
And that structure does not share the quirks of heuristically guessing
what the user meant.
Also this would more easily allow later addition of specifying multiple
files or sourcefolders along with a main class to run.
# Regarding the single-file restriction
Why not allow users to modularize their first few classes in java and
load them all to run a main method? Teaching them to put all classes in
a single file does not seem java-like. A source-path option could well
point to a folder or a list of folders to load sources from.
# Regarding the source filename
JEP330 (2018/05/30) currently also states: "The compiler does not
enforce the optional restriction defined at the end of JLS §7.6, [...]
the type name followed by the .java extension. [...] If the file does
not have the|.java|extension..."
I see no significant benefit in allowing users to use a different
filename (unless for the shebang line / scripting issue), and IDEs will
again struggle to turn off compiler errors for such files. I believe it
is better to keep the experience consistent.
# Regarding jshell as alternative
JEP330 (2018/05/30) currently states jshell "We could delegate the task
of "one-off runs" to the|jshell|tool. While this may at first seem
obvious, this was an explicit non-goal in the design of|jshell|.
The|jshell|tool was designed to be an interactive shell, and many design
decisions were made in favor of providing a better interactive
experience. Burdening it with the additional constraints of being the
batch runner would detract from the interactive experience."
This seems insufficient justification. People are already using jshell
for this purpose, e.g. see
*
https://stackoverflow.com/questions/44916618/how-to-execute-a-java-script-with-jshell
* https://gist.github.com/ffissore/012d7e32a096fde5266f49038c93dcaf
* https://dzone.com/articles/jdk9-execute-java-code-like-unix-shell-script
Why burdening java with this feature for interactive programming
sessions and not jshell seems quite mysterious to me. Several other
programming languages also have a unified executable for running both
interactive mode and individual files, so it's not generally considered
counter-intuitive.
I might be wrong, but jshell seems to be part of the JDK, which would
also help compared to the java command being part of the JRE, which by
itself would not be able to compile source files (I assume).
# Regarding POSIX scripting support (shebang lines)
This should be a JEP in it's own right, and may well also consider
approaches like this:
https://coderwall.com/p/ssuaxa/how-to-make-a-jar-file-linux-executable
||
More information about the jdk-dev
mailing list