pragmatic smalltalk

Download Pragmatic Smalltalk

Post on 20-May-2015

1.618 views

Category:

Technology

1 download

Embed Size (px)

DESCRIPTION

ESUG 2011, Edinburgh

TRANSCRIPT

  • 1. Traditional Smalltalk Playing Well With Others Performance Etoile eEtoilPragmatic Smalltalk David Chisnall August 25, 2011

2. Traditional Smalltalk Playing Well With Others Performance Etoile Smalltalk is Awesome! Pure object-oriented system Clean, simple syntax Automatic persistence and many other great features 3. Traditional SmalltalkPlaying Well With OthersPerformance Etoile...but no one cares TIOBE ranks Smalltalk somewhere in the #51-100 range. In the same range as Io, Dylan, Eiel, Inform... Behind Haskell (#34), Go (#24), Logo (#21) A long way behind Smalltalk-derivatives Ruby (#12), Objective-C (#6), and Java (#1) 4. Traditional Smalltalk Playing Well With OthersPerformance Etoile Why? What do other languages have that Smalltalk doesnt? Large commercial backer, writing huge amounts of library code (e.g. Java) Easy interoperability with other languages 5. Traditional Smalltalk Playing Well With Others Performance EtoileLanguage Report Cards Smalltalk: Very bright student. Excels in most subjects. Doesnt play well with others. Python:Very friendly student. Always actively participates in group activities. May have undiagnosed learning diculties. 6. Traditional SmalltalkPlaying Well With OthersPerformanceEtoile Heresy Smalltalk is not always the best tool for the job Try writing a video CODEC in Smalltalk Its possible, but youre ghting the language every step of the way 7. Traditional Smalltalk Playing Well With Others PerformanceEtoileSmalltalk is a High-level Language High-level abstractions Good for most tasks Bad when you need close access to the hardware (e.g. SIMD) 8. Traditional Smalltalk Playing Well With Others Performance EtoileObjective-C: C in Smalltalk Objects Created by Brad Cox and Tom Love in 1986 to package C libraries in Smalltalk-like classes Smalltalk object model C code in methods, message passing between objects Rich set of standard class libraries 9. Traditional SmalltalkPlaying Well With Others Performance Etoile The Compiler and the Runtime The compiler generates calls to functions in the runtime library All Smalltalk-like features are implemented by runtime calls Calls to C libraries have the same cost as calling them from C Can incrementally deploy Objective-C code with C/C++ libraries 10. Traditional SmalltalkPlaying Well With Others Performance Etoile Pragmatic Smalltalk e Dialect of Smalltalk used by Etoil Implements Smalltalk-80 language, but not the standard libraries Compiles to native code (JIT or static compiler) Emits code ABI-compatible with Objective-C 11. Traditional Smalltalk Playing Well With Others Performance Etoile Compiler ArchitectureClang (Objective-C) LLVM Optimiser Executable LLVM Linker / Optimiser Native Linker EScript ParserLLVM OptimiserJITLanguageKit InterpreterSmalltalk Parser 12. Traditional Smalltalk Playing Well With OthersPerformance EtoileExecution Architecture Smalltalk ApplicationsObjC ApplicationsSmalltalkSupport ObjC FrameworksLanguageKitRuntime GNUstep AppKitGNUstep Foundation X11libobjcC/C++ LibrarieslibcKernel 13. Traditional SmalltalkPlaying Well With Others Performance EtoileLanguageKit AST for representing Smalltalk-like languages Interpreter for directly executing the AST LLVM-based code generation back end for compiling Written in Objective-C 14. Traditional SmalltalkPlaying Well With Others Performance EtoileCompiling Smalltalk: The Hard Bits Small integers Blocks Non-local returns Memory management 15. Traditional SmalltalkPlaying Well With Others PerformanceEtoile Small Objects Objects hidden in pointers (e.g. small integers) Very common operations implemented as (hand optimised) C functions Inlined during compilation Objective-C runtime modied to allow sending messages to small objects Totally interoperable with Objective-C: small integers are just NSSmallInt instances, can be used anywhere NSNumber is expected Very fast: almost the same speed as C integer arithmetic - Fibonacci benchmark ran the same speed as GCC 4.2.1 16. Traditional Smalltalk Playing Well With Others Performance EtoileBlocks Objective-C now supports blocks LanguageKit uses the same ABI Smalltalk and Objective-C blocks can be used interchangeably. 17. Traditional SmalltalkPlaying Well With Others Performance EtoileNon-Local Returns Returns from blocks Ugly feature, should never have been allowed in the language Implemented using same mechanism as exceptions (DWARF stack unwinding) 18. Traditional SmalltalkPlaying Well With Others PerformanceEtoileMemory Management Objective-C can use tracing GC or reference counting LanguageKit supports GC or automatic reference counting (ARC) Optimisation passes remove redundant retain / release operations in ARC mode. 19. Traditional SmalltalkPlaying Well With Others Performance Etoile Objective-C[++] is our Foreign Function Interface Objective-C and Smalltalk classes are the same Categories can be written in either language Methods written in Smalltalk and Objective-C are indistinguishable Calling C++ from Objective-C++ is trivial 20. Traditional SmalltalkPlaying Well With OthersPerformance Etoile Sending Messages to C Writing a method just to call a C function is cumbersome (and slow!) " Smalltalk code :" C sqrt : 42. C fdim : {60. 12}. C NSLocation : l InRange : r . Generates exactly the same code as: // C code sqrt (42) ; fdim (60 , 12) ; NSLocatio nInRan ge (l , r ) ; No bridging code, no custom wrappers, just native function calls in the compiled code. 21. Traditional Smalltalk Playing Well With Others PerformanceEtoileSmalltalk in the Terminal $./br "viewSpace: (Shapeways ringBlopperPath: (env objectForKey:BLOPPER)order: 1 ringSize: 10thickness: 3.0 height: 15.0)" 22. Traditional Smalltalk Playing Well With Others Performance Etoile In Shell Scripts $ cat foo.st #!/Local/Tools/edlc -f NSObject subclass: SmalltalkTool [ run [ | info | info := NSProcessInfo processInfo. ETTranscript show: Hello, world? ; cr; show: sqrt(2): ; show: (C sqrt: 2) ; cr; show: Arguments: ; show: (info arguments); cr. ] ] $ ./foo.st This is a shell script Hello, world? sqrt(2): 1.414214 Arguments: ("/Local/Tools/edlc", "-f", "./foo.st", This, is, a, shell, script) 23. Traditional SmalltalkPlaying Well With Others Performance EtoileCompiled Shell Scripts $ edlc -c -f foo.st $ llc foo.bc $ clang -fobjc-nonfragile-abi run.m foo.s-lEtoileFoundation -lLanguageKitRuntime $ ./a.out this is the same shell script Hello, world? sqrt(2): 1.414214 Arguments: ("./a.out", this, is, the, same, shell, script) $ edlc -i -f foo.st In the interpreter Hello, world? sqrt(2): 1.414214 Arguments: (edlc, "-i", "-f", "foo.st", In, the, interpreter) 24. Traditional Smalltalk Playing Well With Others Performance EtoileOr in the GUI... 25. Traditional Smalltalk Playing Well With Others Performance EtoileWhat Makes Things Slow? Small integer arithmetic Boxing Dynamic message lookup Memory management operations 26. Traditional Smalltalk Playing Well With Others Performance EtoileSmall Objects Support in Libobjc Allows Smalltalk SmallInts to be returned to ObjC code (no boxing required) Removes the need for LanguageKit to add conditionals around every message send Approximately 40% reduction in code size Smaller code means better instruction cache usage 27. Traditional Smalltalk Playing Well With OthersPerformance EtoileLookup Caching New lookup function returns a pointer to a structure Structure contains a version Version incremented if the method is replaced Safe automatic caching now possible Optimisation pass caches all lookups in loops and to classes Optimisations shared between Objective-C and Smalltalk 28. Traditional SmalltalkPlaying Well With Others Performance EtoileSpeculative Inlining C can insert copies of functions where they are used Objective-C message sends may map to dierent methods But we can guess one... ...inline it... ...and wrap it in a test to see if we guessed right 29. Traditional Smalltalk Playing Well With OthersPerformanceEtoile A Microbenchmark Simple message sends in a loop. Target: using C function calls takes 3 seconds Innitely fast lookup function would therefore take 6 secondsOptimisationTime (s)None 10Standard LLVM Opts8Auto-Caching4.6 Auto-Caching + LLVM Opts 3.5Auto-Caching + Speculative Inlining 2Are we fast enough yet? 30. Traditional SmalltalkPlaying Well With Others Performance EtoileDont Trust Microbenchmarks(Including the last slide!) Algorithmic improvements make much a more noticeable dierence to performance Loose coupling makes specialisation easier. Case study: Integrating with libicu The problem: libicu uses its own (very ecient) unicode string representation 31. Traditional Smalltalk Playing Well With Others Performance EtoileICU Strings in C++ std::string is the standard string class Non-virtual methods for speed Not exible enough: everyone implements their own (e.g. llvm::StringRef, qt::QString, etc.) Using libicu strings involves O(n) operations, copying characters between representations This problem happens at every library boundary 32. Traditional SmalltalkPlaying Well With Others PerformanceEtoileICU Strings in Objective-C NSString is the standard string class Abstract superclass, (hidden) concrete subclasses Very exible, used everywhere. Using libicu strings involves an O(1) operation, wrapping the libicu string type in an NSString subclass. Objective-C wrapper can be used in Pragmatic Smalltalk directly Result: The slower language encourages O(1) algorithms where the faster language encourages O(n) algorithms. 33. Traditional SmalltalkPlaying Well With Others Performance Etoile Object Planes GNUstep runtime takes the sender as argument to lookup function Object Planes are now possible with the Objective-C runtime Messages intercepted when travelling between groups of objects Implicit concurrency, acce