blob: 9049c270e7460df78d60c420cc7613d85687aa7a [file] [log] [blame]
This is a proof-of-concept for compiling Groovy to native code.
Goals:
- Better performance / reduced overheads (cpu, memory, start-up time).
- Appealing alternative to Perl/Python/Ruby/shell-scripts.
- Simple install (src tarball, RPM, dpkg, windows installer, OS-X whatever).
- No JVM required.
- Ability to use Groovy to access less Javaish libraries (POSIXy stuff, MFC, .NET).
- Ability to use Groovy (and Java) objects from other languages (C, C++, Perl, Python, Ruby, .NET, etc)
WARNING: This is an experiment. It's a proof-of-concept. It probably won't work. But maybe it will.
The first attempt at this package uses the GNU GCJ compiler. This is built on top of GCC and is
available for UNIXy platforms (including Linux and OS-X) and Windows (with Cygwin).
These are the first set of goals for the experiment.
*** Goal 1 : Native standalone executable of .groovy file.
[Complete]
The existing Groovy compiler (running on a JVM) can compile .groovy files to .class files.
GCJ can then compile these .class files to .o binary objects.
GCJ can link these objects (together with a native version of the Groovy runtime library) into a
native executable.
The challenge is building the native runtime library. In particular, identifying if the runtime
byte-code generation, custom class-loaders and dynamic proxies will cause problems when moved to
native code.
Certain features of the Groovy language may be excluded to meet this goal and a JVM is still
required at build time.
*** Goal 2 : Native Groovy libraries.
[In progress]
Compile a collection of .groovy files into a .so that can be linked to from other Groovy or native
libraries.
Provide samples for Groovy, C and C++ apps all linking to another Groovy library.
*** Goal 3 : Native .groovy compiler.
[Not started]
The actual Groovy compiler should be native (as well as the runtime) allowing Groovy to be developed
entirely without a JVM present.
*** Goal 4 : Usable tool set.
[In progress]
A set of simple wrapper tools should be provided for common features:
- Compiling and linking a Groovy library or standalone executable.
- JIT style interpreter (like Python) that runs a Groovy script directly by recompiling if necessary.
- #!/usr/local/bin/groovy style declaration for scripts allowing direct invocation.
*** Goal 5 : Runtime interpreter.
[Not started]
Allow Groovy snippets to be evaluated dynamically at runtime (the functionality of GroovyClassLoader).
This could get tricky.
*** Goal 6 : Complete language features.
[Not started]
Get all the unit tests running on the native Groovy. This excludes Java specific extras such as JMS
and Servlets.
*** Goal 7 : Installation bundle.
[Not started]
Provide a UNIX installation bundle that contains scripts and instructions for getting native Groovy
running on a machine.
*** Goal 8 : Optimizations.
[Not started]
Profile code to see how it can be made snappier. Especially important is the startup time. A plain
GCJ compiled Java file starts within <50ms, whereas Groovy is taking much longer.
*** Goal 9 : Provide Groovy with simple access to native libraries.
[Not started]
Extend the Groovy library and build tools to allow easy access to code outside of Groovy/Java from
Groovy classes.
Something like:
import ncurses // use libncurses/ncurses.h
class Thingy {
void doStuff(name) {
ncurses.printw("Hello ${name}") // print string
ncurses.refresh() // display it on screen
ncurses.getch() // wait for key press
}
}
- Joe Walnes <joe@thoughtworks.net>