What is a language construct?

Alex Buckley alex.buckley at oracle.com
Fri Dec 23 12:46:57 PST 2011


On 12/23/2011 10:52 AM, Jesse Glick wrote:
> I fail to see how the tradition of the JLS forces such a system to
> represent modules directly in Java source files. Following the style of
> chapter 7, the JLS could simply say something to the effect of:
>
> - A host system may group compilation units [or types?] into sets called
> "modules". The host system must then determine which other modules are
> observable from a given module, and may specify that some types [or
> packages? or individual elements?] within those modules are to be
> considered inaccessible despite the other provisions in the section
> "Access Control".

Yes, this is pretty much what the JLS needs to say. The host system 
_must_ attempt to identify a module declaration among its observable 
compilation units, and then based on the module system's interpretation 
of that declaration, make other compilation units observable. (The JLS 
only knows about Java code in compilation units, so there may be some 
finessing here to cover code in class files.)

It doesn't even have to be in the JLS. The package-info javadoc for the 
java.lang.module package would do fine. Both are part of the overall 
Java SE Platform Specification. The accessibility rules embedded in the 
JLS can refer to module system constructs (e.g. exports) whether those 
constructs are in the JLS or in the SE API.

(This is how JSR 292 is specified. The JVM Spec's text for the 
invokedynamic instruction is deeply dependent on concepts and rules 
defined in the spec of the java.lang.invoke package, because the 
instruction is fundamentally a front-end to operations on intrinsic 
types like MethodHandle.)

Note we are not yet specifying the syntax of a module declaration, or a 
physical placement of a module declaration on a file system.

> JSR 199's JavaFileManager would need to provide a way to specify module
> identity, observability, and accessibility. At runtime, java.lang.module
> would define opaque module identifiers with no details such as version,
> just informational toString() and a boolean hook for the VM to conduct
> its access checks; and permit ClassLoader.defineClass to pass a module
> identifier.

Basically yes. (I don't want to get into versioning here.)

> Then it would be up to the javac command line and the module-aware Java
> launcher to interpret a physical format of modules - which could, for
> example, be based on JARs with special manifest attributes defining
> Jigsaw semantics. ...

> Of course you could argue that module-info.java

Stop right there. A file called module-info.java is an implementation 
detail, not something for the spec. You should say: "Of course you could 
argue that a module declaration having Java-like syntax" ... OK, let's 
proceed.

> as currently proposed is
> simply more readable than manifests and is what Java developers want,
> especially those who use no IDE or build framework or module system
> currently. That does not preclude the above approach - it just means
> that the syntax of module-info.java would be specified by Jigsaw, not
> the JLS, and could just as easily be module.yaml.

Again, to be fully correct: "it just means that the syntax of a module 
declaration would be specified by Jigsaw, not the JLS".

Sure, the module system could define a YAML-based grammar for a module 
declaration, and the host system would still be mandated (by text 
_somewhere_ in the Platform Specification) to find and interpret a 
module declaration at compile-time. This is where we remember there's 
another requirement, currently open, that says the grammar should use 
Java-like syntax.

Alex



More information about the jigsaw-dev mailing list