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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Konstantin Haase
September 17, 2011
Technology
1
51
Smalltalk On Rubinius
Konstantin Haase
September 17, 2011
Tweet
Share
More Decks by Konstantin Haase
See All by Konstantin Haase
RubyConf Philippines 2017: Magenta is a Lie
rkh
0
220
How We Replaced Salary Negotiations with a Sinatra App
rkh
17
4.3k
HTTP (RubyMonsters Edition)
rkh
5
1.2k
GCRC 2015: Abstract Thoughts on Abstract Things
rkh
1
380
Frozen Rails: Magenta - The Art Of Abstraction
rkh
3
330
RedDotRubyConf 2014: Magenta is a Lie - and other tales of abstraction
rkh
0
970
Ancient City Ruby: Hack me, if you can!
rkh
2
450
Boston I/O: Continuous Integration
rkh
3
330
Steel City Ruby: Architecting Chaos
rkh
4
960
Other Decks in Technology
See All in Technology
Microsoft “Adaptive Cloud” Update 2026年3月版
sdosamut
0
100
SLI/SLO 導入で 避けるべきこと3選
yagikota
0
130
内製AIチャットボットで学んだDatadog LLM Observability活用術
mkdev10
0
140
身体を持ったパーソナルAIエージェントの 可能性を探る開発
yokomachi
1
130
ソフトバンク流!プラットフォームエンジニアリング実現へのアプローチ
sbtechnight
1
220
Kiroで見直す開発プロセスとAI-DLC
k_adachi_01
0
100
新規事業×QAの挑戦:不確実性を乗りこなす!フェーズごとに求められるQAの役割変革
hacomono
PRO
0
120
アーキテクチャモダナイゼーションを実現する組織
satohjohn
1
1.1k
"作る"から"使われる"へ:Backstage 活用の現在地
sbtechnight
0
220
頼れる Agentic AI を支える Datadog のオブザーバビリティ / Powering Reliable Agentic AI with Datadog Observability
aoto
PRO
0
230
visionOS 開発向けの MCP / Skills をつくり続けることで XR の探究と学習を最大化
karad
1
1.1k
Copilot 宇宙へ 〜生成AIで「専門データの壁」を壊す方法〜
nakasho
0
120
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
55
8k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
790
Testing 201, or: Great Expectations
jmmastey
46
8.1k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.2k
ラッコキーワード サービス紹介資料
rakko
1
2.7M
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
62
52k
Art, The Web, and Tiny UX
lynnandtonic
304
21k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
1
1.4k
Darren the Foodie - Storyboard
khoart
PRO
3
2.9k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.6k
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