Developing a Language

119
Developing a Language Evan Phoenix Feb 5th, 2011 @evanphx github.com/evanphx Tuesday, February 8, 2011

description

Evan Phoenix's LARubyConf 2010 keynote talk.

Transcript of Developing a Language

Page 1: Developing a Language

Developinga

Language

Evan Phoenix Feb 5th, 2011

★ @evanphx github.com/evanphx

Tuesday, February 8, 2011

Page 2: Developing a Language

#11Tuesday, February 8, 2011

Page 3: Developing a Language

LA.RBLos Angeles Ruby Brigade

Tuesday Night. Every Week.http://rb.la

Tuesday, February 8, 2011

Page 4: Developing a Language

DINNER

Tuesday, February 8, 2011

Page 5: Developing a Language

DINNER

Tuesday, February 8, 2011

Page 6: Developing a Language

DINNER

Tuesday, February 8, 2011

Page 7: Developing a Language

DINNERTuesday, February 8, 2011

Page 8: Developing a Language

Which came first?

Tuesday, February 8, 2011

Page 9: Developing a Language

Language > Idea

Tuesday, February 8, 2011

Page 10: Developing a Language

Language < Idea

Tuesday, February 8, 2011

Page 11: Developing a Language

Language = Idea

Tuesday, February 8, 2011

Page 12: Developing a Language

The programmer, like the poet,

works only slightly removed

from pure thought-stuff.

- Fred Brooks

Tuesday, February 8, 2011

Page 13: Developing a Language

If ideas are a manifestation of

language

Tuesday, February 8, 2011

Page 14: Developing a Language

Can better language lead to

better ideas?

Tuesday, February 8, 2011

Page 15: Developing a Language

better!=

newer

Tuesday, February 8, 2011

Page 16: Developing a Language

���������

Tuesday, February 8, 2011

Page 17: Developing a Language

To craft a language from

scratch is to take 95% from the

past and call it groundbreaking.

- Evan Phoenix

Tuesday, February 8, 2011

Page 18: Developing a Language

Peek back

Tuesday, February 8, 2011

Page 19: Developing a Language

Tuesday, February 8, 2011

Page 20: Developing a Language

RLK

Tuesday, February 8, 2011

Page 21: Developing a Language

Implement with ease

RLK

Tuesday, February 8, 2011

Page 22: Developing a Language

KPeg

RLK

Tuesday, February 8, 2011

Page 23: Developing a Language

KPeg

A new parsing library

RLK

Tuesday, February 8, 2011

Page 24: Developing a Language

Prattle < RLK

Tuesday, February 8, 2011

Page 25: Developing a Language

github.com/evanphx/prattle.git

github.com/evanphx/kpeg.git

URLs

git://192.168.2.88/prattle

In the Building

In the Cloud

Tuesday, February 8, 2011

Page 26: Developing a Language

Tuesday, February 8, 2011

Page 27: Developing a Language

Dude. Really?

Tuesday, February 8, 2011

Page 28: Developing a Language

Prattle

Tuesday, February 8, 2011

Page 29: Developing a Language

selftruefalsenil

Tuesday, February 8, 2011

Page 30: Developing a Language

+module Prattle+ module AST+ class Self < AST::Node+ Prattle::Parser.register self++ def self.rule_name+ "self"+ end++ def initialize+ # Nothing.+ end++ def self.grammar(g)+ g.self = g.str("self") { Self.new }+ end+ end+ end+end

Tuesday, February 8, 2011

Page 31: Developing a Language

+module Prattle+ module AST+ class Self < AST::Node+ Prattle::Parser.register self++ def self.rule_name+ "self"+ end++ def initialize+ # Nothing.+ end++ def self.grammar(g)+ g.self = g.str("self") { Self.new }+ end+ end+ end+end

Tuesday, February 8, 2011

Page 32: Developing a Language

def self.grammar(g) g.self = g.str("self") { Self.new }end

047b522

Self

Tuesday, February 8, 2011

Page 33: Developing a Language

def self.grammar(g) g.true = g.str("true") { True.new }end

04ad51b

True

Tuesday, February 8, 2011

Page 34: Developing a Language

def self.grammar(g) g.false = g.str("false") { False.new }end

04ad51b

False

Tuesday, February 8, 2011

Page 35: Developing a Language

def self.grammar(g) g.nil = g.str("nil") { Nil.new }end

7609e64

Nil

Tuesday, February 8, 2011

Page 36: Developing a Language

01042

10323

Number

Tuesday, February 8, 2011

Page 37: Developing a Language

def self.grammar(g) g.number = g.reg(/0|([1-9][0-9]*)/) { |i| Number.new(i.to_i) }end

a06d98c

Number

Tuesday, February 8, 2011

Page 38: Developing a Language

def self.grammar(g) g.root = g.any(:true, :false, :self, :nil, :number) end

dfd78cb

Root

Tuesday, February 8, 2011

Page 39: Developing a Language

root = self | true | false | nil | number

Tuesday, February 8, 2011

Page 40: Developing a Language

REPL

Tuesday, February 8, 2011

Page 41: Developing a Language

Instant Gratification

REPL

Tuesday, February 8, 2011

Page 42: Developing a Language

$ rbx bin/repl.rb> 42#<Prattle::AST::Number:0x9c @value=42>> true#<Prattle::AST::True:0x9d>

Tuesday, February 8, 2011

Page 43: Developing a Language

def bytecode(g) g.push :selfend

4e4c1c9

Self

Tuesday, February 8, 2011

Page 44: Developing a Language

def bytecode(g) g.push :trueend

4e4c1c9

True

Tuesday, February 8, 2011

Page 45: Developing a Language

def bytecode(g) g.push :falseend

4e4c1c9

False

Tuesday, February 8, 2011

Page 46: Developing a Language

def bytecode(g) g.push :nilend

4e4c1c9

Nil

Tuesday, February 8, 2011

Page 47: Developing a Language

def bytecode(g) g.push @valueend

4e4c1c9

Number

Tuesday, February 8, 2011

Page 48: Developing a Language

def self.grammar(g) not_quote = g.many( g.any(escapes, /[^']/)) { |*a| a.join } g.string = g.seq("'", g.t(not_quote), "'") { |str| String.new(str) }end

String

Tuesday, February 8, 2011

Page 49: Developing a Language

char = escapes | [^’]not_quote = char* string = “‘“ not_quote “‘“

String

Tuesday, February 8, 2011

Page 50: Developing a Language

$ rbx bin/repl.rb> 42=> 42> true=> 42> ‘hello’=> “hello”

Tuesday, February 8, 2011

Page 51: Developing a Language

BORING

Tuesday, February 8, 2011

Page 52: Developing a Language

Unary Send

3 class

Tuesday, February 8, 2011

Page 53: Developing a Language

Unary Send

3.classRuby

Tuesday, February 8, 2011

Page 54: Developing a Language

Unary Send

3 class

Tuesday, February 8, 2011

Page 55: Developing a Language

Unary Send

3 class

Tuesday, February 8, 2011

Page 56: Developing a Language

g.seq(:number, “ “, :method_name) { |v,_,n| UnarySend.new(v,n) }

Unary Send

Tuesday, February 8, 2011

Page 57: Developing a Language

us = number “ “ method_name

Unary Send

Tuesday, February 8, 2011

Page 58: Developing a Language

Unary Send

true class

Tuesday, February 8, 2011

Page 59: Developing a Language

g.seq(:atom, “ “, :method_name) { |v,_,n| UnarySend.new(v,n) }

Unary Send

Tuesday, February 8, 2011

Page 60: Developing a Language

atom = true | false | self | nil | number | string

Tuesday, February 8, 2011

Page 61: Developing a Language

us = atom “ “ method_name

Unary Send

Tuesday, February 8, 2011

Page 62: Developing a Language

Unary Send

3 class class

Tuesday, February 8, 2011

Page 63: Developing a Language

g.any(g.seq(:unary_send, “ “, :method_name) { |v,_,n| UnarySend.new(v,n) },g.seq(:atom, “ “, :method_name) { |v,_,n| UnarySend.new(v,n) })

Unary Send

Tuesday, February 8, 2011

Page 64: Developing a Language

us = us “ “ method_name | atom “ “ method_name

Unary Send

Tuesday, February 8, 2011

Page 65: Developing a Language

def bytecode(g) @receiver.bytecode(g) g.send @method_name.to_sym, 0end

Unary Send

Tuesday, February 8, 2011

Page 66: Developing a Language

$ rbx bin/repl.rb> 3 class=> Fixnum> 3 class class=> Class> ‘hello’ class=> String

Tuesday, February 8, 2011

Page 67: Developing a Language

‘hello’ index: ‘o’

Keyword Send

Tuesday, February 8, 2011

Page 68: Developing a Language

“hello”.index(“o”)

Keyword Send

Ruby

Tuesday, February 8, 2011

Page 69: Developing a Language

g.keyword_send = g.seq(:atom, ‘ ‘, :method_name, “:”, “ “, :atom)

Keyword Send

Tuesday, February 8, 2011

Page 70: Developing a Language

ks = atom “ “ method_name “: ” :atom

Keyword Send

Tuesday, February 8, 2011

Page 71: Developing a Language

‘hello’ at: 0 put: ‘j’

Keyword Send

Tuesday, February 8, 2011

Page 72: Developing a Language

“hello”[0] = “j”

Keyword Send

Ruby

Tuesday, February 8, 2011

Page 73: Developing a Language

g.pairs = g.seq(:method_name, “:”, “ “, :atom)

Keyword Send

Tuesday, February 8, 2011

Page 74: Developing a Language

g.keyword_send = g.seq( :atom, ‘ ‘, g.many([:pair, ‘ ‘]), :pair )

Keyword Send

Tuesday, February 8, 2011

Page 75: Developing a Language

ks = atom (pair ‘ ‘)+ pair

Keyword Send

Tuesday, February 8, 2011

Page 76: Developing a Language

def bytecode(g) @receiver.bytecode(g) @arguments.each do |a| a.bytecode(a) end g.send @method_name.to_sym, @arguments.sizeend

Keyword Send

Tuesday, February 8, 2011

Page 77: Developing a Language

def bytecode(g) @receiver.bytecode(g) @arguments.each do |a| a.bytecode(a) end g.send @method_name.to_sym, @arguments.sizeend

Keyword Send

Tuesday, February 8, 2011

Page 78: Developing a Language

$ rbx bin/repl.rb> ‘hello’ index: ‘o’

NoMethodError: Unknown method ‘index:’

Tuesday, February 8, 2011

Page 79: Developing a Language

$ rbx bin/repl.rb> ‘hello’ index: ‘o’

NoMethodError: Unknown method ‘index:’

Tuesday, February 8, 2011

Page 80: Developing a Language

‘hello’ index: ‘o’

Keyword Send

Tuesday, February 8, 2011

Page 81: Developing a Language

“hello”.send( “index:”, “o” )

Keyword Send

Ruby

Tuesday, February 8, 2011

Page 82: Developing a Language

‘hello’ ~index: ‘o’

Keyword Send

Tuesday, February 8, 2011

Page 83: Developing a Language

def bytecode(g) if @method_name[0] == ?~ ruby_style else smalltalk_style endend

Keyword Send

Tuesday, February 8, 2011

Page 84: Developing a Language

“hello”.send( “index”, “o” )

Keyword Send

Ruby

Tuesday, February 8, 2011

Page 85: Developing a Language

$ rbx bin/repl.rb> ‘hello’ ~index: ‘o’=> 4NoMethodError: Unknown method ‘index:’

Tuesday, February 8, 2011

Page 86: Developing a Language

obj string at: 0 put: ‘j’

Keyword Send

Tuesday, February 8, 2011

Page 87: Developing a Language

obj string at: 0 put: ‘j’

Keyword Send

Tuesday, February 8, 2011

Page 88: Developing a Language

obj string at: 0 put: ‘j’

Keyword Send

Tuesday, February 8, 2011

Page 89: Developing a Language

g.keyword_send = g.seq( :atom, ‘ ‘, g.many([:pair, ‘ ‘]), :pair )

Keyword Send

Tuesday, February 8, 2011

Page 90: Developing a Language

g.keyword_send = g.seq( :atom, ‘ ‘, g.many([:pair, ‘ ‘]), :pair )

Keyword Send

Tuesday, February 8, 2011

Page 91: Developing a Language

ks = atom (pair ‘ ‘)+ pair

Keyword Send

Tuesday, February 8, 2011

Page 92: Developing a Language

g.any(:atom, :unary_send)

Keyword Send

Tuesday, February 8, 2011

Page 93: Developing a Language

recv = us | atom ks = recv (pair ‘ ‘)+ pair

Keyword Send

Tuesday, February 8, 2011

Page 94: Developing a Language

[ 1 ]Block

Tuesday, February 8, 2011

Page 95: Developing a Language

g.block = g.seq(‘[‘, :expr, ‘]’)

Keyword Send

Tuesday, February 8, 2011

Page 96: Developing a Language

expr = ks | us | atom

Keyword Send

Tuesday, February 8, 2011

Page 97: Developing a Language

block = “[“ expr “]

Keyword Send

Tuesday, February 8, 2011

Page 98: Developing a Language

[ 1. 2 ]Block

Tuesday, February 8, 2011

Page 99: Developing a Language

g.exprs = g.seq(:expr, g.kleene(‘.’, :expr))

Keyword Send

Tuesday, February 8, 2011

Page 100: Developing a Language

exprs = (‘.’ expr)*

Keyword Send

Tuesday, February 8, 2011

Page 101: Developing a Language

block = “[“ exprs “]

Keyword Send

Tuesday, February 8, 2011

Page 102: Developing a Language

$ rbx bin/repl.rb> 10 ~times: [ Kernel ~puts: ‘hello’ ]

Tuesday, February 8, 2011

Page 103: Developing a Language

$ rbx bin/repl.rb> 10 ~times: [ Kernel ~puts: ‘rb.la’ ]“rb.la”“rb.la”“rb.la”...=> 10

Tuesday, February 8, 2011

Page 104: Developing a Language

$ rbx bin/repl.rb> 10 ~times: [ :x | Kernel ~p: x ]

Tuesday, February 8, 2011

Page 105: Developing a Language

$ rbx bin/repl.rb> 10 ~times: [ :x | Kernel ~p: x ]012...=> 10

Tuesday, February 8, 2011

Page 106: Developing a Language

ary concat: a; concat: b; concat: c

Cascade Send

Tuesday, February 8, 2011

Page 107: Developing a Language

3 + 4 * 5

Operators

Tuesday, February 8, 2011

Page 108: Developing a Language

$ rbx bin/repl.rb> 3 + 4 * 5

Tuesday, February 8, 2011

Page 109: Developing a Language

$ rbx bin/repl.rb> 3 + 4 * 5=> 35

Tuesday, February 8, 2011

Page 110: Developing a Language

parens = “(“ expr “)

Parens

Tuesday, February 8, 2011

Page 111: Developing a Language

$ rbx bin/repl.rb> 3 + (4 * 5)=> 23

Tuesday, February 8, 2011

Page 112: Developing a Language

zero to usable

Tuesday, February 8, 2011

Page 113: Developing a Language

BIG IDEA

Tuesday, February 8, 2011

Page 114: Developing a Language

little idea

Tuesday, February 8, 2011

Page 115: Developing a Language

ComplexLanguage

Tuesday, February 8, 2011

Page 116: Developing a Language

simple language

Tuesday, February 8, 2011

Page 117: Developing a Language

See ya out there.

Thanks!

Tuesday, February 8, 2011

Page 118: Developing a Language

MIA: Return

Tuesday, February 8, 2011

Page 119: Developing a Language

MIA: =

Tuesday, February 8, 2011