Hello Mr. Sean Luke!
I am very pleased to hear back from you. As you can see, I created an
account on LISTSERV.GMU and will send all my letters there unless you tell
me otherwise.
My previous letters to you were not very structured. Some of the things I
wrote, like the XML feature, were not a suggestion to put into ECJ. It
was just a description of what I did already. I will be more structured
in the future.
My ultimate goal is to make minor changes to ECJ to bring it up-to-date
with current Java technology and to be able to run ECJ on personal
computers (Windows or Linux) or to run ECJ on Grid servers. That is a
realistic goal. I would like to do as much changes as possible in
collaboration with you. But obviously some on the changes will be done
privately by me for my own private purposes.
I was hoping first we could do the minor things in collaboration. I have
another list of more involved changes but I hope we can talk about it
after dealing with the minor things.
Here is list of the minor things that I see is necessary to do on ECJ and
the justification for them.
1) Change ECJ library structure (like I explained before). This
change is cosmetic but it would make other java programmers feel more
familiar with the ECJ project. If you look at other open-source projects
on Jakarta or SourceForge, you will recognize a common directory
structure. This structure is described in an official Sun Java
documentation. ECJ would benefit to adopt this directory structure.
For the fun of it, I privately changed the ECJ directory to the standard
one. It took about 2 minutes to do and the benefits are substantial.
The source directories are less cluttered and more easily navigable. A
final Jar library is generated.
2) Use the ANT builder on ECJ. If you wish, you can distribute a
MAKE and an ANT builder. You will find that most Java programmers use
ANT. ANT is not more complicated than MAKE. I included an ANT file made
from your MAKE file. It works wonderfully. The ANT file is at the end of
this email. ANT is already deeply established in the Java programming
culture. Again, if you look at other projects including Jakarta,
SourceForge, Eclipse, you will see that they use ANT. ANT brings along
other benefits like testing, documentation generation, visual dependency
viewers,…etc.
3) Use a format parser like Jalopy to bring all ECJ source code to
use the Sun Java formatting style. Currently ECJ uses an archaic C
formatting style. For people accustomed to reading Java code, ECJ looks a
little strange because of that. Sun suggests a formatting style for
Java. It is possible to use a formatter like Jalopy to format all source
code without affecting the language syntax. The operation last only a
few seconds and does not change the integrity of the source code.
4) Bring ECJ to the latest Java Compiler version (Java 1.5). The
justification for that is that ECJ needs to adopt the Java 1.5 features
(like typed containers, advanced JVM, ..etc) in order to be maintainable
for the future and to work properly with other Java libraries. For this
change, I will need your help because it is a delicate change.
Please, let me know what you think of this. I welcome your comments. I
am willing to do all these changes. If you give me your absolute latest
version of ECJ, I propose to do points 1, 2, 3 and give you back a copy
that compiles exactly like before. Point number 4 is more demanding and
will require more communication between us.
Colbert Philippe
EXAMPLE OF ANT BUILD FILE FOR ECJ (prototype just for fun)
<project name="ECJ" default="archive5" basedir=".">
<!—This other build.xml file has declaration of often used libraries
and builds -->
<import file="E:/Projects/_0000_Common/Matrix/build.xml" />
<target name="init" depends="commoninit">
<property file="build.properties"/>
<!-- define path for classpath -->
<path id="project.classpath">
<pathelement location="${classes.dir}" />
<pathelement location="${lib.dir}/${project.name}.jar" />
<path refid="project.common.classpath" />
</path>
<patternset id="source.files">
<include name="${project.path}/*.java"/>
<include name="${project.path}/app/ant/*.java"/>
<include name="${project.path}/app/ant/func/*.java"/>
<include name="${project.path}/app/ecsuite/*.java"/>
<include name="${project.path}/app/edge/*.java"/>
<include name="${project.path}/app/edge/func/*.java"/>
<include name="${project.path}/app/lawnmower/*.java"/>
<include name="${project.path}/app/lawnmower/func/*.java"/>
<include name="${project.path}/app/multiplexer/*.java"/>
<include name="${project.path}/app/multiplexer/func/*.java"/>
<include name="${project.path}/app/multiplexerslow/*.java"/>
<include
name="${project.path}/app/multiplexerslow/func/*.java"/>
<include name="${project.path}/app/parity/*.java"/>
<include name="${project.path}/app/parity/func/*.java"/>
<include name="${project.path}/app/regression/*.java"/>
<include name="${project.path}/app/regression/func/*.java"/>
<include name="${project.path}/app/sum/*.java"/>
<include name="${project.path}/app/tutorial1/*.java"/>
<include name="${project.path}/app/tutorial2/*.java"/>
<include name="${project.path}/app/tutorial3/*.java"/>
<include name="${project.path}/app/tutorial4/*.java"/>
<include name="${project.path}/app/coevolve1/*.java"/>
<include name="${project.path}/app/coevolve2/*.java"/>
<include name="${project.path}/app/twobox/*.java"/>
<include name="${project.path}/app/twobox/func/*.java"/>
<include name="${project.path}/breed/*.java"/>
<include name="${project.path}/coevolve/*.java"/>
<include name="${project.path}/es/*.java"/>
<include name="${project.path}/eval/*.java"/>
<include name="${project.path}/exchange/*.java"/>
<include name="${project.path}/gp/*.java"/>
<include name="${project.path}/gp/breed/*.java"/>
<include name="${project.path}/gp/build/*.java"/>
<include name="${project.path}/gp/koza/*.java"/>
<include name="${project.path}/multiobjective/*.java"/>
<include name="${project.path}/select/*.java"/>
<include name="${project.path}/simple/*.java"/>
<include name="${project.path}/steadystate/*.java"/>
<include name="${project.path}/util/*.java"/>
<include name="${project.path}/vector/*.java"/>
<include name="${project.path}/vector/breed/*.java"/>
<include name="${project.path}/parsimony/*.java"/>
<include name="${project.path}/rule/*.java"/>
<include name="${project.path}/rule/breed/*.java"/>
<include name="${project.path}/multiobjective/spea2/*.java"/>
<include name="${project.path}/display/*.java"/>
<include name="${project.path}/display/portrayal/*.java"/>
</patternset>
</target>
</project>