Building a Miserably
                Fun Compiler in
                     JRuby.
                                Chris Umbel

                                @chrisumbel

                         http://www.chrisumbel.com


Sunday, January 29, 12
Agenda


                         Ruby/JRuby introduction

                         Talk background

                         Building a compiler




Sunday, January 29, 12
Ruby
                         Dynamic, but strongly typed.

                         Object-oriented

                         metaprogrammable

                         Has multiple implementations (MRI,
                         IronRuby, Rubinius, JRuby)

                         Has functional features (Higher-order
                         functions, blocks)



Sunday, January 29, 12
Ruby Examples



                         OO

                         Data Structures




Sunday, January 29, 12
JRuby

                         Highly compatible Ruby implementation

                         Written in Java/runs on the JVM

                         Can consume arbitrary Java libraries

                         Favorable concurrency characteristics
                         to CRuby (no GIL)



Sunday, January 29, 12
JRuby Examples


                         Java types

                         Using .jars

                         conventions




Sunday, January 29, 12
Inspiration

                         Ian Dees @undees

                         JRubyConf 2011

                         JRuby, Not Just for Hard-Headed
                         Pragmatists Anymore

                         Author: Using JRuby: Bringing Ruby to
                         Java



Sunday, January 29, 12
JRubyConf


                         Practical problem solving

                         Customers, Customers, Customers!

                         ROI




Sunday, January 29, 12
Thnad
                         Just enough of a fictional
                         programming language to show how to
                         write a compiler

                         https://github.com/undees/thnad

                         Sort of JavaScript-ey

                         Allusion to the greatest of classical
                         literature


Sunday, January 29, 12
What We’ll Build


                         Lisp-style S-expressions

                         Pure JRuby

                         Compiles to Java bytecode




Sunday, January 29, 12
What We’ll Use
                         JRuby

                         Parslet

                           Kaspar Shiess

                           Parser in pure Ruby

                         Bitescript

                           Charles Nutter

                           JVM bytecode emitter for JRuby
Sunday, January 29, 12
What it wont’ do

                         Conditionals

                         Non-parametric locally scoped
                         variables

                         OO

                         Provide Java library support,
                         standard or otherwise.



Sunday, January 29, 12
What It’ll Do

                         Basic math

                         Functions

                         Standard output

                         Suck!!!




Sunday, January 29, 12
sucklang




Sunday, January 29, 12
Language Components


                         Simple Atoms (identifiers; literal
                         strings and integers)

                         Lists

                         Function calls




Sunday, January 29, 12
sucklang Code Sample




                (defun foo [x y]
                  (+ x y))
                (println "result is " (foo 6 9))




Sunday, January 29, 12
Parts


                         Parser

                         Transmogrifier

                         Compiler




Sunday, January 29, 12
Step 1

                         Parser

                           Numbers

                           Basic list

                           Whitespace handling




Sunday, January 29, 12
Step 2



                         Parser

                           Expressions




Sunday, January 29, 12
Step 3

                         Parser

                           Identifiers

                           Atoms

                           Lists in lists

                           Operators are Identifiers



Sunday, January 29, 12
Step 4



                         Parser

                           Strings




Sunday, January 29, 12
Step 5



                         Parser

                           Vectors




Sunday, January 29, 12
Step 6



                         Transmogrifier

                           AST




Sunday, January 29, 12
Step 7: STOP!



                         javap - Java disassembler




Sunday, January 29, 12
Step 8



                         bitescript example




Sunday, January 29, 12
Step 9


                         compiler

                           java requires/imports

                           emitting of simple types




Sunday, January 29, 12
Step 10

                         emitting of functions

                           +

                           println

                           defun

                           calls



Sunday, January 29, 12
What It Did


                         Parsed S-expressions into an AST

                         Compiled AST to JVM bytecode

                         Sucked (a lot of assumptions)




Sunday, January 29, 12
What We’ve Learned


                         Parslet

                         Bitescript

                         JVM innards




Sunday, January 29, 12
Thank you!




Sunday, January 29, 12

Building a compiler in JRuby

  • 1.
    Building a Miserably Fun Compiler in JRuby. Chris Umbel @chrisumbel http://www.chrisumbel.com Sunday, January 29, 12
  • 2.
    Agenda Ruby/JRuby introduction Talk background Building a compiler Sunday, January 29, 12
  • 3.
    Ruby Dynamic, but strongly typed. Object-oriented metaprogrammable Has multiple implementations (MRI, IronRuby, Rubinius, JRuby) Has functional features (Higher-order functions, blocks) Sunday, January 29, 12
  • 4.
    Ruby Examples OO Data Structures Sunday, January 29, 12
  • 5.
    JRuby Highly compatible Ruby implementation Written in Java/runs on the JVM Can consume arbitrary Java libraries Favorable concurrency characteristics to CRuby (no GIL) Sunday, January 29, 12
  • 6.
    JRuby Examples Java types Using .jars conventions Sunday, January 29, 12
  • 7.
    Inspiration Ian Dees @undees JRubyConf 2011 JRuby, Not Just for Hard-Headed Pragmatists Anymore Author: Using JRuby: Bringing Ruby to Java Sunday, January 29, 12
  • 8.
    JRubyConf Practical problem solving Customers, Customers, Customers! ROI Sunday, January 29, 12
  • 9.
    Thnad Just enough of a fictional programming language to show how to write a compiler https://github.com/undees/thnad Sort of JavaScript-ey Allusion to the greatest of classical literature Sunday, January 29, 12
  • 10.
    What We’ll Build Lisp-style S-expressions Pure JRuby Compiles to Java bytecode Sunday, January 29, 12
  • 11.
    What We’ll Use JRuby Parslet Kaspar Shiess Parser in pure Ruby Bitescript Charles Nutter JVM bytecode emitter for JRuby Sunday, January 29, 12
  • 12.
    What it wont’do Conditionals Non-parametric locally scoped variables OO Provide Java library support, standard or otherwise. Sunday, January 29, 12
  • 13.
    What It’ll Do Basic math Functions Standard output Suck!!! Sunday, January 29, 12
  • 14.
  • 15.
    Language Components Simple Atoms (identifiers; literal strings and integers) Lists Function calls Sunday, January 29, 12
  • 16.
    sucklang Code Sample (defun foo [x y] (+ x y)) (println "result is " (foo 6 9)) Sunday, January 29, 12
  • 17.
    Parts Parser Transmogrifier Compiler Sunday, January 29, 12
  • 18.
    Step 1 Parser Numbers Basic list Whitespace handling Sunday, January 29, 12
  • 19.
    Step 2 Parser Expressions Sunday, January 29, 12
  • 20.
    Step 3 Parser Identifiers Atoms Lists in lists Operators are Identifiers Sunday, January 29, 12
  • 21.
    Step 4 Parser Strings Sunday, January 29, 12
  • 22.
    Step 5 Parser Vectors Sunday, January 29, 12
  • 23.
    Step 6 Transmogrifier AST Sunday, January 29, 12
  • 24.
    Step 7: STOP! javap - Java disassembler Sunday, January 29, 12
  • 25.
    Step 8 bitescript example Sunday, January 29, 12
  • 26.
    Step 9 compiler java requires/imports emitting of simple types Sunday, January 29, 12
  • 27.
    Step 10 emitting of functions + println defun calls Sunday, January 29, 12
  • 28.
    What It Did Parsed S-expressions into an AST Compiled AST to JVM bytecode Sucked (a lot of assumptions) Sunday, January 29, 12
  • 29.
    What We’ve Learned Parslet Bitescript JVM innards Sunday, January 29, 12
  • 30.