SlideShare a Scribd company logo
IronSmalltalk
  August 24th 2011
   Todor Todorov
IronSmalltalk
  Smalltalk for the
 Microsoft .Net DLR
Agenda
•   History
•   Motivation and Background
•   Microsoft .Net DLR
•   Message Sends and CallSites
•   CallSite Binders
•   Expression Trees
•   Code Pipeline
•   Polymorphic Inline Caching
•   Conclusion
•   Extras / Bonus

24 August 2011        Todor Todorov   3 / 111
Smalltalk 1980
Smalltalk 1980
Smalltalk 1981
Smalltalk 2011
Smalltalk 2005
The World Today
The World Today
Smalltalking
 since 1998
  Todor Todorov
Business
Applications
Microsoft
.Net Platform
Costly vs. Free?
Commodity!
Goal
• X3J20 Compliant Smalltalk

• First Class Member of the
  DLR Family

• Easy interop. with .Net

• Decent Performance
Personal
Challenge
.NET DLR
.NET DLR
.NET DLR
Message Send
Message Send
Communication
Message Send

Transcript show:
   'Hello, Edinburgh!'.
Message Send
Transcript show: 'Hello, Edinburgh!'.

TranscriptStream >> show: anObject

self
       nextPutAll: anObject asString;
       endEntry.
Method Lookup
Transcript show: 'Hello, Edinburgh!'.

TranscriptStream >> show: anObject

self
       nextPutAll: anObject asString;
       endEntry.
Call Site
Transcript show: 'Hello, Edinburgh!'.

call1 := Message receiver: Transcript
     selector: #show:
     arguments: #('Hello, Edinb… ').
call1 evaluate.
Call Site
Transcript show: 'Hello, Edinburgh!'.

call1 := CallSite receiver: Transcript
     selector: #show:
     arguments: #('Hello, Edinb… ').
call1 evaluate.
Call Site
Transcript show: 'Hello, Edinburgh!'.

call1 := CallSite selector: #show:.

call1
   evaluateWithReceiver: Transcript
   andArgs: #('Hello, Edinburgh').
Call Site Binders
Transcript show: 'Hello, Edinburgh!'.

call1 := CallSite onBinder:
     (Binder selector: #show:).

call1
   evaluateWithReceiver: Transcript
   andArgs: #('Hello, Edinburgh').
Call Site Binders
Binder >> bindFor: aReceiver
     arguments: anArray

^BindingRule for:
    (aReceiver compiledMethodAt:
         #show).
Dynamic Objects
 Reflective Objects
Call Site Binders
Binder >> bindFor: aReceiver
     arguments: anArray

^BindingRule for:
    (aReceiver compiledMethodAt:
         #show).
Call Site Binders
Binder >> bindFor: aReceiver
     arguments: anArray

^aReceiver bindEvaluateFor: self
    arguments: anArray.
Call Site Binders
Object >> bindEvaluateFor: aBinder
     arguments: anArray

^BindingRule for:
    (self compiledMethodAt:
          aBinder selector).

    ” or return whatever it wants! ”
Call Site Binders
  … receiver can’t help us, then …

fallbackBindInvokeFor: aReceiver
     arguments: anArray

^BindingRule for:
    … some compiled method …
Expression Trees
Expression Trees
Abstract Semantic Tree
Expression Trees
Abstract Semantic Tree
Abstract Syntax Tree
Expression Trees
Abstract Semantic Tree
Abstract Syntax Tree
Expression trees model code
Expression Trees
Abstract Semantic Tree
Abstract Syntax Tree
Expression trees model code
Expressions are used to
represent the implementation
of certain code or logic
Expression Trees
signString

   ^self < 0
      ifTrue: [ 'Negative' ]
      ifFalse: [ 'Positive' ].
Expression Trees
signString

^Expression
   condition: (Expression
        lowerThan: self value: 0)
   true: 'Negative'
   false: 'Positive'.
Expression Trees
signString

selfArg := Expression parameter: 'self'.

^Expression
     condition: (Expression
           lowerThan: selfArg
           value: (Expression constant: 0))
     true: (Expression constant: 'Negative')
     false: (Expression constant: 'Positive').
Expression Trees
TranscriptStream>>show: anObject


self
       nextPutAll: anObject.
Expression Trees
self
       nextPutAll: anObject.

selfArg := Expression parameter: 'self'.
arg1 := Expression parameter: 'anObject'.

^Expression
     dynamic: (Binder selector: #nextPutAll:)
     receiver: selfArg
     arguments: (Array with: arg1).
Expression Trees
Binder >> bindFor: aReceiver
     arguments: anArray

^BindingRule for:
    (aReceiver compiledMethodAt:
         #nextPutAll).
Expression Trees
Binder >> bindFor: aReceiver
     arguments: anArray

^BindingRule expression: (Expression
      dynamic: (Binder selector: #nextPutAll:)
      receiver: aReceiver expression
      arguments: (Array
            with: anArray first expression).
Code Pipeline
Code Pipeline
Smalltalk Sources
Code Pipeline
Smalltalk Sources            Smalltalk
                               AST




          Smalltalk Parser
Code Pipeline
Smalltalk Sources            Smalltalk               Expression
                               AST                      Tree




                                    Smalltalk JIT-
          Smalltalk Parser
                                     Compiler
Code Pipeline
Smalltalk Sources            Smalltalk               Expression              MSIL
                               AST                      Tree               (Bytecode)




                                    Smalltalk JIT-            DLR / Linq
          Smalltalk Parser
                                     Compiler                 Compiler
Code Pipeline
Smalltalk Sources            Smalltalk               Expression              MSIL
                                                                                                     Machine Code
                               AST                      Tree               (Bytecode)




                                    Smalltalk JIT-            DLR / Linq               .NET CLR
          Smalltalk Parser
                                     Compiler                 Compiler              (JIT Compiler)
Polymorphic
Inline Caching
Caching
Transcript show: 'Hello, Edinburgh!'.

call1 := CallSite onBinder:
     (Binder selector: #show:).

call1
   evaluateWithReceiver: Transcript
   andArgs: #('Hello, Edinburgh').
Caching
Binder >> bindFor: aReceiver
       arguments: anArray

method := aReceiver value compiledMethodAt: #show:.

” … magic … to generate expression from method … ”

^BindingRule expression: (Expression
      dynamic: (Binder selector: #nextPutAll:)
      receiver: aReceiver expression
      arguments: (Array
             with: anArray first expression).
Caching
Transcript show: 'Hello, Edinburgh!'.

call1 := CallSite onBinder:
     (Binder selector: #show:).

call1
   evaluateWithReceiver: Transcript
   andArgs: #('Hello, Edinburgh').
Caching
Binder >> bindFor: aReceiver
       arguments: anArray

method := aReceiver value compiledMethodAt: #show:.

” … magic … to generate expression from method … ”


^BindingRule expression: ” … expression … ”
     restriction: [ :obj |
           obj class = TranscriptStream ].
Caching
Transcript show: 'Hello, Edinburgh!'.

call1 := CallSite onBinder:
     (Binder selector: #show:).

call1
   evaluateWithReceiver: Transcript
   andArgs: #('Hello, Edinburgh').
Restrictions
• Restrictions can be more complex
  •   For example, instance specific or object
      version specific
• Restrictions determine the
  polymorphism of objects

• Restrictions are the key to
  polymorphic inline caching!
The Cache
•   3 Levels of Caching:
•   Level 0 : Rule for last call
•   Level 1 : Last 10 rules
•   Level 2 : 100 rules, shares
    across similar call sites
.NET DLR
Common Vocabulary
• None Defined
• De-Facto, the .Net class library
• We aim at reusing the common
  classes
  – Example: System.Char => Character
• Not everything maps easily, but most
  do
  – Example: System.String ~= String
Demo
Summary
Components
                                     Hosting




                             Interchange Installer




IC Encoder        AST JIT Compiler                    DefinitionInstaller




                                                     Runtime
       Compiler                          Core                  IC JitCompiler




                                     Common
Hosting
Windows Process

  .Net AppDomain            .Net AppDomain

    DLR Script Scope          Smalltalk Runtime

      Smalltalk (Runtime)

                              Smalltalk Runtime
      Ruby / Python



    Smalltalk Runtime         DLR Script Scope
Specifics
Symbols
Strings
Smalltalk Process
#sender
#respondsTo:
Events
Object Space
No   Object Space Reflection
No   #allInstances
No   #allReferences
No   #become:



But #behaveLike: is possible!
Debugger inspection is possible.
Major Tech Companies
Good News
Unicode
Multi Threaded
Large Class Library
Web-Hostable
MIT License
Near Future
Generics
Class Library Importer
     (or auto-integration)
Finish Version 1.0
Write Tests (…)
Future
GUI Integration (WinForms + WPF)
SubSystems
(Interactive) Debugger
Visual Studio Integration
Mixins
SubSystems / Namespaces
Instance Specific Behavior
Questions




http://ironsmalltalk.codeplex.com/
   mailto:todor@scientia.dk
Callbacks
                        List showItems:
                             #( 'TT' 'ST' ).




Workspace >> evaluate
Smalltalk >> run
Callbacks
                        List >> showItems: anArray

                         “ AddItems(anArray, self) ”

                             <Windows API>



List >> showItems:
Workspace >> evaluate
Smalltalk >> run
Callbacks
                        List.AddItems(string[] keys,
                              dynamic stList)
                        {
                              for(i=0; i<…;i++)
                                    this.AddItem(
                                          keys[i],
List.AddItems()                            stList);
List >> showItems:      }
Workspace >> evaluate
Smalltalk >> run
Callbacks
                        List.AddItem(string[] keys,
                              dynamic stList)
                        {
                              string text = stList.
                                    .GetItemText(key);
List.AddItem()
List.AddItems()              ” …somehow add it… ”
List >> showItems:      }
Workspace >> evaluate
Smalltalk >> run
Callbacks
                        List >> getItemText:
                              aString

                             ^self itemTexts
List >> getItemText:               at: aString.
List.AddItem()
List.AddItems()
List >> showItems:
Workspace >> evaluate
Smalltalk >> run
Callbacks
                        .Net 4.0 has the dynamic
                        keyword used for invoking
                        method on dynamic objects.


List >> getItemText:    IronSmalltalk objects can
List.AddItem()
                        transparently be used by any
                        DLR aware language.
List.AddItems()
List >> showItems:
Workspace >> evaluate
Smalltalk >> run
Callbacks
                        Native Name: GetItemText

                        List >> getItemText:
                              aString
List >> getItemText:
List.AddItem()
List.AddItems()         The native name is the
List >> showItems:      method name (selector) that
Workspace >> evaluate
                        is exposed to the other DLR
                        languages.
Smalltalk >> run
Exceptions
                        [ Transcript show:
                             'Hello, Edinburgh!' ]
                             on: Error do: [ … ].




Workspace >> evaluate
Smalltalk >> run
Exceptions
                         BlockClosure >>
                              on: exception
                              do: handlerAction

                             ” Some magic … ”

BlockClosure >> on:do:
                             ^self value.
Workspace >> evaluate
Smalltalk >> run
Exceptions
                         BlockClosure >> value

                              < Primitive >




BlockClosure >> value
BlockClosure >> on:do:
Workspace >> evaluate
Smalltalk >> run
Exceptions
                            TranscriptStream >>
                                show: anObject

                            self
                                   nextPutAll:
TranscriptStream >> show:              anObject asString;
BlockClosure >> value                  endEntry.
BlockClosure >> on:do:
Workspace >> evaluate
Smalltalk >> run
Exceptions
                            String >> asString

                                 ^self.

String >> asString
TranscriptStream >> show:
BlockClosure >> value
BlockClosure >> on:do:
Workspace >> evaluate
Smalltalk >> run
Exceptions
                            TranscriptStream >>
                                show: anObject

                            self
                                   nextPutAll:
TranscriptStream >> show:             anObject asString;
BlockClosure >> value                 endEntry.
BlockClosure >> on:do:
Workspace >> evaluate
Smalltalk >> run
Exceptions
                                 TranscriptStream >>
                                     nextPutAll: aString

                                 ” … some code here … ”
TranscriptStream >>nextPutAll:
TranscriptStream >> show:
BlockClosure >> value
BlockClosure >> on:do:
Workspace >> evaluate
Smalltalk >> run
Exceptions
                            TranscriptStream >>
                                show: anObject

                            self
                                   nextPutAll:
TranscriptStream >> show:              anObject asString;
BlockClosure >> value                  endEntry.
BlockClosure >> on:do:
Workspace >> evaluate
Smalltalk >> run
Exceptions
                               TranscriptStream >>
                                   endEntry

                               ” … some code here … ”
TranscriptStream >> endEntry
TranscriptStream >> show:
BlockClosure >> value
BlockClosure >> on:do:
Workspace >> evaluate
Smalltalk >> run
Exceptions
                            TranscriptStream >>
                                show: anObject

                            self
                                   nextPutAll:
TranscriptStream >> show:              anObject asString;
BlockClosure >> value                  endEntry.
BlockClosure >> on:do:
Workspace >> evaluate
Smalltalk >> run
Exceptions
                         BlockClosure >> value

                              < Primitive >




BlockClosure >> value
BlockClosure >> on:do:
Workspace >> evaluate
Smalltalk >> run
Exceptions
                         BlockClosure >>
                              on: exception
                              do: handlerAction

                             ” Some magic … ”

BlockClosure >> on:do:
                             ^self value.
Workspace >> evaluate
Smalltalk >> run
Exceptions
                        Transcript show:
                             'Hello, Edinburgh!'.




Workspace >> evaluate
Smalltalk >> run
Exceptions
                                 TranscriptStream >>
                                     nextPutAll: aString

                                 ” Transcript Window cannot
TranscriptStream >>nextPutAll:   hold more text! ”
TranscriptStream >> show:
BlockClosure >> value
BlockClosure >> on:do:
Workspace >> evaluate
Smalltalk >> run
Exceptions
                                 TranscriptStream >>
                                     nextPutAll: aString

                                 ” Transcript Window cannot
TranscriptStream >>nextPutAll:   hold more text! ”
TranscriptStream >> show:
BlockClosure >> value



                                   FAIL !
BlockClosure >> on:do:
Workspace >> evaluate
Smalltalk >> run
Exceptions
                                 .Net Exceptions
                                 unwind the stack
TranscriptStream >>nextPutAll:   when thrown!
TranscriptStream >> show:
BlockClosure >> value
BlockClosure >> on:do:
Workspace >> evaluate
Smalltalk >> run
Exceptions
                                 Smalltalk expects
                                 resumable
TranscriptStream >>nextPutAll:   exceptions!
TranscriptStream >> show:
BlockClosure >> value
BlockClosure >> on:do:           Stack is gone!
Workspace >> evaluate
Smalltalk >> run
Exceptions
                                 Must keep stack!
Extra code here …
BlockClosure >> value
TranscriptStream >>nextPutAll:   Code executes as
TranscriptStream >> show:
BlockClosure >> value
                                 usually.
BlockClosure >> on:do:
Workspace >> evaluate
Smalltalk >> run
Exceptions
                                 Unwinding is
                                 executes as
TranscriptStream >>nextPutAll:
                                 usually.
TranscriptStream >> show:
BlockClosure >> value
BlockClosure >> on:do:
Workspace >> evaluate
Smalltalk >> run
Exceptions
                         List >> getItemText:
                               aString
List >> getItemText:
List.AddItem()                ^self itemTexts
List.AddItems()                     at: aString.
List >> showItems:
BlockClosure >> value
BlockClosure >> on:do:

Workspace >> evaluate
Smalltalk >> run
Exceptions
                         List >> getItemText:
                               aString
List >> getItemText:
List.AddItem()                ^self itemTexts
List.AddItems()                     at: aString.
List >> showItems:
BlockClosure >> value
BlockClosure >> on:do:
                          KEY IS MISSING
Workspace >> evaluate
Smalltalk >> run
Exceptions
                         List >> getItemText:
                               aString
List >> getItemText:
List.AddItem()                ^self itemTexts
List.AddItems()                     at: aString.
List >> showItems:
BlockClosure >> value
BlockClosure >> on:do:
                          KEY IS MISSING
Workspace >> evaluate
Smalltalk >> run
Exceptions
                         List >> getItemText:
                               aString
List >> getItemText:
List.AddItem()                ^self itemTexts
List.AddItems()                     at: aString.
List >> showItems:
BlockClosure >> value
BlockClosure >> on:do:
                          KEY IS MISSING
Workspace >> evaluate
Smalltalk >> run
Exceptions
List >> getItemText:
                         Exceptions must
List.AddItem()           integrate with the
try { … } catch { … }
                         rest of the .Net!
List.AddItems()
List >> showItems:
BlockClosure >> value
BlockClosure >> on:do:

Workspace >> evaluate
Smalltalk >> run
Exceptions
Non-Resumable exceptions can be
mapped to native .Net exceptions
Exceptions
Non-Resumable exceptions can be
mapped to native .Net exceptions

Resumable exceptions cannot be
mapped to native .Net exceptions
and will need a IronSmalltalk
special implementation.

More Related Content

What's hot

The Rust Programming Language: an Overview
The Rust Programming Language: an OverviewThe Rust Programming Language: an Overview
The Rust Programming Language: an OverviewRoberto Casadei
 
Swift and Kotlin Presentation
Swift and Kotlin PresentationSwift and Kotlin Presentation
Swift and Kotlin PresentationAndrzej Sitek
 
Kotlin boost yourproductivity
Kotlin boost yourproductivityKotlin boost yourproductivity
Kotlin boost yourproductivitynklmish
 
Kotlin Developer Starter in Android projects
Kotlin Developer Starter in Android projectsKotlin Developer Starter in Android projects
Kotlin Developer Starter in Android projectsBartosz Kosarzycki
 
Kotlin in action
Kotlin in actionKotlin in action
Kotlin in actionCiro Rizzo
 
Introduction to kotlin for android app development gdg ahmedabad dev fest 2017
Introduction to kotlin for android app development   gdg ahmedabad dev fest 2017Introduction to kotlin for android app development   gdg ahmedabad dev fest 2017
Introduction to kotlin for android app development gdg ahmedabad dev fest 2017Hardik Trivedi
 
Introduction to kotlin + spring boot demo
Introduction to kotlin + spring boot demoIntroduction to kotlin + spring boot demo
Introduction to kotlin + spring boot demoMuhammad Abdullah
 
Little Helpers for Android Development with Kotlin
Little Helpers for Android Development with KotlinLittle Helpers for Android Development with Kotlin
Little Helpers for Android Development with KotlinKai Koenig
 
How to write a TableGen backend
How to write a TableGen backendHow to write a TableGen backend
How to write a TableGen backendMin-Yih Hsu
 
ADG Poznań - Kotlin for Android developers
ADG Poznań - Kotlin for Android developersADG Poznań - Kotlin for Android developers
ADG Poznań - Kotlin for Android developersBartosz Kosarzycki
 
2017: Kotlin - now more than ever
2017: Kotlin - now more than ever2017: Kotlin - now more than ever
2017: Kotlin - now more than everKai Koenig
 
The Kotlin Programming Language, Svetlana Isakova
The Kotlin Programming Language, Svetlana IsakovaThe Kotlin Programming Language, Svetlana Isakova
The Kotlin Programming Language, Svetlana IsakovaVasil Remeniuk
 
Behavioral Reflection
Behavioral ReflectionBehavioral Reflection
Behavioral ReflectionMarcus Denker
 
An introduction to Rust: the modern programming language to develop safe and ...
An introduction to Rust: the modern programming language to develop safe and ...An introduction to Rust: the modern programming language to develop safe and ...
An introduction to Rust: the modern programming language to develop safe and ...Claudio Capobianco
 
The Kotlin Programming Language
The Kotlin Programming LanguageThe Kotlin Programming Language
The Kotlin Programming Languageintelliyole
 
Kotlin advanced - language reference for android developers
Kotlin advanced - language reference for android developersKotlin advanced - language reference for android developers
Kotlin advanced - language reference for android developersBartosz Kosarzycki
 
Kotlin for Android - Vali Iorgu - mRready
Kotlin for Android - Vali Iorgu - mRreadyKotlin for Android - Vali Iorgu - mRready
Kotlin for Android - Vali Iorgu - mRreadyMobileAcademy
 
Clean up your code with C#6
Clean up your code with C#6Clean up your code with C#6
Clean up your code with C#6Rui Carvalho
 

What's hot (20)

The Rust Programming Language: an Overview
The Rust Programming Language: an OverviewThe Rust Programming Language: an Overview
The Rust Programming Language: an Overview
 
The Joy Of Ruby
The Joy Of RubyThe Joy Of Ruby
The Joy Of Ruby
 
Swift and Kotlin Presentation
Swift and Kotlin PresentationSwift and Kotlin Presentation
Swift and Kotlin Presentation
 
Kotlin boost yourproductivity
Kotlin boost yourproductivityKotlin boost yourproductivity
Kotlin boost yourproductivity
 
Kotlin Developer Starter in Android projects
Kotlin Developer Starter in Android projectsKotlin Developer Starter in Android projects
Kotlin Developer Starter in Android projects
 
Kotlin in action
Kotlin in actionKotlin in action
Kotlin in action
 
Introduction to kotlin for android app development gdg ahmedabad dev fest 2017
Introduction to kotlin for android app development   gdg ahmedabad dev fest 2017Introduction to kotlin for android app development   gdg ahmedabad dev fest 2017
Introduction to kotlin for android app development gdg ahmedabad dev fest 2017
 
Introduction to kotlin + spring boot demo
Introduction to kotlin + spring boot demoIntroduction to kotlin + spring boot demo
Introduction to kotlin + spring boot demo
 
Little Helpers for Android Development with Kotlin
Little Helpers for Android Development with KotlinLittle Helpers for Android Development with Kotlin
Little Helpers for Android Development with Kotlin
 
How to write a TableGen backend
How to write a TableGen backendHow to write a TableGen backend
How to write a TableGen backend
 
ADG Poznań - Kotlin for Android developers
ADG Poznań - Kotlin for Android developersADG Poznań - Kotlin for Android developers
ADG Poznań - Kotlin for Android developers
 
2017: Kotlin - now more than ever
2017: Kotlin - now more than ever2017: Kotlin - now more than ever
2017: Kotlin - now more than ever
 
The Kotlin Programming Language, Svetlana Isakova
The Kotlin Programming Language, Svetlana IsakovaThe Kotlin Programming Language, Svetlana Isakova
The Kotlin Programming Language, Svetlana Isakova
 
Behavioral Reflection
Behavioral ReflectionBehavioral Reflection
Behavioral Reflection
 
Polyglot JVM
Polyglot JVMPolyglot JVM
Polyglot JVM
 
An introduction to Rust: the modern programming language to develop safe and ...
An introduction to Rust: the modern programming language to develop safe and ...An introduction to Rust: the modern programming language to develop safe and ...
An introduction to Rust: the modern programming language to develop safe and ...
 
The Kotlin Programming Language
The Kotlin Programming LanguageThe Kotlin Programming Language
The Kotlin Programming Language
 
Kotlin advanced - language reference for android developers
Kotlin advanced - language reference for android developersKotlin advanced - language reference for android developers
Kotlin advanced - language reference for android developers
 
Kotlin for Android - Vali Iorgu - mRready
Kotlin for Android - Vali Iorgu - mRreadyKotlin for Android - Vali Iorgu - mRready
Kotlin for Android - Vali Iorgu - mRready
 
Clean up your code with C#6
Clean up your code with C#6Clean up your code with C#6
Clean up your code with C#6
 

Viewers also liked

Native or External?
Native or External?Native or External?
Native or External?ESUG
 
Talents: Dynamically Composable Units of Reuse
Talents: Dynamically Composable Units of ReuseTalents: Dynamically Composable Units of Reuse
Talents: Dynamically Composable Units of ReuseESUG
 
Magritte Magic
Magritte MagicMagritte Magic
Magritte MagicESUG
 
Show Us: SS7 Update
Show Us: SS7 UpdateShow Us: SS7 Update
Show Us: SS7 UpdateESUG
 
DeltaImpact: Assessing semantic merge conflicts with Dependency Analysis
DeltaImpact: Assessing semantic merge conflicts with Dependency AnalysisDeltaImpact: Assessing semantic merge conflicts with Dependency Analysis
DeltaImpact: Assessing semantic merge conflicts with Dependency AnalysisESUG
 
Code Transformation by Direct Transformation of ASTs
Code Transformation by Direct Transformation of ASTsCode Transformation by Direct Transformation of ASTs
Code Transformation by Direct Transformation of ASTsESUG
 
Bloc: a Modern Core for Highly Dynamic Graphics
Bloc: a Modern Core for Highly Dynamic Graphics Bloc: a Modern Core for Highly Dynamic Graphics
Bloc: a Modern Core for Highly Dynamic Graphics ESUG
 
Sistemas de Telecomunicações - Aula 07 - Sistema Telefônico Fixo e Sistema Te...
Sistemas de Telecomunicações - Aula 07 - Sistema Telefônico Fixo e Sistema Te...Sistemas de Telecomunicações - Aula 07 - Sistema Telefônico Fixo e Sistema Te...
Sistemas de Telecomunicações - Aula 07 - Sistema Telefônico Fixo e Sistema Te...Leinylson Fontinele
 
Sistemas de Telecomunicações - Aula 06 - Estrutura da rede pública de Telecom...
Sistemas de Telecomunicações - Aula 06 - Estrutura da rede pública de Telecom...Sistemas de Telecomunicações - Aula 06 - Estrutura da rede pública de Telecom...
Sistemas de Telecomunicações - Aula 06 - Estrutura da rede pública de Telecom...Leinylson Fontinele
 

Viewers also liked (9)

Native or External?
Native or External?Native or External?
Native or External?
 
Talents: Dynamically Composable Units of Reuse
Talents: Dynamically Composable Units of ReuseTalents: Dynamically Composable Units of Reuse
Talents: Dynamically Composable Units of Reuse
 
Magritte Magic
Magritte MagicMagritte Magic
Magritte Magic
 
Show Us: SS7 Update
Show Us: SS7 UpdateShow Us: SS7 Update
Show Us: SS7 Update
 
DeltaImpact: Assessing semantic merge conflicts with Dependency Analysis
DeltaImpact: Assessing semantic merge conflicts with Dependency AnalysisDeltaImpact: Assessing semantic merge conflicts with Dependency Analysis
DeltaImpact: Assessing semantic merge conflicts with Dependency Analysis
 
Code Transformation by Direct Transformation of ASTs
Code Transformation by Direct Transformation of ASTsCode Transformation by Direct Transformation of ASTs
Code Transformation by Direct Transformation of ASTs
 
Bloc: a Modern Core for Highly Dynamic Graphics
Bloc: a Modern Core for Highly Dynamic Graphics Bloc: a Modern Core for Highly Dynamic Graphics
Bloc: a Modern Core for Highly Dynamic Graphics
 
Sistemas de Telecomunicações - Aula 07 - Sistema Telefônico Fixo e Sistema Te...
Sistemas de Telecomunicações - Aula 07 - Sistema Telefônico Fixo e Sistema Te...Sistemas de Telecomunicações - Aula 07 - Sistema Telefônico Fixo e Sistema Te...
Sistemas de Telecomunicações - Aula 07 - Sistema Telefônico Fixo e Sistema Te...
 
Sistemas de Telecomunicações - Aula 06 - Estrutura da rede pública de Telecom...
Sistemas de Telecomunicações - Aula 06 - Estrutura da rede pública de Telecom...Sistemas de Telecomunicações - Aula 06 - Estrutura da rede pública de Telecom...
Sistemas de Telecomunicações - Aula 06 - Estrutura da rede pública de Telecom...
 

Similar to IronSmalltalk

An Introduction to Twisted
An Introduction to TwistedAn Introduction to Twisted
An Introduction to Twistedsdsern
 
Ice mini guide
Ice mini guideIce mini guide
Ice mini guideAdy Liu
 
Type script - advanced usage and practices
Type script  - advanced usage and practicesType script  - advanced usage and practices
Type script - advanced usage and practicesIwan van der Kleijn
 
Using Smalltalk for controlling robotics systems
Using Smalltalk for controlling robotics systemsUsing Smalltalk for controlling robotics systems
Using Smalltalk for controlling robotics systemsSerge Stinckwich
 
Runtime Bytecode Transformation for Smalltalk
Runtime Bytecode Transformation for SmalltalkRuntime Bytecode Transformation for Smalltalk
Runtime Bytecode Transformation for SmalltalkMarcus Denker
 
Bringing nullability into existing code - dammit is not the answer.pptx
Bringing nullability into existing code - dammit is not the answer.pptxBringing nullability into existing code - dammit is not the answer.pptx
Bringing nullability into existing code - dammit is not the answer.pptxMaarten Balliauw
 
Unmanaged Parallelization via P/Invoke
Unmanaged Parallelization via P/InvokeUnmanaged Parallelization via P/Invoke
Unmanaged Parallelization via P/InvokeDmitri Nesteruk
 
Denker - Pharo: Present and Future - 2009-07-14
Denker - Pharo: Present and Future - 2009-07-14Denker - Pharo: Present and Future - 2009-07-14
Denker - Pharo: Present and Future - 2009-07-14CHOOSE
 
Iron Languages - NYC CodeCamp 2/19/2011
Iron Languages - NYC CodeCamp 2/19/2011Iron Languages - NYC CodeCamp 2/19/2011
Iron Languages - NYC CodeCamp 2/19/2011Jimmy Schementi
 
Runtime Bytecode Transformation for Smalltalk
Runtime Bytecode Transformation for SmalltalkRuntime Bytecode Transformation for Smalltalk
Runtime Bytecode Transformation for SmalltalkESUG
 
Talk: The Present and Future of Pharo
Talk: The Present and Future of PharoTalk: The Present and Future of Pharo
Talk: The Present and Future of PharoMarcus Denker
 
PDC Video on C# 4.0 Futures
PDC Video on C# 4.0 FuturesPDC Video on C# 4.0 Futures
PDC Video on C# 4.0 Futuresnithinmohantk
 
Smalltalk in a .NET World
Smalltalk in a  .NET WorldSmalltalk in a  .NET World
Smalltalk in a .NET WorldESUG
 
07 140430-ipp-languages used in llvm during compilation
07 140430-ipp-languages used in llvm during compilation07 140430-ipp-languages used in llvm during compilation
07 140430-ipp-languages used in llvm during compilationAdam Husár
 
Windows 8 für .net Entwickler
Windows 8 für .net EntwicklerWindows 8 für .net Entwickler
Windows 8 für .net EntwicklerPatric Boscolo
 
Embedding Languages Without Breaking Tools
Embedding Languages Without Breaking ToolsEmbedding Languages Without Breaking Tools
Embedding Languages Without Breaking ToolsLukas Renggli
 

Similar to IronSmalltalk (20)

Opal compiler
Opal compilerOpal compiler
Opal compiler
 
An Introduction to Twisted
An Introduction to TwistedAn Introduction to Twisted
An Introduction to Twisted
 
Ice mini guide
Ice mini guideIce mini guide
Ice mini guide
 
Type script - advanced usage and practices
Type script  - advanced usage and practicesType script  - advanced usage and practices
Type script - advanced usage and practices
 
Using Smalltalk for controlling robotics systems
Using Smalltalk for controlling robotics systemsUsing Smalltalk for controlling robotics systems
Using Smalltalk for controlling robotics systems
 
Runtime Bytecode Transformation for Smalltalk
Runtime Bytecode Transformation for SmalltalkRuntime Bytecode Transformation for Smalltalk
Runtime Bytecode Transformation for Smalltalk
 
Bringing nullability into existing code - dammit is not the answer.pptx
Bringing nullability into existing code - dammit is not the answer.pptxBringing nullability into existing code - dammit is not the answer.pptx
Bringing nullability into existing code - dammit is not the answer.pptx
 
Unmanaged Parallelization via P/Invoke
Unmanaged Parallelization via P/InvokeUnmanaged Parallelization via P/Invoke
Unmanaged Parallelization via P/Invoke
 
Solr @ Etsy - Apache Lucene Eurocon
Solr @ Etsy - Apache Lucene EuroconSolr @ Etsy - Apache Lucene Eurocon
Solr @ Etsy - Apache Lucene Eurocon
 
Denker - Pharo: Present and Future - 2009-07-14
Denker - Pharo: Present and Future - 2009-07-14Denker - Pharo: Present and Future - 2009-07-14
Denker - Pharo: Present and Future - 2009-07-14
 
Iron Languages - NYC CodeCamp 2/19/2011
Iron Languages - NYC CodeCamp 2/19/2011Iron Languages - NYC CodeCamp 2/19/2011
Iron Languages - NYC CodeCamp 2/19/2011
 
OOPSLA Talk on Preon
OOPSLA Talk on PreonOOPSLA Talk on Preon
OOPSLA Talk on Preon
 
Runtime Bytecode Transformation for Smalltalk
Runtime Bytecode Transformation for SmalltalkRuntime Bytecode Transformation for Smalltalk
Runtime Bytecode Transformation for Smalltalk
 
Talk: The Present and Future of Pharo
Talk: The Present and Future of PharoTalk: The Present and Future of Pharo
Talk: The Present and Future of Pharo
 
PDC Video on C# 4.0 Futures
PDC Video on C# 4.0 FuturesPDC Video on C# 4.0 Futures
PDC Video on C# 4.0 Futures
 
Smalltalk in a .NET World
Smalltalk in a  .NET WorldSmalltalk in a  .NET World
Smalltalk in a .NET World
 
07 140430-ipp-languages used in llvm during compilation
07 140430-ipp-languages used in llvm during compilation07 140430-ipp-languages used in llvm during compilation
07 140430-ipp-languages used in llvm during compilation
 
Windows 8 für .net Entwickler
Windows 8 für .net EntwicklerWindows 8 für .net Entwickler
Windows 8 für .net Entwickler
 
Embedding Languages Without Breaking Tools
Embedding Languages Without Breaking ToolsEmbedding Languages Without Breaking Tools
Embedding Languages Without Breaking Tools
 
Lambdas puzzler - Peter Lawrey
Lambdas puzzler - Peter LawreyLambdas puzzler - Peter Lawrey
Lambdas puzzler - Peter Lawrey
 

More from ESUG

Workshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programmingWorkshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programmingESUG
 
Technical documentation support in Pharo
Technical documentation support in PharoTechnical documentation support in Pharo
Technical documentation support in PharoESUG
 
The Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and RoadmapThe Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and RoadmapESUG
 
Sequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in PharoSequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in PharoESUG
 
Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...ESUG
 
Analyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early resultsAnalyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early resultsESUG
 
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6ESUG
 
A Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test GenerationA Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test GenerationESUG
 
Creating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic ProgrammingCreating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic ProgrammingESUG
 
Threaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution ModesThreaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution ModesESUG
 
Exploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience ReportExploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience ReportESUG
 
Pharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIsPharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIsESUG
 
Garbage Collector Tuning
Garbage Collector TuningGarbage Collector Tuning
Garbage Collector TuningESUG
 
Improving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame CaseImproving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame CaseESUG
 
Pharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and FuturePharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and FutureESUG
 
thisContext in the Debugger
thisContext in the DebuggerthisContext in the Debugger
thisContext in the DebuggerESUG
 
Websockets for Fencing Score
Websockets for Fencing ScoreWebsockets for Fencing Score
Websockets for Fencing ScoreESUG
 
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScriptShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScriptESUG
 
Advanced Object- Oriented Design Mooc
Advanced Object- Oriented Design MoocAdvanced Object- Oriented Design Mooc
Advanced Object- Oriented Design MoocESUG
 
A New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and TransformationsA New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and TransformationsESUG
 

More from ESUG (20)

Workshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programmingWorkshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programming
 
Technical documentation support in Pharo
Technical documentation support in PharoTechnical documentation support in Pharo
Technical documentation support in Pharo
 
The Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and RoadmapThe Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and Roadmap
 
Sequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in PharoSequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in Pharo
 
Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...
 
Analyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early resultsAnalyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early results
 
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
 
A Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test GenerationA Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test Generation
 
Creating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic ProgrammingCreating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic Programming
 
Threaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution ModesThreaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution Modes
 
Exploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience ReportExploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience Report
 
Pharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIsPharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIs
 
Garbage Collector Tuning
Garbage Collector TuningGarbage Collector Tuning
Garbage Collector Tuning
 
Improving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame CaseImproving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame Case
 
Pharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and FuturePharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and Future
 
thisContext in the Debugger
thisContext in the DebuggerthisContext in the Debugger
thisContext in the Debugger
 
Websockets for Fencing Score
Websockets for Fencing ScoreWebsockets for Fencing Score
Websockets for Fencing Score
 
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScriptShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
 
Advanced Object- Oriented Design Mooc
Advanced Object- Oriented Design MoocAdvanced Object- Oriented Design Mooc
Advanced Object- Oriented Design Mooc
 
A New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and TransformationsA New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and Transformations
 

Recently uploaded

De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...Product School
 
UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3DianaGray10
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...Product School
 
Unpacking Value Delivery - Agile Oxford Meetup - May 2024.pptx
Unpacking Value Delivery - Agile Oxford Meetup - May 2024.pptxUnpacking Value Delivery - Agile Oxford Meetup - May 2024.pptx
Unpacking Value Delivery - Agile Oxford Meetup - May 2024.pptxDavid Michel
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...Elena Simperl
 
IoT Analytics Company Presentation May 2024
IoT Analytics Company Presentation May 2024IoT Analytics Company Presentation May 2024
IoT Analytics Company Presentation May 2024IoTAnalytics
 
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...Product School
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...BookNet Canada
 
UiPath Test Automation using UiPath Test Suite series, part 1
UiPath Test Automation using UiPath Test Suite series, part 1UiPath Test Automation using UiPath Test Suite series, part 1
UiPath Test Automation using UiPath Test Suite series, part 1DianaGray10
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsPaul Groth
 
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptxIOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptxAbida Shariff
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Thierry Lestable
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Jeffrey Haguewood
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaRTTS
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...Product School
 
ODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User GroupODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User GroupCatarinaPereira64715
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualityInflectra
 
Search and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical FuturesSearch and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical FuturesBhaskar Mitra
 

Recently uploaded (20)

De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
 
UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
 
Unpacking Value Delivery - Agile Oxford Meetup - May 2024.pptx
Unpacking Value Delivery - Agile Oxford Meetup - May 2024.pptxUnpacking Value Delivery - Agile Oxford Meetup - May 2024.pptx
Unpacking Value Delivery - Agile Oxford Meetup - May 2024.pptx
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
 
IoT Analytics Company Presentation May 2024
IoT Analytics Company Presentation May 2024IoT Analytics Company Presentation May 2024
IoT Analytics Company Presentation May 2024
 
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
 
UiPath Test Automation using UiPath Test Suite series, part 1
UiPath Test Automation using UiPath Test Suite series, part 1UiPath Test Automation using UiPath Test Suite series, part 1
UiPath Test Automation using UiPath Test Suite series, part 1
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
 
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptxIOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
 
ODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User GroupODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User Group
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
 
Search and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical FuturesSearch and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical Futures
 

IronSmalltalk

  • 1. IronSmalltalk August 24th 2011 Todor Todorov
  • 2. IronSmalltalk Smalltalk for the Microsoft .Net DLR
  • 3. Agenda • History • Motivation and Background • Microsoft .Net DLR • Message Sends and CallSites • CallSite Binders • Expression Trees • Code Pipeline • Polymorphic Inline Caching • Conclusion • Extras / Bonus 24 August 2011 Todor Todorov 3 / 111
  • 4.
  • 12.
  • 13. Smalltalking since 1998 Todor Todorov
  • 18. Goal • X3J20 Compliant Smalltalk • First Class Member of the DLR Family • Easy interop. with .Net • Decent Performance
  • 20.
  • 21.
  • 27. Message Send Transcript show: 'Hello, Edinburgh!'.
  • 28. Message Send Transcript show: 'Hello, Edinburgh!'. TranscriptStream >> show: anObject self nextPutAll: anObject asString; endEntry.
  • 29. Method Lookup Transcript show: 'Hello, Edinburgh!'. TranscriptStream >> show: anObject self nextPutAll: anObject asString; endEntry.
  • 30. Call Site Transcript show: 'Hello, Edinburgh!'. call1 := Message receiver: Transcript selector: #show: arguments: #('Hello, Edinb… '). call1 evaluate.
  • 31. Call Site Transcript show: 'Hello, Edinburgh!'. call1 := CallSite receiver: Transcript selector: #show: arguments: #('Hello, Edinb… '). call1 evaluate.
  • 32. Call Site Transcript show: 'Hello, Edinburgh!'. call1 := CallSite selector: #show:. call1 evaluateWithReceiver: Transcript andArgs: #('Hello, Edinburgh').
  • 33. Call Site Binders Transcript show: 'Hello, Edinburgh!'. call1 := CallSite onBinder: (Binder selector: #show:). call1 evaluateWithReceiver: Transcript andArgs: #('Hello, Edinburgh').
  • 34. Call Site Binders Binder >> bindFor: aReceiver arguments: anArray ^BindingRule for: (aReceiver compiledMethodAt: #show).
  • 36. Call Site Binders Binder >> bindFor: aReceiver arguments: anArray ^BindingRule for: (aReceiver compiledMethodAt: #show).
  • 37. Call Site Binders Binder >> bindFor: aReceiver arguments: anArray ^aReceiver bindEvaluateFor: self arguments: anArray.
  • 38. Call Site Binders Object >> bindEvaluateFor: aBinder arguments: anArray ^BindingRule for: (self compiledMethodAt: aBinder selector). ” or return whatever it wants! ”
  • 39. Call Site Binders … receiver can’t help us, then … fallbackBindInvokeFor: aReceiver arguments: anArray ^BindingRule for: … some compiled method …
  • 42. Expression Trees Abstract Semantic Tree Abstract Syntax Tree
  • 43. Expression Trees Abstract Semantic Tree Abstract Syntax Tree Expression trees model code
  • 44. Expression Trees Abstract Semantic Tree Abstract Syntax Tree Expression trees model code Expressions are used to represent the implementation of certain code or logic
  • 45. Expression Trees signString ^self < 0 ifTrue: [ 'Negative' ] ifFalse: [ 'Positive' ].
  • 46. Expression Trees signString ^Expression condition: (Expression lowerThan: self value: 0) true: 'Negative' false: 'Positive'.
  • 47. Expression Trees signString selfArg := Expression parameter: 'self'. ^Expression condition: (Expression lowerThan: selfArg value: (Expression constant: 0)) true: (Expression constant: 'Negative') false: (Expression constant: 'Positive').
  • 49. Expression Trees self nextPutAll: anObject. selfArg := Expression parameter: 'self'. arg1 := Expression parameter: 'anObject'. ^Expression dynamic: (Binder selector: #nextPutAll:) receiver: selfArg arguments: (Array with: arg1).
  • 50. Expression Trees Binder >> bindFor: aReceiver arguments: anArray ^BindingRule for: (aReceiver compiledMethodAt: #nextPutAll).
  • 51. Expression Trees Binder >> bindFor: aReceiver arguments: anArray ^BindingRule expression: (Expression dynamic: (Binder selector: #nextPutAll:) receiver: aReceiver expression arguments: (Array with: anArray first expression).
  • 54. Code Pipeline Smalltalk Sources Smalltalk AST Smalltalk Parser
  • 55. Code Pipeline Smalltalk Sources Smalltalk Expression AST Tree Smalltalk JIT- Smalltalk Parser Compiler
  • 56. Code Pipeline Smalltalk Sources Smalltalk Expression MSIL AST Tree (Bytecode) Smalltalk JIT- DLR / Linq Smalltalk Parser Compiler Compiler
  • 57. Code Pipeline Smalltalk Sources Smalltalk Expression MSIL Machine Code AST Tree (Bytecode) Smalltalk JIT- DLR / Linq .NET CLR Smalltalk Parser Compiler Compiler (JIT Compiler)
  • 59. Caching Transcript show: 'Hello, Edinburgh!'. call1 := CallSite onBinder: (Binder selector: #show:). call1 evaluateWithReceiver: Transcript andArgs: #('Hello, Edinburgh').
  • 60. Caching Binder >> bindFor: aReceiver arguments: anArray method := aReceiver value compiledMethodAt: #show:. ” … magic … to generate expression from method … ” ^BindingRule expression: (Expression dynamic: (Binder selector: #nextPutAll:) receiver: aReceiver expression arguments: (Array with: anArray first expression).
  • 61. Caching Transcript show: 'Hello, Edinburgh!'. call1 := CallSite onBinder: (Binder selector: #show:). call1 evaluateWithReceiver: Transcript andArgs: #('Hello, Edinburgh').
  • 62. Caching Binder >> bindFor: aReceiver arguments: anArray method := aReceiver value compiledMethodAt: #show:. ” … magic … to generate expression from method … ” ^BindingRule expression: ” … expression … ” restriction: [ :obj | obj class = TranscriptStream ].
  • 63. Caching Transcript show: 'Hello, Edinburgh!'. call1 := CallSite onBinder: (Binder selector: #show:). call1 evaluateWithReceiver: Transcript andArgs: #('Hello, Edinburgh').
  • 64. Restrictions • Restrictions can be more complex • For example, instance specific or object version specific • Restrictions determine the polymorphism of objects • Restrictions are the key to polymorphic inline caching!
  • 65. The Cache • 3 Levels of Caching: • Level 0 : Rule for last call • Level 1 : Last 10 rules • Level 2 : 100 rules, shares across similar call sites
  • 67.
  • 68. Common Vocabulary • None Defined • De-Facto, the .Net class library • We aim at reusing the common classes – Example: System.Char => Character • Not everything maps easily, but most do – Example: System.String ~= String
  • 69. Demo
  • 71. Components Hosting Interchange Installer IC Encoder AST JIT Compiler DefinitionInstaller Runtime Compiler Core IC JitCompiler Common
  • 72. Hosting Windows Process .Net AppDomain .Net AppDomain DLR Script Scope Smalltalk Runtime Smalltalk (Runtime) Smalltalk Runtime Ruby / Python Smalltalk Runtime DLR Script Scope
  • 74. Object Space No Object Space Reflection No #allInstances No #allReferences No #become: But #behaveLike: is possible! Debugger inspection is possible.
  • 76. Good News Unicode Multi Threaded Large Class Library Web-Hostable MIT License
  • 77. Near Future Generics Class Library Importer (or auto-integration) Finish Version 1.0 Write Tests (…)
  • 78. Future GUI Integration (WinForms + WPF) SubSystems (Interactive) Debugger Visual Studio Integration Mixins SubSystems / Namespaces Instance Specific Behavior
  • 80. Callbacks List showItems: #( 'TT' 'ST' ). Workspace >> evaluate Smalltalk >> run
  • 81. Callbacks List >> showItems: anArray “ AddItems(anArray, self) ” <Windows API> List >> showItems: Workspace >> evaluate Smalltalk >> run
  • 82. Callbacks List.AddItems(string[] keys, dynamic stList) { for(i=0; i<…;i++) this.AddItem( keys[i], List.AddItems() stList); List >> showItems: } Workspace >> evaluate Smalltalk >> run
  • 83. Callbacks List.AddItem(string[] keys, dynamic stList) { string text = stList. .GetItemText(key); List.AddItem() List.AddItems() ” …somehow add it… ” List >> showItems: } Workspace >> evaluate Smalltalk >> run
  • 84. Callbacks List >> getItemText: aString ^self itemTexts List >> getItemText: at: aString. List.AddItem() List.AddItems() List >> showItems: Workspace >> evaluate Smalltalk >> run
  • 85. Callbacks .Net 4.0 has the dynamic keyword used for invoking method on dynamic objects. List >> getItemText: IronSmalltalk objects can List.AddItem() transparently be used by any DLR aware language. List.AddItems() List >> showItems: Workspace >> evaluate Smalltalk >> run
  • 86. Callbacks Native Name: GetItemText List >> getItemText: aString List >> getItemText: List.AddItem() List.AddItems() The native name is the List >> showItems: method name (selector) that Workspace >> evaluate is exposed to the other DLR languages. Smalltalk >> run
  • 87. Exceptions [ Transcript show: 'Hello, Edinburgh!' ] on: Error do: [ … ]. Workspace >> evaluate Smalltalk >> run
  • 88. Exceptions BlockClosure >> on: exception do: handlerAction ” Some magic … ” BlockClosure >> on:do: ^self value. Workspace >> evaluate Smalltalk >> run
  • 89. Exceptions BlockClosure >> value < Primitive > BlockClosure >> value BlockClosure >> on:do: Workspace >> evaluate Smalltalk >> run
  • 90. Exceptions TranscriptStream >> show: anObject self nextPutAll: TranscriptStream >> show: anObject asString; BlockClosure >> value endEntry. BlockClosure >> on:do: Workspace >> evaluate Smalltalk >> run
  • 91. Exceptions String >> asString ^self. String >> asString TranscriptStream >> show: BlockClosure >> value BlockClosure >> on:do: Workspace >> evaluate Smalltalk >> run
  • 92. Exceptions TranscriptStream >> show: anObject self nextPutAll: TranscriptStream >> show: anObject asString; BlockClosure >> value endEntry. BlockClosure >> on:do: Workspace >> evaluate Smalltalk >> run
  • 93. Exceptions TranscriptStream >> nextPutAll: aString ” … some code here … ” TranscriptStream >>nextPutAll: TranscriptStream >> show: BlockClosure >> value BlockClosure >> on:do: Workspace >> evaluate Smalltalk >> run
  • 94. Exceptions TranscriptStream >> show: anObject self nextPutAll: TranscriptStream >> show: anObject asString; BlockClosure >> value endEntry. BlockClosure >> on:do: Workspace >> evaluate Smalltalk >> run
  • 95. Exceptions TranscriptStream >> endEntry ” … some code here … ” TranscriptStream >> endEntry TranscriptStream >> show: BlockClosure >> value BlockClosure >> on:do: Workspace >> evaluate Smalltalk >> run
  • 96. Exceptions TranscriptStream >> show: anObject self nextPutAll: TranscriptStream >> show: anObject asString; BlockClosure >> value endEntry. BlockClosure >> on:do: Workspace >> evaluate Smalltalk >> run
  • 97. Exceptions BlockClosure >> value < Primitive > BlockClosure >> value BlockClosure >> on:do: Workspace >> evaluate Smalltalk >> run
  • 98. Exceptions BlockClosure >> on: exception do: handlerAction ” Some magic … ” BlockClosure >> on:do: ^self value. Workspace >> evaluate Smalltalk >> run
  • 99. Exceptions Transcript show: 'Hello, Edinburgh!'. Workspace >> evaluate Smalltalk >> run
  • 100. Exceptions TranscriptStream >> nextPutAll: aString ” Transcript Window cannot TranscriptStream >>nextPutAll: hold more text! ” TranscriptStream >> show: BlockClosure >> value BlockClosure >> on:do: Workspace >> evaluate Smalltalk >> run
  • 101. Exceptions TranscriptStream >> nextPutAll: aString ” Transcript Window cannot TranscriptStream >>nextPutAll: hold more text! ” TranscriptStream >> show: BlockClosure >> value FAIL ! BlockClosure >> on:do: Workspace >> evaluate Smalltalk >> run
  • 102. Exceptions .Net Exceptions unwind the stack TranscriptStream >>nextPutAll: when thrown! TranscriptStream >> show: BlockClosure >> value BlockClosure >> on:do: Workspace >> evaluate Smalltalk >> run
  • 103. Exceptions Smalltalk expects resumable TranscriptStream >>nextPutAll: exceptions! TranscriptStream >> show: BlockClosure >> value BlockClosure >> on:do: Stack is gone! Workspace >> evaluate Smalltalk >> run
  • 104. Exceptions Must keep stack! Extra code here … BlockClosure >> value TranscriptStream >>nextPutAll: Code executes as TranscriptStream >> show: BlockClosure >> value usually. BlockClosure >> on:do: Workspace >> evaluate Smalltalk >> run
  • 105. Exceptions Unwinding is executes as TranscriptStream >>nextPutAll: usually. TranscriptStream >> show: BlockClosure >> value BlockClosure >> on:do: Workspace >> evaluate Smalltalk >> run
  • 106. Exceptions List >> getItemText: aString List >> getItemText: List.AddItem() ^self itemTexts List.AddItems() at: aString. List >> showItems: BlockClosure >> value BlockClosure >> on:do: Workspace >> evaluate Smalltalk >> run
  • 107. Exceptions List >> getItemText: aString List >> getItemText: List.AddItem() ^self itemTexts List.AddItems() at: aString. List >> showItems: BlockClosure >> value BlockClosure >> on:do: KEY IS MISSING Workspace >> evaluate Smalltalk >> run
  • 108. Exceptions List >> getItemText: aString List >> getItemText: List.AddItem() ^self itemTexts List.AddItems() at: aString. List >> showItems: BlockClosure >> value BlockClosure >> on:do: KEY IS MISSING Workspace >> evaluate Smalltalk >> run
  • 109. Exceptions List >> getItemText: aString List >> getItemText: List.AddItem() ^self itemTexts List.AddItems() at: aString. List >> showItems: BlockClosure >> value BlockClosure >> on:do: KEY IS MISSING Workspace >> evaluate Smalltalk >> run
  • 110. Exceptions List >> getItemText: Exceptions must List.AddItem() integrate with the try { … } catch { … } rest of the .Net! List.AddItems() List >> showItems: BlockClosure >> value BlockClosure >> on:do: Workspace >> evaluate Smalltalk >> run
  • 111. Exceptions Non-Resumable exceptions can be mapped to native .Net exceptions
  • 112. Exceptions Non-Resumable exceptions can be mapped to native .Net exceptions Resumable exceptions cannot be mapped to native .Net exceptions and will need a IronSmalltalk special implementation.