BiteScript 0.0.1 - a DSL for JVM bytecode

BiteScript is a Ruby DSL for generating JVM bytecode and classes. It is
used by the Duby programming language and by the upcoming “compiler2”
Ruby-to-Java compiler in JRuby.

Project page: http://kenai.com/projects/jvmscript

Install: gem install bitescript

Dependencies: JRuby 1.2 or higher

Changes:

  • First public release. Most features up to Java 1.4 are supported plus
    Java 5 annotations.

Sample code:

require ‘bitescript’

include BiteScript

fb = FileBuilder.build(FILE) do
public_class “SimpleLoop” do
public_static_method “main”, void, string[] do
aload 0
push_int 0
aaload
label :top
dup
aprintln
goto :top
returnvoid
end
end
end

fb.generate do |filename, class_builder|
File.open(filename, ‘w’) do |file|
file.write(class_builder.generate)
end
end

I should have mentioned I’m open to suggestions for API/DSL
improvements, and obviously bug reports are welcome. There’s mailing
lists and an issue tracker at the kenai project page.

And blogged, with a bit more information and links to JVM spec docs,
opcode quickref, and more examples:

On Sat, Mar 28, 2009 at 1:11 PM, Charles Oliver N. <
[email protected]> wrote:

 push_int 0

fb.generate do |filename, class_builder|
File.open(filename, ‘w’) do |file|
file.write(class_builder.generate)
end
end

That’s some awesome use of blocks

Tony A. wrote:

On Sat, Mar 28, 2009 at 1:11 PM, Charles Oliver N. <

fb = FileBuilder.build(FILE) do
public_class “SimpleLoop” do
public_static_method “main”, void, string[] do
aload 0
push_int 0

That’s some awesome use of blocks

Thanks! I know the instance_eval’ed pattern for executing blocks is
sometimes considered bad form, but it makes the code look so nice here I
figured I’d go for it. If you want to use it as a normal API, you can do
that just as easily; you just have to “start” and “stop” the method body
yourself:

fb = FileBuilder.build(FILE) do
cls = fb.public_class “SimpleLoop”
m = cls.public_static_method “main”, void, string[]
m.start
m.aload 0
m.push_int 0
m.aaload
m.label :top
m.dup
m.aprintln
m.goto :top
m.returnvoid
m.stop

  • Charlie

On Sun, Mar 29, 2009 at 7:28 AM, Charles Oliver N.
[email protected] wrote:

m.aload 0
m.push_int 0
m.aaload
m.label :top
m.dup
m.aprintln
m.goto :top
m.returnvoid
m.stop

Charlie, you can also use some ‘trick’ to allow programmers choose if
he wants instance_eval or ‘normal’ version:

class Foo
def initialize(*args, &block)
if block_given?
if block.arity == 1
block.call(self)
else
instance_eval(&block)
end
end
end
end

Foo.new do |foo|
puts “self = #{self}”
puts “foo = #{foo}”
end

Foo.new do
puts “self = #{self}”
end


Pozdrawiam

Rados³aw Bu³at
http://radarek.jogger.pl - mój blog