# BiteScript 0.0.1 - a DSL for JVM bytecode

**URL:** <https://www.ruby-forum.com/t/bitescript-0-0-1-a-dsl-for-jvm-bytecode/164154>\
**Category:** Ruby\
**Created:** [March 28, 2009, 8:12pm UTC](https://www.ruby-forum.com/t/bitescript-0-0-1-a-dsl-for-jvm-bytecode/164154 "2009-03-28T20:12:02Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![headius](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/7c8e57/32.png) [@headius](https://www.ruby-forum.com/u/headius)\
**Post date:** [March 28, 2009, 8:12pm UTC](https://www.ruby-forum.com/t/bitescript-0-0-1-a-dsl-for-jvm-bytecode/164154/1 "2009-03-28T20:12:02Z")

</div>

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](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

---

<div class="post-metadata">

**Author:** ![headius](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/7c8e57/32.png) [@headius](https://www.ruby-forum.com/u/headius)\
**Post date:** [March 28, 2009, 8:22pm UTC](https://www.ruby-forum.com/t/bitescript-0-0-1-a-dsl-for-jvm-bytecode/164154/2 "2009-03-28T20:22:00Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![headius](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/7c8e57/32.png) [@headius](https://www.ruby-forum.com/u/headius)\
**Post date:** [March 28, 2009, 8:43pm UTC](https://www.ruby-forum.com/t/bitescript-0-0-1-a-dsl-for-jvm-bytecode/164154/3 "2009-03-28T20:43:06Z")

</div>

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

> **[BiteScript 0.0.1 - A Ruby DSL for JVM Bytecode](http://blog.headius.com/2009/03/bitescript-001-ruby-dsl-for-jvm.html)**
>
> I have finally released the first version of BiteScript, my little DSL for generating JVM bytecode. Install it as a gem with

---

<div class="post-metadata">

**Author:** ![headius](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/7c8e57/32.png) [@headius](https://www.ruby-forum.com/u/headius)\
**Post date:** [March 29, 2009, 6:28am UTC](https://www.ruby-forum.com/t/bitescript-0-0-1-a-dsl-for-jvm-bytecode/164154/4 "2009-03-29T06:28:01Z")

</div>

On Sat, Mar 28, 2009 at 1:11 PM, Charles Oliver N. \<  
removed\_email\_address@domain.invalid\> 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

---

<div class="post-metadata">

**Author:** ![headius](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/7c8e57/32.png) [@headius](https://www.ruby-forum.com/u/headius)\
**Post date:** [March 29, 2009, 7:28am UTC](https://www.ruby-forum.com/t/bitescript-0-0-1-a-dsl-for-jvm-bytecode/164154/5 "2009-03-29T07:28:52Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![headius](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/7c8e57/32.png) [@headius](https://www.ruby-forum.com/u/headius)\
**Post date:** [March 29, 2009, 1:24pm UTC](https://www.ruby-forum.com/t/bitescript-0-0-1-a-dsl-for-jvm-bytecode/164154/6 "2009-03-29T13:24:27Z")

</div>

On Sun, Mar 29, 2009 at 7:28 AM, Charles Oliver N.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) 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](http://radarek.jogger.pl) - mój blog
