Optionale Typen

Total Page:16

File Type:pdf, Size:1020Kb

Optionale Typen Höllische Programmiersprachen Masterseminar im Wintersemester 2014/2015 Optionale Typen Michael Lux Technische Universität München betreut durch Ralf Vogler 18.12.2014 Abstract This work is about optional typing, an approach to facilitate advan- tages of static typing like high eciency and early error detection in dy- namically typed programming languages without loosing the advantages and dynamics of the latter. As an example, it will be shown how recent JavaScript development tools make use of optional typing to facilitate those advantages in practice. 1 Introduction In the long history of software development, many programming languages be- came established. As many of them target specic application elds, whereas others are meant to be as generic as possible, there exists a broad variety of dif- ferent classes of programming languages nowadays, like imperative languages, declarative languages, object-oriented languages, or functional ones, to name just a few. One criterion, maybe one of the most obvious ones to tell dierent kinds of programming languages apart, is the so-called type system of a programming language. A type system is a syntactic method for automatically checking the absence of certain erroneous behaviors by classifying program phrases according to the kinds of values they compute. [12] Of course, there are also various type systems, but at the bottom line, all programming languages can be roughly divided into dynamically and statically typed languages [14]. Both kinds of type systems have individual advantages and disadvantages in terms of usability, type safety, performance and many more aspects. 1 This work is about usage of optional typing, an approach to bring some advantages of static typing into dynamically typed programming languages by oering an opportunity to statically dene types (either via new language constructs or via hints with normal features of the programming language) within the code whenever this is desired. Optional typing can be seen as a subsume of a number of related concepts such as gradual typing, soft typing and pluggable typing [14]. It is dicult to give an exact denition of optional typing, as the whole topic is still an active area of research [14]. In this work, the advantages and disadvantages of dynamic type systems over static type systems are briey explained rst. Secondly, two dierent approaches to introduce optional (static) types in JavaScript will be pre- sented, namely asm.js [5], a JavaScript subset for type hinting, and Flow [4], a meta-language for optional typing. Then, the focus will be on two important advantages that can be achieved using optional types: Performance improvements (or, to be more exact, improved runtime eciency) and early detection of errors (i.e. typing errors) prior to execution. Finally, the work concludes with some considerations about the usefulness of optional typing for application development, using the example of JavaScript. 2 (Dis)Advantages of Dynamic Type Systems The dierence between statically and dynamically typed languages is that the former can check the correctness of the types of variables and parameters at compile time, whereas the latter can only check those types at runtime [14]. Both statically and dynamically typed programming languages have a long, rich history. The rst programming language considered a high level programming language was FORTRAN, released in 1957 [10]. FORTRAN is, as might be intuitively assumed, a statically typed language. However, the rst dynamically typed language, LISP, was released only shortly after in 1958 [9]. This historical fact shows, that even at a time where computational power was magnitudes lower than those of today's computers, it seems that there have already been good reasons to use dynamic typing despite of it's drawbacks in terms of performance. 2.1 Advantages The rst very obvious advantage of dynamic typing is the shallower learning curve for programming beginners. Where advanced programmers are familiar with typing and related concepts, it can be quite confusing for beginners to even tell oating point numbers and integer numbers apart, not to mention type con- version, representation of boolean values or strings, and so on. Another point is the vast exibility of dynamic typing. Imagine a function that 2 sums up an array of values. In a statically typed language, one has to dene one function for each data type, e.g. one for arrays of integer values, another one for arrays of oat values, and so on. In a dynamically typed language, the function has to be written only once and can be used with any type of data that semantically makes sense. The same applies for the so-called duck typing [2], where objects with the same set of visible methods and attributes can be equally used, no matter which class they've been derived from. This leads to the nding that dynamic typing also enables, in general, faster de- velopment and ecient (i.e. fast) prototyping. For static typing, programmers always have to consider which type of data suits best for the specic applica- tion, and set up something that might be called a type contract. On the other side, when using dynamic typing, programmers can just write down the code without thinking about typing, and later adapt relevant portions of the code as required. 2.2 Disadvantages The most obvious disadvantage of dynamic typing is a loss of eciency. In statically typed languages, compilers can exploit the type information to produce more ecient code [1] and don't have to put runtime checks of types into the code. This might not be an essential issue for many applications, but it can become a problem when eciency matters, for example for scientic computing. In section 4, we will explain how optional typing can help to alleviate this issue. As dynamic type systems don't enforce types at compile time, misinter- pretation of the meaning of a function or accidental passing of wrong parameter types is also a severe issue that may result in unexpected behavior. This gets much worse when the programming language is weakly typed, i.e. does a lot of automatic type conversion based on assumptions about the most likely meaning of an expression. Let's consider a piece of JavaScript code given in Figure 1. 1 function sum(array){ 2 var sum = 0; 3 for(i = 0;i< array.length;i++) { 4 sum += array[i]; 5 } 6 return sum; 7 } 8 9 sum([1,2,3]);// result:6 10 sum(["1", 2, 3]);// result: "0123" Figure 1: sum function with invocations 3 The rst call to sum() with integer parameters yields the (most likely) expected result, the latter one might not be what the programmer expected. This happens because the + operator in JavaScript is ambiguously used for an arithmetic operation as well as string concatenation. Such errors may be xed with stronger type systems. In Python, for instance, such code would raise a TypeError, as all numeric values must be explicitly converted to strings before being concatenated there. Of course, this xes only half of the problem, as errors still can't be detected before execution. However, there are much more complex errors of this manner, like returning of null in PHP or undened in JavaScript to indicate an error, whereas the programmer expects an object and doesn't consider possible error states. It will also be shown how optional typing can help with this issue. Furthermore, as it has already been shown in Figure 1 that typing errors in dynamically typed languages can be very hard to trace and track down. Technically, the second call to the sum() function returns a perfectly valid value. This value may be further processed at dierent places and nally cause either a wrong output or a crash at some other point in time where the root cause of the failure is everything but obvious. One worst case scenario is shown in Figure 2, where the result is even forced back to the type originally expected without any hassle. Such invocations mask the error, making it almost impossible to detect the cause of wrong results. 1 sum(["1", 2, 3]) - 3;// result: 120 Figure 2: really bad invocation of sum 3 Optional Typing in Practice In the past, there has been a lot of research on how to utilize the benets of static typing in dynamically typed languages, but without integration of this approaches in any mainstream programming language [14]. However, over the past few years approaches began to emerge that try to adopt this idea in practice. This section takes a look at two of them: asm.js [5], that was developed by Mozilla and Flow [4], which was developed by facebook. 3.1 Optional Typing in asm.js Asm.js exploits the ECMAScript denitions to enforce certain native types on variables and parameters using standard JavaScript operators. For instance, ECMA-262 denes the bitwise-or-operation to be performed on 32 bit integer values, which means that an expression like x|0 corresponds to the 32 bit integer value of x. As a subset of JavaScript, it maintains full compatibility 4 to existing JavaScript interpreters according to the ECMAScript standard [6]. A very simple asm.js script is shown in Figure 3. Here, the bitwise-or-operation with the neutral element 0 is used to tell an asm.js-aware JavaScript inter- preter that the inputs as well as the return value of the function have to be 32 bit integer values. 1 function compiledCalculation(){ 2 varx=f()|0;//x isa 32-bit value 3 vary=g()|0;// so isy 4 return(x+y)|0;// 32-bit addition, no type or overflow checks 5 } Figure 3: asm.js example code This ECMAScript-compatible nota- tion comes at a cost: To take advan- tage of the speed improvements, pro- grammers must provide consistent, correct types for both input values and return values.
Recommended publications
  • Interaction Between Web Browsers and Script Engines
    IT 12 058 Examensarbete 45 hp November 2012 Interaction between web browsers and script engines Xiaoyu Zhuang Institutionen för informationsteknologi Department of Information Technology Abstract Interaction between web browser and the script engine Xiaoyu Zhuang Teknisk- naturvetenskaplig fakultet UTH-enheten Web browser plays an important part of internet experience and JavaScript is the most popular programming language as a client side script to build an active and Besöksadress: advance end user experience. The script engine which executes JavaScript needs to Ångströmlaboratoriet Lägerhyddsvägen 1 interact with web browser to get access to its DOM elements and other host objects. Hus 4, Plan 0 Browser from host side needs to initialize the script engine and dispatch script source code to the engine side. Postadress: This thesis studies the interaction between the script engine and its host browser. Box 536 751 21 Uppsala The shell where the engine address to make calls towards outside is called hosting layer. This report mainly discussed what operations could appear in this layer and Telefon: designed testing cases to validate if the browser is robust and reliable regarding 018 – 471 30 03 hosting operations. Telefax: 018 – 471 30 00 Hemsida: http://www.teknat.uu.se/student Handledare: Elena Boris Ämnesgranskare: Justin Pearson Examinator: Lisa Kaati IT 12 058 Tryckt av: Reprocentralen ITC Contents 1. Introduction................................................................................................................................
    [Show full text]
  • Defensive Javascript Building and Verifying Secure Web Components
    Defensive JavaScript Building and Verifying Secure Web Components Karthikeyan Bhargavan1, Antoine Delignat-Lavaud1, and Sergio Maffeis2 1 INRIA Paris-Rocquencourt, France 2 Imperial College London, UK Abstract. Defensive JavaScript (DJS) is a typed subset of JavaScript that guarantees that the functional behavior of a program cannot be tampered with even if it is loaded by and executed within a malicious environment under the control of the attacker. As such, DJS is ideal for writing JavaScript security components, such as bookmarklets, single sign-on widgets, and cryptographic libraries, that may be loaded within untrusted web pages alongside unknown scripts from arbitrary third par- ties. We present a tutorial of the DJS language along with motivations for its design. We show how to program security components in DJS, how to verify their defensiveness using the DJS typechecker, and how to analyze their security properties automatically using ProVerif. 1 Introduction Since the advent of asynchronous web applications, popularly called AJAX or Web 2.0, JavaScript has become the predominant programming language for client-side web applications. JavaScript programs are widely deployed as scripts in web pages, but also as small storable snippets called bookmarklets, as down- loadable web apps,1 and as plugins or extensions to popular browsers.2 Main- stream browsers compete with each other in providing convenient APIs and fast JavaScript execution engines. More recently, Javascript is being used to program smartphone and desktop applications3, and also cloud-based server ap- plications,4 so that now programmers can use the same idioms and libraries to write and deploy a variety of client- and server-side programs.
    [Show full text]
  • Typescript-Handbook.Pdf
    This copy of the TypeScript handbook was created on Monday, September 27, 2021 against commit 519269 with TypeScript 4.4. Table of Contents The TypeScript Handbook Your first step to learn TypeScript The Basics Step one in learning TypeScript: The basic types. Everyday Types The language primitives. Understand how TypeScript uses JavaScript knowledge Narrowing to reduce the amount of type syntax in your projects. More on Functions Learn about how Functions work in TypeScript. How TypeScript describes the shapes of JavaScript Object Types objects. An overview of the ways in which you can create more Creating Types from Types types from existing types. Generics Types which take parameters Keyof Type Operator Using the keyof operator in type contexts. Typeof Type Operator Using the typeof operator in type contexts. Indexed Access Types Using Type['a'] syntax to access a subset of a type. Create types which act like if statements in the type Conditional Types system. Mapped Types Generating types by re-using an existing type. Generating mapping types which change properties via Template Literal Types template literal strings. Classes How classes work in TypeScript How JavaScript handles communicating across file Modules boundaries. The TypeScript Handbook About this Handbook Over 20 years after its introduction to the programming community, JavaScript is now one of the most widespread cross-platform languages ever created. Starting as a small scripting language for adding trivial interactivity to webpages, JavaScript has grown to be a language of choice for both frontend and backend applications of every size. While the size, scope, and complexity of programs written in JavaScript has grown exponentially, the ability of the JavaScript language to express the relationships between different units of code has not.
    [Show full text]
  • Expanding the Power of Csound with Integrated Html and Javascript
    Michael Gogins. Expanding the Power of Csound with Intergrated HTML and JavaScript EXPANDING THE POWER OF CSOUND WITH INTEGRATED HTML AND JAVA SCRIPT Michael Gogins [email protected] https://michaelgogins.tumblr.com http://michaelgogins.tumblr.com/ This paper presents recent developments integrating Csound [1] with HTML [2] and JavaScript [3, 4]. For those new to Csound, it is a “MUSIC N” style, user- programmable software sound synthesizer, one of the first yet still being extended, written mostly in the C language. No synthesizer is more powerful. Csound can now run in an interactive Web page, using all the capabilities of current Web browsers: custom widgets, 2- and 3-dimensional animated and interactive graphics canvases, video, data storage, WebSockets, Web Audio, mathematics typesetting, etc. See the whole list at HTML5 TEST [5]. Above all, the JavaScript programming language can be used to control Csound, extend its capabilities, generate scores, and more. JavaScript is the “glue” that binds together the components and capabilities of HTML5. JavaScript is a full-featured, dynamically typed language that supports functional programming and prototype-based object- oriented programming. In most browsers, the JavaScript virtual machine includes a just- in-time compiler that runs about 4 times slower than compiled C, very fast for a dynamic language. JavaScript has limitations. It is single-threaded, and in standard browsers, is not permitted to access the local file system outside the browser's sandbox. But most musical applications can use an embedded browser, which bypasses the sandbox and accesses the local file system. HTML Environments for Csound There are two approaches to integrating Csound with HTML and JavaScript.
    [Show full text]
  • Learn Javascript
    Learn JavaScript Steve Suehring Copyright © 2012 by Steve Suehring All rights reserved. No part of the contents of this book may be reproduced or transmitted in any form or by any means without the written permission of the publisher. ISBN: 978-0-7356-6674-0 1 2 3 4 5 6 7 8 9 LSI 7 6 5 4 3 2 Printed and bound in the United States of America. Microsoft Press books are available through booksellers and distributors worldwide. If you need support related to this book, email Microsoft Press Book Support at [email protected]. Please tell us what you think of this book at http://www.microsoft.com/learning/booksurvey. Microsoft and the trademarks listed at http://www.microsoft.com/about/legal/en/us/IntellectualProperty/ Trademarks/EN-US.aspx are trademarks of the Microsoft group of companies. All other marks are property of their respective owners. The example companies, organizations, products, domain names, email addresses, logos, people, places, and events depicted herein are fictitious. No association with any real company, organization, product, domain name, email address, logo, person, place, or event is intended or should be inferred. This book expresses the author’s views and opinions. The information contained in this book is provided without any express, statutory, or implied warranties. Neither the authors, Microsoft Corporation, nor its resellers, or distributors will be held liable for any damages caused or alleged to be caused either directly or indirectly by this book. Acquisitions and Developmental Editor: Russell Jones Production Editor: Rachel Steely Editorial Production: Dianne Russell, Octal Publishing, Inc.
    [Show full text]
  • Research-Based Comparison of Top20 Javascript Frameworks & Libraries Picked by Remote Developers in 2020
    Research-Based Comparison of Top20 JavaScript Frameworks & Libraries Picked by Remote Developers in 2020 Original # of Websites # of Devs Used Top 3 Countries with # of # of Ranking on # of Open Average JS Frameworks/ # of Stars Average Dev Type Founded by Release Ideal for Size Powered by a It (2019, the Highest % of Contributors Forks on Stack Overflow Vacancies on Hourly Rate Learnability Libraries on GitHub Salary (USA) Year Framework Worldwide) Usage on GitHub GitHb (2019) LinkedIn (USA) US React JavaScript library Facebook 2011 UI 133KB 380,164 71.7% Russia 146,000 1,373 28,300 1 130,300 $91,000.00 $35.19 Moderate Germany US Single-page apps and dynamic web Angular Front-end framework Google 2016 566KB 706,489 21.9% UK 59,000 1,104 16,300 2 94,282 $84,000.00 $39.14 Moderate apps Brazil US Vue.js Front-end framework Evan You 2014 UI and single-page applications 58.8KB 241,б615 40.5% Russia 161,000 291 24,300 5 27,395 $116,562.00 $42.08 Easy Germany US Ember.js Front-end framework Yehuda Katz 2011 Scalable single-page web apps 435KB 20,985 3.6% Germany 21,400 782 4,200 8 3,533 $105,315.00 $51.00 Difficult UK US Scalable web, mobile and desktop Meteor App platform Meteor Software 2012 4.2MB 8,674 4% Germany 41,700 426 5,100 7 256 $96,687.00 $27.92 Moderate apps France US JavaScript runtime Network programs, such as Web Node.js Ryan Dahl 2009 141KB 1,610,630 49.9% UK 69,000 2,676 16,600 not included 52,919 $104,964.00 $33.78 Moderate (server) environment servers Germany US Polymer JS library Google 2015 Web apps using web components
    [Show full text]
  • Concrete Types for Typescript
    Concrete Types for TypeScript Gregor Richards1, Francesco Zappa Nardelli2, and Jan Vitek3 1 University of Waterloo 2 Inria 3 Northeastern University Abstract TypeScript extends JavaScript with optional type annotations that are, by design, unsound and, that the TypeScript compiler discards as it emits code. This design point preserves programming idioms developers are familiar with, and allows them to leave their legacy code unchanged, while offering a measure of static error checking in annotated parts of the program. We present an alternative design for TypeScript that supports the same degree of dynamism but that also allows types to be strengthened to provide correctness guarantees. We report on an implementation, called StrongScript, that improves runtime performance of typed programs when run on a modified version of the V8 JavaScript engine. 1998 ACM Subject Classification F.3.3 Type structure Keywords and phrases Gradual typing, dynamic languages Digital Object Identifier 10.4230/LIPIcs.ECOOP.2015.999 1 Introduction Perhaps surprisingly, a number of modern computer programming languages have been de- signed with intentionally unsound type systems. Unsoundness arises for pragmatic reasons, for instance, Java has a covariant array subtype rule designed to allow for a single polymor- phic sort() implementation. More recently, industrial extensions to dynamic languages, such as Hack, Dart and TypeScript, have featured optional type systems [5] geared to ac- commodate dynamic programming idioms and preserve the behavior of legacy code. Type annotations are second class citizens intended to provide machine-checked documentation, and only slightly reduce the testing burden. Unsoundness, here, means that a variable an- notated with some type T may, at runtime, hold a value of a type that is not a subtype of T due to unchecked casts, covariant subtyping, and untyped code.
    [Show full text]
  • Readme for 3Rd Party Software FIN Framework
    Smart Infrastructure Note to Resellers: Please pass on this document to your customer to avoid license breach and copyright infringements. Third-Party Software Information for FIN Framework 5.0.7 J2 Innovations Inc. is a Siemens company and is referenced herein as SIEMENS. This product, solution or service ("Product") contains third-party software components listed in this document. These components are Open Source Software licensed under a license approved by the Open Source Initiative (www.opensource.org) or similar licenses as determined by SIEMENS ("OSS") and/or commercial or freeware software components. With respect to the OSS components, the applicable OSS license conditions prevail over any other terms and conditions covering the Product. The OSS portions of this Product are provided royalty-free and can be used at no charge. If SIEMENS has combined or linked certain components of the Product with/to OSS components licensed under the GNU LGPL version 2 or later as per the definition of the applicable license, and if use of the corresponding object file is not unrestricted ("LGPL Licensed Module", whereas the LGPL Licensed Module and the components that the LGPL Licensed Module is combined with or linked to is the "Combined Product"), the following additional rights apply, if the relevant LGPL license criteria are met: (i) you are entitled to modify the Combined Product for your own use, including but not limited to the right to modify the Combined Product to relink modified versions of the LGPL Licensed Module, and (ii) you may reverse-engineer the Combined Product, but only to debug your modifications.
    [Show full text]
  • Visual Studio “Code in Strings”
    VisCis: Visual Studio “Code in Strings” Paul Roper School of Business and Computer Technology Nelson Marlborough Institute of Technology Nelson, NZ [email protected] When developing web applications using Visual Studio .NET SQL and Javascript. This code is ignored by Visual there are times when the programmer is coding either SQL or Javascript within text strings. Consequently such code is never Studio, and consequently can be the source of run- checked for correct syntax before it is run. As far as Visual time errors. The writer wanted to see if another Studio is concerned, the contents of a string are irrelevant. As program could extract this “code in strings” and syn- long as the code is inside matching quotes, it is simply a valid string. tax check it at edit-time, potentially saving devel- There is an irony here in that Visual Studio is a sophisticated oper time and frustration. tool with powerful features for developers such as highlighting syntax errors as lines are typed. However, the SQL and 1.1 SQL in ASP.NET program code Javascript code inside strings is just as prone to errors as any other code but these errors are only discovered at run time. In SQL instructions have long been part of web terms of time taken to find and fix, they probably consume application code (Java, ASP, PHP etc). Both stu- relatively more time per lines of code than the VB or C# code that is thoroughly checked at edit-time. Both SQL and Javascript dents and experienced developers frequently expe- are necessary for any non-trivial web application although the rience problems with the syntax of embedded SQL use of stored procedures in MSSQL removes SQL code from particularly unmatched quotes, inadvertent use of a program code.
    [Show full text]
  • Formally Verifying Webassembly with Kwasm
    Formally Verifying WebAssembly with KWasm Towards an Automated Prover for Wasm Smart Contracts Master’s thesis in Computer Science and Engineering RIKARD HJORT Department of Computer Science and Engineering CHALMERS UNIVERSITY OF TECHNOLOGY UNIVERSITY OF GOTHENBURG Gothenburg, Sweden 2020 Master’s thesis 2020 Formally Verifying WebAssembly with KWasm Towards an Automated Prover for Wasm Smart Contracts RIKARD HJORT Department of Computer Science and Engineering Chalmers University of Technology University of Gothenburg Gothenburg, Sweden 2020 Formally Verifying WebAssembly with KWasm Towards an Automated Prover for Wasm Smart Contracts RIKARD HJORT © RIKARD HJORT, 2020. Supervisor: Thomas Sewell, Department of Computer Science and Engineering Examiner: Wolfgang Ahrendt, Department of Computer Science and Engineering Master’s Thesis 2020 Department of Computer Science and Engineering Chalmers University of Technology and University of Gothenburg SE-412 96 Gothenburg Telephone +46 31 772 1000 Cover: Conceptual rendering of the KWasm system, as the logos for K ans Web- Assembly merged together, with a symbolic execution proof tree protruding. The cover image is made by Bogdan Stanciu, with permission. The WebAssembly logo made by Carlos Baraza and is licensed under Creative Commons License CC0. The K logo is property of Runtime Verification, Inc., with permission. Typeset in LATEX Gothenburg, Sweden 2020 iv Formally Verifying WebAssembly with KWasm Towards an Automated Prover for Wasm Smart Contracts Rikard Hjort Department of Computer Science and Engineering Chalmers University of Technology and University of Gothenburg Abstract A smart contract is immutable, public bytecode which handles valuable assets. This makes it a prime target for formal methods. WebAssembly (Wasm) is emerging as bytecode format for smart contracts.
    [Show full text]
  • Intro to Javascript
    1 Intro to Javascript CS380 Client Side Scripting 2 CS380 Why use client-side programming? 3 PHP already allows us to create dynamic web pages. Why also use client-side scripting? client-side scripting (JavaScript) benefits: usability : can modify a page without having to post back to the server (faster UI) efficiency : can make small, quick changes to page without waiting for server event-driven : can respond to user actions like clicks and key presses CS380 Why use client-side programming? 4 server-side programming (PHP) benefits: security : has access to server's private data; client can't see source code compatibility : not subject to browser compatibility issues power : can write files, open connections to servers, connect to databases, ... CS380 What is Javascript? 5 a lightweight programming language ("scripting language") used to make web pages interactive insert dynamic text into HTML (ex: user name) react to events (ex: page load user click) get information about a user's computer (ex: browser type) perform calculations on user's computer (ex: form validation) CS380 What is Javascript? 6 a web standard (but not supported identically by all browsers) NOT related to Java other than by name and some syntactic similarities CS380 Javascript vs Java 7 interpreted, not compiled more relaxed syntax and rules fewer and "looser" data types variables don't need to be declared errors often silent (few exceptions) key construct is the function rather than the class "first-class" functions are used in many situations contained within a web page and integrates with its HTML/CSS content CS380 Javascript vs Java 8 + = CS380 JavaScript vs.
    [Show full text]
  • Preview Javascript Tutorial
    About the Tutorial JavaScript is a lightweight, interpreted programming language. It is designed for creating network-centric applications. It is complimentary to and integrated with Java. JavaScript is very easy to implement because it is integrated with HTML. It is open and cross-platform. Audience This tutorial has been prepared for JavaScript beginners to help them understand the basic functionality of JavaScript to build dynamic web pages and web applications. Prerequisites For this tutorial, it is assumed that the reader have a prior knowledge of HTML coding. It would help if the reader had some prior exposure to object-oriented programming concepts and a general idea on creating online applications. Copyright and Disclaimer Copyright 2015 by Tutorials Point (I) Pvt. Ltd. All the content and graphics published in this e-book are the property of Tutorials Point (I) Pvt. Ltd. The user of this e-book is prohibited to reuse, retain, copy, distribute or republish any contents or a part of contents of this e-book in any manner without written consent of the publisher. We strive to update the contents of our website and tutorials as timely and as precisely as possible, however, the contents may contain inaccuracies or errors. Tutorials Point (I) Pvt. Ltd. provides no guarantee regarding the accuracy, timeliness or completeness of our website or its contents including this tutorial. If you discover any errors on our website or in this tutorial, please notify us at [email protected] i Table of Contents About the Tutorial ............................................................................................................................................
    [Show full text]