Please note I'm not into the github thing --neither into Java, even if it may sound weird in 2013 A.D.
Requirements:
- maven 3.x (I couldn't get maven 2.x working)
- jruby
- a Java jdk
I have an Ubuntu 12.04 machine with openjdk-7 installed, so I just apt-got jruby and maven from stock repositories.
After cloning the RubyFlux git repo the mvn package command failed, so I had to add the maven-compiler-plugin goal to the pom file and call mvn package again:
<plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-compiler-plugin</artifactid> <configuration> <source></source>1.7 <target>1.7</target> </configuration> </plugin>
Ready to go!
Create the fib.rb example and verify execution time with stock Ruby interpreter (arrrrgh: 4'06" on an AMDv140 processor!).
Convert to Java sources: I had to specify Ruby 1.9 version on the jruby command-line because Ruby 1.8.x does not have the Dir.exists? method (yeah, right):
jruby --1.9 -I target:src/main/ruby src/main/ruby/ruby_flux.rb fib.rb
Compile to .class files and execute:
cd build javac fib.java java fib
If you get some eerie "unsupported version 51.0" error, you have the stock Java 1.6 installed (look what is linked to /etc/alternatives/java); I just to explicitly called the 1.7:
/usr/lib/jvm/java-7-openjdk-amd64/bin/java fib
Build the .jar archive as usual, and then run it:
cd build jar -cfe fib.jar fib *.class java -jar fib.jar
Arrrrgh: 6.7 seconds. Nice. Remember that fib.rb is pure number-crunching, don't expect a 37× speed improvement on "anything".
Oh, yeah: it would be nice to have a rubyflux inputfile.rb script. Here is my ugly quick-hack:
#!/bin/bash -e # usage: $0 inputfile.rb DIR=~/rubyflux VAI=`basename $1 .rb` CWD=`pwd` #renice 20 $$ rm -f $DIR/$VAI.rb cp $1 $DIR/$VAI.rb cd $DIR rm -rf build jruby --1.9 -I target:src/main/ruby src/main/ruby/ruby\_flux.rb $VAI.rb cd build javac $VAI.java jar -cfe $VAI.jar $VAI *.class cd "$CWD" mv $DIR/build/$VAI.jar . rm -f $DIR/$VAI.rb ls -al $VAI*
Before you go totally apeshit, remember that RubyFlux is still a work-in-progress. Don't expect anything more than "print" and "puts" functions and very basic operations. For example, "sleep" is not supported, so I had to write mine, adding to RKernel.java source:
public RObject sleep(RFloat j) { try { Thread.sleep(new Double(1000.0*j.flo).longValue()); } catch(InterruptedException ie) { } return RNil; }
and changing the builtins definitions in the main ruby_flux.rb (yes, there were only "puts" and "print"):
BUILTINS = %w[puts print sleep]
Thus I was able to build this Ruby source into a Java .jar "executable" archive:
i = 0 p = 0.234 puts "FORMAT C:" sleep 0.15 while i < 80 print "\rFormatting track " puts i i += 1 p *= 0.937 sleep p end puts "Formatting complete. Your hard disk has more free space now"
Hey, boss. Check out this Hard Disk Maintenance. Yeah, it's a safe JAR. #LOL
Nessun commento:
Posta un commento