Code Staging in GNU Guix

Total Page:16

File Type:pdf, Size:1020Kb

Code Staging in GNU Guix Code Staging in GNU Guix Ludovic Courtès Inria Bordeaux, France Abstract means that software build processes are considered as pure GNU Guix is a “functional” package manager that builds functions: given a set of inputs (compiler, libraries, build upon earlier work on Nix. Guix implements high-level ab- scripts, and so on), a package’s build function is assumed stractions such as packages and operating system services to always produce the same result. Build results are stored as domain-specific languages (DSLs) embedded in Scheme. in an immutable persistent data structure, the store, imple- It also implements build actions and operating system or- mented as a single directory, /gnu/store. Each entry in /- chestration in Scheme. This leads to a multi-tier program- gnu/store has a file name composed of the hash of all the ming environment where embedded code snippets are staged build inputs used to produce it, followed by a symbolic name. for eventual execution. For example, /gnu/store/yr9rk90jf...-gcc-7.1.0identi- This paper presents G-expressions or “gexps”, the staging fies a specific build of GCC 7.1. A variant of GCC 7.1, for mechanism we devised for Guix. We explain our journey instance one using different build options or different de- from traditional Lisp S-expressions to G-expressions, which pendencies, would get a different hash. Thus, each store file augment the former with contextual information and en- name uniquely identifies build results, and build processes sure hygienic code staging. We discuss the implementation are referentially transparent. This simplifies reasoning on of gexps and report on our experience using them in a vari- complex package compositions, and also has nice properties ety of operating system use cases—from package build pro- such as supporting transactional upgrades and rollback “for cesses to system services. Gexps provide a novel way to free.” The Guix System Distribution (or GuixSD) and NixOS cover many aspects of OS configuration in a single, multi- extend the functional paradigm to whole operating system tier language, while facilitating code reuse and code shar- deployments [6]. ing. Guix implements this functional deployment paradigm pioneered by Nix but, as explained in previous work, its CCS Concepts • Software and its engineering → Source implementation departs from Nix in interesting ways [3]. code generation; Functional languages; System administra- First, while Nix relies on a custom domain-specific language tion; (DSL), the Nix language, Guix instead implements a set of Keywords Code staging, Scheme, Software deployment DSLs and data structures embedded in the general-purpose language Scheme. This simplifies the development of user ACM Reference Format: interfaces and tools, and allows users to benefit from every- Ludovic Courtès. 2017. Code Staging in GNU Guix. In Proceedings thing a general-purpose language brings: compiler, debug- of 16th ACM SIGPLAN International Conference on Generative Pro- gramming: Concepts and Experiences (GPCE’17). ACM, New York, ger, REPL, editor support, libraries, and so on. NY, USA, 9 pages. hps://doi.org/10.1145/3136040.3136045 (define hello (package arXiv:1709.00833v1 [cs.PL] 4 Sep 2017 1 Introduction (name "hello") Users of free operating systems such as GNU/Linux are used (version "2.8") (source (origin to package managers like Debian’s apt-get, which allow (method url-fetch) them to install, upgrade, and remove software from a large (uri (string-append "mirror://gnu/hello/hello-" 1 version ".tar.gz")) collection of free software packages. GNU Guix is a func- (sha256 (base32 "0wqd8...")))) tional package manager that builds upon the ideas devel- (build-system gnu-build-system) (arguments oped for Nix by Dolstra et al. [5]. The term “functional” ’(#:configure-flags ‘("--disable-color" 1https://gnu.org/software/guix ,(string-append "--with-gawk=" (assoc-ref %build-inputs "gawk"))))) Copyright ©2017 Ludovic Courtès. (inputs ‘(("gawk" ,gawk))) (synopsis "GNU Hello") Permission is granted to copy, distribute and/or modify this document un- (description "Example of a GNU package.") der the terms of the GNU Free Documentation License, Version 1.3 or any (home-page "https://gnu.org/software/hello/") later version published by the Free Software Foundation; with no Invari- (license gpl3+))) ant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at hps://www.gnu.org/licenses/gfdl.html. Figure 1. A package definition using the high-level inter- The source of this document is available from face. hps://git.sv.gnu.org/cgit/guix/maintenance.git. GPCE’17, October 23–24, 2017, Vancouver, Canada Ludovic Courtès (let* ((store (open-connection)) In Guix, high-level package definitions like the one shown (drv (package-derivation store imagemagick)) in Figure 1 are compiled to derivations, the low-level repre- (image (add-to-store store "image.png" #t "sha256" "./GuixSD.png")) sentation of build actions inherited from Nix. A derivation (build specifies: a command to run to perform the build (the build ’(let ((imagemagick (assoc-ref %build-inputs "imagemagick")) program), environment variables to be defined, and deriva- (image (assoc-ref %build-inputs "image"))) tions whose build result it depends on. Derivations are sent (mkdir %output) (system* (string-append imagemagick "/bin/convert") to a privileged daemon, which is responsible for building "-quality" "75%" them on behalf of clients. The build daemon creates isolated image (string-append %output "/image.jpg"))))) environments (containers in a chroot) in which it spawns (build-expression->derivation store "example" build the build program; isolated build environments ensure that #:inputs ‘(("imagemagick" ,drv) build programs do not depend on undeclared inputs. ("image" ,image)))) The second way in which Guix departs from Nix is by Figure 2. First attempt: build expressions as sexps. using the same language, Scheme, for all its functionality. While package definitions in Nix can embed Bash or Perl snippets to refine build steps, Guix package definitions in- the file GuixSD.png to /gnu/store.The variable build con- stead embed Scheme code. Consequently, we have two strata tains our build program as an sexp (the apostrophe is equiva- of Scheme code: the host code, which provides the package lent to quote; it introduces unevaluated code). Finally, build-- definition, and the build code, which is staged for later exe- expression->derivationtakesthebuild programandcom- cution by the build daemon. putes the corresponding derivation without building it. The This paper focuses on code staging in Guix. Our contribu- user can then make an RPC to the daemon asking it to build tion is twofold: we present G-expressions (or “gexps”), a new this derivation; only then will the daemon create an isolated code staging mechanism implemented through mere syntac- environment and run our build program. tic extensions of the Scheme language; we show the use of build-expression->derivation arranges so that the gexps in several areas of the “orchestration” programs of the build program, build, is evaluated in a context where two operating system. Section 2 discusses the early attempt at extra variables are defined: %build-inputs contains a list code staging in Guix, as mentioned in [3], and its shortcom- that maps labels, such as "imagemagick",to file names, such ings. Section 3 presents the design and implementation of as /gnu/store/...-imagemagick-6.9,and %output contains gexps. Section 4 reports on our experience using gexps in a the file name for the result of this derivation. Thus, the assoc-- variety of areas in Guix and GuixSD. Section 5 discusses lim- ref calls in build allow it to retrieve the file name of Im- itations and future work. Finally Section 6 compares gexps ageMagick. to related work and Section 7 concludes. 2.2 S-Expressions Are Not Enough Needless to say, this interface was extremely verbose and 2 Early Attempt inconvenient—fortunately, users usually only had to deal Scheme is a dialect of Lisp, and Lisp is famous for its its with the more pleasant package interface shown in Figure direct representation of code as a data structure using the 1. All these steps are necessary to define the derivation and same syntax. “S-expressions” or “sexps”, Lisp’s parenthecal its dependencies, but where does the verbosity come from? expressions, thus look like they lend themselves to code stag- First, we have to explicitly call package-derivation for ing. In this section we show how our early experience made each package the expression refers to. Second, we have to it clear that we needed an augmented version of sexps. specify the inputs with labels at the call site. Third, the build code has to use this assoc-ref call just to retrieve the /- gnu/store 2.1 Staging Build Expressions file name of its inputs. It is error-prone: if we omit the #:inputs parameter, of if we mispell an input la- In previous work [3], we presented our first attempt at writ- bel, we will only find out when we build the derivation. ing build expressions in Scheme, which relied solely on Lisp Another limitation not visible on a toy example but that quotation [2]. Figure 2 shows an example that creates a deriva- became clear as we developed GuixSD is the cost of carry- tion that, when built, converts the input image to JPEG, us- ing this #:inputs argument down to the call site. It forces ing the convertprogram from the ImageMagickpackage—this programmers to carry not only the build expression, build, is equivalent to a three-line makefile rule, but referentially but also the corresponding inputs argument, and makes it transparent. In this example, variable store represents the very hard to compose build expressions. connection to the build daemon. The package-derivation While quote allowed us to easily represent code, it clearly function takes the imagemagick package object and com- lacked some of the machinery that would make staging in putes its corresponding derivation, while the add-to-store Guix more convenient.
Recommended publications
  • Processing an Intermediate Representation Written in Lisp
    Processing an Intermediate Representation Written in Lisp Ricardo Pena,˜ Santiago Saavedra, Jaime Sanchez-Hern´ andez´ Complutense University of Madrid, Spain∗ [email protected],[email protected],[email protected] In the context of designing the verification platform CAVI-ART, we arrived to the need of deciding a textual format for our intermediate representation of programs. After considering several options, we finally decided to use S-expressions for that textual representation, and Common Lisp for processing it in order to obtain the verification conditions. In this paper, we discuss the benefits of this decision. S-expressions are homoiconic, i.e. they can be both considered as data and as code. We exploit this duality, and extensively use the facilities of the Common Lisp environment to make different processing with these textual representations. In particular, using a common compilation scheme we show that program execution, and verification condition generation, can be seen as two instantiations of the same generic process. 1 Introduction Building a verification platform such as CAVI-ART [7] is a challenging endeavour from many points of view. Some of the tasks require intensive research which can make advance the state of the art, as it is for instance the case of automatic invariant synthesis. Some others are not so challenging, but require a lot of pondering and discussion before arriving at a decision, in order to ensure that all the requirements have been taken into account. A bad or a too quick decision may have a profound influence in the rest of the activities, by doing them either more difficult, or longer, or more inefficient.
    [Show full text]
  • Download the Specification
    Internationalizing and Localizing Applications in Oracle Solaris Part No: E61053 November 2020 Internationalizing and Localizing Applications in Oracle Solaris Part No: E61053 Copyright © 2014, 2020, Oracle and/or its affiliates. License Restrictions Warranty/Consequential Damages Disclaimer This software and related documentation are provided under a license agreement containing restrictions on use and disclosure and are protected by intellectual property laws. Except as expressly permitted in your license agreement or allowed by law, you may not use, copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, or decompilation of this software, unless required by law for interoperability, is prohibited. Warranty Disclaimer The information contained herein is subject to change without notice and is not warranted to be error-free. If you find any errors, please report them to us in writing. Restricted Rights Notice If this is software or related documentation that is delivered to the U.S. Government or anyone licensing it on behalf of the U.S. Government, then the following notice is applicable: U.S. GOVERNMENT END USERS: Oracle programs (including any operating system, integrated software, any programs embedded, installed or activated on delivered hardware, and modifications of such programs) and Oracle computer documentation or other Oracle data delivered to or accessed by U.S. Government end users are "commercial
    [Show full text]
  • The Debian GNU/Linux
    The Debian GNU/Linux FAQ translator: etony C.F.AN <[email protected]> Debian FAQ Authors version 5.0.1, 17 March 2012 XXX要要要 ,文cãT一些s于 Debian GNU/Linux 的8Á问题. HHHCCC声声声明明明 Copyright © 1996-2003 by Software in the Public Interest (u守v包+,文cHC声明的MÐ下, A¸6\和发布,文c的完t拷贝. (u守上述完t拷贝H,有sHC声明的MÐ下, A¸拷贝和发布ú于,文c完t拷贝的修9H,, v且, 发布@有通Ç修9 ,文c而得0的工\成果, {使(与,文c的¸可声明一致的¸可声明. (u守上述修9H,HC声明的MÐ下, A¸拷贝和发布,文cv它语言的û译H,, 如果,¸可声明有Ïê1o件ú金 会(Free Software Foundation)8Æ的S0化译,, 则uªS0化译,. i Contents 1 定定定II义与与与概概概述述述 1 1.1 什么/ Debian GNU/Linux?...............................................1 1.2 OK, 现(我知SDebian /. Linux/什么?!.......................................1 1.3 什么/ “Hurd”?.......................................................2 1.4 Debian GNU/Linux 与v他 Linux 发LH有什么不同? 为什么要选éDebian GNU/Linux?............2 1.5 Debian ¡划与ê1o件ú金会的GNU¡划 .......................................2 1.6 Debian 的发音Ê+I?...................................................2 2 Debian GNU/Linux 的的的···取取取与与与安安安ÅÅÅ 3 2.1 Debian 的最新H,/?...................................................3 2.2 如U得0 Debian 的安Å盘?................................................3 2.3 如UÎIq安Å Debian?..................................................3 2.4 我有;U:, 可以·取 Debian qÏ吗?..........................................3 2.5 可以o盘安Å吗?.......................................................3 2.6 可以Q络安Å吗?.......................................................4 3 |||¹¹¹'''问问问题题题 5 3.1 可以(什么7的l件û统上ÐL?.............................................5 3.2 与v他的linux发LH|¹L如U?.............................................5 3.3 Debian 源码与v他
    [Show full text]
  • Beginning Portable Shell Scripting from Novice to Professional
    Beginning Portable Shell Scripting From Novice to Professional Peter Seebach 10436fmfinal 1 10/23/08 10:40:24 PM Beginning Portable Shell Scripting: From Novice to Professional Copyright © 2008 by Peter Seebach All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording, or by any information storage or retrieval system, without the prior written permission of the copyright owner and the publisher. ISBN-13 (pbk): 978-1-4302-1043-6 ISBN-10 (pbk): 1-4302-1043-5 ISBN-13 (electronic): 978-1-4302-1044-3 ISBN-10 (electronic): 1-4302-1044-3 Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1 Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the trademark. Lead Editor: Frank Pohlmann Technical Reviewer: Gary V. Vaughan Editorial Board: Clay Andres, Steve Anglin, Ewan Buckingham, Tony Campbell, Gary Cornell, Jonathan Gennick, Michelle Lowman, Matthew Moodie, Jeffrey Pepper, Frank Pohlmann, Ben Renow-Clarke, Dominic Shakeshaft, Matt Wade, Tom Welsh Project Manager: Richard Dal Porto Copy Editor: Kim Benbow Associate Production Director: Kari Brooks-Copony Production Editor: Katie Stence Compositor: Linda Weidemann, Wolf Creek Press Proofreader: Dan Shaw Indexer: Broccoli Information Management Cover Designer: Kurt Krames Manufacturing Director: Tom Debolski Distributed to the book trade worldwide by Springer-Verlag New York, Inc., 233 Spring Street, 6th Floor, New York, NY 10013.
    [Show full text]
  • Bringing GNU Emacs to Native Code
    Bringing GNU Emacs to Native Code Andrea Corallo Luca Nassi Nicola Manca [email protected] [email protected] [email protected] CNR-SPIN Genoa, Italy ABSTRACT such a long-standing project. Although this makes it didactic, some Emacs Lisp (Elisp) is the Lisp dialect used by the Emacs text editor limitations prevent the current implementation of Emacs Lisp to family. GNU Emacs can currently execute Elisp code either inter- be appealing for broader use. In this context, performance issues preted or byte-interpreted after it has been compiled to byte-code. represent the main bottleneck, which can be broken down in three In this work we discuss the implementation of an optimizing com- main sub-problems: piler approach for Elisp targeting native code. The native compiler • lack of true multi-threading support, employs the byte-compiler’s internal representation as input and • garbage collection speed, exploits libgccjit to achieve code generation using the GNU Com- • code execution speed. piler Collection (GCC) infrastructure. Generated executables are From now on we will focus on the last of these issues, which con- stored as binary files and can be loaded and unloaded dynamically. stitutes the topic of this work. Most of the functionality of the compiler is written in Elisp itself, The current implementation traditionally approaches the prob- including several optimization passes, paired with a C back-end lem of code execution speed in two ways: to interface with the GNU Emacs core and libgccjit. Though still a work in progress, our implementation is able to bootstrap a func- • Implementing a large number of performance-sensitive prim- tional Emacs and compile all lexically scoped Elisp files, including itive functions (also known as subr) in C.
    [Show full text]
  • Debian Installation Manual
    Powered by Universal Speech Solutions LLC MRCP Deb Installation Manual Administrator Guide Revision: 70 Created: February 7, 2015 Last updated: March 15, 2021 Author: Arsen Chaloyan Powered by Universal Speech Solutions LLC | Overview 1 Table of Contents 1 Overview ............................................................................................................................................... 3 1.1 Applicable Versions ............................................................................................................ 3 1.2 Supported Distributions ...................................................................................................... 3 1.3 Authentication ..................................................................................................................... 3 2 Installing Deb Packages Using Apt-Get ............................................................................................... 4 2.1 Repository Configuration ................................................................................................... 4 2.2 GnuPG Key ......................................................................................................................... 4 2.3 Repository Update .............................................................................................................. 4 2.4 UniMRCP Client Installation .............................................................................................. 5 2.5 UniMRCP Server Installation ............................................................................................
    [Show full text]
  • An Optimized R5RS Macro Expander
    An Optimized R5RS Macro Expander Sean Reque A thesis submitted to the faculty of Brigham Young University in partial fulfillment of the requirements for the degree of Master of Science Jay McCarthy, Chair Eric Mercer Quinn Snell Department of Computer Science Brigham Young University February 2013 Copyright c 2013 Sean Reque All Rights Reserved ABSTRACT An Optimized R5RS Macro Expander Sean Reque Department of Computer Science, BYU Master of Science Macro systems allow programmers abstractions over the syntax of a programming language. This gives the programmer some of the same power posessed by a programming language designer, namely, the ability to extend the programming language to fit the needs of the programmer. The value of such systems has been demonstrated by their continued adoption in more languages and platforms. However, several barriers to widespread adoption of macro systems still exist. The language Racket [6] defines a small core of primitive language constructs, including a powerful macro system, upon which all other features are built. Because of this design, many features of other programming languages can be implemented through libraries, keeping the core language simple without sacrificing power or flexibility. However, slow macro expansion remains a lingering problem in the language's primary implementation, and in fact macro expansion currently dominates compile times for Racket modules and programs. Besides the typical problems associated with slow compile times, such as slower testing feedback, increased mental disruption during the programming process, and unscalable build times for large projects, slow macro expansion carries its own unique problems, such as poorer performance for IDEs and other software analysis tools.
    [Show full text]
  • GNU Guix Cookbook Tutorials and Examples for Using the GNU Guix Functional Package Manager
    GNU Guix Cookbook Tutorials and examples for using the GNU Guix Functional Package Manager The GNU Guix Developers Copyright c 2019 Ricardo Wurmus Copyright c 2019 Efraim Flashner Copyright c 2019 Pierre Neidhardt Copyright c 2020 Oleg Pykhalov Copyright c 2020 Matthew Brooks Copyright c 2020 Marcin Karpezo Copyright c 2020 Brice Waegeneire Copyright c 2020 Andr´eBatista Copyright c 2020 Christine Lemmer-Webber Copyright c 2021 Joshua Branson Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled \GNU Free Documentation License". i Table of Contents GNU Guix Cookbook ::::::::::::::::::::::::::::::: 1 1 Scheme tutorials ::::::::::::::::::::::::::::::::: 2 1.1 A Scheme Crash Course :::::::::::::::::::::::::::::::::::::::: 2 2 Packaging :::::::::::::::::::::::::::::::::::::::: 5 2.1 Packaging Tutorial:::::::::::::::::::::::::::::::::::::::::::::: 5 2.1.1 A \Hello World" package :::::::::::::::::::::::::::::::::: 5 2.1.2 Setup:::::::::::::::::::::::::::::::::::::::::::::::::::::: 8 2.1.2.1 Local file ::::::::::::::::::::::::::::::::::::::::::::: 8 2.1.2.2 `GUIX_PACKAGE_PATH' ::::::::::::::::::::::::::::::::: 9 2.1.2.3 Guix channels ::::::::::::::::::::::::::::::::::::::: 10 2.1.2.4 Direct checkout hacking:::::::::::::::::::::::::::::: 10 2.1.3 Extended example ::::::::::::::::::::::::::::::::::::::::
    [Show full text]
  • Using Ptxdist on Mac OS Based on Ptxdist 2012.04
    Using PTXdist on Mac OS based on PTXdist 2012.04 Bernhard Walle∗ 2012-04-20 ∗[email protected] Contents 1. Motivation 3 2. Basics 4 2.1. Getting OpenSource Software on Mac OS.........................4 2.2. Preparing the Hard Disk..................................5 2.2.1. Creating and Using a Sparse Bundle ........................6 3. Installing PTXdist7 3.1. Requirements........................................7 3.1.1. Mac OS.......................................7 3.1.2. Host compiler....................................7 3.2. GNU Tools..........................................7 3.3. Installation..........................................8 3.4. First setup..........................................9 4. Building an OSELAS.Toolchain 11 5. Building an Embedded Linux project 12 5.1. Using OSELAS.BSP-Pengutronix-Generic......................... 12 5.1.1. Getting the BSP................................... 12 5.1.2. Building FSF GCC.................................. 13 5.1.3. Building Qemu................................... 13 5.1.4. Running the System................................ 13 5.2. Using real Hardware.................................... 14 6. Limitations 15 6.1. Building UBI or JFFS2 images................................ 15 6.2. Linux kernel......................................... 15 6.3. Bootloader.......................................... 15 7. Using a Mac for Embedded Linux Development 16 7.1. Using a serial console.................................... 16 7.2. Exporting directories via NFS............................... 16 7.3. Mounting ext2 partitions.................................. 18 A. About this Document 19 B. Change History 20 Bibliography 21 2 1. Motivation PTXdist (http://www.ptxdist.org) is a great way to build Embedded Linux systems. It downloads all required components, conVgures them for cross-compilation and Vnally builds a target image and/or target packages. In addition, it provides an easy way to build a cross-toolchain for most common processors. Read [2] for a description how to use PTXdist.
    [Show full text]
  • 2004 USENIX Annual Technical Conference
    USENIX Association Proceedings of the FREENIX Track: 2004 USENIX Annual Technical Conference Boston, MA, USA June 27–July 2, 2004 © 2004 by The USENIX Association All Rights Reserved For more information about the USENIX Association: Phone: 1 510 528 8649 FAX: 1 510 548 5738 Email: [email protected] WWW: http://www.usenix.org Rights to individual papers remain with the author or the author's employer. Permission is granted for noncommercial reproduction of the work for educational or research purposes. This copyright notice must be included in the reproduced paper. USENIX acknowledges all trademarks herein. The NetBSD Update System Alistair Crooks, The NetBSD Project 9th April 2004 Abstract driving force behind the use of pkgsrc or NetBSD - rather, this is a description of a facility which is This paper explains the needs for a binary patch and used in NetBSD and which can be used on any other update system, and explains the background and im- operating system to augment the standard facilities plementation of NetBSD-update, a binary update fa- which are in place. cility for NetBSD. The implementation is then anal- ysed, and some lessons drawn for others who may be interested in implementing their own binary up- Driving Forces for a Binary Patch and date system using the NetBSD pkgsrc tools, which Update System are available for many operating systems and envi- ronments already. It is now common to nd rewalls in large and small organisations, preventing malign access, and protect- ing the organisation from intrusion and other attacks. The NetBSD Binary Update Sys- It would not be prudent to have a C compiler in- tem stalled on such a machine - its use should be that of a gatekeeper, as a bouncer with an attitude, keep- Unix, Linux and the BSD operating systems have ing anything suspicious out, and not allowing anyone traditionally been distributed in source format, and who does manage to penetrate the defences to use users and administrators have had a long tradition any tools to break further into the infrastructure.
    [Show full text]
  • The Evolution of Lisp
    1 The Evolution of Lisp Guy L. Steele Jr. Richard P. Gabriel Thinking Machines Corporation Lucid, Inc. 245 First Street 707 Laurel Street Cambridge, Massachusetts 02142 Menlo Park, California 94025 Phone: (617) 234-2860 Phone: (415) 329-8400 FAX: (617) 243-4444 FAX: (415) 329-8480 E-mail: [email protected] E-mail: [email protected] Abstract Lisp is the world’s greatest programming language—or so its proponents think. The structure of Lisp makes it easy to extend the language or even to implement entirely new dialects without starting from scratch. Overall, the evolution of Lisp has been guided more by institutional rivalry, one-upsmanship, and the glee born of technical cleverness that is characteristic of the “hacker culture” than by sober assessments of technical requirements. Nevertheless this process has eventually produced both an industrial- strength programming language, messy but powerful, and a technically pure dialect, small but powerful, that is suitable for use by programming-language theoreticians. We pick up where McCarthy’s paper in the first HOPL conference left off. We trace the development chronologically from the era of the PDP-6, through the heyday of Interlisp and MacLisp, past the ascension and decline of special purpose Lisp machines, to the present era of standardization activities. We then examine the technical evolution of a few representative language features, including both some notable successes and some notable failures, that illuminate design issues that distinguish Lisp from other programming languages. We also discuss the use of Lisp as a laboratory for designing other programming languages. We conclude with some reflections on the forces that have driven the evolution of Lisp.
    [Show full text]
  • Bash Guide for Beginners
    Bash Guide for Beginners Machtelt Garrels Garrels BVBA <tille wants no spam _at_ garrels dot be> Version 1.11 Last updated 20081227 Edition Bash Guide for Beginners Table of Contents Introduction.........................................................................................................................................................1 1. Why this guide?...................................................................................................................................1 2. Who should read this book?.................................................................................................................1 3. New versions, translations and availability.........................................................................................2 4. Revision History..................................................................................................................................2 5. Contributions.......................................................................................................................................3 6. Feedback..............................................................................................................................................3 7. Copyright information.........................................................................................................................3 8. What do you need?...............................................................................................................................4 9. Conventions used in this
    [Show full text]