[jsr294-modularity-eg] Pain
Alex Buckley
Alex.Buckley at Sun.COM
Fri Jul 17 23:17:38 EDT 2009
Thanks, this is clearer for me now. You've differentiated container
modules (and the processing of container-info.*) from namespace modules,
so you're technically consistent. Even if you weren't, let us recall
John Maynard Keynes: "When the facts change, I change my mind. What do
you do, sir?"
Namespaces in .NET are a hierarchical program structuring feature,
orthogonal to access control. You describe in namespace modules a
hierarchical program structuring feature that is a) more complex than
namespaces (due to imports in package-info) and b) deeply involved with
access control (due to 'import implementation module ...' and
module-level accessibility following the hierarchy). This is clearly
outside the design space covered by .NET, so there is no point alluding
to .NET's cleanliness.
Regarding container-info.java and container-info.class as described
below, they are outside the scope of a JSR. The 294 spec cannot mandate
the existence of tools and the operational steps of a build process.
There is also the fact that 294 aims to align the compile-time
environment with the runtime environment. I can't tell if
container-info.txt is meant to be read by a compiler *for the purpose of
setting up a classpath*. Based on your belief in a "broad palette", I
guess you still require people to set the classpath, and then have the
optimized container-info.class hold the minimal classpath for runtime.
If that's the case, then no way - the classpath is going. If that's not
the case, and container-info.txt IS meant to auto-configure the
classpath at compile-time, then I don't see why delaying production of
container-info.class is such a big deal. My compiler emits a
module-info.class that tools can optimize w.r.t. classfiles as they wish
- 294 doesn't need to know.
I'm not in favor of this proposal and it's far from clear that the
Expert Group as a whole is in favor. Rather than inventing arbitrary new
language features, we should try to standardize directives within a
module declaration as far as possible, as Bryan said.
Alex
Peter Kriens wrote:
> Again, the sketch I made is trying to come up with a proposal that took
> all our conversations into account. It is not my dream model but
> something that I think we could agree to prevent fragmenting the Java
> language by giving each module system its own "Java".
>
> Anyway, I think your confusion is related to the dichotomy between
> deployment modules (which I will refer to as the container from now on)
> and the language modules.
>
> Container membership (internal keyword in .NET) should not be encoded in
> the source because it I think that we can provide many useful functions
> in creating the container and packaging it in different ways; encoding
> the membership in the code would make this much harder than necessary.
> That is, using the module keyword in source without a module has the
> scope of the container. It will also allow a project to be packaged in a
> container without a lot of work.
>
> However, namespace modules (namespaces in .NET) which are a hierarchical
> grouping of packages have a much smaller granularity and are what
> packages always implied but were not: hierarchical. I still do like the
> idea of making module membership depend on the position of module-info
> because it is a non-redundant approach. However, something that is so
> close to packages feels a bit odd to not mention it in the source code.
> Mentioning the module is more in the spirit of Java where a compilation
> unit is completely contained:
>
> module com.acme.foo;
> package main;
> class Main {}
>
> For type com.acme.foo.main.Main, this feels pretty natural. This
> proposal also seems to reflect the nature of modules in Ruby, .NET,
> Modula-2, etc. And the gap between this model and the current package
> based model in the JLS is surprisingly small, usually a good sign.
>
> In the sketch, I made a clear distinction between container-info.java
> and container-info.class ... The compiler compiles the source code into
> class files and another tool creates container-info.class by aggregating
> the information in the source class files. It is likely that we have a
> module system dependency but maybe, if we try hard, we could make this
> generic! The indirection of not compiling but aggregating makes it
> possible to specify a broad palette in the container-info.java source
> file while only encoding the real dependencies in the container, as well
> as aggregating the visibility rules, making it easy for the compiler and
> runtime to use the container. The broad palette is very useful during
> development because it allows easy completion.
>
> To summarize: I am AGAINST container membership in source but I am
> currently slightly in FAVOR of namespace module membership in source.
> But if you want to convince me of the proposal to make module membership
> depend on the package that contains a module-info file, then lets talk!
> The only thing I want at this moment is a JLS that does not let the Java
> semantics depend on a pluggable module system ...
>
> Kind regards,
>
> Peter Kriens
>
> P.S. The fact I objected to 277 and 294 super packages was not because
> the core ideas were bad,. Obviously, our industry is blessed with a
> rather high average IQ and many ideas people propose are quite good. My
> opposition was caused because the actual execution of many of those
> ideas, and mainly because they did not take some perspectives into account.
>
> P.P.S. I am not sure why it would be bad if I had contradicted myself in
> old mails, after talking for 6 months in this EG? Aren't we all going
> through a learning process? Isn't that one of the goals of a good EG?
>
>
>
>
> On 16 jul 2009, at 20:03, Alex Buckley wrote:
>
>> Peter Kriens wrote:
>>> The consequence of the current JSR 294 design is that the JLS is not
>>> sufficient to understand a set of source files because it does not
>>> define module membership.
>>> This is acceptable for you?
>>
>> Peter, you argued in February AGAINST module membership in source and
>> class files:
>>
>> "Peter's idea is further that only module-info.class would have a Module
>> attribute giving module membership. Normal classfiles would have
>> membership determined at compile-time based on their nearest enclosing
>> module-info.java/class, and at runtime based on a module system calling
>> defineClass(..., moduleID)." [1]
>>
>> Also, in your proposal, container-info is a compile-time list of
>> dependencies, but in March, you argued AGAINST that:
>>
>> "Peter did not support declaring dependencies in source at all. Claim:
>> having to list dependencies upfront is unnecessarily constraining;
>> programmers should have a broad palette of packages available to them
>> during development (e.g. for code completion in an IDE); a build-time
>> step should determines actual dependencies from classfiles and reify
>> those dependencies in the artifact." [2]
>>
>> I don't understand why you are suddenly so keen to put module
>> identities and dependencies into source, when you have been against it
>> for the past six months.
>>
>> Alex
>>
>> P.S. Your augmented package-info file reminds me of a superpackage - a
>> central file that changes the meaning of 'public' in other compilation
>> units - but that's another topic.
>>
>> [1]http://altair.cs.oswego.edu/pipermail/jsr294-modularity-eg/2009-February/000217.html
>> [2]http://altair.cs.oswego.edu/pipermail/jsr294-modularity-eg/2009-March/000222.html
>> _______________________________________________
>> jsr294-modularity-eg mailing list
>> jsr294-modularity-eg at cs.oswego.edu
>> <mailto:jsr294-modularity-eg at cs.oswego.edu>
>> http://cs.oswego.edu/mailman/listinfo/jsr294-modularity-eg
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> jsr294-modularity-eg mailing list
> jsr294-modularity-eg at cs.oswego.edu
> http://cs.oswego.edu/mailman/listinfo/jsr294-modularity-eg
More information about the jsr294-modularity-eg
mailing list