SlideShare a Scribd company logo
1 of 96
Download to read offline
Building Interpreters
with PyPy
About me
• Computer science bachelor student at TU Berlin!
• Programming/Python since ~2008!
• Primarily involved with Pocoo projects (Sphinx,
Werkzeug, Flask, Babel, …)
PyPy Python Interpreter
• Fast Python implementation!
• Just-in-Time compilation!
• Proper garbage collection (no reference counting)!
• Written in Python
PyPy Translation Toolchain
• Capable of compiling (R)Python!
• Garbage collection!
• Tracing just-in-time compiler generator!
• Software transactional memory?
PyPy based interpreters
• Topaz (Ruby)!
• HippyVM (PHP)!
• Pyrolog (Prolog)!
• pycket (Racket)!
• Various other interpreters for (Scheme, Javascript,
io, Gameboy)
RPython
• Python subset!
• Statically typed!
• Garbage collected!
• Standard library almost entirely unavailable!
• Some missing builtins (print, open(), …)!
• rpython.rlib!
• exceptions are (sometimes) ignored!
• Not a really a language, rather a "state"
Hello RPython
# hello_rpython.py	
import os	
!
def entry_point(argv):	
os.write(2, “Hello, World!n”)	
return 0	
!
def target(driver, argv):	
return entry_point, None
$ rpython hello_rpython.py	
…	
$ ./hello_python-c	
Hello, RPython!
Goal
• BASIC interpreter capable of running Hamurabi!
• Bytecode based!
• Garbage Collection!
• Just-In-Time Compilation
Live play session
Architecture
Parser
Compiler
Virtual Machine
AST
Bytecode
Source
10 PRINT TAB(32);"HAMURABI"	
20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"	
30 PRINT:PRINT:PRINT	
80 PRINT "TRY YOUR HAND AT GOVERNING ANCIENT SUMERIA"	
90 PRINT "FOR A TEN-YEAR TERM OF OFFICE.":PRINT	
95 D1=0: P1=0	
100 Z=0: P=95:S=2800: H=3000: E=H-S	
110 Y=3: A=H/Y: I=5: Q=1	
210 D=0	
215 PRINT:PRINT:PRINT "HAMURABI: I BEG TO REPORT TO YOU,": Z=Z+1	
217 PRINT "IN YEAR";Z;",";D;"PEOPLE STARVED,";I;"CAME TO THE CITY,"	
218 P=P+I	
227 IF Q>0 THEN 230	
228 P=INT(P/2)	
229 PRINT "A HORRIBLE PLAGUE STRUCK! HALF THE PEOPLE DIED."	
230 PRINT "POPULATION IS NOW";P	
232 PRINT "THE CITY NOW OWNS ";A;"ACRES."	
235 PRINT "YOU HARVESTED";Y;"BUSHELS PER ACRE."	
250 PRINT "THE RATS ATE";E;"BUSHELS."	
260 PRINT "YOU NOW HAVE ";S;"BUSHELS IN STORE.": PRINT	
270 REM *** MORE CODE THAT DID NOT FIT INTO THE SLIDE FOLLOWS
Parser
Parser
Abstract Syntax Tree (AST)
Source
Parser
Parser
AST
Source
Lexer
Tokens
Source
Parser
AST
RPLY
• Based on PLY, which is based on Lex and Yacc!
• Lexer generator!
• LALR parser generator
Lexer
from rply import LexerGenerator	
!
lg = LexerGenerator()	
!
lg.add(“NUMBER”, “[0-9]+”)	
# …	
lg.ignore(“ +”) # whitespace	
!
lexer = lg.build().lex
lg.add('NUMBER', r'[0-9]*.[0-9]+')	
lg.add('PRINT', r'PRINT')	
lg.add('IF', r'IF')	
lg.add('THEN', r'THEN')	
lg.add('GOSUB', r'GOSUB')	
lg.add('GOTO', r'GOTO')	
lg.add('INPUT', r'INPUT')	
lg.add('REM', r'REM')	
lg.add('RETURN', r'RETURN')	
lg.add('END', r'END')	
lg.add('FOR', r'FOR')	
lg.add('TO', r'TO')	
lg.add('NEXT', r'NEXT')	
lg.add('NAME', r'[A-Z][A-Z0-9$]*')	
lg.add('(', r'(')	
lg.add(')', r')')	
lg.add(';', r';')	
lg.add('STRING', r'"[^"]*"')	
lg.add(':', r'r?n')	
lg.add(':', r':')	
lg.add('=', r'=')	
lg.add('<>', r'<>')	
lg.add('-', r'-')	
lg.add('/', r'/')	
lg.add('+', r'+')	
lg.add('>=', r'>=')	
lg.add('>', r'>')	
lg.add('***', r'***.*')	
lg.add('*', r'*')	
lg.add('<=', r'<=')	
lg.add('<', r'<')
>>> from basic.lexer import lex	
>>> source = open("hello.bas").read()	
>>> for token in lex(source):	
... print token	
Token("NUMBER", "10")	
Token("PRINT", "PRINT")	
Token("STRING",'"HELLO BASIC!"')	
Token(":", "n")
Grammar
• A set of formal rules that defines the syntax!
• terminals = tokens!
• nonterminals = rules defining a sequence of one or
more (non)terminals
10 PRINT TAB(32);"HAMURABI"	
20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"	
30 PRINT:PRINT:PRINT	
80 PRINT "TRY YOUR HAND AT GOVERNING ANCIENT SUMERIA"	
90 PRINT "FOR A TEN-YEAR TERM OF OFFICE.":PRINT	
95 D1=0: P1=0	
100 Z=0: P=95:S=2800: H=3000: E=H-S	
110 Y=3: A=H/Y: I=5: Q=1	
210 D=0	
215 PRINT:PRINT:PRINT "HAMURABI: I BEG TO REPORT TO YOU,": Z=Z+1	
217 PRINT "IN YEAR";Z;",";D;"PEOPLE STARVED,";I;"CAME TO THE CITY,"	
218 P=P+I	
227 IF Q>0 THEN 230	
228 P=INT(P/2)	
229 PRINT "A HORRIBLE PLAGUE STRUCK! HALF THE PEOPLE DIED."	
230 PRINT "POPULATION IS NOW";P	
232 PRINT "THE CITY NOW OWNS ";A;"ACRES."	
235 PRINT "YOU HARVESTED";Y;"BUSHELS PER ACRE."	
250 PRINT "THE RATS ATE";E;"BUSHELS."	
260 PRINT "YOU NOW HAVE ";S;"BUSHELS IN STORE.": PRINT	
270 REM *** MORE CODE THAT DID NOT FIT INTO THE SLIDE FOLLOWS
program :	
program : line	
program : line program
line : NUMBER statements
statements : statement	
statements : statement statements
statement : PRINT :	
statement : PRINT expressions :	
expressions : expression	
expressions : expression ;	
expressions : expression ; expressions
statement : NAME = expression :
statement : IF expression THEN number :
statement : INPUT name :
statement : GOTO NUMBER :	
statement : GOSUB NUMBER :	
statement : RETURN :
statement : REM *** :
statement : FOR NAME = NUMBER TO NUMBER :	
statement : NEXT NAME :
statement : END :
expression : NUMBER	
expression : NAME	
expression : STRING	
expression : operation	
expression : ( expression )	
expression : NAME ( expression )
operation : expression + expression	
operation : expression - expression	
operation : expression * expression	
operation : expression / expression	
operation : expression <= expression	
operation : expression < expression	
operation : expression = expression	
operation : expression <> expression	
operation : expression > expression	
operation : expression >= expression
from rply.token import BaseBox	
!
class Program(BaseBox):	
def __init__(self, lines):

self.lines = lines
AST
class Line(BaseBox):	
def __init__(self, lineno, statements):	
self.lineno = lineno	
self.statements = statements
class Statements(BaseBox):	
def __init__(self, statements):	
self.statements = statements
class Print(BaseBox):	
def __init__(self, expressions, newline=True):	
self.expressions = expressions	
self.newline = newline
…
from rply import ParserGenerator	
!
pg = ParserGenerator(["NUMBER", "PRINT", …])
Parser
@pg.production("program : ")	
@pg.production("program : line")	
@pg.production("program : line program")	
def program(p):	
if len(p) == 2:	
return Program([p[0]] + p[1].get_lines())	
return Program(p)
@pg.production("line : number statements")	
def line(p):	
return Line(p[0], p[1].get_statements())
@pg.production("op : expression + expression")	
@pg.production("op : expression * expression")	
def op(p):	
if p[1].gettokentype() == "+":	
return Add(p[0], p[2])	
elif p[1].gettokentype() == "*":	
return Mul(p[0], p[2])
pg = ParserGenerator([…], precedence=[	
("left", ["+", "-"]),	
("left", ["*", "/"])	
])
parse = pg.build().parse
Compiler/Virtual Machine
Compiler
Virtual Machine
AST
Bytecode
class VM(object):	
def __init__(self, program):	
self.program = program
class VM(object):	
def __init__(self, program):	
self.program = program	
self.pc = 0
class VM(object):	
def __init__(self, program):	
self.program = program	
self.pc = 0	
self.frames = []
class VM(object):	
def __init__(self, program):	
self.program = program	
self.pc = 0	
self.frames = []	
self.iterators = []
class VM(object):	
def __init__(self, program):	
self.program = program	
self.pc = 0	
self.frames = []	
self.iterators = []	
self.stack = []
class VM(object):	
def __init__(self, program):	
self.program = program	
self.pc = 0	
self.frames = []	
self.iterators = {}	
self.stack = []	
self.variables = {}
class VM(object):	
…	
def execute(self):	
while self.pc < len(self.program.instructions):	
self.execute_bytecode(self.program.instructions[self.pc])
class VM(object):	
…	
def execute_bytecode(self, code):	
raise NotImplementedError(code)
class VM(object):	
...	
def execute_bytecode(self):	
if isinstance(code, TYPE):	
self.execute_TYPE(code)	
...	
else:	
raise NotImplementedError(code)
class Program(object):	
def __init__(self):	
self.instructions = []
Bytecode
class Instruction(object):	
pass
class Number(Instruction):	
def __init__(self, value):	
self.value = value	
!
class String(Instructions):	
def __init__(self, value):	
self.value = value
class Print(Instruction):	
def __init__(self, expressions, newline):	
self.expressions = expressions	
self.newline = newline
class Call(Instruction):	
def __init__(self, function_name):	
self.function_name = function_name
class Let(Instruction):	
def __init__(self, name):	
self.name = name
class Lookup(Instruction):	
def __init__(self, name):	
self.name = name
class Add(Instruction):	
pass	
!
class Sub(Instruction):	
pass	
!
class Mul(Instruction):	
pass	
!
class Equal(Instruction):	
pass	
!
...
class GotoIfTrue(Instruction):	
def __init__(self, target):	
self.target = target	
!
class Goto(Instruction):	
def __init__(self, target, with_frame=False):	
self.target = target	
self.with_frame = with_frame	
!
class Return(Instruction):	
pass
class Input(object):	
def __init__(self, name):	
self.name = name
class For(Instruction):	
def __init__(self, variable):	
self.variable = variable	
!
class Next(Instruction):	
def __init__(self, variable):	
self.variable = variable
class Program(object):	
def __init__(self):	
self.instructions = []	
self.lineno2instruction = {}	
!
def __enter__(self):	
return self	
!
def __exit__(self, exc_type, exc_value, tb):	
if exc_type is None:	
for i, instruction in enumerate(self.instructions):	
instruction.finalize(self, i)
def finalize(self, program, index):	
self.target = program.lineno2instruction[self.target]
class Program(BaseBox):	
…	
def compile(self):	
with bytecode.Program() as program:	
for line in self.lines:	
line.compile(program)	
return program
class Line(BaseBox):	
...	
def compile(self, program):	
program.lineno2instruction[self.lineno] = len(program.instructions)	
for statement in self.statements:	
statement.compile(program)
class Line(BaseBox):	
...	
def compile(self, program):	
program.lineno2instruction[self.lineno] = len(program.instructions)	
for statement in self.statements:	
statement.compile(program)
class Print(Statement):	
def compile(self, program):	
for expression in self.expressions:	
expression.compile(program)	
program.instructions.append(	
bytecode.Print(	
len(self.expressions),	
self.newline	
)	
)
class Print(Statement):	
...	
def compile(self, program):	
for expression in self.expressions:	
expression.compile(program)	
program.instructions.append(	
bytecode.Print(	
len(self.expressions),	
self.newline	
)	
)
class Let(Statement):	
...	
def compile(self, program):	
self.value.compile(program)	
program.instructions.append(	
bytecode.Let(self.name)	
)
class Input(Statement):	
...	
def compile(self, program):	
program.instructions.append(	
bytecode.Input(self.variable)	
)
class Goto(Statement):	
...	
def compile(self, program):	
program.instructions.append(	
bytecode.Goto(self.target)	
)	
!
class Gosub(Statement):	
...	
def compile(self, program):	
program.instructions.append(	
bytecode.Goto(	
self.target,	
with_frame=True	
)	
)	
!
class Return(Statement):	
...	
def compile(self, program):	
program.instructions.append(	
bytecode.Return()	
)
class For(Statement):	
...	
def compile(self, program):	
self.start.compile(program)	
program.instructions.append(	
bytecode.Let(self.variable)	
)	
self.end.compile(program)	
program.instructions.append(	
bytecode.For(self.variable)	
)
class WrappedObject(object):	
pass	
!
class WrappedString(WrappedObject):	
def __init__(self, value):	
self.value = value	
!
class WrappedFloat(WrappedObject):	
def __init__(self, value):	
self.value = value
class VM(object):	
…	
def execute_number(self, code):	
self.stack.append(WrappedFloat(code.value))	
self.pc += 1	
!
def execute_string(self, code):	
self.stack.append(WrappedString(code.value))	
self.pc += 1
class VM(object):	
…	
def execute_call(self, code):	
argument = self.stack.pop()	
if code.function_name == "TAB":	
self.stack.append(WrappedString(" " * int(argument)))	
elif code.function_name == "RND":	
self.stack.append(WrappedFloat(random.random()))	
...	
self.pc += 1
class VM(object):	
…	
def execute_let(self, code):	
value = self.stack.pop()	
self.variables[code.name] = value	
self.pc += 1	
!
def execute_lookup(self, code):	
value = self.variables[code.name]	
self.stack.append(value)	
self.pc += 1
class VM(object):	
…	
def execute_add(self, code):	
right = self.stack.pop()	
left = self.stack.pop()	
self.stack.append(WrappedFloat(left + right))	
self.pc += 1
class VM(object):	
…	
def execute_goto_if_true(self, code):	
condition = self.stack.pop()	
if condition:	
self.pc = code.target	
else:	
self.pc += 1
class VM(object):	
…	
def execute_goto(self, code):	
if code.with_frame:	
self.frames.append(self.pc + 1)	
self.pc = code.target
class VM(object):	
…	
def execute_return(self, code):	
self.pc = self.frames.pop()
class VM(object):	
…	
def execute_input(self, code):	
value = WrappedFloat(float(raw_input() or “0.0”))	
self.variables[code.name] = value	
self.pc += 1
class VM(object):	
…	
def execute_for(code):	
self.pc += 1	
self.iterators[code.variable] = (	
self.pc,	
self.stack.pop()	
)
class VM(object):	
…	
def execute_next(self, code):	
loop_begin, end = self.iterators[code.variable]	
current_value = self.variables[code.variable].value	
next_value = current_value + 1.0	
if next_value <= end:	
self.variables[code.variable] = 	
WrappedFloat(next_value)	
self.pc = loop_begin	
else:	
del self.iterators[code.variable]	
self.pc += 1
def entry_point(argv):	
try:	
filename = argv[1]	
except IndexError:	
print(“You must supply a filename”)	
return 1	
content = read_file(filename)	
tokens = lex(content)	
ast = parse(tokens)	
program = ast.compile()	
vm = VM(program)	
vm.execute()	
return 0
Entry Point
JIT (in PyPy)
1. Identify “hot" loops!
2. Create trace inserting guards based on observed
values!
3. Optimize trace!
4. Compile trace!
5. Execute machine code instead of interpreter
from rpython.rlib.jit import JitDriver	
!
jitdriver = JitDriver(	
greens=[“pc”, “vm”, “program”, “frames”, “iterators”],	
reds=[“stack”, “variables"]	
)
class VM(object):	
…	
def execute(self):	
while self.pc < len(self.program.instructions):	
jitdriver.merge_point(	
vm=self,	
pc=self.pc,	
…	
)
Benchmark
10 N = 1	
20 IF N <= 10000 THEN 40	
30 END	
40 GOSUB 100	
50 IF R = 0 THEN 70	
60 PRINT "PRIME"; N	
70 N = N + 1: GOTO 20	
100 REM *** ISPRIME N -> R	
110 IF N <= 2 THEN 170	
120 FOR I = 2 TO (N - 1)	
130 A = N: B = I: GOSUB 200	
140 IF R <> 0 THEN 160	
150 R = 0: RETURN	
160 NEXT I	
170 R = 1: RETURN	
200 REM *** MOD A -> B -> R	
210 R = A - (B * INT(A / B))	
220 RETURN
cbmbasic 58.22s
basic-c 5.06s
basic-c-jit 2.34s
Python implementation (CPython) 2.83s
Python implementation (PyPy) 0.11s
C implementation 0.03s
Questions?
These slides are licensed under a Creative Commons
Attribution-ShareAlike 4.0 International License

More Related Content

What's hot

Perl.Hacks.On.Vim Perlchina
Perl.Hacks.On.Vim PerlchinaPerl.Hacks.On.Vim Perlchina
Perl.Hacks.On.Vim PerlchinaLin Yo-An
 
Perl 5.10
Perl 5.10Perl 5.10
Perl 5.10acme
 
Compiled Python UDFs for Impala
Compiled Python UDFs for ImpalaCompiled Python UDFs for Impala
Compiled Python UDFs for ImpalaCloudera, Inc.
 
A Lifecycle Of Code Under Test by Robert Fornal
A Lifecycle Of Code Under Test by Robert FornalA Lifecycle Of Code Under Test by Robert Fornal
A Lifecycle Of Code Under Test by Robert FornalQA or the Highway
 
What's new in PHP 8.0?
What's new in PHP 8.0?What's new in PHP 8.0?
What's new in PHP 8.0?Nikita Popov
 
Simple ETL in Python 3.5+ - PolyConf Paris 2017 - Lightning Talk (10 minutes)
Simple ETL in Python 3.5+ - PolyConf Paris 2017 - Lightning Talk (10 minutes)Simple ETL in Python 3.5+ - PolyConf Paris 2017 - Lightning Talk (10 minutes)
Simple ETL in Python 3.5+ - PolyConf Paris 2017 - Lightning Talk (10 minutes)Romain Dorgueil
 
Nikita Popov "What’s new in PHP 8.0?"
Nikita Popov "What’s new in PHP 8.0?"Nikita Popov "What’s new in PHP 8.0?"
Nikita Popov "What’s new in PHP 8.0?"Fwdays
 
Perl.Hacks.On.Vim
Perl.Hacks.On.VimPerl.Hacks.On.Vim
Perl.Hacks.On.VimLin Yo-An
 
Oredev 2015 - Taming Java Agents
Oredev 2015 - Taming Java AgentsOredev 2015 - Taming Java Agents
Oredev 2015 - Taming Java AgentsAnton Arhipov
 
Perl.Hacks.On.Vim Perlchina
Perl.Hacks.On.Vim PerlchinaPerl.Hacks.On.Vim Perlchina
Perl.Hacks.On.Vim Perlchinaguestcf9240
 
Go for Object Oriented Programmers or Object Oriented Programming without Obj...
Go for Object Oriented Programmers or Object Oriented Programming without Obj...Go for Object Oriented Programmers or Object Oriented Programming without Obj...
Go for Object Oriented Programmers or Object Oriented Programming without Obj...Steven Francia
 
Alfresco the clojure way
Alfresco the clojure wayAlfresco the clojure way
Alfresco the clojure wayCarlo Sciolla
 
Oral presentation v2
Oral presentation v2Oral presentation v2
Oral presentation v2Yeqi He
 
InterConnect: Server Side Swift for Java Developers
InterConnect:  Server Side Swift for Java DevelopersInterConnect:  Server Side Swift for Java Developers
InterConnect: Server Side Swift for Java DevelopersChris Bailey
 
Python Coroutines, Present and Future
Python Coroutines, Present and FuturePython Coroutines, Present and Future
Python Coroutines, Present and Futureemptysquare
 
Typed Properties and more: What's coming in PHP 7.4?
Typed Properties and more: What's coming in PHP 7.4?Typed Properties and more: What's coming in PHP 7.4?
Typed Properties and more: What's coming in PHP 7.4?Nikita Popov
 
What's New in ES6 for Web Devs
What's New in ES6 for Web DevsWhat's New in ES6 for Web Devs
What's New in ES6 for Web DevsRami Sayar
 

What's hot (20)

Perl.Hacks.On.Vim Perlchina
Perl.Hacks.On.Vim PerlchinaPerl.Hacks.On.Vim Perlchina
Perl.Hacks.On.Vim Perlchina
 
Perl Moderno
Perl ModernoPerl Moderno
Perl Moderno
 
Perl 5.10
Perl 5.10Perl 5.10
Perl 5.10
 
Compiled Python UDFs for Impala
Compiled Python UDFs for ImpalaCompiled Python UDFs for Impala
Compiled Python UDFs for Impala
 
A Lifecycle Of Code Under Test by Robert Fornal
A Lifecycle Of Code Under Test by Robert FornalA Lifecycle Of Code Under Test by Robert Fornal
A Lifecycle Of Code Under Test by Robert Fornal
 
What's new in PHP 8.0?
What's new in PHP 8.0?What's new in PHP 8.0?
What's new in PHP 8.0?
 
Es.next
Es.nextEs.next
Es.next
 
Simple ETL in Python 3.5+ - PolyConf Paris 2017 - Lightning Talk (10 minutes)
Simple ETL in Python 3.5+ - PolyConf Paris 2017 - Lightning Talk (10 minutes)Simple ETL in Python 3.5+ - PolyConf Paris 2017 - Lightning Talk (10 minutes)
Simple ETL in Python 3.5+ - PolyConf Paris 2017 - Lightning Talk (10 minutes)
 
Nikita Popov "What’s new in PHP 8.0?"
Nikita Popov "What’s new in PHP 8.0?"Nikita Popov "What’s new in PHP 8.0?"
Nikita Popov "What’s new in PHP 8.0?"
 
Perl.Hacks.On.Vim
Perl.Hacks.On.VimPerl.Hacks.On.Vim
Perl.Hacks.On.Vim
 
Oredev 2015 - Taming Java Agents
Oredev 2015 - Taming Java AgentsOredev 2015 - Taming Java Agents
Oredev 2015 - Taming Java Agents
 
Perl.Hacks.On.Vim Perlchina
Perl.Hacks.On.Vim PerlchinaPerl.Hacks.On.Vim Perlchina
Perl.Hacks.On.Vim Perlchina
 
Go for Object Oriented Programmers or Object Oriented Programming without Obj...
Go for Object Oriented Programmers or Object Oriented Programming without Obj...Go for Object Oriented Programmers or Object Oriented Programming without Obj...
Go for Object Oriented Programmers or Object Oriented Programming without Obj...
 
Alfresco the clojure way
Alfresco the clojure wayAlfresco the clojure way
Alfresco the clojure way
 
Oral presentation v2
Oral presentation v2Oral presentation v2
Oral presentation v2
 
InterConnect: Server Side Swift for Java Developers
InterConnect:  Server Side Swift for Java DevelopersInterConnect:  Server Side Swift for Java Developers
InterConnect: Server Side Swift for Java Developers
 
Python Coroutines, Present and Future
Python Coroutines, Present and FuturePython Coroutines, Present and Future
Python Coroutines, Present and Future
 
Typed Properties and more: What's coming in PHP 7.4?
Typed Properties and more: What's coming in PHP 7.4?Typed Properties and more: What's coming in PHP 7.4?
Typed Properties and more: What's coming in PHP 7.4?
 
Modern JS with ES6
Modern JS with ES6Modern JS with ES6
Modern JS with ES6
 
What's New in ES6 for Web Devs
What's New in ES6 for Web DevsWhat's New in ES6 for Web Devs
What's New in ES6 for Web Devs
 

Similar to Building Interpreters with PyPy

Python - Getting to the Essence - Points.com - Dave Park
Python - Getting to the Essence - Points.com - Dave ParkPython - Getting to the Essence - Points.com - Dave Park
Python - Getting to the Essence - Points.com - Dave Parkpointstechgeeks
 
Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Guillaume Laforge
 
Programming Under Linux In Python
Programming Under Linux In PythonProgramming Under Linux In Python
Programming Under Linux In PythonMarwan Osman
 
Writing a compiler in go
Writing a compiler in goWriting a compiler in go
Writing a compiler in goYusuke Kita
 
JIP Pipeline System Introduction
JIP Pipeline System IntroductionJIP Pipeline System Introduction
JIP Pipeline System Introductionthasso23
 
C# 6 and 7 and Futures 20180607
C# 6 and 7 and Futures 20180607C# 6 and 7 and Futures 20180607
C# 6 and 7 and Futures 20180607Kevin Hazzard
 
RubyConf Portugal 2014 - Why ruby must go!
RubyConf Portugal 2014 - Why ruby must go!RubyConf Portugal 2014 - Why ruby must go!
RubyConf Portugal 2014 - Why ruby must go!Gautam Rege
 
A Recovering Java Developer Learns to Go
A Recovering Java Developer Learns to GoA Recovering Java Developer Learns to Go
A Recovering Java Developer Learns to GoMatt Stine
 
Python 3000
Python 3000Python 3000
Python 3000Bob Chao
 
An Overview Of Python With Functional Programming
An Overview Of Python With Functional ProgrammingAn Overview Of Python With Functional Programming
An Overview Of Python With Functional ProgrammingAdam Getchell
 
Making JavaScript Libraries More Approachable
Making JavaScript Libraries More ApproachableMaking JavaScript Libraries More Approachable
Making JavaScript Libraries More ApproachablePamela Fox
 
Object Orientation vs. Functional Programming in Python
Object Orientation vs. Functional Programming in PythonObject Orientation vs. Functional Programming in Python
Object Orientation vs. Functional Programming in PythonPython Ireland
 
Diving into HHVM Extensions (php[tek] 2016)
Diving into HHVM Extensions (php[tek] 2016)Diving into HHVM Extensions (php[tek] 2016)
Diving into HHVM Extensions (php[tek] 2016)James Titcumb
 
Diseño y Desarrollo de APIs
Diseño y Desarrollo de APIsDiseño y Desarrollo de APIs
Diseño y Desarrollo de APIsRaúl Neis
 
Extreme Swift
Extreme SwiftExtreme Swift
Extreme SwiftMovel
 
NetPonto - The Future Of C# - NetConf Edition
NetPonto - The Future Of C# - NetConf EditionNetPonto - The Future Of C# - NetConf Edition
NetPonto - The Future Of C# - NetConf EditionPaulo Morgado
 

Similar to Building Interpreters with PyPy (20)

Python - Getting to the Essence - Points.com - Dave Park
Python - Getting to the Essence - Points.com - Dave ParkPython - Getting to the Essence - Points.com - Dave Park
Python - Getting to the Essence - Points.com - Dave Park
 
Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008
 
Programming Under Linux In Python
Programming Under Linux In PythonProgramming Under Linux In Python
Programming Under Linux In Python
 
Writing a compiler in go
Writing a compiler in goWriting a compiler in go
Writing a compiler in go
 
An introduction to Ruby
An introduction to RubyAn introduction to Ruby
An introduction to Ruby
 
JIP Pipeline System Introduction
JIP Pipeline System IntroductionJIP Pipeline System Introduction
JIP Pipeline System Introduction
 
C# 6 and 7 and Futures 20180607
C# 6 and 7 and Futures 20180607C# 6 and 7 and Futures 20180607
C# 6 and 7 and Futures 20180607
 
RubyConf Portugal 2014 - Why ruby must go!
RubyConf Portugal 2014 - Why ruby must go!RubyConf Portugal 2014 - Why ruby must go!
RubyConf Portugal 2014 - Why ruby must go!
 
A Recovering Java Developer Learns to Go
A Recovering Java Developer Learns to GoA Recovering Java Developer Learns to Go
A Recovering Java Developer Learns to Go
 
Python 3000
Python 3000Python 3000
Python 3000
 
An Overview Of Python With Functional Programming
An Overview Of Python With Functional ProgrammingAn Overview Of Python With Functional Programming
An Overview Of Python With Functional Programming
 
Charming python
Charming pythonCharming python
Charming python
 
Making JavaScript Libraries More Approachable
Making JavaScript Libraries More ApproachableMaking JavaScript Libraries More Approachable
Making JavaScript Libraries More Approachable
 
Gore: Go REPL
Gore: Go REPLGore: Go REPL
Gore: Go REPL
 
Object Orientation vs. Functional Programming in Python
Object Orientation vs. Functional Programming in PythonObject Orientation vs. Functional Programming in Python
Object Orientation vs. Functional Programming in Python
 
Diving into HHVM Extensions (php[tek] 2016)
Diving into HHVM Extensions (php[tek] 2016)Diving into HHVM Extensions (php[tek] 2016)
Diving into HHVM Extensions (php[tek] 2016)
 
Diseño y Desarrollo de APIs
Diseño y Desarrollo de APIsDiseño y Desarrollo de APIs
Diseño y Desarrollo de APIs
 
Extreme Swift
Extreme SwiftExtreme Swift
Extreme Swift
 
effective_r27
effective_r27effective_r27
effective_r27
 
NetPonto - The Future Of C# - NetConf Edition
NetPonto - The Future Of C# - NetConf EditionNetPonto - The Future Of C# - NetConf Edition
NetPonto - The Future Of C# - NetConf Edition
 

Recently uploaded

Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 

Recently uploaded (20)

Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 

Building Interpreters with PyPy