Julia: Dynamism and Performance Reconciled by Design 2 3 JEFF BEZANSON, Julia Computing, Inc

Total Page:16

File Type:pdf, Size:1020Kb

Julia: Dynamism and Performance Reconciled by Design 2 3 JEFF BEZANSON, Julia Computing, Inc 1 Julia: Dynamism and Performance Reconciled by Design 2 3 JEFF BEZANSON, Julia Computing, Inc. 4 JIAHAO CHEN, Capital One 5 6 BEN CHUNG, Northeastern University 7 STEFAN KARPINSKI, Julia Computing, Inc 8 VIRAL B. SHAH, Julia Computing, Inc 9 LIONEL ZOUBRITZKY, École Normale Supérieure and Northeastern University 10 JAN VITEK, Northeastern University and Czech Technical University 11 Julia is a programming language for the scientific community that combines features of productivity languages, 12 such as Python or MATLAB, with characteristics of performance-oriented languages, such as C++ or Fortran. 13 Julia’s productivity features include: dynamic typing, automatic memory management, rich type annotations, 14 and multiple dispatch. At the same time, it allows programmers to control memory layout and leverages a 15 specializing just-in-time compiler to eliminate much of the overhead of those features. This paper details the 16 design choices made by the creators of Julia and reflects on the implications of those choices for performance 17 and usability. 18 CCS Concepts: • Software and its engineering → Language features; General programming languages; 19 Just-in-time compilers; Multiparadigm languages; 20 Additional Key Words and Phrases: multiple dispatch, just in time compilation, dynamic languages 21 22 ACM Reference Format: 23 Jeff Bezanson, Jiahao Chen, Ben Chung, Stefan Karpinski, Viral B. Shah, Lionel Zoubritzky, and Jan Vitek.2018. 24 Julia: Dynamism and Performance Reconciled by Design. Proc. ACM Program. Lang. 1, OOPSLA, Article 00 ( 2018), 23 pages. https://doi.org/00.0000/0000000 25 26 1 INTRODUCTION 27 Scientific programming has traditionally adopted one of two programming language families: 28 productivity languages (Python, MATLAB, R) for easy development, and performance languages (C, 29 C++, Fortran) for speed and a predictable mapping to hardware. Features of productivity languages 30 such as dynamic typing or garbage collection make exploratory and iterative development simple. 31 Thus, scientific applications often begin their lives in a productivity language. In many cases, asthe 32 problem size and complexity outgrows what the initial implementation can handle, programmers 33 turn to performance languages. While this usually leads to improved performance, converting an 34 existing application (or some subset thereof) to a different language requires significant programmer 35 involvement; features previously handled by the language (e.g. memory management) now have 36 to be emulated by hand. As a result, porting software from a high level to a low level language is 37 often a daunting task. 38 Scientists have been trying to bridge the divide between performance and productivity for years. 39 One example is the ROOT data processing framework [Antcheva et al. 2015]. Confronted with 40 petabytes of data, the high energy physics community spent more than 20 years developing an 41 extension to C++, providing interpretive execution and reflection—typical features of productivity 42 43 Permission to make digital or hard copies of part or all of this work for personal or classroom use is granted without fee 44 provided that copies are not made or distributed for profit or commercial advantage and that copies bear this notice and the full citation on the first page. Copyrights for third-party components of this work must be honored. For all otheruses, 45 contact the owner/author(s). 46 © 2018 Copyright held by the owner/author(s). 47 2475-1421/2018/00-ART00 48 https://doi.org/00.0000/0000000 49 Proceedings of the ACM on Programming Languages, Vol. 1, No. OOPSLA, Article 00. Publication date: 2018. 00:2 Bezanson, Chen, Chung, Karpinski, Shah, Zoubritzky, Vitek 50 languages—while retaining C++’s performance in critical portions of the code. Most scientific fields, 51 however, do not have the resources to build and maintain their own computational infrastructure. 52 The Julia programming language aims to decrease the gap between productivity and performance 53 languages. On one hand, it provides productivity features like dynamic typing, garbage collection, 54 and multiple dispatch. On the other, it has a type-specializing just-in-time compiler and lets 55 programmers control the layout of data structure in memory. Julia, therefore, promises scientific 56 programmers the ease of a productivity language at the speed of a performance language. 57 This promise is surprising. Dynamic languages like 58 Python or R typically suffer from at least an order of mag- mutable struct Node 59 nitude slowdown over C, and often more. Fig.1 illustrates § val ¤ nxt 60 that Julia is indeed a dynamic language. It declares a Node end 61 datatype containing two untyped fields, val and nxt, and function insert(list, elem) 62 an untyped insert function that takes a sorted list and if list isa Void 63 performs an ordered insertion. While this code will be op- return Node(elem, nothing) elseif list.val> elem 64 timized by the Julia compiler, it is not going to run at full return Node(elem, list) 65 speed without some additional programmer intervention. end list.nxt= insert(list.nxt, elem) 66 The key to performance in Julia lies in the synergy list 67 between language design, implementation techniques and end 68 programming style. Julia’s design was carefully tailored 69 so that a very small team of language implementers could ¦ Fig. 1. Linked list ¥ 70 create an efficient compiler. The key to this relative ease 71 is to leverage the combination of language features and programming idioms to reduce overhead, 72 but what language properties enable easy compilation to fast code? 73 Language design: Julia includes a number of features that are common to many productivity 74 languages, namely dynamic types, optional type annotations, reflection, dynamic code loading, and 75 garbage collection. A slightly less common feature is symmetric multiple dispatch [Bobrow et al. 76 1986]. In Julia a function can have multiple implementations, called methods, distinguished by the 77 type annotations added to parameters of the function. At run-time, a function call is dispatched to 78 the most specific method applicable to the types of the arguments. Julia’s type annotations canbe 79 attached to datatype declarations as well, in which case they are checked whenever typed fields are 80 assigned to. Julia differentiate between concrete and abstract types: the former can be instantiated 81 while the latter can be extended by subtypes. This distinction is important for optimization. 82 Language implementation: Performance does not arise from great feats of compiler engineering: 83 Julia’s implementation is simpler than that of many dynamic languages. The Julia compiler has 84 three main optimizations that are performed on a high-level intermediate representation; native 85 code generation is delegated to the LLVM compiler infrastructure. The optimizations are (1) method 86 inlining which devirtualizes multi-dispatched calls and inline the call target; (2) object unboxing to 87 avoid heap allocation; and (3) method specialization where code is special cased to its actual argument 88 types. The compiler does not support the kind of speculative compilation and deoptimizations 89 common in dynamic language implementations, but supports dynamic code loading from the 90 interpreter and with eval(). 91 The synergy between language design and implementation is in evidence in the interaction 92 between the three optimizations. Each call to a function that has a combination of concrete argument 93 types not observed before triggers specialization. A type inference algorithm uses the type of the 94 arguments (and if these are user-defined types, the declared type of fields) to discover thetypes 95 of variables in the specialized function. This enables both unboxing and inlining. The specialized 96 method is added to the function’s dispatch table so that future calls with the same argument types 97 can use the generated code. 98 Proceedings of the ACM on Programming Languages, Vol. 1, No. OOPSLA, Article 00. Publication date: 2018. Julia 00:3 99 Programming style: To assist the implementation, Julia programmers need to write idiomatic 100 code that can be compiled effectively. Programmers are keenly aware of the optimizations that the 101 compiler performs and write code that is shaped accordingly. For instance, adding type annotations 102 to fields of datatypes is viewed as good practice. Another good practice is to write methods that 103 are type stable. A method is type stable if, when it is specialized to a set of concrete types, type 104 inference can assign concrete types to all variables in the function. This property should hold for 105 all specializations of the same method. Type instability can stem from methods that can return 106 values of different types, or from assignment of different types to the same variable dependingon 107 branches of the function. 108 This paper gives the first unified overview of the design of the language and its implementation, 109 paying particular attention to the features that play a role in achieving performance. This furthers 110 the work of Bezanson et al. [2017] by detailing the synergies at work through the entire compilation 111 pipeline between the design and the programming style of the language. Moreover we present 112 experimental results on performance and usage. More specifically, we give results obtained ona 113 benchmark suite of 10 small applications where Julia v0.6.2 performs between 0.9x and 6.1x from 114 optimized C code. On our benchmarks, Julia outperforms JavaScript and Python in all cases. Finally 115 we conduct a corpus analysis over a group of 50 popular projects hosted on GitHub to examine how 116 the features and underlying design choices of the language are used in practice. The corpus analysis 117 confirms that multiple dispatch and type annotations are widely used by Julia programmers. Italso 118 shows that the corpus is mostly made up of type stable code.
Recommended publications
  • Homework 2: Reflection and Multiple Dispatch in Smalltalk
    Com S 541 — Programming Languages 1 October 2, 2002 Homework 2: Reflection and Multiple Dispatch in Smalltalk Due: Problems 1 and 2, September 24, 2002; problems 3 and 4, October 8, 2002. This homework can either be done individually or in teams. Its purpose is to familiarize you with Smalltalk’s reflection facilities and to help learn about other issues in OO language design. Don’t hesitate to contact the staff if you are not clear about what to do. In this homework, you will adapt the “multiple dispatch as dispatch on tuples” approach, origi- nated by Leavens and Millstein [1], to Smalltalk. To do this you will have to read their paper and then do the following. 1. (30 points) In a new category, Tuple-Smalltalk, add a class Tuple, which has indexed instance variables. Design this type to provide the necessary methods for working with dispatch on tuples, for example, we’d like to have access to the tuple of classes of the objects in a given tuple. Some of these methods will depend on what’s below. Also design methods so that tuples can be used as a data structure (e.g., to pass multiple arguments and return multiple results). 2. (50 points) In the category, Tuple-Smalltalk, design other classes to hold the behavior that will be declared for tuples. For example, you might want something analogous to a method dictionary and other things found in the class Behavior or ClassDescription. It’s worth studying those classes to see what can be adapted to our purposes.
    [Show full text]
  • TAMING the MERGE OPERATOR a Type-Directed Operational Semantics Approach
    Technical Report, Department of Computer Science, the University of Hong Kong, Jan 2021. 1 TAMING THE MERGE OPERATOR A Type-directed Operational Semantics Approach XUEJING HUANG JINXU ZHAO BRUNO C. D. S. OLIVEIRA The University of Hong Kong (e-mail: fxjhuang, jxzhao, [email protected]) Abstract Calculi with disjoint intersection types support a symmetric merge operator with subtyping. The merge operator generalizes record concatenation to any type, enabling expressive forms of object composition, and simple solutions to hard modularity problems. Unfortunately, recent calculi with disjoint intersection types and the merge operator lack a (direct) operational semantics with expected properties such as determinism and subject reduction, and only account for terminating programs. This paper proposes a type-directed operational semantics (TDOS) for calculi with intersection types and a merge operator. We study two variants of calculi in the literature. The first calculus, called li, is a variant of a calculus presented by Oliveira et al. (2016) and closely related to another calculus by Dunfield (2014). Although Dunfield proposes a direct small-step semantics for her calcu- lus, her semantics lacks both determinism and subject reduction. Using our TDOS we obtain a direct + semantics for li that has both properties. The second calculus, called li , employs the well-known + subtyping relation of Barendregt, Coppo and Dezani-Ciancaglini (BCD). Therefore, li extends the more basic subtyping relation of li, and also adds support for record types and nested composition (which enables recursive composition of merged components). To fully obtain determinism, both li + and li employ a disjointness restriction proposed in the original li calculus.
    [Show full text]
  • Julia: a Fresh Approach to Numerical Computing
    RSDG @ UCL Julia: A Fresh Approach to Numerical Computing Mosè Giordano @giordano [email protected] Knowledge Quarter Codes Tech Social October 16, 2019 Julia’s Facts v1.0.0 released in 2018 at UCL • Development started in 2009 at MIT, first • public release in 2012 Julia co-creators won the 2019 James H. • Wilkinson Prize for Numerical Software Julia adoption is growing rapidly in • numerical optimisation, differential equations, machine learning, differentiable programming It is used and taught in several universities • (https://julialang.org/teaching/) Mosè Giordano (RSDG @ UCL) Julia: A Fresh Approach to Numerical Computing October 16, 2019 2 / 29 Julia on Nature Nature 572, 141-142 (2019). doi: 10.1038/d41586-019-02310-3 Mosè Giordano (RSDG @ UCL) Julia: A Fresh Approach to Numerical Computing October 16, 2019 3 / 29 Solving the Two-Language Problem: Julia Multiple dispatch • Dynamic type system • Good performance, approaching that of statically-compiled languages • JIT-compiled scripts • User-defined types are as fast and compact as built-ins • Lisp-like macros and other metaprogramming facilities • No need to vectorise: for loops are fast • Garbage collection: no manual memory management • Interactive shell (REPL) for exploratory work • Call C and Fortran functions directly: no wrappers or special APIs • Call Python functions: use the PyCall package • Designed for parallelism and distributed computation • Mosè Giordano (RSDG @ UCL) Julia: A Fresh Approach to Numerical Computing October 16, 2019 4 / 29 Multiple Dispatch using DifferentialEquations
    [Show full text]
  • Concepts in Programming Languages Practicalities
    Concepts in Programming Languages Practicalities I Course web page: Alan Mycroft1 www.cl.cam.ac.uk/teaching/1617/ConceptsPL/ with lecture slides, exercise sheet and reading material. These slides play two roles – both “lecture notes" and “presentation material”; not every slide will be lectured in Computer Laboratory detail. University of Cambridge I There are various code examples (particularly for 2016–2017 (Easter Term) JavaScript and Java applets) on the ‘materials’ tab of the course web page. I One exam question. www.cl.cam.ac.uk/teaching/1617/ConceptsPL/ I The syllabus and course has changed somewhat from that of 2015/16. I would be grateful for comments on any remaining ‘rough edges’, and for views on material which is either over- or under-represented. 1Acknowledgement: various slides are based on Marcelo Fiore’s 2013/14 course. Alan Mycroft Concepts in Programming Languages 1 / 237 Alan Mycroft Concepts in Programming Languages 2 / 237 Main books Context: so many programming languages I J. C. Mitchell. Concepts in programming languages. Cambridge University Press, 2003. Peter J. Landin: “The Next 700 Programming Languages”, I T.W. Pratt and M. V.Zelkowitz. Programming Languages: CACM (published in 1966!). Design and implementation (3RD EDITION). Some programming-language ‘family trees’ (too big for slide): Prentice Hall, 1999. http://www.oreilly.com/go/languageposter http://www.levenez.com/lang/ ? M. L. Scott. Programming language pragmatics http://rigaux.org/language-study/diagram.html (4TH EDITION). http://www.rackspace.com/blog/ Elsevier, 2016. infographic-evolution-of-computer-languages/ I R. Harper. Practical Foundations for Programming Plan of this course: pick out interesting programming-language Languages.
    [Show full text]
  • Characteristics of Mathematical Modeling Languages That
    www.nature.com/npjsba ARTICLE OPEN Characteristics of mathematical modeling languages that facilitate model reuse in systems biology: a software engineering perspective ✉ Christopher Schölzel 1 , Valeria Blesius1, Gernot Ernst2,3 and Andreas Dominik 1 Reuse of mathematical models becomes increasingly important in systems biology as research moves toward large, multi-scale models composed of heterogeneous subcomponents. Currently, many models are not easily reusable due to inflexible or confusing code, inappropriate languages, or insufficient documentation. Best practice suggestions rarely cover such low-level design aspects. This gap could be filled by software engineering, which addresses those same issues for software reuse. We show that languages can facilitate reusability by being modular, human-readable, hybrid (i.e., supporting multiple formalisms), open, declarative, and by supporting the graphical representation of models. Modelers should not only use such a language, but be aware of the features that make it desirable and know how to apply them effectively. For this reason, we compare existing suitable languages in detail and demonstrate their benefits for a modular model of the human cardiac conduction system written in Modelica. npj Systems Biology and Applications (2021) 7:27 ; https://doi.org/10.1038/s41540-021-00182-w 1234567890():,; INTRODUCTION descriptions of experiment setup or design choices6–8. A recent As the understanding of biological systems grows, it becomes study by curators of the BioModels database showed that only 8 more and more apparent that their behavior cannot be reliably 51% of 455 published models were directly reproducible .Inan 9 predicted without the help of mathematical models. In the past, extreme case, Topalidou et al.
    [Show full text]
  • Strategic Location and Dispatch Management of Assets in a Military Medical Evacuation Enterprise Phillip R
    Air Force Institute of Technology AFIT Scholar Theses and Dissertations Student Graduate Works 6-19-2019 Strategic Location and Dispatch Management of Assets in a Military Medical Evacuation Enterprise Phillip R. Jenkins Follow this and additional works at: https://scholar.afit.edu/etd Part of the Operations and Supply Chain Management Commons Recommended Citation Jenkins, Phillip R., "Strategic Location and Dispatch Management of Assets in a Military Medical Evacuation Enterprise" (2019). Theses and Dissertations. 2292. https://scholar.afit.edu/etd/2292 This Dissertation is brought to you for free and open access by the Student Graduate Works at AFIT Scholar. It has been accepted for inclusion in Theses and Dissertations by an authorized administrator of AFIT Scholar. For more information, please contact [email protected]. Strategic Location and Dispatch Management of Assets in a Military Medical Evacuation Enterprise DISSERTATION Phillip R. Jenkins, Capt, USAF AFIT-ENS-DS-19-J-037 DEPARTMENT OF THE AIR FORCE AIR UNIVERSITY AIR FORCE INSTITUTE OF TECHNOLOGY Wright-Patterson Air Force Base, Ohio DISTRIBUTION STATEMENT A APPROVED FOR PUBLIC RELEASE; DISTRIBUTION UNLIMITED. The views expressed in this document are those of the author and do not reflect the official policy or position of the United States Air Force, the United States Department of Defense or the United States Government. This material is declared a work of the U.S. Government and is not subject to copyright protection in the United States. AFIT-ENS-DS-19-J-037 STRATEGIC LOCATION AND DISPATCH MANAGEMENT OF ASSETS IN A MILITARY MEDICAL EVACUATION ENTERPRISE DISSERTATION Presented to the Faculty Graduate School of Engineering and Management Air Force Institute of Technology Air University Air Education and Training Command in Partial Fulfillment of the Requirements for the Degree of Doctor of Philosophy Phillip R.
    [Show full text]
  • First-Class Dynamic Types (2019)
    First-Class Dynamic Types∗ Michael Homer Timothy Jones James Noble School of Engineering Montoux School of Engineering and Computer Science New York, USA and Computer Science Victoria University of Wellington [email protected] Victoria University of Wellington New Zealand New Zealand [email protected] [email protected] Abstract 1 Introduction Since LISP, dynamic languages have supported dynamically- Most dynamically-typed languages do not provide much sup- checked type annotations. Even in dynamic languages, these port for programmers incorporating type checks in their annotations are typically static: tests are restricted to check- programs. Object-oriented languages have dynamic dispatch ing low-level features of objects and values, such as primi- and often explicit “instance of” reflective operations, grad- tive types or membership of an explicit programmer-defined ual typing provides mixed-mode enforcement of a single class. static type system, and functional languages often include We propose much more dynamic types for dynamic lan- pattern-matching partial functions, all of which are relatively guages — first-class objects that programmers can custom- limited at one end of the spectrum. At the other end, lan- ise, that can be composed with other types and depend on guages like Racket support higher-order dynamic contract computed values — and to use these first-class type-like val- systems, wrapping objects to verify contracts lazily, and with ues as types. In this way programs can define their own con- concomitant power, complexity, and overheads [10, 51]. ceptual models of types, extending both the kinds of tests Programmers may wish for a greater level of run-time programs can make via types, and the guarantees those tests checking than provided by the language, or merely different can provide.
    [Show full text]
  • Multiple Dispatch As Dispatch on Tuples Gary T
    Computer Science Technical Reports Computer Science 7-1998 Multiple Dispatch as Dispatch on Tuples Gary T. Leavens Iowa State University Todd Millstein Iowa State University Follow this and additional works at: http://lib.dr.iastate.edu/cs_techreports Part of the Systems Architecture Commons, and the Theory and Algorithms Commons Recommended Citation Leavens, Gary T. and Millstein, Todd, "Multiple Dispatch as Dispatch on Tuples" (1998). Computer Science Technical Reports. 131. http://lib.dr.iastate.edu/cs_techreports/131 This Article is brought to you for free and open access by the Computer Science at Iowa State University Digital Repository. It has been accepted for inclusion in Computer Science Technical Reports by an authorized administrator of Iowa State University Digital Repository. For more information, please contact [email protected]. Multiple Dispatch as Dispatch on Tuples Abstract Many popular object-oriented programming languages, such as C++, Smalltalk-80, Java, and Eiffel, do not support multiple dispatch. Yet without multiple dispatch, programmers find it difficult to express binary methods and design patterns such as the ``visitor'' pattern. We describe a new, simple, and orthogonal way to add multimethods to single-dispatch object-oriented languages, without affecting existing code. The new mechanism also clarifies many differences between single and multiple dispatch. Keywords Multimethods, generic functions, object-oriented programming languages, single dispatch, multiple dispatch, tuples, product types, encapsulation,
    [Show full text]
  • Array Operators Using Multiple Dispatch: a Design Methodology for Array Implementations in Dynamic Languages
    Array Operators Using Multiple Dispatch: A design methodology for array implementations in dynamic languages The MIT Faculty has made this article openly available. Please share how this access benefits you. Your story matters. Citation Jeff Bezanson, Jiahao Chen, Stefan Karpinski, Viral Shah, and Alan Edelman. 2014. Array Operators Using Multiple Dispatch: A design methodology for array implementations in dynamic languages. In Proceedings of ACM SIGPLAN International Workshop on Libraries, Languages, and Compilers for Array Programming (ARRAY '14). ACM, New York, NY, USA, 56-61, 6 pages. As Published http://dx.doi.org/10.1145/2627373.2627383 Publisher Association for Computing Machinery (ACM) Version Author's final manuscript Citable link http://hdl.handle.net/1721.1/92858 Terms of Use Creative Commons Attribution-Noncommercial-Share Alike Detailed Terms http://creativecommons.org/licenses/by-nc-sa/4.0/ Array Operators Using Multiple Dispatch Array Operators Using Multiple Dispatch A design methodology for array implementations in dynamic languages Jeff Bezanson Jiahao Chen Stefan Karpinski Viral Shah Alan Edelman MIT Computer Science and Artificial Intelligence Laboratory [email protected], [email protected], [email protected], [email protected], [email protected] Abstract ficient, such as loop fusion for array traversals and common subex- Arrays are such a rich and fundamental data type that they tend to pression elimination for indexing operations [3, 24]. Many lan- be built into a language, either in the compiler or in a large low- guage implementations therefore choose to build array semantics level library. Defining this functionality at the user level instead into compilers. provides greater flexibility for application domains not envisioned Only a few of the languages that support n-arrays, however, by the language designer.
    [Show full text]
  • Function Programming in Python
    Functional Programming in Python David Mertz Additional Resources 4 Easy Ways to Learn More and Stay Current Programming Newsletter Get programming related news and content delivered weekly to your inbox. oreilly.com/programming/newsletter Free Webcast Series Learn about popular programming topics from experts live, online. webcasts.oreilly.com O’Reilly Radar Read more insight and analysis about emerging technologies. radar.oreilly.com Conferences Immerse yourself in learning at an upcoming O’Reilly conference. conferences.oreilly.com ©2015 O’Reilly Media, Inc. The O’Reilly logo is a registered trademark of O’Reilly Media, Inc. #15305 Functional Programming in Python David Mertz Functional Programming in Python by David Mertz Copyright © 2015 O’Reilly Media, Inc. All rights reserved. Attribution-ShareAlike 4.0 International (CC BY-SA 4.0). See: http://creativecommons.org/licenses/by-sa/4.0/ Printed in the United States of America. Published by O’Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472. O’Reilly books may be purchased for educational, business, or sales promotional use. Online editions are also available for most titles (http://safaribooksonline.com). For more information, contact our corporate/institutional sales department: 800-998-9938 or [email protected]. Editor: Meghan Blanchette Interior Designer: David Futato Production Editor: Shiny Kalapurakkel Cover Designer: Karen Montgomery Proofreader: Charles Roumeliotis May 2015: First Edition Revision History for the First Edition 2015-05-27: First Release The O’Reilly logo is a registered trademark of O’Reilly Media, Inc. Functional Pro‐ gramming in Python, the cover image, and related trade dress are trademarks of O’Reilly Media, Inc.
    [Show full text]
  • Perl 6 Introduction
    Perl 6 Introduction Naoum Hankache [email protected] Table of Contents 1. Introduction 1.1. What is Perl 6 1.2. Jargon 1.3. Installing Perl 6 1.4. Running Perl 6 code 1.5. Editors 1.6. Hello World! 1.7. Syntax overview 2. Operators 3. Variables 3.1. Scalars 3.2. Arrays 3.3. Hashes 3.4. Types 3.5. Introspection 3.6. Scoping 3.7. Assignment vs. Binding 4. Functions and mutators 5. Loops and conditions 5.1. if 5.2. unless 5.3. with 5.4. for 5.5. given 5.6. loop 6. I/O 6.1. Basic I/O using the Terminal 6.2. Running Shell Commands 6.3. File I/O 6.4. Working with files and directories 7. Subroutines 7.1. Definition 7.2. Signature 7.3. Multiple dispatch 7.4. Default and Optional Arguments 8. Functional Programming 8.1. Functions are first-class citizens 8.2. Closures 8.3. Anonymous functions 8.4. Chaining 8.5. Feed Operator 8.6. Hyper operator 8.7. Junctions 8.8. Lazy Lists 9. Classes & Objects 9.1. Introduction 9.2. Encapsulation 9.3. Named vs. Positional Arguments 9.4. Methods 9.5. Class Attributes 9.6. Access Type 9.7. Inheritance 9.8. Multiple Inheritance 9.9. Roles 9.10. Introspection 10. Exception Handling 10.1. Catching Exceptions 10.2. Throwing Exceptions 11. Regular Expressions 11.1. Regex definition 11.2. Matching characters 11.3. Matching categories of characters 11.4. Unicode properties 11.5. Wildcards 11.6. Quantifiers 11.7. Match Results 11.8.
    [Show full text]
  • Multimethods
    11-A1568 01/23/2001 12:39 PM Page 263 11 Multimethods This chapter defines, discusses, and implements multimethods in the context of Cϩϩ . The Cϩϩ virtual function mechanism allows dispatching a call depending on the dynamic type of one object. The multimethods feature allows dispatching a function call depending on the types of multiple objects. A universally good implementation requires language support, which is the route that languages such as CLOS, ML, Haskell, and Dylan have taken. Cϩϩ lacks such support, so its emulation is left to library writers. This chapter discusses some typical solutions and some generic implementations of each. The solutions feature various trade-offs in terms of speed, flexibility, and dependency management. To describe the technique of dispatching a function call depending on mul- tiple objects, this book uses the terms multimethod (borrowed from CLOS) and multiple dis- patch. A particularization of multiple dispatch for two objects is known as double dispatch. Implementing multimethods is a problem as fascinating as dreaded, one that has stolen lots of hours of good, healthy sleep from designers and programmers.1 The topics of this chapter include • Defining multimethods • Identifying situations in which the need for multiobject polymorphism appears • Discussing and implementing three double dispatchers that foster different trade-offs • Enhancing double-dispatch engines After reading this chapter, you will have a firm grasp of the typical situations for which multimethods are the way to go. In addition, you will be able to use and extend several ro- bust generic components implementing multimethods, provided by Loki. This chapter limits discussion to multimethods for two objects (double dispatch).
    [Show full text]