Exploring the Current Landscape of Programming Paradigm and Models

Total Page:16

File Type:pdf, Size:1020Kb

Exploring the Current Landscape of Programming Paradigm and Models Cover Venkatesh Prasad Ranganath Story Researcher at Microsoft Research, India Exploring the Current Landscape of Programming Paradigm and Models Until few years ago, imperative programming of Programming Paradigms[44]” page assignments (e.g. i = i + 1). This is evident and object-oriented programming have at Wikipedia states that “None of the by the explicitly use and maintenance been two prevalent programming main programming paradigms have a of a counter variable i, dependence on paradigms in the industry. However, this precise, globally unanimous defi nition, let the length of nums, and direct access of has started to change over the past few alone an offi cial international standard.” elements of nums (via indexing syntax, years with the community exploring and Hence, instead of chasing defi nitions of i.e. nums[i]). slowly adopting functional programming. programming paradigms, let us try to In object-oriented style, the Similarly, there has been a renewed understand programming paradigms via program does not depend on the interest in exploring existing programming examples. internal details of list type. Instead, languages or creating new programming We shall start with three prevalent list type encapsulates its elements languages that support either tried-and- programming paradigms: imperative, (implementation details) and provides forgotten paradigms or a combination of object-oriented, and functional. an iterator abstraction (interface) to paradigms. Further, there has been a surge For this purpose, let us consider iterate over its elements. Consequently, in languages and programming systems to the following programs that identical in the program depends only on the support development of loosely coupled functionality but written in imperative, iterator abstraction. This style of applications such as web applications and object-oriented and functional using encapsulation to hide information distributed applications. programming styles. These programs and abstraction to provide appropriate To a large extent, these changes have accept a list of integers (nums) and views of information (decouple been fueled by two factors. The fi rst factor output a list of squares of these integers implementation from interface) are is the decision of the computer hardware (output). To simplify comparison, all the distinct features of object-oriented industry to move from faster single- of these programs are written in Python programming. core processors to slower multi-core programming language[2]. list (an As for the part of specifying how to processors (to compensate for the failure ordered sequence of objects) is a primitive iterate through the elements, observe of Moore’s law[1]n).The second factor data type in Python. that the boilerplate code required to is the rise of internet-enabled mobile Imperative: use an abstraction such as iterators devices, cloud computing, and big data. output = list() is dependent only on the abstraction As a result of the fi rst factor, i = 0 and is parameterized only by the object applications cannot be scaled by merely while i <len(nums): providing the abstraction. Combining this switching to faster processors. Instead, output.append(square(nums[i])) observation with language level syntactic applications need to be reengineered i = i + 1 sugar and compile-time transformation, to leverage multiple cores. Similarly, Object-Oriented(1) [Pseudo-Python]: object-oriented style of programming the second factor has forced more and output = list() can be further simplifi ed as illustrated in more applications to be composed of i = nums.iterator() the third example program titled “Object- communicating components that are while i.hasNext(): Oriented (2)”. In this form, with the distributed across diff erent computers. output.append(square(i.next()) exception of using for looping statement, the program does not specify how to This has prompted the programming Object-Oriented (2): iterate through the elements of nums. community to explore, extend, and even output = list() create programming languages to enable for n in nums: In functional style, the program and simplify programming in the presence output.append(square(n)) specifi es that function square should of concurrency, distribution, and web be applied to every element of nums and Functional: the results should be returned in order as technologies. output = map(square, nums) In this context, this article attempts a list. This is accomplished using ahigh to explore the current landscape of While the above programs obviously level function map(f,l) that applies the given function f to every element programming paradigms and models. diff er in length (succinctness), they also diff er in the level of detail at which of the given sequencel(that provides Old Timers computation is specifi ed. iterator abstraction) and returns What is a programming paradigm? The In imperative style, the program the results in order as a list. So, unlike “Programming Paradigm[43]” page at explicitly specifi es how to iterate through in imperative style and object-oriented Wikipedia defi nes programming paradigm the elements of nums, depends on the style, the program does not specify how as a fundamental style of programming. internal details of list type (the type of to iterate through numso. Instead, the Digging a bit deeper, the “Comparison nums), and modifi es program state via program relies on map to leverage the 1Readers interested in concurrency and hardware changes may want to read Herb Sutter’s “Welcome to the Jungle” blog post[38]. 2As a result, the decisions regarding how to iterate and the order of iteration are deferred to the compiler or the runtime system. CSI Communications | February 2013 | 6 www.csi-india.org iterator abstraction provided by list Where’s that list of languages? type to iterate through nums. Hence, as There is a reason this article has been in mathematics, functional programming language agnostic thus far. Most existing is all about applying and composing main stream languages (such as C#, functions to specify computationp. JavaScript, Python, and Ruby[3,4,2,5]) and Another distinct aspect of functional new up-and-coming languages (such programming is immutability of data – as Clojure, F#, and Scala[6,7,8]) support function applications and expression various aspects of multiple programming evaluations create values as opposed to paradigms. This is achieved by off ering modifying existing values. To understand language features that embody a this aspect in terms of its ramifi cation combination of aspects of multiple on programming, consider a function paradigms, e.g. F# supports object- append(l,e) that appends element e oriented programming by supporting Fi g. 2: Summing network to list l. In terms of exposing the result of classes. On the other hand, there are program. So, square function can be append, there are two options: 1) modify languages that are pure in supporting a applied to the elements of nums in random list l in place (imperative) or 2) create a single paradigm, e.g. Haskell and SML/NJ order. This implies square function can be new list containing the elements of land are pure functional languages[9,10]. concurrently applied to elements of nums the element e (functional). The following While language support for a provided square and Seq.map functions pseudo code snippets exercise these programming paradigm certainly helps are side-eff ect free. Since these functions options to achieve the same goal – v1 programming in that paradigm, one could are indeed side-eff ect free, we can trivially should refer to the list[7,8,9]. program in a paradigm that is not directly parallelize the above programas follows supported by a language, e.g. one could v1 = [7,8] v2 = [7,8] by using PSeq.map, a parallel version of v2 = v1 v1 = append (v2,9) do object-oriented style programming in Seq.map. append(v1,9) a language (e.g. C) that is not ideal for object-oriented programming. Remember With the fi rst option (on the left), the nums |> PSeq.map square |> that programming paradigm is about the List.ofSeq change to listv1 will be visible via v2 style of programming (and not about any (an alias to v1) referring to v1’s list. This This example was a simple case specifi c programming language). phenomenon is known as side-eff ect. of data parallelism – same operation is With the second option (on the right), Rookies performed on various data items and due to the absence of side-eff ect, the list Besides prevalent programming these operations and their results are resulting from append is assigned to v1 paradigms, there are new language mutually independent – and functional to achieve the desired goal (as, without features (or paradigms?) that are inspired programming was ideal. the assignment, v1 will refer to list[7,8]). by specifi c aspects of problems. In the rest Now, consider the task of summing Fig. 1 illustrates eff ect of executing these of this article, we shall explore few such the squares of a given list of integers programs. problem aspects and related language (nums) with the following sequential F# While presence and absence of side- features and paradigms. program. In this program, Seq.reduce eff ect have their benefi ts and drawbacks, Concurrency / Parallelism reduces the input sequence to a single integer by applying sum to each element the absence of side-eff ect is a desirable Continuing with functional programming, of the sequence along with the result of aspect to program concurrency, and let us try to understand why side eff ect applying sum to the previous element; at we shall discuss this aspect in the next freedom and immutable data benefi ts the start, sum is applied to the fi rst two section. concurrent programming. Consider the elements of the sequence. following F# program to square a list of integers. nums |>Seq.map square |>Seq. As with the functional reduce sum |> List.ofSeq Python program, square To parallelize this program, observe function is applied to each that summation is dependent on each element of nums using input element.
Recommended publications
  • An Empirical Study on Program Comprehension with Reactive Programming
    Jens Knoop, Uwe Zdun (Hrsg.): Software Engineering 2016, Lecture Notes in Informatics (LNI), Gesellschaft fur¨ Informatik, Bonn 2016 69 An Emirical Study on Program Comrehension with Reactive Programming Guido Salvaneschi, Sven Amann, Sebastian Proksch, and Mira Mezini1 Abstract: Starting from the first investigations with strictly functional languages, reactive programming has been proposed as the programming paradigm for reactive applications. The advantages of designs based on this style overdesigns based on the Observer design pattern have been studied for along time. Over the years, researchers have enriched reactive languages with more powerful abstractions, embedded these abstractions into mainstream languages –including object-oriented languages –and applied reactive programming to several domains, likeGUIs, animations, Webapplications, robotics, and sensor networks. However, an important assumption behind this line of research –that, beside other advantages, reactive programming makes awide class of otherwise cumbersome applications more comprehensible –has neverbeen evaluated. In this paper,wepresent the design and the results of the first empirical study that evaluates the effect of reactive programming on comprehensibility compared to the traditional object-oriented style with the Observer design pattern. Results confirm the conjecture that comprehensibility is enhanced by reactive programming. In the experiment, the reactive programming group significantly outperforms the other group. Keywords: Reactive Programming, Controlled
    [Show full text]
  • Swri IR&D Program 2016
    Internal Research and Development 2016 The SwRI IR&D Program exists to broaden the Institute's technology base and to encourage staff professional growth. Internal funding of research enables the Institute to advance knowledge, increase its technical capabilities, and expand its reputation as a leader in science and technology. The program also allows Institute engineers and scientists to continually grow in their technical fields by providing freedom to explore innovative and unproven concepts without contractual restrictions and expectations. Space Science Materials Research & Structural Mechanics Intelligent Systems, Advanced Computer & Electronic Technology, & Automation Engines, Fuels, Lubricants, & Vehicle Systems Geology & Nuclear Waste Management Fluid & Machinery Dynamics Electronic Systems & Instrumentation Chemistry & Chemical Engineering Copyright© 2017 by Southwest Research Institute. All rights reserved under U.S. Copyright Law and International Conventions. No part of this publication may be reproduced in any form or by any means, electronic or mechanical, including photocopying, without permission in writing from the publisher. All inquiries should be addressed to Communications Department, Southwest Research Institute, P.O. Drawer 28510, San Antonio, Texas 78228-0510, [email protected], fax (210) 522-3547. 2016 IR&D | IR&D Home SwRI IR&D 2016 – Space Science Capability Development and Demonstration for Next-Generation Suborbital Research, 15-R8115 Scaling Kinetic Inductance Detectors, 15-R8311 Capability Development of
    [Show full text]
  • Flapjax: Functional Reactive Web Programming
    Flapjax: Functional Reactive Web Programming Leo Meyerovich Department of Computer Science Brown University [email protected] 1 People whose names should be before mine. Thank you to Shriram Krishnamurthi and Gregory Cooper for ensuring this project’s success. I’m not sure what would have happened if not for the late nights with Michael Greenberg, Aleks Bromfield, and Arjun Guha. Peter Hopkins, Jay McCarthy, Josh Gan, An- drey Skylar, Jacob Baskin, Kimberly Burchett, Noel Welsh, and Lee Butterman provided invaluable input. While not directly involved with this particular project, Kathi Fisler and Michael Tschantz have pushed me along. 1 Contents 4.6. Objects and Collections . 32 4.6.1 Delta Propagation . 32 1. Introduction 3 4.6.2 Shallow vs Deep Binding . 33 1.1 Document Approach . 3 4.6.3 DOM Binding . 33 2. Background 4 4.6.4 Server Binding . 33 2.1. Web Programming . 4 4.6.5 Disconnected Nodes and 2.2. Functional Reactive Programming . 5 Garbage Collection . 33 2.2.1 Events . 6 2.2.2 Behaviours . 7 4.7. Evaluations . 34 2.2.3 Automatic Lifting: Transparent 4.7.1 Demos . 34 Reactivity . 8 4.7.2 Applications . 34 2.2.4 Records and Transparent Reac- 4.8 Errors . 34 tivity . 10 2.2.5 Behaviours and Events: Conver- 4.9 Library vs Language . 34 sions and Event-Based Derivation 10 4.9.1 Dynamic Typing . 34 4.9.2 Optimization . 35 3. Implementation 11 3.1. Topological Evaluation and Glitches . 13 4.9.3 Components . 35 3.1.1 Time Steps . 15 4.9.4 Compilation .
    [Show full text]
  • A Functional Approach to Finding Answer Sets
    A Functional Approach to Finding Answer Sets Bryant Nelson, Josh Archer, and Nelson Rushton Texas Tech Dept. of Computer Science (bryant.nelson | josh.archer | nelson.rushton) @ ttu.edu Texas Tech University Department of Computer Science Box 43104 Lubbock, TX 79409-3104 we have been convinced of Hughes’ hypothesis. We set out to further test this Submitted to FCS 2013 hypothesis by encoding an Answer Set Solver in SequenceL. We hypothesize that Keywords: Functional Programming, a functional language would allow the Answer Set Prolog, Logic Programming programmer to implement an Answer Set Solver more quickly than a procedural Abstract: A naive answer set solver was language, and that the resulting program implemented in the functional programming would be more readable and language SequenceL, and its performance understandable. compared to mainstream solvers on a set of standard benchmark problems. Finding answer sets is an NP-Complete Implementation was very rapid (25 person problem, and over the last few decades a hours) and the resulting program only 400 few solvers have been developed that lines of code. Nonetheless, the algorithm tackle this problem. The current juggernauts was tractable and obtained parallel in this area are the DLV, CLASP, and speedups. Performance, though not SMODELS solvers, all of which are very pathologically poor, was considerably efficient. The problem would seem to benefit slower (around 20x) than that of mainstream from a parallelized solver, yet CLASP only solvers (CLASP, Smodels, and DLV) on all has a branch (CLASPar) dedicated to this, but one benchmark problem. and DLV has been “experimenting” with parallelization in their grounder [DLVPar].
    [Show full text]
  • Characterizing Callbacks in Javascript
    Don’t Call Us, We’ll Call You: Characterizing Callbacks in JavaScript Keheliya Gallaba Ali Mesbah Ivan Beschastnikh University of British Columbia University of British Columbia University of British Columbia Vancouver, BC, Canada Vancouver, BC, Canada Vancouver, BC, Canada [email protected] [email protected] [email protected] Abstract—JavaScript is a popular language for developing 1 var db = require(’somedatabaseprovider’); web applications and is increasingly used for both client-side 2 http.get(’/recentposts’, function(req, res){ and server-side application logic. The JavaScript runtime is 3 db.openConnection(’host’, creds, function(err, conn){ inherently event-driven and callbacks are a key language feature. 4 res.param[’posts’]. forEach(function(post) { 5 conn.query(’select * from users where id=’ + post Unfortunately, callbacks induce a non-linear control flow and can [’user’], function(err, results){ be deferred to execute asynchronously, declared anonymously, 6 conn.close(); and may be nested to arbitrary levels. All of these features make 7 res.send(results[0]); callbacks difficult to understand and maintain. 8 }); 9 }); We perform an empirical study to characterize JavaScript 10 }); callback usage across a representative corpus of 138 JavaScript 11 }); programs, with over 5 million lines of JavaScript code. We Listing 1. A representative JavaScript snippet illustrating the comprehension find that on average, every 10th function definition takes a and maintainability challenges associated with nested, anonymous callbacks callback argument, and that over 43% of all callback-accepting and asynchronous callback scheduling. function callsites are anonymous. Furthermore, the majority of callbacks are nested, more than half of all callbacks are asynchronous, and asynchronous callbacks, on average, appear more frequently in client-side code (72%) than server-side (55%).
    [Show full text]
  • Elmulating Javascript
    Linköping University | Department of Computer science Master thesis | Computer science Spring term 2016-07-01 | LIU-IDA/LITH-EX-A—16/042--SE Elmulating JavaScript Nils Eriksson & Christofer Ärleryd Tutor, Anders Fröberg Examinator, Erik Berglund Linköpings universitet SE–581 83 Linköping +46 13 28 10 00 , www.liu.se Abstract Functional programming has long been used in academia, but has historically seen little light in industry, where imperative programming languages have been dominating. This is quickly changing in web development, where the functional paradigm is increas- ingly being adopted. While programming languages on other platforms than the web are constantly compet- ing, in a sort of survival of the fittest environment, on the web the platform is determined by the browsers which today only support JavaScript. JavaScript which was made in 10 days is not well suited for building large applications. A popular approach to cope with this is to write the application in another language and then compile the code to JavaScript. Today this is possible to do in a number of established languages such as Java, Clojure, Ruby etc. but also a number of special purpose language has been created. These are lan- guages that are made for building front-end web applications. One such language is Elm which embraces the principles of functional programming. In many real life situation Elm might not be possible to use, so in this report we are going to look at how to bring the benefits seen in Elm to JavaScript. Acknowledgments We would like to thank Jörgen Svensson for the amazing support thru this journey.
    [Show full text]
  • Bryant Nelson
    Bryant K. Nelson, PhD (940) 902-5460 [email protected] bethune-bryant bryant-nelson Education: Doctor of Philosophy in Computer Science, Texas Tech University 2016 “Automatic Distributed Programming Using SequenceL” Bachelor of Science in Computer Science, Texas Tech University 2012 Bachelor of Science in Mathematics, Texas Tech University 2012 Professional Experience: Texas Multicore Technologies Inc., Software Development Engineer Jul 2012- Present Austin, Texas o Develop and extend the programming language, SequenceL, including work on the compiler, interpreter, debugger and IDE. Develop and maintain the primary libraries shipped with SequenceL. o Work with companies porting existing projects to SequenceL to make use of multicore hardware. o Speak at technical conferences and briefings. Design and lead technical workshops and training. o Primary Languages: SequenceL, C++, C#, Haskell, Bash, make, Python o Primary Tools: Jenkins, Git, Jira, Cross-OS Development (Linux/Mac/Windows) Tyler Technologies Inc., Software Developer Mar 2011- Aug 2012 Lubbock, Texas o As part of the Public Safety Team I worked on projects such as, Computer Aided Dispatch, Unit Mapping and Control, Records Management, Mobile Unit Interfaces, and Statistical Crime Analysis. o Primary Languages: Visual Basic 6, C# .NET, SQL Texas Tech University, Computer Science Undergraduate Research Assistant Aug 2010-Jul 2012 Lubbock, Texas o Worked closely with NASA improving and rewriting flight code in a more efficient new language, SequenceL. SequenceL is a declarative, automatic-parallelizing, high-level language. Texas Tech University, Computer Science Supplemental Instructor Aug 2009 - May 2010 Lubbock, Texas o Taught a Supplemental Computer Science class multiple times a week intended to supplement the information given by the professor, and to assist students in developing good study habits.
    [Show full text]
  • Designing Interdisciplinary Approaches to Problem Solving Into Computer Languages
    Designing Interdisciplinary Approaches to Problem Solving Into Computer Languages by Daniel E. Cooke (1), Vladik Kreinovich (2), and Joseph E. Urban (3) (1) Computer Science Department Texas Tech University; (2) Computer Science Department University of Texas at El Paso; (3) Computer Science and Engineering Department Arizona State University Abstract Many interdisciplinary design efforts require the involvement of computer scientists because of the complexity of the problem solving tools available for the projects. This paper demonstrates how appropriate language design can place high level languages in the hands of scientists and engineers, thus providing a more automated approach to problem solving that may reduce the amount of computer scientist involvement. The language SequenceL serves as an example of this approach. 1.0 Introduction There is an ongoing discussion at the highest levels of the United States government concerning "data morgues." The concern has to do with the current hardware capabilities that permit the acquisition and storage of vast amounts of data and the inability of scientists armed with current software technology to process and analyze the data. The current problem actually demonstrates that advances in computer software have not kept pace with advances in computer hardware. If corresponding software advances can be made, the data may be found to be comatose, rather than dead. Among other root problems, the comatose data is symptomatic of the fact that currently available software technology is not based upon abstractions that appropriately simplify approaches to complex problems and data sets, especially when the data sets are distributed among multiple processing elements. If large data sets containing, e.g., telemetry data, are to be analyzed, then exploratory or data mining programs must be written.
    [Show full text]
  • Evaluating Research Tool Usability on the Web
    Research.js: Evaluating Research Tool Usability on the Web Joel Galenson, Cindy Rubio-Gonzalez,´ Sarah Chasins, Liang Gong University of California, Berkeley fjoel,rubio,schasins,[email protected] Abstract To make research tools available online, current practice requires researchers to set up and run their own servers, Many research projects are publicly available but rarely used which run their tools on users’ inputs. Setting up such a due to the difficulty of building and installing them. We server can be a difficult, time-consuming, and costly pro- propose that researchers compile their projects to JavaScript cess. Because of load restrictions, this approach imposes a and put them online to make them more accessible to new limit on the number of concurrent users. Further, most re- users and thus facilitate large-scale online usability studies. search tools are not designed to be secure, which makes it 1. Motivation dangerous to run them on a server that accepts user inputs. When researchers create new programming languages and Some researchers also distribute their tools as virtual ma- tools, they sometimes choose to release them publicly. Un- chine images, but these are very heavyweight. fortunately, released projects are often complicated to in- We propose helping researchers compile their tools to stall, which makes it difficult to find enough users to con- JavaScript, thereby allowing anyone with a web browser to duct large-scale usability studies. Yet releasing tools that are use them. This would enable researchers to make their tools accessible to users is typically difficult for researchers. We available online without running their own secure servers.
    [Show full text]
  • Using Static Analysis for Ajax Intrusion Detection
    Using Static Analysis for Ajax Intrusion Detection Arjun Guha Shriram Krishnamurthi Trevor Jim Brown University Brown University AT&T Labs-Research [email protected] [email protected] [email protected] ABSTRACT We have built a static control-flow analyzer for the client We present a static control-flow analysis for JavaScript pro- portion of Ajax web applications. The analyzer operates html grams running in a web browser. Our analysis tackles nu- on the and JavaScript code that constitute the pro- merous challenges posed by modern web applications includ- gram executed by the web browser, and it produces a flow url ing asynchronous communication, frameworks, and dynamic graph of s that the client-side program can invoke on the code generation. We use our analysis to extract a model of server. We install this request graph in a reverse proxy that expected client behavior as seen from the server, and build monitors all requests; any request that does not conform to an intrusion-prevention proxy for the server: the proxy inter- this graph constitutes a potential attack. Our tool can pre- xss cepts client requests and disables those that do not meet the vent many common cross-site scripting ( ) and cross-site csrf expected behavior. We insert random asynchronous requests request forgery ( ) attacks. to foil mimicry attacks. Finally, we evaluate our technique Our work is inspired by that of Wagner and Dean [33] and § against several real applications and show that it protects others (see 9), who used program analysis to build system against an attack in a widely-used web application.
    [Show full text]
  • Comparative Programming Languages CM20253
    We have briefly covered many aspects of language design And there are many more factors we could talk about in making choices of language The End There are many languages out there, both general purpose and specialist And there are many more factors we could talk about in making choices of language The End There are many languages out there, both general purpose and specialist We have briefly covered many aspects of language design The End There are many languages out there, both general purpose and specialist We have briefly covered many aspects of language design And there are many more factors we could talk about in making choices of language Often a single project can use several languages, each suited to its part of the project And then the interopability of languages becomes important For example, can you easily join together code written in Java and C? The End Or languages And then the interopability of languages becomes important For example, can you easily join together code written in Java and C? The End Or languages Often a single project can use several languages, each suited to its part of the project For example, can you easily join together code written in Java and C? The End Or languages Often a single project can use several languages, each suited to its part of the project And then the interopability of languages becomes important The End Or languages Often a single project can use several languages, each suited to its part of the project And then the interopability of languages becomes important For example, can you easily
    [Show full text]
  • An Evaluation of Reactive Programming and Promises for Structuring Collaborative Web Applications
    An Evaluation of Reactive Programming and Promises for Structuring Collaborative Web Applications Kennedy Kambona Elisa Gonzalez Boix Wolfgang De Meuter Software Languages Lab Software Languages Lab Software Languages Lab Vrije Universiteit Brussel Vrije Universiteit Brussel Vrije Universiteit Brussel Brussels, Belgium Brussels, Belgium Brussels, Belgium [email protected] [email protected] [email protected] ABSTRACT gives birth to a variety of challenges. The most notable one JavaScript programs are highly event-driven, resulting in that has recently gained high recognition among JavaScript `asynchronous spaghetti' code that is difficult to maintain enthusiasts is the asynchronous spaghetti[16]: deeply-nested as the magnitude programs written in the language grows. callbacks that have dependencies on data that have been To reduce the effects of this callback hell, various concepts returned from previous asynchronous invocations. have been employed by a number of JavaScript libraries and Since callbacks are common in JavaScript, programmers frameworks. In this paper we investigate the expressive- end up losing the ability to think in the familiar sequential ness of two such techniques, namely reactive extensions and algorithms and end up dealing with an unfamiliar program promises. We have done this by means of a case study con- structure. A program might be forced to shelve program sisting of an online collaborative drawing editor. The editor execution aside and continue when a return value becomes supports advanced drawing features which we try to model available in the unforeseen future while in the meantime ex- using the aforementioned techniques. We then present a ecution continues performing some other computation. This discussion on our overall experience in implementing the ap- structure forces programmers to write their applications in plication using the two concepts.
    [Show full text]