<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Depth-First: Tag nestedvm</title>
    <link>http://depth-first.com/articles/tag/nestedvm</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Walking the Web of Chemical Informatics</description>
    <item>
      <title>Run Babel Anywhere Java Runs with JBabel</title>
      <description>&lt;p&gt;&lt;a href="http://openbabel.sf.net"&gt;&lt;img src="http://depth-first.com/files/Babel256.png" align="right"&gt;&lt;/img&gt;&lt;/a&gt;A &lt;a href="http://depth-first.com/articles/tag/nestedvm"&gt;recent series of D-F articles&lt;/a&gt; have discussed the use of &lt;a href="http://nestedvm.ibex.org/"&gt;NestedVM&lt;/a&gt; to compile cheminformatics programs written in C/C++ to pure java binaries that can be run on any system with a JVM. More specifically, an attempt to compile &lt;a href="http://openbabel.sf.net"&gt;OpenBabel's&lt;/a&gt; &lt;tt&gt;babel&lt;/tt&gt; program to bytecode was only &lt;a href="http://depth-first.com/articles/2007/11/26/compiling-open-babel-to-pure-java-bytecode-with-nestedvm-building-a-runnable-classfile-that-almost-works"&gt;partially successful&lt;/a&gt;. With the &lt;a href="http://sourceforge.net/mailarchive/forum.php?thread_name=819391.60947.qm%40web34201.mail.mud.yahoo.com&amp;amp;forum_name=openbabel-discuss"&gt;help of Geoff Hutchison&lt;/a&gt;, the problem was resolved. This article introduces JBabel, a platform-independent, pure Java implementation of OpenBabel's &lt;tt&gt;babel&lt;/tt&gt; program.&lt;/p&gt;

&lt;h4&gt;A Little About JBabel&lt;/h4&gt;

&lt;p&gt;JBabel was compiled from the &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=40728&amp;amp;package_id=32894&amp;amp;release_id=521581"&gt;Open Babel 2.1.1 source release&lt;/a&gt; and can be &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=144794&amp;amp;package_id=255103"&gt;downloaded from SourceForge&lt;/a&gt;. The same jarfile was successfully tested on Linux, Windows and Mac OS X. You can verify JBabel works on your platform with the following command:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ java -jar jbabel-20071209.jar -Hsmi
smi  SMILES format
A linear text format which can describe the connectivity
and chirality of a molecule
Write Options e.g. -xt
  n no molecule name
  t molecule name only
  r radicals lower case eg ethyl is Cc
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This version of JBabel was compiled with support for three formats:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;SMILES (smi). Non-canonical SMILES.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;MDL (mol). Molfiles and SD Files.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Canonical SMILES (can). Canonical SMILES implementation &lt;a href="http://depth-first.com/articles/2006/11/06/stone-soup"&gt;donated by eMolecules&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'll discuss exactly how support for these formats was added in a subsequent post. More formats will be added in the future. For now, let's just try JBabel out.&lt;/p&gt;

&lt;h4&gt;Testing JBabel&lt;/h4&gt;

&lt;p&gt;One way to use JBabel is interactively from the command line - just leave out an input or output file parameter. For example, if you wanted to get the eMolecules canonical SMILES for &lt;a href="http://pubchem.ncbi.nlm.nih.gov/summary/summary.cgi?cid=68617"&gt;sertraline&lt;/a&gt;, you might do something like this (be sure to use two returns to begin processing):&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ java -jar jbabel-20071209.jar -ismi -ocan
CN[C@H]1CC[C@H](C2=CC=CC=C12)C3=CC(=C(C=C3)Cl)Cl

CN[C@H]1CC[C@H](c2ccc(Cl)c(Cl)c2)c2ccccc12
1 molecule converted
34 audit log messages
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This canonical SMILES can be converted into a molfile with the following:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ java -jar jbabel-20071209.jar -ismi -omol
CN[C@H]1CC[C@H](c2ccc(Cl)c(Cl)c2)c2ccccc12


 OpenBabel12090723182D

 22 24  0  0  0  0  0  0  0  0999 V2000
    0.0000    0.0000    0.0000 C   0  0  0  0  0

...
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;To convert using input and output files, we could use a medium-sized dataset such as the &lt;a href="http://rubyforge.org/frs/download.php/27768/pubchem_benzodiazepine_20071110.sdf.gz"&gt;PubChem benzodiazepine dataset&lt;/a&gt; prepared for &lt;a href="http://rbtk.rubyforge.org/"&gt;Rubidium&lt;/a&gt;:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ java -jar jbabel-20071209.jar -imol pubchem_benzodiazepine_20071110.sdf -ocan pubchem_benzodiazepine_20071110.smi
==============================
*** Open Babel Warning  in ReadMolecule
  WARNING: Problems reading a MDL file
Cannot read title line

2117 molecules converted
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This test, which parses 2117 records, required four minutes forty-five seconds on my system. For comparison, the natively compiled binary did the same thing in about thirteen seconds. Clearly, the JBabel performance hit is substantial.&lt;/p&gt;

&lt;h4&gt;Uses&lt;/h4&gt;

&lt;p&gt;Although it's very unlikely that JBabel will ever be useful in performance-critical situations, its portability makes it attractive for other uses. Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;application development in heterogeneous computing environments;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;use on systems in which native compilation may be difficult, such as those with unusual configurations or operating systems;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cases in which native binaries work poorly or not at all, such as in applets and Java applications;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;situations in which performance is a minor consideration, such as in end-user applications that process only a few molecules at a time, or during application prototyping&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Conclusions&lt;/h4&gt;

&lt;p&gt;This article has described JBabel, the first portable binary version of OpenBabel's &lt;tt&gt;babel&lt;/tt&gt; molecular file format interconversion program. The next article in this series will describe in detail the steps that were used to compile it.&lt;/p&gt;</description>
      <pubDate>Mon, 10 Dec 2007 08:50:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:5d98a980-e3d6-4afd-8eb3-25769a28d13b</guid>
      <author>Rich Apodaca</author>
      <link>http://depth-first.com/articles/2007/12/10/run-babel-anywhere-java-runs-with-jbabel</link>
      <category>Tools</category>
      <category>jbabel</category>
      <category>babel</category>
      <category>openbabel</category>
      <category>nestedvm</category>
      <category>molfile</category>
      <category>canonicalsmiles</category>
      <category>smiles</category>
    </item>
    <item>
      <title>From C Source Code to Platform-Independent Executable Jarfile: Using NestedVM to Build JInChI</title>
      <description>&lt;p&gt;&lt;a href="http://flickr.com/photos/smithco/76749170/"&gt;&lt;img src="http://depth-first.com/demo/20071203/nested.jpg" align="right"&gt;&lt;/img&gt;&lt;/a&gt;A &lt;a href="http://depth-first.com/articles/tag/nestedvm"&gt;recent series of articles&lt;/a&gt; discussed in some detail the process of compiling source code written in C and C++ to pure Java bytecode with &lt;a href="http://nestedvm.ibex.org/"&gt;NestedVM&lt;/a&gt;. But the full conversion process, starting with source and finishing with an executable jarfile, has to my knowledge never been documented. This article uses the InChI toolkit to illustrate the complete process for converting a real-world C source distribution into a platform-independent, executable jarfile that can be run with any modern Java Virtual Machine (JVM).&lt;/p&gt;

&lt;h4&gt;About InChI&lt;/h4&gt;

&lt;p&gt;The previous article in this series &lt;a href="http://depth-first.com/articles/2007/10/31/jinchi-run-inchi-anywhere-java-runs"&gt;introduced JInChI&lt;/a&gt;, the first and only pure Java implementation of the &lt;a href="http://www.iupac.org/inchi/"&gt;IUPAC/NIST InChI toolkit&lt;/a&gt;. This toolkit is used to convert molecular connection tables encoded in &lt;a href="http://www.mdli.com/downloads/public/ctfile/ctfile.jsp"&gt;MDL's SD File format&lt;/a&gt; into ASCII character strings called 'InChIs' that have a &lt;a href="http://depth-first.com/articles/2007/09/27/inchi-for-newbies"&gt;variety of applications in the field of cheminformatics&lt;/a&gt;. Although an excellent &lt;a href="http://depth-first.com/articles/2007/10/10/jruby-for-cheminformatics-reading-and-writing-inchis-via-the-java-native-interface"&gt;JNI-InChI&lt;/a&gt; interface is available, JNI won't be a viable option in every situation. Our pure Java implementation nicely complements the JNI-InChI library.&lt;/p&gt;

&lt;p&gt;In this tutorial, we'll build version 1.0.2b of the InChI toolkit. This version, among other features, supports the generation of &lt;a href="http://depth-first.com/articles/2007/05/09/hashing-inchis"&gt;InChI Keys&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;Prerequisites&lt;/h4&gt;

&lt;p&gt;This article assumes you've already &lt;a href="http://wiki.brianweb.net/NestedVM/QuickStartGuide"&gt;installed NestedVM&lt;/a&gt; on your system. Building NestedVM required the installation of many dependencies and was a fairly lengthy, but straightforward, process on my Linux system.&lt;/p&gt;

&lt;h4&gt;Step 1: Prepare Your Environment&lt;/h4&gt;

&lt;p&gt;Before building anything, we'll need to set up our environment. NestedVM makes this simple:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ cd /your/path/to/nestedvm/
$ source env.sh
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Next, let's create a directory to hold the various components we'll need during the build process:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ cd /your/projects/directory
$ mkdir jinchi
$ cd jinchi
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Next, we'll download and unpack the InChI source distribution:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ wget http://www.iupac.org/inchi/download/inchi102b.zip
$ unzip inchi102b.zip
&lt;/pre&gt;
&lt;/div&gt;

&lt;h4&gt;Step 2: Cross-Compile InChI&lt;/h4&gt;

&lt;p&gt;We now have everything we need to begin cross-compiling. NestedVM uses a two-part process in which source code is first cross-compiled to a MIPS binary. That MIPS binary is then translated to Java bytecode. We start by invoking &lt;tt&gt;make&lt;/tt&gt; with the appropriate cross-compiler flags (which I found by looking through the InChI &lt;strong&gt;Makefile&lt;/strong&gt;):&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ make C_COMPILER=mips-unknown-elf-gcc LINKER=mips-unknown-elf-gcc
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This creates a MIPS binary (&lt;tt&gt;cInChI-1&lt;/tt&gt;). Unless you're running on a MIPS machine, this binary won't be executable.&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ ./cInChI-1
bash: ./cInChI-1: cannot execute binary file
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;We can now translate the MIPS binary into pure Java bytecode:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ java org.ibex.nestedvm.Compiler -outfile JInChI.class JInChI cInChI-1
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This produces a Java class file:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ ll JInChI.class
-rw-r--r-- 1 rich rich 4372362 Nov 30 08:27 JInChI.class
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;We can verify that the classfile has been compiled correctly by running it:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ java JInChI
InChI ver 1, Software version 1.02-beta August 2007.

Usage:
cInChI-1 inputFile [outputFile [logFile [problemFile]]] [-option[ -option...]]

Options:
  SNon        Exclude stereo (Default: Include Absolute stereo)
  SRel        Relative stereo

-- truncated --
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;We have now done something truly remarkable: we've taken a standard C source code distribution and converted it into an executable Java class file. It runs, but only because the NestedVM runtime is on our classpath (thanks to the &lt;tt&gt;source&lt;/tt&gt; command we used at the beginning of the process).&lt;/p&gt;

&lt;p&gt;What we really want is a self-contained, executable jarfile that can be run, unmodified, on any system with Java installed.&lt;/p&gt;

&lt;h4&gt;Step 3: Build the JInChI Jarfile&lt;/h4&gt;

&lt;p&gt;We begin by moving up the the root directory of our jinchi project, creating a new directory to hold our java-specific files (the &lt;strong&gt;JInChI.class&lt;/strong&gt; file and the NestedVM runtime), and copying them into it:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ cd ../../..
$ mkdir jinchi-1.0.2b.1
$ mv InChI-1-software-1-02-beta/cInChI/gcc_makefile/JInChI.class jinchi-1.0.2b.1/
$ cp -r /your/path/to/nestedvm/build/org/ jinchi-1.0.2b.1
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;An executable jarfile generally needs a manifest to point to the main execution class. One way to do that is to first create a manifest:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ vi jinchi-1.0.2b.1/MANIFEST.MF
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;It's essential that this file end with a newline.&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ cat jinchi-1.0.2b.1/MANIFEST.MF
Main-Class: JInChI
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;With everything in place, we can create the jarfile:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ cd jinchi-1.0.2b.1/
$ ls
JInChI.class  MANIFEST.MF  org/
$ jar -cfm jinchi-1.0.2b.1.jar MANIFEST.MF *
$ ls
jinchi-1.0.2b.1.jar  JInChI.class  MANIFEST.MF  org/
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;We've successfully converted standard C source code into a platform independent executable jarfile. But does it work?&lt;/p&gt;

&lt;h4&gt;Step 4: Test JInChI&lt;/h4&gt;

&lt;p&gt;We can confirm that the process has worked by running the jarfile (you should do this in a new shell session to verify that the jarfile is indeed independent of your NestedVM installation).&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ java -jar jinchi-1.0.2b.1.jar
InChI ver 1, Software version 1.02-beta August 2007.

Usage:
cInChI-1 inputFile [outputFile [logFile [problemFile]]] [-option[ -option...]]

Options:
  SNon        Exclude stereo (Default: Include Absolute stereo)
  SRel        Relative stereo
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;That's all there is to it! Your shiny new jarfile can be run on any system with a JVM installed. The one created here has been successfully tested on Mac OS X, Linux, and Windows.&lt;/p&gt;

&lt;p&gt;If you'd prefer to download the JInChI jarfile, it can be obtained &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=142870&amp;amp;package_id=250448&amp;amp;release_id=558625"&gt;from SourceForge&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;Conclusions&lt;/h4&gt;

&lt;p&gt;This article has illustrated in detail the process of converting a standard C source distribution into a platform-independent executable jarfile. Given the appropriate MIPS cross-compiler (many of which come with the NestedVM distribution), the same process can be repeated with code written in a variety of other languages.&lt;/p&gt;

&lt;p&gt;You may be wondering what kind of performance hit you can expect with the approach outlined here. After all, we'd be comparing a native binary to something running on top of two abstraction layers: the NestedVM runtime and a JVM. It's not as bad as you might think, but that's a story for another time.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Image Credit: &lt;a href="http://flickr.com/photos/smithco/"&gt;smithco&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</description>
      <pubDate>Mon, 03 Dec 2007 08:42:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:d7475edf-ad10-4358-af89-35c3c830f422</guid>
      <author>Rich Apodaca</author>
      <link>http://depth-first.com/articles/2007/12/03/from-c-source-code-to-platform-independent-executable-jarfile-using-nestedvm-to-build-jinchi</link>
      <category>Tools</category>
      <category>nestedvm</category>
      <category>java</category>
      <category>inchi</category>
      <category>jinchi</category>
      <category>jarfile</category>
    </item>
    <item>
      <title>Compiling Open Babel to Pure Java Bytecode with NestedVM: Building A Runnable Classfile that Almost Works</title>
      <description>&lt;p&gt;&lt;a href="http://openbabel.sf.net"&gt;&lt;img src="http://depth-first.com/files/Babel256.png" align="right"&gt;&lt;/img&gt;&lt;/a&gt;Previously, I described an &lt;a href="http://depth-first.com/articles/2007/11/19/compiling-open-babel-to-pure-java-bytecode-with-nestedvm-an-unsuccessful-first-attempt#comment-268"&gt;unsuccessful first attempt&lt;/a&gt; to compile the popular cheminformatics C/C++ library &lt;a href="http://openbabel.sf.net"&gt;Open Babel&lt;/a&gt; to pure Java bytecode using &lt;a href="http://nestedvm.ibex.org/"&gt;NestedVM&lt;/a&gt;. This article follows that topic one step further, and shows how to obtain a runnable Java classfile. Although major functionality is missing, the principle of compiling arbitrary C/C++ code to both Java source code and Java bytecode is illustrated.&lt;/p&gt;

&lt;h4&gt;Getting Started&lt;/h4&gt;

&lt;p&gt;This articles assumes that you've &lt;a href="http://depth-first.com/articles/2007/11/19/compiling-open-babel-to-pure-java-bytecode-with-nestedvm-an-unsuccessful-first-attempt#comment-268"&gt;installed NestedVM and downloaded Open Babel&lt;/a&gt; on your system. You'll then need to set up your environment (from the nestedvm installation directory):&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ source env.sh
&lt;/pre&gt;
&lt;/div&gt;

&lt;h4&gt;Run the Configure Script&lt;/h4&gt;

&lt;p&gt;The configure script we used last time didn't attempt to statically compile the binary utilities in the &lt;strong&gt;tools&lt;/strong&gt; directory. This time, we'll add flags to allow this:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ ./configure --disable-dynamic-modules --enable-static=yes --enable-shared=no --enable-inchi --host=mips-unknown-elf
$ make
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Note: leaving out the static compile directives does not produce a fully-functioning classfile either.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Next, we'll attempt to directly create the &lt;tt&gt;babel&lt;/tt&gt; binary in Java classfile format, as we did last time:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ cd tools
$ java org.ibex.nestedvm.Compiler -outfile Babel.class Babel babel
Exception in thread "main" java.lang.IllegalStateException: unresolved phantom target
        at org.ibex.classgen.MethodGen.resolveTarget(MethodGen.java:555)
        at org.ibex.classgen.MethodGen._generateCode(MethodGen.java:664)
        at org.ibex.classgen.MethodGen.generateCode(MethodGen.java:618)
        at org.ibex.classgen.MethodGen.dump(MethodGen.java:888)
        at org.ibex.classgen.ClassFile._dump(ClassFile.java:193)
        at org.ibex.classgen.ClassFile.dump(ClassFile.java:160)
        at org.ibex.nestedvm.ClassFileCompiler.__go(ClassFileCompiler.java:380)
        at org.ibex.nestedvm.ClassFileCompiler._go(ClassFileCompiler.java:72)
        at org.ibex.nestedvm.Compiler.go(Compiler.java:259)
        at org.ibex.nestedvm.Compiler.main(Compiler.java:183)
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;We're getting the same error as before. Although, an &lt;a href="http://groups.google.com/group/nestedvm/browse_thread/thread/b5d114a20a6b672b"&gt;announcement of a bugfix&lt;/a&gt; was posted to the NestedVM list, in my hands the new version of NestedVM caused the same error.&lt;/p&gt;

&lt;p&gt;As a workaround, we can compile to Java sourcecode first:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ java org.ibex.nestedvm.Compiler -outformat java -outfile Babel.java Babel babel
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;We now have a Java source file encoding the &lt;strong&gt;babel&lt;/strong&gt; program. Does it compile?&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ javac Babel.java
The system is out of resources.
Consult the following stack trace for details.
java.lang.OutOfMemoryError: Java heap space
        at com.sun.tools.javac.util.Position$LineMapImpl.build(Position.java:139)
        at com.sun.tools.javac.util.Position.makeLineMap(Position.java:63)
        at com.sun.tools.javac.parser.Scanner.getLineMap(Scanner.java:1105)
        at com.sun.tools.javac.main.JavaCompiler.parse(JavaCompiler.java:512)
        at com.sun.tools.javac.main.JavaCompiler.parse(JavaCompiler.java:550)
        at com.sun.tools.javac.main.JavaCompiler.parseFiles(JavaCompiler.java:801)
        at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:727)
        at com.sun.tools.javac.main.Main.compile(Main.java:353)
        at com.sun.tools.javac.main.Main.compile(Main.java:279)
        at com.sun.tools.javac.main.Main.compile(Main.java:270)
        at com.sun.tools.javac.Main.compile(Main.java:69)
        at com.sun.tools.javac.Main.main(Main.java:54)
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Not exactly. But this is a massive source file, so we'll need to increase the Java compiler's memory allowance:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ javac Babel.java -J-Xms256m -J-Xmx256m
Note: Babel.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This seems to have worked. Can we run the classfile?&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ java Babel -H
Open Babel converts chemical structures from one file format to another

Usage: Babel &amp;lt;input spe&amp;gt; &amp;lt;output spec&amp;gt; [Options]

Each spec can be a file whose extension decides the format.
Optionally the format can be specified by preceding the file by
-i&amp;lt;format-type&amp;gt; e.g. -icml, for input and -o&lt;format-type&gt; for output

--truncated--
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Success! But before we get too excited, let's make sure Open Babel's file formats are recognized by testing for "SMILES":&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ java Babel -Hsmi
Format type: smi was not recognized
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;As you can see, we have successfully converted the &lt;tt&gt;babel&lt;/tt&gt; program to an executable classfile, but this classfile is missing most of the features of the native binary.&lt;/p&gt;

&lt;p&gt;This may seem hopeless, but consider that natively compiling Open Babel using the above &lt;tt&gt;configure&lt;/tt&gt; flags also produces a binary that doesn't know about SMILES or any other format.&lt;/p&gt;

&lt;p&gt;So, it's very likely that if we can produce a native, statically compiled, self contained &lt;tt&gt;babel&lt;/tt&gt; executable, then we will have solved the problem of running Open Babel entirely on a JVM.&lt;/p&gt;

&lt;p&gt;This doesn't seem like a difficult problem, &lt;a href="http://sourceforge.net/mailarchive/forum.php?thread_name=819391.60947.qm%40web34201.mail.mud.yahoo.com&amp;amp;forum_name=openbabel-discuss"&gt;but apparently it is&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Mon, 26 Nov 2007 10:10:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:24f162e9-dafd-4f32-8458-0dc45acb5345</guid>
      <author>Rich Apodaca</author>
      <link>http://depth-first.com/articles/2007/11/26/compiling-open-babel-to-pure-java-bytecode-with-nestedvm-building-a-runnable-classfile-that-almost-works</link>
      <category>Tools</category>
      <category>openbabel</category>
      <category>nestedvm</category>
      <category>java</category>
      <category>crosscompile</category>
      <category>bytecode</category>
    </item>
    <item>
      <title>Compiling Open Babel to Pure Java Bytecode with NestedVM: An Unsuccessful First Attempt</title>
      <description>&lt;p&gt;&lt;a href="http://openbabel.sf.net/"&gt;&lt;img src="http://depth-first.com/files/Babel256.png" align="right"&gt;&lt;/img&gt;&lt;/a&gt;Wouldn't it be great to be able to compile code written in languages like FORTRAN, C, and C++ to Java bytecode? &lt;a href="http://nestedvm.ibex.org/"&gt;NestedVM&lt;/a&gt; - almost magically - can do just that. This article documents a failed first attempt to compile the popular cheminformatics toolkit &lt;a href="http://openbabel.sf.net"&gt;Open Babel&lt;/a&gt;, which is written in C and C++, to pure Java bytecode with NestedVM.&lt;/p&gt;

&lt;p&gt;A previous article described the &lt;a href="http://depth-first.com/articles/2007/10/31/jinchi-run-inchi-anywhere-java-runs"&gt;successful compilation of the InChI toolkit&lt;/a&gt;, a C library, to a platform-independent executable jarfile.&lt;/p&gt;

&lt;h4&gt;The Problem&lt;/h4&gt;

&lt;p&gt;&lt;a href="http://openbabel.sf.net"&gt;Open Babel&lt;/a&gt; is one of cheminformatics' most &lt;a href="http://sourceforge.net/project/stats/?group_id=40728&amp;amp;ugn=openbabel"&gt;widely-used&lt;/a&gt; open source packages. It interconverts dozens of molecular languages, performs a host of cheminformatics analyses, and serves as a platform for many programs and Web services.&lt;/p&gt;

&lt;p&gt;As useful as Open Babel is, it doesn't run directly on a Java Virtual Machine (JVM). Although an &lt;a href="http://openbabel.sourceforge.net/wiki/Java"&gt;Open Babel JNI&lt;/a&gt; interface does exist, using it introduces a platform dependency, which in many cases is not acceptable. JNI is a great solution in some cases, but when maintaining a single version of a program is important, or when applets need to be used, or when code needs to work with unusual system configurations, it's a poor choice.&lt;/p&gt;

&lt;p&gt;Our goal is to compile Open Babel's "babel" command-line utility into pure Java bytecode that can be run on any recent JVM without using JNI.&lt;/p&gt;

&lt;h4&gt;Overview of NestedVM&lt;/h4&gt;

&lt;p&gt;In a nutshell, NestedVM converts MIPS binaries to Java class files. In theory, this allows software written in any language that can be compiled to a MIPS binary to be run on a JVM.&lt;/p&gt;

&lt;p&gt;To do this, NestedVM distributes two categories of tools: (1) a complete MIPS cross-compiler toolchain; and (2) a MIPS binary to Java bytecode compiler and accessories.&lt;/p&gt;

&lt;h4&gt;Building NestedVM&lt;/h4&gt;

&lt;p&gt;The preferred method to install NestedVM is to compile it from source found in the project repository. There are a number of prerequisites your system must meet in order to be able to do so. For now, this article assumes your system has all of them. Some of the following steps can be found in &lt;a href="http://wiki.brianweb.net/NestedVM/QuickStartGuide"&gt;these instructions&lt;/a&gt; as well.&lt;/p&gt;

&lt;p&gt;To obtain the source code from the NestedVM darcs repository:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ darcs get --repo-name=nestedvm http://nestedvm.ibex.org
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Then change into the &lt;strong&gt;nestedvm&lt;/strong&gt; directory and build the main code:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ cd nestedvm
$ make
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;On my machine, this step takes 10-15 minutes.&lt;/p&gt;

&lt;p&gt;To make sure your build works, run the tests:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ make test
...
1.574000e+00
-4.315000e+01l
-43
-4.315000e+01
4.315000e+01
Hello, World
7F
fabs(-2.24) = 2.34
Destructor!
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;NestedVM doesn't build the g++ compiler by default - it's something that needs to be done manually. Fortunately, it's not difficult to do:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ make cxxtest
...
java -cp build tests.CXXTest
Test's constructor
Name: 0x50b40
Name: PKc
Is pointer: 1
Name: 0x50b3c
Name: i
Is pointer: 0
Hello, World from Test
Now throwing an exception
sayhi threw: const char *:Hello, Exception Handling!
Test's destructor
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Finally, with all tools built, we need to set up our environment:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ make env.sh
$ source env.sh
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;We're now ready to cross-compile Open Babel.&lt;/p&gt;

&lt;h4&gt;Cross-Compiling Open Babel&lt;/h4&gt;

&lt;p&gt;For this tutorial, we'll use the &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=40728&amp;amp;package_id=32894&amp;amp;release_id=521581"&gt;Open Babel 2.1.1&lt;/a&gt; source distribution. Unpack the tarball and change into the directory.&lt;/p&gt;

&lt;p&gt;Next, we'll need to set up our cross-compiler environment. Fortunately, NestedVM has made this easy. If you check your environment variables, you'll find that &lt;tt&gt;CXX&lt;/tt&gt; and &lt;tt&gt;CC&lt;/tt&gt; have both been set. All that remains is to notify the configure script that we'll be cross-compiling:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ ./configure --host=mips-unknown-elf
&lt;/div&gt;

&lt;p&gt;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Then we build the MIPS binaries:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ make
&lt;/div&gt;

&lt;p&gt;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Peeking into the &lt;strong&gt;tools&lt;/strong&gt; directory, we can see all of the Open Babel command line tools have been built, including &lt;tt&gt;babel&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;Unless you're running a MIPS machine, though, this binary won't be executable.&lt;/p&gt;

&lt;p&gt;So far, it looks like everything worked. Although it didn't work the first time I tried it, the NestedVM team &lt;a href="http://groups.google.com/group/nestedvm/browse_thread/thread/7373accf6010d6d7"&gt;were most helpful&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;Building the Java Class File&lt;/h4&gt;

&lt;p&gt;We're now ready for the final stage in the process, converting the MIPS binary to a Java class file. Again, NestedVM makes this simple:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ cd tools
$ java org.ibex.nestedvm.Compiler -outfile Babel.class Babel babel
Exception in thread "main" java.lang.IllegalStateException: unresolved phantom target
        at org.ibex.classgen.MethodGen.resolveTarget(MethodGen.java:555)
        at org.ibex.classgen.MethodGen._generateCode(MethodGen.java:664)
        at org.ibex.classgen.MethodGen.generateCode(MethodGen.java:618)
        at org.ibex.classgen.MethodGen.dump(MethodGen.java:888)
        at org.ibex.classgen.ClassFile._dump(ClassFile.java:193)
        at org.ibex.classgen.ClassFile.dump(ClassFile.java:160)
        at org.ibex.nestedvm.ClassFileCompiler.__go(ClassFileCompiler.java:380)
        at org.ibex.nestedvm.ClassFileCompiler._go(ClassFileCompiler.java:72)
        at org.ibex.nestedvm.Compiler.go(Compiler.java:259)

&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Unfortunately, NestedVM has blown up with an exception. Although our target class file, &lt;strong&gt;Babel.class&lt;/strong&gt; is now in our working directory, it is not complete and won't run.&lt;/p&gt;

&lt;h4&gt;What Went Wrong?&lt;/h4&gt;

&lt;p&gt;After bringing this problem to the &lt;a href="http://groups.google.com/group/nestedvm"&gt;NestedVM mailing list&lt;/a&gt;, it appears that this is a &lt;a href="http://groups.google.com/group/nestedvm/browse_thread/thread/b5d114a20a6b672b"&gt;NestedVM bug&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;However, the way &lt;tt&gt;babel&lt;/tt&gt; works is to load its various language modules dynamically. It may be possible to fix the problem by producing a version of &lt;tt&gt;babel&lt;/tt&gt; containing all of its modules in a single binary.&lt;/p&gt;

&lt;p&gt;Although there is a major issue to be resolved, this tutorial illustrates the full process of compiling C++ code to Java bytecode using NestedVM.&lt;/p&gt;</description>
      <pubDate>Mon, 19 Nov 2007 10:42:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:63647f0e-a238-45dd-af26-f57319f21001</guid>
      <author>Rich Apodaca</author>
      <link>http://depth-first.com/articles/2007/11/19/compiling-open-babel-to-pure-java-bytecode-with-nestedvm-an-unsuccessful-first-attempt</link>
      <category>Tools</category>
      <category>nestedvm</category>
      <category>openbabel</category>
      <category>crosscompile</category>
      <category>mips</category>
      <category>bytecode</category>
    </item>
    <item>
      <title>JInChI: Run InChI Anywhere Java Runs</title>
      <description>&lt;p&gt;&lt;a href="http://flickr.com/photos/smithco/76749170/"&gt;&lt;img src="http://depth-first.com/demo/20071031/russian_doll.jpg" align="right" border="0"&gt;&lt;/img&gt;&lt;/a&gt;Regardless of your views on Java the Programming Language, Java the Platform has a lot going for it. The ability to run the same executable on any system with a Java Virtual Machine (JVM), without recompilation, is a significant advantage in today's heterogeneous computing environment. Combine that with Java the Platform's battle-tested security model, stability and performance, and you have some compelling reasons to actually prefer that code execute on a JVM rather than bare metal.&lt;/p&gt;

&lt;p&gt;Cheminformatics has many useful libraries, legacy and otherwise, that don't yet run on a JVM. Many of these can trace their roots back to the 1960s and 1970s and FORTRAN; others were written in C or C++ more recently. What they all have in common is that they're compiled to native binaries rather than Java bytecode.&lt;/p&gt;

&lt;p&gt;Wouldn't it be great if this software could be easily compiled to Java bytecode instead?&lt;/p&gt;

&lt;p&gt;A recent Depth-First article described how the &lt;a href="http://www.iupac.org/inchi/"&gt;InChI toolkit&lt;/a&gt;, an open source C library distributed by IUPAC, &lt;a href="http://depth-first.com/articles/2007/10/29/compiling-the-inchi-toolkit-to-pure-java-bytecode-with-nestedvm"&gt;was successfully compiled to a Java classfile&lt;/a&gt; with the remarkable &lt;a href="http://nestedvm.ibex.org/"&gt;NestedVM&lt;/a&gt; library. This article describes the creation and use of a new platform-independent jarfile that runs the InChI program.&lt;/p&gt;

&lt;p&gt;The procedure was not difficult. The two files previously released ( &lt;a href="http://downloads.sourceforge.net/ninja/JInChI.class?modtime=1193672654&amp;amp;big_mirror=0"&gt;JInChI.class&lt;/a&gt; and &lt;a href="http://downloads.sourceforge.net/ninja/nestedvm.jar?modtime=1193673646&amp;amp;big_mirror=0"&gt;nestedvm.jar&lt;/a&gt;) were combined into a single executable jarfile with a Manifest pointing to the JInChI classfile as the Main class.&lt;/p&gt;

&lt;p&gt;The full cInChI jarfile can be &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=142870&amp;amp;package_id=250448&amp;amp;release_id=550857"&gt;downloaded here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;jinchi.jar&lt;/strong&gt; file can be tested from the command line:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ java -jar jinchi.jar
InChI ver 1, Software version 1.01 release 07/21/2006.

Usage:
cInChI-1 inputFile [outputFile [logFile [problemFile]]] [-option[ -option...]]

Options:
  SNon        Exclude stereo (Default: Include Absolute stereo)
  SRel        Relative stereo
  SRac        Racemic stereo

[truncated]
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;If we wanted to process a molfile representing toluene, we'd use something like the following:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ java -jar jinchi.jar test/toluene.mol
InChI version 1, Software version 1.01 release 07/21/2006
Opened log file 'test/toluene.mol.log'
Opened input file 'test/toluene.mol'
Opened output file 'test/toluene.mol.txt'
Opened problem file 'test/toluene.mol.prb'
Options: Mobile H Perception ON
Isotopic ON, Absolute Stereo ON
Omit undefined/unknown stereogenic centers and bonds
Full Aux. info
Input format: MOLfile
Output format: Plain text
Timeout per structure: 60.000 sec; Up to 1024 atoms per structure
End of file detected after structure #1.
Finished processing 1 structure: 0 errors, processing time 0:00:00.00
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This command would produce the following output file, just like the cInChI program:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ cat test/toluene.mol.txt
* Input_File: "test/toluene.mol"
Structure: 1
InChI=1/C7H8/c1-7-5-3-2-4-6-7/h2-6H,1H3
AuxInfo=1/0/N:1,2,3,4,5,6,7/E:(3,4)(5,6)/rA:7nCCCCCCC/rB:;d2;s2;s3;d4;s1d5s6;/rC:3.6373,2.8,0;0,.7,0;0,2.1,0;1.2124,0,0;1.2124,2.8,0;2.4249,.7,0;2.4249,2.1,0;
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;We can also convert InChIs into molfiles (command line options work the same as in cInChI):&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ java -jar jinchi.jar test/toluene.mol.txt -OutputSDF
InChI version 1, Software version 1.01 release 07/21/2006
Opened log file 'test/toluene.mol.txt.log'
Opened input file 'test/toluene.mol.txt'
Opened output file 'test/toluene.mol.txt.txt'
Opened problem file 'test/toluene.mol.txt.prb'
Options: Output SDfile only
End of file detected after structure #1.
Finished processing 1 structure: 0 errors, processing time 0:00:00.00
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;In this case the output is:&lt;/p&gt;

&lt;div class="console"&gt;
&lt;pre&gt;
$ cat test/toluene.mol.txt.txt
Structure #1
  InChI v1 SDfile Output

  7  7  0  0  0  0  0  0  0  0  1 V2000
    3.6373    2.8000    0.0000 C   0  0  0     0  0  0  0  0  0
    0.0000    0.7000    0.0000 C   0  0  0     0  0  0  0  0  0
    0.0000    2.1000    0.0000 C   0  0  0     0  0  0  0  0  0
    1.2124    0.0000    0.0000 C   0  0  0     0  0  0  0  0  0
    1.2124    2.8000    0.0000 C   0  0  0     0  0  0  0  0  0
    2.4249    0.7000    0.0000 C   0  0  0     0  0  0  0  0  0
    2.4249    2.1000    0.0000 C   0  0  0     0  0  0  0  0  0
  1  7  1  0  0  0  0
  2  3  2  0  0  0  0
  2  4  1  0  0  0  0
  3  5  1  0  0  0  0
  4  6  2  0  0  0  0
  5  7  2  0  0  0  0
  6  7  1  0  0  0  0
M  END
$$$$
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Similar tests worked on both Linux and Windows using the same jarfile.&lt;/p&gt;

&lt;p&gt;There are still some issues to be addressed with this approach. For example, various reports indicate that NestedVM code runs about four to ten times slower than native execution. Benchmarking may be useful at this point.&lt;/p&gt;

&lt;p&gt;Another issue is how to go about making a Java InChI library with NestedVM. If you decompile the &lt;strong&gt;jinchi.jar&lt;/strong&gt; file, you'll find that the &lt;strong&gt;JInChI.class&lt;/strong&gt; file is a large and complex beast in which almost all methods are named as hex numbers. It may be possible to create a library by renaming certain methods and breaking the code into smaller classfiles, but the NestedVM documentation seems sparse on this subject.&lt;/p&gt;

&lt;p&gt;Despite these difficulties, this article demonstrates the power of NestedVM and describes the first (and currently only) example of a 100% Java InChI implementation.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Image Credit: &lt;a href="http://flickr.com/photos/smithco/"&gt;smithco&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 31 Oct 2007 10:59:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:8d75b727-adf7-4722-9c60-2b9b91c94f17</guid>
      <author>Rich Apodaca</author>
      <link>http://depth-first.com/articles/2007/10/31/jinchi-run-inchi-anywhere-java-runs</link>
      <category>Tools</category>
      <category>inchi</category>
      <category>java</category>
      <category>nestedvm</category>
    </item>
    <item>
      <title>Compiling the InChI Toolkit to Pure Java Bytecode with NestedVM</title>
      <description>&lt;p&gt;&lt;a href="http://flickr.com/photos/pmorgan/32606683/"&gt;&lt;img src="http://depth-first.com/demo/20071029/shanghai.jpg" align="right" border="0"&gt;&lt;/img&gt;&lt;/a&gt;Some time ago, a Depth-First article discussed some methods for &lt;a href="http://depth-first.com/articles/2006/10/16/compiling-c-to-java-bytecode"&gt;compiling C to Java bytecode&lt;/a&gt;. Many factors make this approach attractive compared to the JNI approach. Some of them include security, portability, and use within applets. Unfortunately, none of the approaches discussed in the earlier article seemed particularly general.&lt;/p&gt;

&lt;p&gt;Many cheminformatics libraries are written in C and C++; being able to reliably and automatically port them to Java could potentially save a great deal of effort.&lt;/p&gt;

&lt;p&gt;One of the more important cheminformatics C libraries written in recent years is the &lt;a href="http://www.iupac.org/inchi/"&gt;InChI toolkit&lt;/a&gt;. With no pure Java port of this library, JNI is the &lt;a href="http://depth-first.com/articles/2007/10/10/jruby-for-cheminformatics-reading-and-writing-inchis-via-the-java-native-interface"&gt;only way&lt;/a&gt; to use InChI with Java. In some situations, this approach is either overly complicated or simply unacceptable.&lt;/p&gt;

&lt;p&gt;All of this leaves us with the question: how can the InChI toolkit be converted into a pure Java library without writing any new code?&lt;/p&gt;

&lt;p&gt;A partial answer to this question came from Evan Jones, who suggested I look at &lt;a href="http://nestedvm.ibex.org/"&gt;NestedVM&lt;/a&gt;. From the website:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;NestedVM provides binary translation for Java Bytecode. This is done by having GCC compile to a MIPS binary which is then translated to a Java class file. Hence any application written in C, C++, Fortran, or any other language supported by GCC can be run in 100% pure Java with no source changes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And it worked!&lt;/p&gt;

&lt;p&gt;NestedVM was successfully used compile the InChI-API distribution to a Java class file that executed on nothing more than a standard JVM -- and with no JNI code. The InChI classfile and nestedvm runtime jarfile can be &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=142870&amp;amp;package_id=250448&amp;amp;release_id=550390"&gt;downloaded from SourceForge&lt;/a&gt;. Future articles in this series will describe the compilation, installation, and use of NestedVM, as well as the Java class file that it produced.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Image Credit: &lt;a href="http://flickr.com/photos/pmorgan/"&gt;pmorgan&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</description>
      <pubDate>Mon, 29 Oct 2007 11:13:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:77ab0a8f-6209-462f-a536-41ef737fc7a4</guid>
      <author>Rich Apodaca</author>
      <link>http://depth-first.com/articles/2007/10/29/compiling-the-inchi-toolkit-to-pure-java-bytecode-with-nestedvm</link>
      <category>Tools</category>
      <category>inchi</category>
      <category>nestedvm</category>
      <category>bytecode</category>
    </item>
  </channel>
</rss>
