building a compiler in jruby
DESCRIPTION
Building a Compiler in JRuby - Chris Umbel at Jan 24th 2012 PittJUG meeting showing how you can create a language using JRuby tools to parse the language an emit JVM bytecode.TRANSCRIPT
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
RubyDynamic, 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
ThnadJust 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 UseJRuby
Parslet
Kaspar Shiess
Parser in pure Ruby
Bitescript
Charles Nutter
JVM bytecode emitter for JRubySunday, 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
(defun foo [x y] (+ x y))(println "result is " (foo 6 9))
sucklang Code Sample
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