Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Smalltalk on Rubinius
Search
gogaruco
September 27, 2011
66
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Smalltalk on Rubinius
by Konstantin Haase
gogaruco
September 27, 2011
More Decks by gogaruco
See All by gogaruco
Wesley Beary at GoGaRuCo 2011
gogaruco
2
65
CouchDB & Ruby - You're doing it wrong
gogaruco
5
300
Ruby Javascript and the Mobile Web
gogaruco
1
87
KidsRuby: Think of the Children
gogaruco
1
170
Writing your own Programming Language to Understand Ruby better
gogaruco
3
96
Go for the Rubyist
gogaruco
3
260
Fast Rails Tests
gogaruco
1
170
Featured
See All Featured
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
300
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
220
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
210
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
210
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.8k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.9k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Designing for Timeless Needs
cassininazir
1
260
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.7k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Transcript
Smalltalk On Rubinius Konstantin Haase
None
None
None
None
None
None
None
None
Why implement Smalltalk on Rubinius?
Why create a programming language?
Why create?
"When you don't create things, you become defined by your
tastes rather than ability. Your tastes only narrow and exclude people. So create." why the lucky stiff
Why a programming language?
About programming languages: "I don’t like any of them, and
I don’t think any of them are suitable for the real programming problems of today, whether for systems or for end-users" Alan Kay
Problem Oriented Programming Languages Cairo (~120k SLOC in C) rewritten
in less than 400 lines
Why Smalltalk?
Why Rubinius?
None
1 + 1 1 + 1
this is it this.is.it
GoGaRuCo rock: #hard GoGaRuCo.rock :hard
doc convertFrom: #xml to: #yaml doc.convert(:xml, :ruby)
doc convertFrom: #xml to: #yaml doc.convert from: :xml, to: :ruby
[ 42 ] proc { 42 }
anArray do: [ :each | each doSomething ] an_array.each do
|element| element.do_something end
Textmate version = 2 ifTrue: [ 'no way' ] ifFalse:
[ 'thought so' ] if Textmate.version == 2 "no way" else "thought so" end
Storage current store: #foo; store: #bar storage = Storage.current storage.store
:foo storage.store :bar
Smalltalk claims to look like: 'English'. Judge yourself. Does it.
Ruby.claims.to.look. like "English" Judge.yourself; Does.it?
Reak github.com/rkh/Reak Like Squeak but with R File based (as
opposed to image based)
None
The Rubinius Compiler Pure Ruby Modular and Flexible lib/compiler
None
Parsing with KPeg github.com/evanphx/kpeg
" from Reak.AST.Self " grammar: g [ ^ g str:
'self' ] # from Reak::AST::Return def bootstrap_grammar(g) g.seq "^", :sp, g.t(:expression) end
Rubinius Bytecode
$ rbx compile -B -e 'puts "Hello World"' 0000: push_self
0001: push_literal "Hello World" 0003: allow_private 0004: send_stack :puts, 1
$ rbx compile -B -e 'puts "Hello World"' 0000: push_self
0001: push_literal "Hello World" 0003: allow_private 0004: send_stack :puts, 1
$ rbx compile -B -e 'puts "Hello World"' 0000: push_self
0001: push_literal "Hello World" 0003: allow_private 0004: send_stack :puts, 1
$ rbx compile -B -e 'puts "Hello World"' 0000: push_self
0001: push_literal "Hello World" 0003: allow_private 0004: send_stack :puts, 1
$ rbx compile -B -e 'puts "Hello World"' 0000: push_self
0001: push_literal "Hello World" 0003: allow_private 0004: send_stack :puts, 1
class Object dynamic_method(:display) do |g| g.push_self g.push_local(0) # first argument
g.send(:puts, 1, true) g.ret end end display "Hello World"
Reusing the Rubinius tool chain
None
class Reak::Compiler < Rubinius::Compiler class Parser < Stage stage :parser
next_stage Generator end end
class CustomNode < Reak::AST::Base def self.bootstrap_grammar(g) # grammar definition end
def bytecode(g) # bytecode definition end end
class ConstantAccess < Rubinius::AST::ConstantAccess include Reak::AST::Node Reak::AST::Primary.push self def self.bootstrap_grammar(g)
g.t /[A-Z][a-zA-Z0-9_]*/ end # no bytecode definition necessary end
Rubinius.AST.TrueLiteral subclass: #TrueLiteral [ Reak.AST.Primary push: self. self include: Reak.AST.Node.
self class >> grammar: g [ ^ g str: 'true' ]. ]
" Remember cascades? " g pushSelf; pushLocal: 0; send: #puts
args: 1 private: true; ret.
Reak.AST.Base subclass: #Cascade [ Reak.AST.Expression push: self. bytecode: g [
g pushSelf. cascadedSends do: [:send | g dup. send bytecode: g. g pop ]. lastSend bytecode: g. ] ]
Thanks! github.com / rkh / presentations