Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Smalltalk On Rubinius
Search
Konstantin Haase
September 17, 2011
Technology
55
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Smalltalk On Rubinius
Konstantin Haase
September 17, 2011
More Decks by Konstantin Haase
See All by Konstantin Haase
RubyConf Philippines 2017: Magenta is a Lie
rkh
0
250
How We Replaced Salary Negotiations with a Sinatra App
rkh
17
4.4k
HTTP (RubyMonsters Edition)
rkh
5
1.3k
GCRC 2015: Abstract Thoughts on Abstract Things
rkh
1
410
Frozen Rails: Magenta - The Art Of Abstraction
rkh
3
360
RedDotRubyConf 2014: Magenta is a Lie - and other tales of abstraction
rkh
0
1k
Ancient City Ruby: Hack me, if you can!
rkh
2
490
Boston I/O: Continuous Integration
rkh
3
350
Steel City Ruby: Architecting Chaos
rkh
4
1k
Other Decks in Technology
See All in Technology
スマートロックを支えるFlutter × ネイティブ連携の実践 / Flutter and Native Integration in Practice: Powering Smart Locks
bitkey
PRO
0
120
Claude Codeから見る、エンジニアの世界の変容とその先
oikon48
7
4.9k
ドメインエキスパートは いかにして AI を使って プロダクト開発をするか
tatsuyashiraishi
1
240
reInvent2026stby LT00 "Change your life!"
shinichirokawano
1
490
Flutter Widget Previewerで始めるUIプレビューとVRTの自動化
sakusaku3939
0
180
Vue.jsのGitHubから学ぶ意思決定
yut0naga1_fa
1
350
You Have Agency(サンキュー、Ruby)
snoozer05
PRO
4
620
AI時代のエンジニアの情報発信〜個人の発信を組織の力に変える〜
ryo_kawamata
0
5.5k
kintoneで在庫管理システムを作るときの要件定義・設計ポイント
kai0707
0
190
【Oracle AI SPOTLIGHT ウェビナー】事例から見る!なぜOCIが選ばれたのか ― AI時代のクラウド戦略を紐解く ―
oracle4engineer
PRO
1
140
デザインレビューは自動化できるのか?─ Flutter × Figma で UI 品質保証を考える
techiro
2
670
Vibe-to-Spec開発_実践ガイド
happysamurai294
0
130
Featured
See All Featured
How GitHub (no longer) Works
holman
316
150k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Making the Leap to Tech Lead
cromwellryan
135
10k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
47k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
330
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
320
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
600
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.7k
Odyssey Design
rkendrick25
PRO
2
900
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Faster Mobile Websites
deanohume
310
32k
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