SlideShare a Scribd company logo
1 of 34
Download to read offline
a JIT Smalltalk VM
        written in itself




 Javier Burroni        gera
                      (richie)
ESUG 2009 – JIT Security


                                       @1: 7F647D:   push EBP
test: arg                                  7F647E:   mov EBP, ESP
 ^self with: 0 with: inst with: arg        7F6480:   push EAX
                                           7F6481:   mov ESI, EAX
                                           ...
                                       @2:7F6492:    push 1             ;   PushSmallInteger0
   1   <13>   PushSmallInteger0            7F6497:   push [ESI]         ;   PushInstance1
                                           7F6499:   push [EBP+8]       ;   PushArgument1
   2   <8C>   PushInstance1                7F649C:   mov EAX, ESI       ;   LoadSelf
   3   <55>   PushArgument1                7F649E:   call 740207        ;   SendSelector1
   4   <0A>   LoadSelf                     7F64A3:   mov ESP, EBP       ;   Return
   5   <E2>   SendSelector1                7F64A5:   pop EBP
                                           7F64A6:   mov ESI, [EBP-4]
   6   <48>   Return                       7F64A9:   ret 4 NEAR



  BytecodeNativizerPushR              Assembler >> #pushR
   assembler pushR                     self assembleByte: 16r50 " push eax "
Closure Bug (6-Aug-2010)
testThomasMuhrNestedBlocks
  | abcdef |
  abcdef := [| var1 |
    var1 := 'AB'.
    [| var2 |                                                  BOOM!
      var2 := 'CD'.
      [| var3 |
        var3 := 'EF'.
        [var1 , var2 , var3] value] value] value] value.
  self assert: abcdef = 'ABCDEF'

                          Fix #1 (7-Aug-2010)
        IndirectEscapeBytecode >> #assemble
          type := self nextByte.
          argument := type  4 = 0
            ifTrue: [self nextIndex
                          nextIndex]        nextIndex + 1
            ifFalse: [type  4 + 3].

          type < 5 ifTrue: [^self loadEnvironmentTemporaryIndirect].
          type < 9 ifTrue: [^self pushEnvironmentTemporaryIndirect].
          ^self storeEnvironmentTemporaryIndirect
Closure Bug (6-Aug-2010)
testThomasMuhrNestedBlocks
  | abcdef |
  abcdef := [| var1 |
    var1 := 'AB'.
    [| var2 |                                              BOOM!
      var2 := 'CD'.
      [| var3 |
        var3 := 'EF'.
        [var1 , var2 , var3] value] value] value] value.
  self assert: abcdef = 'ABCDEF'

                          Fix #3 (9-Aug-2010)
         loc_1000ACFA:
         push    esi
         call    JIT_getNextIndex
         mov     edi, [esp+10h+aBytecodeNativizer]
         add     esp, 4
         dec     eax                     nop
         mov     [edi+4], eax
         jmp     short loc_1000AD29
Closure Bug (6-Aug-2010)
testThomasMuhrNestedBlocks
  | abcdef |
  abcdef := [| var1 |
    var1 := 'AB'.
    [| var2 |                                                  BOOM!
      var2 := 'CD'.
      [| var3 |
        var3 := 'EF'.
        [var1 , var2 , var3] value] value] value] value.
  self assert: abcdef = 'ABCDEF'

                          Fix #2 (9-Aug-2010)
         putCode: code
         min: min
         max: max
         range: idx
           (idx >= min and: [idx <= max])
             ifTrue: [self putNext: code - max + idx - 1]
             ifFalse: [
               self putNext: code.
               self putIndex: idx
                               idx]                  Idx + 1
Smalltalks 2009 – code freezer
GenerationalGCBuilder >> #populateInternals
(nativizer := BigNativizer new)
    addAllMethodsFor: GCSpace;
    addAllMethodsFor: ObjectGenerationalGC;
    at: #isSmallInteger default: Object >> #isSmallInteger;
    at: #isSmallInteger add: SmallInteger;
    at: #bitXor: add: SmallInteger;
    at: #between:and: add: SmallInteger;
    at: #_generation default: ExtensionBytecode class >> #_generation;
    at: #_commit: _primitive: ExtensionBytecode >> #_commit;
    ...
Frozen Code: “Lookup”




Object >> #isNil                      UndefinedObject >> #isNil
    self class == Object                 self class == UndefinedObject




          IfFalse: [                            IfFalse: [
               ^self lookupAndSend]                  ^self lookupAndSend]


^false                                ^true
Frozen Code: “Lookup”
nativizer
    at: #isNil addAll: (Array with: Object with: UndefinedObject)




  Object >> #isNil                          UndefinedObject >> #isNil
      self class == Object                     self class == UndefinedObject




                                                       IfFalse: [
                                                            ^self lookupAndSend]


 ^false                                    ^true
Frozen Code: “Lookup”
nativizer
    at: #isNil addAll: (Array with: Object with: UndefinedObject);
    at: #isNil default: Object >> #isNil




  Object >> #isNil                          UndefinedObject >> #isNil
      self class == Object                     self class == UndefinedObject




                                                                ^false


 ^false                                    ^true
Frozen Code: “Lookup”
    nativizer
        at: #isNil addAll: (Array with: Object with: UndefinedObject);
        at: #isNil default: Object >> #isNil;
        at: #isNil add: SmallInteger


self _isSmallInteger
                                        ^false


      Object >> #isNil                           UndefinedObject >> #isNil
          self class == Object                      self class == UndefinedObject




                                                                    ^false


     ^false                                      ^true
New Goal


Smalltalk VM
New Goal


Smalltalk VM
  Written in Smalltalk
New Goal


Smalltalk VM
  Written in Smalltalk
     Compatible with Digitalk's (VS)
New Goal


Smalltalk VM
  Written in Smalltalk
     Compatible with Digitalk's (VS)
         Leveraging the environment
Smalltalk VM

Written in Smalltalk
 .exe generation
Method lookup
Object format
Memory management
 Object creation / copy
 GC
 Become
Primitives
FFI
Processes
Callbacks
etc
PE (.exe) generation
PEFile
                                 _commit: newSize
                                  assembler
 directories




                imports
                                    loadArgFromContext: index;
                exports             convertArgToNative;
                                    pushArg;
               relocations
                                    convertToNative;
                                    pushR;
                  code              pushConstant: 4;
                                    pushConstant: 4096;
 sections




                exports             pushArg;
                                    pushR;
                imports             callTo: 'VirtualAlloc' from: 'KERNEL32.DLL';
                                    convertToSmalltalk
                  code



nativizer
  addAllMethodsFor:
     (Array with: GenerationalGC with: GenerationalGC class with: GCSpace);
  at: #_commit: _primitive: ExtensionBytecode >> #_commit
GCSpace
Object subclass: #GCSpace             old
 InstanceVariableNames: '
   contents
   base
   nextFree                            A
   commitLimit                          flip spaces
   reservedLimit '
 classVariableNames: ''                B
 poolDictionaries: ''



 includes: anObject
   ^anObject isSmallInteger not
      and: [anObject _oop between: self base and: self commitedLimit]


  reset
    self nextFree: self base
GCSpace
                                              old includes: anObject
Object subclass: #GCSpace             old
 InstanceVariableNames: '                     to reset
   contents
   base                                       from isReferredBy: object
   nextFree                            A
   commitLimit                                old growTo: newLimit
   reservedLimit '
 classVariableNames: ''                B      moved := to shallowCopy: object
 poolDictionaries: ''
                                              from flipWith: to


 includes: anObject
   ^anObject isSmallInteger not
      and: [anObject _oop between: self base and: self commitedLimit]


  reset
    self nextFree: self base
GenerationalGC
Object subclass: #GenerationalGC   old
 InstanceVariableNames: '
   old from to
   roots literalsReferences        from
   weakContainers ephemerons
   rescuedEphemerons '
 classVariableNames: ''
 poolDictionaries: ''               to



   collect
     self
       followRoots;
       walkStack;
       rescueEphemerons;
       traverseWeakContainers;
       flipSpaces
GenerationalGC
                                          flipper purgeRoots
Object subclass: #GenerationalGC   old
 InstanceVariableNames: '                 flipper follow: object
   old from to
   roots literalsReferences               flipper moveToOldOrTo: object
                                   from
   weakContainers ephemerons
   rescuedEphemerons '                    flipper
 classVariableNames: ''                      fixReferencesOrSetTombstone:
 poolDictionaries: ''               to       weakContainer

                                          flipper addInterrupt

   collect
     self
       followRoots;
       walkStack;
       rescueEphemerons;
       traverseWeakContainers;
       flipSpaces
GenerationalGC
                                        collect
GenerationalGC old     from    to         self
                                            followRoots;
                                            walkStack;

   follow: object
     | size |
     size := 0.
     object _isBytes ifFalse: [
       object _hasWeaks
         ifTrue: [self addWeakOrEphemeron: object]
         ifFalse: [size := object _size]].
     self follow: object count: 1 + size startingAt: 0
GenerationalGC
                                        collect
GenerationalGC old     from    to         self
                                            followRoots;
                                            walkStack;


    follow: objects count: size startingAt: base
      | index |
      index := base - 1.
      size timesRepeat: [| object |
        index := index + 1.
        object := objects _basicAt: index.
        (fromSpace includes: object) ifTrue: [
          object _isProxy
            ifTrue: [objects _basicAt: index put: object _proxee]
            ifFalse: [| moved |
              moved := self moveToOldOrTo: object.
              objects _basicAt: index put: moved.
              self follow: moved]]
GenerationalGC
                                        collect
GenerationalGC old     from    to         self
                                            followRoots;
                                            walkStack;


    follow: objects count: size startingAt: base
      | index |
      index := base - 1.
      size timesRepeat: [| object |
        index := index + 1.
        object := objects _basicAt: index.
        (fromSpace includes: object) ifTrue: [
          object _isProxy
            ifTrue: [objects _basicAt: index put: object _proxee]
            ifFalse: [| moved |
              moved := self moveToOldOrTo: object.
              objects _basicAt: index put: moved.
              self follow: moved]]]
GenerationalGC
                                        collect
GenerationalGC old     from    to         self
                                            traverseWeakContainers

   traverseWeakContainers
   weakContainers
       do: [:weakContainer |
            self fixReferencesOrSetTombstone: weakContainer]
   self reset: weakContainers

   fixReferencesOrSetTombstone: weakContainer
     | size |
     size := weakContainer _size.
     1 to: size do: [:index | | instance |
       instance := weakContainer _basicAt: index.
       (instance isSmallInteger not and: [fromSpace includes: instance])
         ifTrue: [| referenceOrThombstone |
           referenceOrThombstone := instance _isProxy
             ifTrue: [instance _proxee]
             ifFalse: [residueObject].
           weakContainer _basicAt: index put: referenceOrThombstone]]
GenerationalGC
                                     collect
GenerationalGC old   from    to        self
                                         rescueEphemerons


  rescueEphemerons
    | unknowns rescan |
    unknowns := self localStack.
    rescan := false.
    [ephemerons isEmpty] whileFalse: [
      rescan := self followEphemeronsCollectingIn: unknowns.
      rescan
        ifTrue: [ephemerons addAll: unknowns]
        IfFalse: [
          unknowns do: [:ephemeron | self rescueEphemeron: ephemeron]].
      self reset: unknowns]




    [Hayes1997] Barry Hayes, Ephemerons: a new finalization mechanism
GenerationalGC
                                    collect
GenerationalGC old     from   to      self
                                        flipSpaces

  flipSpaces
     fromSpace flipWith: toSpace.
     toSpace reset.



   GCSpace >> flipWith: space
    | aux |

     aux := space base.
     space base: self base.
     self base: aux.
     ...
GenerationalGC
                                     collect
GenerationalGC old    from    to       self
                                         flipSpaces




          A                                  B

          nextFree := base + size            nextFree := base



                                    copy
               contents A                         contents B
GenerationalGC
                                 collect
GenerationalGC old   from   to     self
                                     flipSpaces




           A                             B




               contents A                     contents B
GenerationalGC
                                  collect
GenerationalGC old   from   to      self
                                      flipSpaces




           A                              B




               contents A                      contents B




               VM assumption: from.commitLimit < to.base
GenerationalGC: testing
                                               collect
GenerationalGC old        from      to           self
                                                   followRoots

    testFollowObject
      | flipper from array string byteArray root flipSize currentSize |
      flipper := self defaultFlipper.
      from := flipper fromSpace.
      array := from shallowCopy: (Array new: 3).
      string := from shallowCopy: 'a String' copy.
      from shallowCopy: 'leaked' copy.
      byteArray := from shallowCopy: #[1 2 3] copy.
      array
         at: 1 put: 1;
         at: 2 put: string;
         at: 3 put: byteArray.
      root := Array with: array.
      string := byteArray := array := nil.
      flipper addRoot: root; followRoots.
      flipSize := flipper toSpace nextFree - flipper toSpace base.
      currentSize := flipper fromSpace nextFree - flipper fromSpace base.
      self
         assert: flipSize < currentSize;
         assert: currentSize - flipSize = (8 + ('leaked' size roundTo: 4))
GenerationalGC: testing
testFollowObject
  | flipper from array string byteArray root flipSize currentSize |
  flipper := self defaultFlipper.
  from := flipper fromSpace.
  array := from shallowCopy: (Array new: 3).
  string := from shallowCopy: 'a String' copy.
  from shallowCopy: 'leaked' copy.
  byteArray := from shallowCopy: #[1 2 3] copy.


testFollowObject
  | flipper from array string byteArray root flipSize currentSize |
  flipper := self defaultFlipper.
  self
     execute: [:from |
       array := from shallowCopy: (Array new: 3).
       string := from shallowCopy: 'a String' copy.
       from shallowCopy: 'leaked' copy.
       byteArray := from shallowCopy: #[1 2 3] copy]
     proxying: flipper fromSpace.
a demo




VMBuilder installGenerational
What now?

Release OpenSource
 Education!!!

Closure for JIT

Memory Management
 Mark & Sweep
 new
 become:

Method Lookup (strategies)

etc.
¡gracias!

More Related Content

What's hot

Ten useful JavaScript tips & best practices
Ten useful JavaScript tips & best practicesTen useful JavaScript tips & best practices
Ten useful JavaScript tips & best practicesAnkit Rastogi
 
Annotation processing and code gen
Annotation processing and code genAnnotation processing and code gen
Annotation processing and code genkoji lin
 
Understanding Asynchronous JavaScript
Understanding Asynchronous JavaScriptUnderstanding Asynchronous JavaScript
Understanding Asynchronous JavaScriptjnewmanux
 
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Domenic Denicola
 
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
 
Ian 20150116 java script oop
Ian 20150116 java script oopIan 20150116 java script oop
Ian 20150116 java script oopLearningTech
 
#살아있다 #자프링외길12년차 #코프링2개월생존기
#살아있다 #자프링외길12년차 #코프링2개월생존기#살아있다 #자프링외길12년차 #코프링2개월생존기
#살아있다 #자프링외길12년차 #코프링2개월생존기Arawn Park
 
Node Boot Camp
Node Boot CampNode Boot Camp
Node Boot CampTroy Miles
 
Groovy and Grails in Action - Devoxx 2008 - University - Guillaume Laforge
Groovy and Grails in Action - Devoxx 2008 - University - Guillaume LaforgeGroovy and Grails in Action - Devoxx 2008 - University - Guillaume Laforge
Groovy and Grails in Action - Devoxx 2008 - University - Guillaume LaforgeGuillaume Laforge
 
Http4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web StackHttp4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web StackGaryCoady
 
Functional Programming with Groovy
Functional Programming with GroovyFunctional Programming with Groovy
Functional Programming with GroovyArturo Herrero
 
descriptive programming
descriptive programmingdescriptive programming
descriptive programmingAnand Dhana
 
Diving into HHVM Extensions (PHPNW Conference 2015)
Diving into HHVM Extensions (PHPNW Conference 2015)Diving into HHVM Extensions (PHPNW Conference 2015)
Diving into HHVM Extensions (PHPNW Conference 2015)James Titcumb
 
Arduino、Web 到 IoT
Arduino、Web 到 IoTArduino、Web 到 IoT
Arduino、Web 到 IoTJustin Lin
 
C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴명신 김
 
Node Architecture and Getting Started with Express
Node Architecture and Getting Started with ExpressNode Architecture and Getting Started with Express
Node Architecture and Getting Started with Expressjguerrero999
 

What's hot (20)

Dlr
DlrDlr
Dlr
 
Java Script Best Practices
Java Script Best PracticesJava Script Best Practices
Java Script Best Practices
 
Ten useful JavaScript tips & best practices
Ten useful JavaScript tips & best practicesTen useful JavaScript tips & best practices
Ten useful JavaScript tips & best practices
 
Annotation processing and code gen
Annotation processing and code genAnnotation processing and code gen
Annotation processing and code gen
 
Polyglot JVM
Polyglot JVMPolyglot JVM
Polyglot JVM
 
Understanding Asynchronous JavaScript
Understanding Asynchronous JavaScriptUnderstanding Asynchronous JavaScript
Understanding Asynchronous JavaScript
 
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
 
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
 
Ian 20150116 java script oop
Ian 20150116 java script oopIan 20150116 java script oop
Ian 20150116 java script oop
 
#살아있다 #자프링외길12년차 #코프링2개월생존기
#살아있다 #자프링외길12년차 #코프링2개월생존기#살아있다 #자프링외길12년차 #코프링2개월생존기
#살아있다 #자프링외길12년차 #코프링2개월생존기
 
Node Boot Camp
Node Boot CampNode Boot Camp
Node Boot Camp
 
Groovy and Grails in Action - Devoxx 2008 - University - Guillaume Laforge
Groovy and Grails in Action - Devoxx 2008 - University - Guillaume LaforgeGroovy and Grails in Action - Devoxx 2008 - University - Guillaume Laforge
Groovy and Grails in Action - Devoxx 2008 - University - Guillaume Laforge
 
Bottom Up
Bottom UpBottom Up
Bottom Up
 
Http4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web StackHttp4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web Stack
 
Functional Programming with Groovy
Functional Programming with GroovyFunctional Programming with Groovy
Functional Programming with Groovy
 
descriptive programming
descriptive programmingdescriptive programming
descriptive programming
 
Diving into HHVM Extensions (PHPNW Conference 2015)
Diving into HHVM Extensions (PHPNW Conference 2015)Diving into HHVM Extensions (PHPNW Conference 2015)
Diving into HHVM Extensions (PHPNW Conference 2015)
 
Arduino、Web 到 IoT
Arduino、Web 到 IoTArduino、Web 到 IoT
Arduino、Web 到 IoT
 
C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴
 
Node Architecture and Getting Started with Express
Node Architecture and Getting Started with ExpressNode Architecture and Getting Started with Express
Node Architecture and Getting Started with Express
 

Viewers also liked

From Legacy Database to Domain Layer Using a New Cincom VisualWorks Tool
From Legacy Database to Domain Layer Using a New Cincom VisualWorks ToolFrom Legacy Database to Domain Layer Using a New Cincom VisualWorks Tool
From Legacy Database to Domain Layer Using a New Cincom VisualWorks ToolESUG
 
A Weak Pharo Story
A Weak Pharo StoryA Weak Pharo Story
A Weak Pharo StoryESUG
 
GemStone/64 product update and road map
GemStone/64 product update and road mapGemStone/64 product update and road map
GemStone/64 product update and road mapESUG
 
How To Do Almost Smalltalking To Develop iOs Apps
How To Do Almost Smalltalking To Develop iOs AppsHow To Do Almost Smalltalking To Develop iOs Apps
How To Do Almost Smalltalking To Develop iOs AppsESUG
 
Smalltalk on the JVM
Smalltalk on the JVMSmalltalk on the JVM
Smalltalk on the JVMESUG
 
Project planning
Project planningProject planning
Project planningESUG
 
Retrobjects - Fun with C64 and NES
Retrobjects - Fun with C64 and NESRetrobjects - Fun with C64 and NES
Retrobjects - Fun with C64 and NESESUG
 
How to Build a High-Performance VM for Squeak/Smalltalk in Your Spare Time: A...
How to Build a High-Performance VM for Squeak/Smalltalk in Your Spare Time: A...How to Build a High-Performance VM for Squeak/Smalltalk in Your Spare Time: A...
How to Build a High-Performance VM for Squeak/Smalltalk in Your Spare Time: A...ESUG
 
CommunityExplorer: A Framework for Visualizing Collaboration Networks
CommunityExplorer: A Framework for Visualizing Collaboration NetworksCommunityExplorer: A Framework for Visualizing Collaboration Networks
CommunityExplorer: A Framework for Visualizing Collaboration NetworksESUG
 
Intro to GemStone/S
Intro to GemStone/SIntro to GemStone/S
Intro to GemStone/SESUG
 
Sista: Improving Cog’s JIT performance
Sista: Improving Cog’s JIT performanceSista: Improving Cog’s JIT performance
Sista: Improving Cog’s JIT performanceESUG
 
Explicit Composition Constructs in DSLs - The case of the epidemiological lan...
Explicit Composition Constructs in DSLs - The case of the epidemiological lan...Explicit Composition Constructs in DSLs - The case of the epidemiological lan...
Explicit Composition Constructs in DSLs - The case of the epidemiological lan...ESUG
 
You Can’t Do That With Smalltalk!
You Can’t Do That With Smalltalk!You Can’t Do That With Smalltalk!
You Can’t Do That With Smalltalk!ESUG
 
seamless – Object Oriented CMS System
seamless – Object Oriented CMS Systemseamless – Object Oriented CMS System
seamless – Object Oriented CMS SystemESUG
 
Smalltalk Metaprogramming supports Probabilistic Program Analysis
Smalltalk Metaprogramming supports Probabilistic Program AnalysisSmalltalk Metaprogramming supports Probabilistic Program Analysis
Smalltalk Metaprogramming supports Probabilistic Program AnalysisESUG
 
Pillar: one language for all supports
Pillar: one language for all supportsPillar: one language for all supports
Pillar: one language for all supportsESUG
 
Talking about bugs with bugs
Talking about bugs with bugsTalking about bugs with bugs
Talking about bugs with bugsESUG
 
More XP-rience
More XP-rienceMore XP-rience
More XP-rienceESUG
 
The Glamorous Toolkit: Towards a novel live IDE
The Glamorous Toolkit: Towards a novel live IDEThe Glamorous Toolkit: Towards a novel live IDE
The Glamorous Toolkit: Towards a novel live IDEESUG
 
Pharo Update
Pharo Update Pharo Update
Pharo Update ESUG
 

Viewers also liked (20)

From Legacy Database to Domain Layer Using a New Cincom VisualWorks Tool
From Legacy Database to Domain Layer Using a New Cincom VisualWorks ToolFrom Legacy Database to Domain Layer Using a New Cincom VisualWorks Tool
From Legacy Database to Domain Layer Using a New Cincom VisualWorks Tool
 
A Weak Pharo Story
A Weak Pharo StoryA Weak Pharo Story
A Weak Pharo Story
 
GemStone/64 product update and road map
GemStone/64 product update and road mapGemStone/64 product update and road map
GemStone/64 product update and road map
 
How To Do Almost Smalltalking To Develop iOs Apps
How To Do Almost Smalltalking To Develop iOs AppsHow To Do Almost Smalltalking To Develop iOs Apps
How To Do Almost Smalltalking To Develop iOs Apps
 
Smalltalk on the JVM
Smalltalk on the JVMSmalltalk on the JVM
Smalltalk on the JVM
 
Project planning
Project planningProject planning
Project planning
 
Retrobjects - Fun with C64 and NES
Retrobjects - Fun with C64 and NESRetrobjects - Fun with C64 and NES
Retrobjects - Fun with C64 and NES
 
How to Build a High-Performance VM for Squeak/Smalltalk in Your Spare Time: A...
How to Build a High-Performance VM for Squeak/Smalltalk in Your Spare Time: A...How to Build a High-Performance VM for Squeak/Smalltalk in Your Spare Time: A...
How to Build a High-Performance VM for Squeak/Smalltalk in Your Spare Time: A...
 
CommunityExplorer: A Framework for Visualizing Collaboration Networks
CommunityExplorer: A Framework for Visualizing Collaboration NetworksCommunityExplorer: A Framework for Visualizing Collaboration Networks
CommunityExplorer: A Framework for Visualizing Collaboration Networks
 
Intro to GemStone/S
Intro to GemStone/SIntro to GemStone/S
Intro to GemStone/S
 
Sista: Improving Cog’s JIT performance
Sista: Improving Cog’s JIT performanceSista: Improving Cog’s JIT performance
Sista: Improving Cog’s JIT performance
 
Explicit Composition Constructs in DSLs - The case of the epidemiological lan...
Explicit Composition Constructs in DSLs - The case of the epidemiological lan...Explicit Composition Constructs in DSLs - The case of the epidemiological lan...
Explicit Composition Constructs in DSLs - The case of the epidemiological lan...
 
You Can’t Do That With Smalltalk!
You Can’t Do That With Smalltalk!You Can’t Do That With Smalltalk!
You Can’t Do That With Smalltalk!
 
seamless – Object Oriented CMS System
seamless – Object Oriented CMS Systemseamless – Object Oriented CMS System
seamless – Object Oriented CMS System
 
Smalltalk Metaprogramming supports Probabilistic Program Analysis
Smalltalk Metaprogramming supports Probabilistic Program AnalysisSmalltalk Metaprogramming supports Probabilistic Program Analysis
Smalltalk Metaprogramming supports Probabilistic Program Analysis
 
Pillar: one language for all supports
Pillar: one language for all supportsPillar: one language for all supports
Pillar: one language for all supports
 
Talking about bugs with bugs
Talking about bugs with bugsTalking about bugs with bugs
Talking about bugs with bugs
 
More XP-rience
More XP-rienceMore XP-rience
More XP-rience
 
The Glamorous Toolkit: Towards a novel live IDE
The Glamorous Toolkit: Towards a novel live IDEThe Glamorous Toolkit: Towards a novel live IDE
The Glamorous Toolkit: Towards a novel live IDE
 
Pharo Update
Pharo Update Pharo Update
Pharo Update
 

Similar to A JIT Smalltalk VM written in itself

Javascript Everywhere
Javascript EverywhereJavascript Everywhere
Javascript EverywherePascal Rettig
 
Bee Smalltalk RunTime: anchor's aweigh
Bee Smalltalk RunTime: anchor's aweighBee Smalltalk RunTime: anchor's aweigh
Bee Smalltalk RunTime: anchor's aweighESUG
 
Csw2016 gong pwn_a_nexus_device_with_a_single_vulnerability
Csw2016 gong pwn_a_nexus_device_with_a_single_vulnerabilityCsw2016 gong pwn_a_nexus_device_with_a_single_vulnerability
Csw2016 gong pwn_a_nexus_device_with_a_single_vulnerabilityCanSecWest
 
NativeBoost
NativeBoostNativeBoost
NativeBoostESUG
 
NativeBoost
NativeBoostNativeBoost
NativeBoostESUG
 
Writing native bindings to node.js in C++
Writing native bindings to node.js in C++Writing native bindings to node.js in C++
Writing native bindings to node.js in C++nsm.nikhil
 
JavaScript (without DOM)
JavaScript (without DOM)JavaScript (without DOM)
JavaScript (without DOM)Piyush Katariya
 
Front End Development: The Important Parts
Front End Development: The Important PartsFront End Development: The Important Parts
Front End Development: The Important PartsSergey Bolshchikov
 
How to Write Node.js Module
How to Write Node.js ModuleHow to Write Node.js Module
How to Write Node.js ModuleFred Chien
 
Conf soat tests_unitaires_Mockito_jUnit_170113
Conf soat tests_unitaires_Mockito_jUnit_170113Conf soat tests_unitaires_Mockito_jUnit_170113
Conf soat tests_unitaires_Mockito_jUnit_170113SOAT
 
From C++ to Objective-C
From C++ to Objective-CFrom C++ to Objective-C
From C++ to Objective-Ccorehard_by
 
Tests unitaires mock_kesako_20130516
Tests unitaires mock_kesako_20130516Tests unitaires mock_kesako_20130516
Tests unitaires mock_kesako_20130516SOAT
 
[A 3]Javascript oop for xpages developers - public
[A 3]Javascript oop for xpages developers - public[A 3]Javascript oop for xpages developers - public
[A 3]Javascript oop for xpages developers - publicKazunori Tatsuki
 
iOS App with Parse.com as RESTful Backend
iOS App with Parse.com as RESTful BackendiOS App with Parse.com as RESTful Backend
iOS App with Parse.com as RESTful BackendStefano Zanetti
 
Automation with Ansible and Containers
Automation with Ansible and ContainersAutomation with Ansible and Containers
Automation with Ansible and ContainersRodolfo Carvalho
 
(COSCUP 2015) A Beginner's Journey to Mozilla SpiderMonkey JS Engine
(COSCUP 2015) A Beginner's Journey to Mozilla SpiderMonkey JS Engine(COSCUP 2015) A Beginner's Journey to Mozilla SpiderMonkey JS Engine
(COSCUP 2015) A Beginner's Journey to Mozilla SpiderMonkey JS EngineZongXian Shen
 
How to Vim - for beginners
How to Vim - for beginnersHow to Vim - for beginners
How to Vim - for beginnersMarcin Rogacki
 
Herding types with Scala macros
Herding types with Scala macrosHerding types with Scala macros
Herding types with Scala macrosMarina Sigaeva
 
Introduction to underscore.js
Introduction to underscore.jsIntroduction to underscore.js
Introduction to underscore.jsJitendra Zaa
 

Similar to A JIT Smalltalk VM written in itself (20)

Javascript Everywhere
Javascript EverywhereJavascript Everywhere
Javascript Everywhere
 
Bee Smalltalk RunTime: anchor's aweigh
Bee Smalltalk RunTime: anchor's aweighBee Smalltalk RunTime: anchor's aweigh
Bee Smalltalk RunTime: anchor's aweigh
 
Csw2016 gong pwn_a_nexus_device_with_a_single_vulnerability
Csw2016 gong pwn_a_nexus_device_with_a_single_vulnerabilityCsw2016 gong pwn_a_nexus_device_with_a_single_vulnerability
Csw2016 gong pwn_a_nexus_device_with_a_single_vulnerability
 
NativeBoost
NativeBoostNativeBoost
NativeBoost
 
NativeBoost
NativeBoostNativeBoost
NativeBoost
 
Writing native bindings to node.js in C++
Writing native bindings to node.js in C++Writing native bindings to node.js in C++
Writing native bindings to node.js in C++
 
JavaScript (without DOM)
JavaScript (without DOM)JavaScript (without DOM)
JavaScript (without DOM)
 
Front End Development: The Important Parts
Front End Development: The Important PartsFront End Development: The Important Parts
Front End Development: The Important Parts
 
How to Write Node.js Module
How to Write Node.js ModuleHow to Write Node.js Module
How to Write Node.js Module
 
Conf soat tests_unitaires_Mockito_jUnit_170113
Conf soat tests_unitaires_Mockito_jUnit_170113Conf soat tests_unitaires_Mockito_jUnit_170113
Conf soat tests_unitaires_Mockito_jUnit_170113
 
Java Performance Tuning
Java Performance TuningJava Performance Tuning
Java Performance Tuning
 
From C++ to Objective-C
From C++ to Objective-CFrom C++ to Objective-C
From C++ to Objective-C
 
Tests unitaires mock_kesako_20130516
Tests unitaires mock_kesako_20130516Tests unitaires mock_kesako_20130516
Tests unitaires mock_kesako_20130516
 
[A 3]Javascript oop for xpages developers - public
[A 3]Javascript oop for xpages developers - public[A 3]Javascript oop for xpages developers - public
[A 3]Javascript oop for xpages developers - public
 
iOS App with Parse.com as RESTful Backend
iOS App with Parse.com as RESTful BackendiOS App with Parse.com as RESTful Backend
iOS App with Parse.com as RESTful Backend
 
Automation with Ansible and Containers
Automation with Ansible and ContainersAutomation with Ansible and Containers
Automation with Ansible and Containers
 
(COSCUP 2015) A Beginner's Journey to Mozilla SpiderMonkey JS Engine
(COSCUP 2015) A Beginner's Journey to Mozilla SpiderMonkey JS Engine(COSCUP 2015) A Beginner's Journey to Mozilla SpiderMonkey JS Engine
(COSCUP 2015) A Beginner's Journey to Mozilla SpiderMonkey JS Engine
 
How to Vim - for beginners
How to Vim - for beginnersHow to Vim - for beginners
How to Vim - for beginners
 
Herding types with Scala macros
Herding types with Scala macrosHerding types with Scala macros
Herding types with Scala macros
 
Introduction to underscore.js
Introduction to underscore.jsIntroduction to underscore.js
Introduction to underscore.js
 

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

Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfhans926745
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 

Recently uploaded (20)

Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 

A JIT Smalltalk VM written in itself

  • 1. a JIT Smalltalk VM written in itself Javier Burroni gera (richie)
  • 2. ESUG 2009 – JIT Security @1: 7F647D: push EBP test: arg 7F647E: mov EBP, ESP ^self with: 0 with: inst with: arg 7F6480: push EAX 7F6481: mov ESI, EAX ... @2:7F6492: push 1 ; PushSmallInteger0 1 <13> PushSmallInteger0 7F6497: push [ESI] ; PushInstance1 7F6499: push [EBP+8] ; PushArgument1 2 <8C> PushInstance1 7F649C: mov EAX, ESI ; LoadSelf 3 <55> PushArgument1 7F649E: call 740207 ; SendSelector1 4 <0A> LoadSelf 7F64A3: mov ESP, EBP ; Return 5 <E2> SendSelector1 7F64A5: pop EBP 7F64A6: mov ESI, [EBP-4] 6 <48> Return 7F64A9: ret 4 NEAR BytecodeNativizerPushR Assembler >> #pushR assembler pushR self assembleByte: 16r50 " push eax "
  • 3. Closure Bug (6-Aug-2010) testThomasMuhrNestedBlocks | abcdef | abcdef := [| var1 | var1 := 'AB'. [| var2 | BOOM! var2 := 'CD'. [| var3 | var3 := 'EF'. [var1 , var2 , var3] value] value] value] value. self assert: abcdef = 'ABCDEF' Fix #1 (7-Aug-2010) IndirectEscapeBytecode >> #assemble type := self nextByte. argument := type 4 = 0 ifTrue: [self nextIndex nextIndex] nextIndex + 1 ifFalse: [type 4 + 3]. type < 5 ifTrue: [^self loadEnvironmentTemporaryIndirect]. type < 9 ifTrue: [^self pushEnvironmentTemporaryIndirect]. ^self storeEnvironmentTemporaryIndirect
  • 4. Closure Bug (6-Aug-2010) testThomasMuhrNestedBlocks | abcdef | abcdef := [| var1 | var1 := 'AB'. [| var2 | BOOM! var2 := 'CD'. [| var3 | var3 := 'EF'. [var1 , var2 , var3] value] value] value] value. self assert: abcdef = 'ABCDEF' Fix #3 (9-Aug-2010) loc_1000ACFA: push esi call JIT_getNextIndex mov edi, [esp+10h+aBytecodeNativizer] add esp, 4 dec eax nop mov [edi+4], eax jmp short loc_1000AD29
  • 5. Closure Bug (6-Aug-2010) testThomasMuhrNestedBlocks | abcdef | abcdef := [| var1 | var1 := 'AB'. [| var2 | BOOM! var2 := 'CD'. [| var3 | var3 := 'EF'. [var1 , var2 , var3] value] value] value] value. self assert: abcdef = 'ABCDEF' Fix #2 (9-Aug-2010) putCode: code min: min max: max range: idx (idx >= min and: [idx <= max]) ifTrue: [self putNext: code - max + idx - 1] ifFalse: [ self putNext: code. self putIndex: idx idx] Idx + 1
  • 6. Smalltalks 2009 – code freezer GenerationalGCBuilder >> #populateInternals (nativizer := BigNativizer new) addAllMethodsFor: GCSpace; addAllMethodsFor: ObjectGenerationalGC; at: #isSmallInteger default: Object >> #isSmallInteger; at: #isSmallInteger add: SmallInteger; at: #bitXor: add: SmallInteger; at: #between:and: add: SmallInteger; at: #_generation default: ExtensionBytecode class >> #_generation; at: #_commit: _primitive: ExtensionBytecode >> #_commit; ...
  • 7. Frozen Code: “Lookup” Object >> #isNil UndefinedObject >> #isNil self class == Object self class == UndefinedObject IfFalse: [ IfFalse: [ ^self lookupAndSend] ^self lookupAndSend] ^false ^true
  • 8. Frozen Code: “Lookup” nativizer at: #isNil addAll: (Array with: Object with: UndefinedObject) Object >> #isNil UndefinedObject >> #isNil self class == Object self class == UndefinedObject IfFalse: [ ^self lookupAndSend] ^false ^true
  • 9. Frozen Code: “Lookup” nativizer at: #isNil addAll: (Array with: Object with: UndefinedObject); at: #isNil default: Object >> #isNil Object >> #isNil UndefinedObject >> #isNil self class == Object self class == UndefinedObject ^false ^false ^true
  • 10. Frozen Code: “Lookup” nativizer at: #isNil addAll: (Array with: Object with: UndefinedObject); at: #isNil default: Object >> #isNil; at: #isNil add: SmallInteger self _isSmallInteger ^false Object >> #isNil UndefinedObject >> #isNil self class == Object self class == UndefinedObject ^false ^false ^true
  • 12. New Goal Smalltalk VM Written in Smalltalk
  • 13. New Goal Smalltalk VM Written in Smalltalk Compatible with Digitalk's (VS)
  • 14. New Goal Smalltalk VM Written in Smalltalk Compatible with Digitalk's (VS) Leveraging the environment
  • 15. Smalltalk VM Written in Smalltalk .exe generation Method lookup Object format Memory management Object creation / copy GC Become Primitives FFI Processes Callbacks etc
  • 16. PE (.exe) generation PEFile _commit: newSize assembler directories imports loadArgFromContext: index; exports convertArgToNative; pushArg; relocations convertToNative; pushR; code pushConstant: 4; pushConstant: 4096; sections exports pushArg; pushR; imports callTo: 'VirtualAlloc' from: 'KERNEL32.DLL'; convertToSmalltalk code nativizer addAllMethodsFor: (Array with: GenerationalGC with: GenerationalGC class with: GCSpace); at: #_commit: _primitive: ExtensionBytecode >> #_commit
  • 17. GCSpace Object subclass: #GCSpace old InstanceVariableNames: ' contents base nextFree A commitLimit flip spaces reservedLimit ' classVariableNames: '' B poolDictionaries: '' includes: anObject ^anObject isSmallInteger not and: [anObject _oop between: self base and: self commitedLimit] reset self nextFree: self base
  • 18. GCSpace old includes: anObject Object subclass: #GCSpace old InstanceVariableNames: ' to reset contents base from isReferredBy: object nextFree A commitLimit old growTo: newLimit reservedLimit ' classVariableNames: '' B moved := to shallowCopy: object poolDictionaries: '' from flipWith: to includes: anObject ^anObject isSmallInteger not and: [anObject _oop between: self base and: self commitedLimit] reset self nextFree: self base
  • 19. GenerationalGC Object subclass: #GenerationalGC old InstanceVariableNames: ' old from to roots literalsReferences from weakContainers ephemerons rescuedEphemerons ' classVariableNames: '' poolDictionaries: '' to collect self followRoots; walkStack; rescueEphemerons; traverseWeakContainers; flipSpaces
  • 20. GenerationalGC flipper purgeRoots Object subclass: #GenerationalGC old InstanceVariableNames: ' flipper follow: object old from to roots literalsReferences flipper moveToOldOrTo: object from weakContainers ephemerons rescuedEphemerons ' flipper classVariableNames: '' fixReferencesOrSetTombstone: poolDictionaries: '' to weakContainer flipper addInterrupt collect self followRoots; walkStack; rescueEphemerons; traverseWeakContainers; flipSpaces
  • 21. GenerationalGC collect GenerationalGC old from to self followRoots; walkStack; follow: object | size | size := 0. object _isBytes ifFalse: [ object _hasWeaks ifTrue: [self addWeakOrEphemeron: object] ifFalse: [size := object _size]]. self follow: object count: 1 + size startingAt: 0
  • 22. GenerationalGC collect GenerationalGC old from to self followRoots; walkStack; follow: objects count: size startingAt: base | index | index := base - 1. size timesRepeat: [| object | index := index + 1. object := objects _basicAt: index. (fromSpace includes: object) ifTrue: [ object _isProxy ifTrue: [objects _basicAt: index put: object _proxee] ifFalse: [| moved | moved := self moveToOldOrTo: object. objects _basicAt: index put: moved. self follow: moved]]
  • 23. GenerationalGC collect GenerationalGC old from to self followRoots; walkStack; follow: objects count: size startingAt: base | index | index := base - 1. size timesRepeat: [| object | index := index + 1. object := objects _basicAt: index. (fromSpace includes: object) ifTrue: [ object _isProxy ifTrue: [objects _basicAt: index put: object _proxee] ifFalse: [| moved | moved := self moveToOldOrTo: object. objects _basicAt: index put: moved. self follow: moved]]]
  • 24. GenerationalGC collect GenerationalGC old from to self traverseWeakContainers traverseWeakContainers weakContainers do: [:weakContainer | self fixReferencesOrSetTombstone: weakContainer] self reset: weakContainers fixReferencesOrSetTombstone: weakContainer | size | size := weakContainer _size. 1 to: size do: [:index | | instance | instance := weakContainer _basicAt: index. (instance isSmallInteger not and: [fromSpace includes: instance]) ifTrue: [| referenceOrThombstone | referenceOrThombstone := instance _isProxy ifTrue: [instance _proxee] ifFalse: [residueObject]. weakContainer _basicAt: index put: referenceOrThombstone]]
  • 25. GenerationalGC collect GenerationalGC old from to self rescueEphemerons rescueEphemerons | unknowns rescan | unknowns := self localStack. rescan := false. [ephemerons isEmpty] whileFalse: [ rescan := self followEphemeronsCollectingIn: unknowns. rescan ifTrue: [ephemerons addAll: unknowns] IfFalse: [ unknowns do: [:ephemeron | self rescueEphemeron: ephemeron]]. self reset: unknowns] [Hayes1997] Barry Hayes, Ephemerons: a new finalization mechanism
  • 26. GenerationalGC collect GenerationalGC old from to self flipSpaces flipSpaces fromSpace flipWith: toSpace. toSpace reset. GCSpace >> flipWith: space | aux | aux := space base. space base: self base. self base: aux. ...
  • 27. GenerationalGC collect GenerationalGC old from to self flipSpaces A B nextFree := base + size nextFree := base copy contents A contents B
  • 28. GenerationalGC collect GenerationalGC old from to self flipSpaces A B contents A contents B
  • 29. GenerationalGC collect GenerationalGC old from to self flipSpaces A B contents A contents B VM assumption: from.commitLimit < to.base
  • 30. GenerationalGC: testing collect GenerationalGC old from to self followRoots testFollowObject | flipper from array string byteArray root flipSize currentSize | flipper := self defaultFlipper. from := flipper fromSpace. array := from shallowCopy: (Array new: 3). string := from shallowCopy: 'a String' copy. from shallowCopy: 'leaked' copy. byteArray := from shallowCopy: #[1 2 3] copy. array at: 1 put: 1; at: 2 put: string; at: 3 put: byteArray. root := Array with: array. string := byteArray := array := nil. flipper addRoot: root; followRoots. flipSize := flipper toSpace nextFree - flipper toSpace base. currentSize := flipper fromSpace nextFree - flipper fromSpace base. self assert: flipSize < currentSize; assert: currentSize - flipSize = (8 + ('leaked' size roundTo: 4))
  • 31. GenerationalGC: testing testFollowObject | flipper from array string byteArray root flipSize currentSize | flipper := self defaultFlipper. from := flipper fromSpace. array := from shallowCopy: (Array new: 3). string := from shallowCopy: 'a String' copy. from shallowCopy: 'leaked' copy. byteArray := from shallowCopy: #[1 2 3] copy. testFollowObject | flipper from array string byteArray root flipSize currentSize | flipper := self defaultFlipper. self execute: [:from | array := from shallowCopy: (Array new: 3). string := from shallowCopy: 'a String' copy. from shallowCopy: 'leaked' copy. byteArray := from shallowCopy: #[1 2 3] copy] proxying: flipper fromSpace.
  • 33. What now? Release OpenSource Education!!! Closure for JIT Memory Management Mark & Sweep new become: Method Lookup (strategies) etc.