The Λ Abroad a Functional Approach to Software Components
Total Page:16
File Type:pdf, Size:1020Kb
The ¸ Abroad A Functional Approach To Software Components Een functionele benadering van software componenten (met een samenvatting in het Nederlands) Proefschrift ter verkrijging van de graad van doctor aan de Universiteit Utrecht op gezag van de Rector Magni¯cus, Prof. dr W.H. Gispen, ingevolge het besluit van het College voor Promoties in het openbaar te verdedigen op dinsdag 4 november 2003 des middags te 12.45 uur door Daniel Johannes Pieter Leijen geboren op 7 Juli 1973, te Alkmaar promotor: Prof. dr S.D. Swierstra, Universiteit Utrecht. co-promotor: dr H.J.M. Meijer, Microsoft Research. The work in this thesis has been carried out under the auspices of the research school IPA (Institute for Programming research and Algorithmics), and has been ¯nanced by Ordina. Printed by Febodruk 2003. Cover illustration shows the heavily cratered surface of the planet Mercury, photographed by the mariner 10. ISBN 90-9017528-8 Contents Dankwoord ix 1 Overview 1 2 H/Direct: a binary language interface for Haskell 5 2.1 Introduction ................................ 5 2.2 Background ................................ 6 2.2.1 Using the host or foreign language ............... 7 2.2.2 Using an IDL ........................... 8 2.2.3 Overview ............................. 9 2.3 The Foreign Function Interface ..................... 12 2.3.1 Foreign static import and export ................ 12 2.3.2 Variations on the theme ..................... 13 2.3.3 Stable pointers and foreign objects ............... 14 2.3.4 Dynamic import ......................... 15 2.3.5 Dynamic export ......................... 15 2.3.6 Implementing dynamic export .................. 18 2.3.7 Related work ........................... 19 iv Contents 2.4 Translating IDL to Haskell ....................... 20 2.5 Procedure declarations .......................... 21 2.6 Mapping for types ............................ 22 2.7 Marshaling ................................ 25 2.8 Type declarations ............................. 28 2.9 The inverse mapping ........................... 32 2.10 Future work ................................ 33 2.11 Conclusions ................................ 33 3 COM components in Haskell 35 3.1 Introduction ................................ 35 3.2 Components ................................ 37 3.3 COM .................................... 37 3.3.1 Creating a COM component .................. 38 3.3.2 Interfaces ............................. 39 3.3.3 Getting other interfaces ..................... 40 3.3.4 Reference counting ........................ 40 3.3.5 Describing interfaces ....................... 41 3.3.6 Example in C++ and Haskell .................. 42 3.4 Polymorphism expresses inheritance .................. 44 3.5 Marshaling COM components to Haskell ................ 46 3.6 Encapsulating Haskell as a COM component ............. 49 3.6.1 The programmer's eye view ................... 49 3.6.2 The generated proxy module .................. 51 Contents v 3.6.3 The Com library .......................... 55 3.6.4 The IUnknown interface ..................... 55 3.7 Related work ............................... 56 3.8 Conclusions ................................ 57 4 Functional programming in an imperative world 59 4.1 Introduction ................................ 59 4.2 Running `hello world' .......................... 61 4.3 Abstraction ................................ 62 4.3.1 Extending the characters' repertoire .............. 62 4.4 Agent combinators ............................ 65 4.4.1 Bags ................................ 67 4.4.2 Unordered computations ..................... 68 4.4.3 Requests .............................. 69 4.4.4 A ¯rst implementation ...................... 71 4.4.5 Associativity ........................... 73 4.4.6 Commutativity .......................... 73 4.5 AgentScript ................................ 78 4.6 Summary ................................. 79 4.7 Appendix: animation implementation ................. 80 5 Database queries 83 5.1 Introduction ................................ 83 5.2 A crash course in relational algebra ................... 85 5.2.1 SQL ................................ 87 vi Contents 5.2.2 Connecting to the database ................... 87 5.2.3 Putting it all together ...................... 88 5.3 Query embedding ............................. 90 5.4 Formula embedding ........................... 91 5.4.1 Step 1: Abstract syntax ..................... 92 5.4.2 Step 2: Abstract Syntax embedding .............. 93 5.4.3 Step 3: Type embedding ..................... 94 5.5 Relational algebra ............................ 95 5.5.1 Functions ............................. 95 5.5.2 Relations ............................. 96 5.5.3 Relational expressions ...................... 97 5.5.4 Restriction ............................ 98 5.5.5 Union,Di®erence and Cartesian product ............ 99 5.6 Embedding queries ............................ 99 5.6.1 Step 1: Abstract syntax ..................... 99 5.6.2 Step 2: Abstract syntax embedding .............. 103 5.6.3 Step 3: Type embedding ..................... 110 5.7 Exam marks ................................ 117 5.7.1 Visual Basic ............................ 117 5.7.2 Haskell .............................. 118 5.8 Status and conclusions .......................... 120 6 The Lazy Virtual Machine 121 6.1 Introduction ................................ 121 Contents vii 6.2 An overview ................................ 123 6.3 The abstract machine .......................... 127 6.3.1 Basic instructions ........................ 128 6.3.2 Local de¯nitions ......................... 130 6.3.3 Sharing .............................. 131 6.3.4 Recursive values ......................... 132 6.3.5 Algebraic data types ....................... 132 6.3.6 Strict evaluation ......................... 133 6.3.7 Matching ............................. 134 6.3.8 Synchronous exceptions ..................... 135 6.3.9 Blackholing ............................ 136 6.3.10 Garbage collection ........................ 137 6.4 The LVM language ............................ 139 6.4.1 Translating ¸core to ¸lvm ..................... 142 6.5 Compilation scheme ........................... 144 6.5.1 Program .............................. 144 6.5.2 Expressions ............................ 145 6.5.3 Atomic expressions ........................ 145 6.5.4 Let expressions .......................... 147 6.5.5 Matching ............................. 148 6.5.6 Optimized schemes ........................ 148 6.5.7 Resolve stack o®sets ....................... 150 6.5.8 Rewrite rules ........................... 153 6.5.9 Code generation ......................... 155 viii Contents 6.5.10 More optimization: superfluous stack movements ....... 156 6.6 Assessment ................................ 160 Bibliography 163 Samenvatting 169 Dankwoord Ik herinner mij nog goed dat ik in het 3e jaar van mijn studie voor het eerst het boek van Richard Bird en Philip Wadler, \Introduction to Functional Program- ming", onder ogen kreeg. Functioneel programmeren, gebaseerd op de zogeheten ¸-calculus, bezat een zodanige elegantie en klaarheid, dat ik onmiddellijk besloot mijn afstudeer scriptie daar aan te wijden. Niet iedereen was daarover even en- thousiast { functionele talen zouden ine±cient zijn, en niet geschikt om \echte" programma's mee te maken. Wie had toen kunnen denken dat ik nu, 7 jaar later, mijn proefschrift volledig aan dat onderwerp zou wijden! Allereerst zou ik daarom mijn leraren van het eerste uur willen bedanken. John Mountjoy die mij heeft ingewijd in de schoonheid van de ¸-calculus en puur func- tioneel programmeren, en Marcel Beemster die mij hielp om af te kunnen studeren bij Simon Peyton Jones, een van de beste wetenschappers op het gebied van fun- tionele talen. Hoewel ik toen dacht naar Glasgow te gaan, bleek Simon op sabbatical te zijn en ging ik uiteindelijk naar het Oregon Graduate Institute of Science and Technology in de VS. Op het OGI, ontmoette ik ook Erik Meijer, en terug in Nederland kon ik bij hem mijn promotie onderzoek doen aan de Universiteit Utrecht. Ik had mij de eerste jaren geen betere begeleider kunnen wensen { ik ken weinig mensen die zo inspir- erend en motiverend kunnen zijn. Erik, bedankt voor al je inzichten die je met me deelde en je niet aflatende passie voor onderzoek, die mij ook vandaag de dag nog inspireert. Aan alle goede dingen komen een eind, en helaas verliet Erik na twee jaar de Uni- versiteit Utrecht om bij Microsoft nieuwe uitdagingen aan te gaan. Na zijn vertrek heb ik toch enige tijd moeite gehad om mijn eigen richting in het onderzoek te vinden en mijn onderzoeks resultaten te bundelen. Gelukkig heb ik toen veel steun gekregen van mijn promotor Doaitse Swierstra, die mij voortdurend motiveerde om ook de minder aangename kanten van het promoveren onder ogen te zien. Zonder zijn kritische discussies en het voortdurend lettten op kwaliteit had dit proefschrift er zeker anders uitgezien. Ook wil ik alle collegae van \software technologie" bedanken voor de goede sfeer x Dankwoord en samenwerking. In het bijzonder wil ik mijn lunchgenoten Martijn Schrage en Arjan van IJzendoorn bedanken voor hun vriendschap, wereldlijke discussies en voortdurende afleiding van mijn werk. Hoewel ze eigenlijk bij een andere club hoort, heeft mijn voormalige kamergenote Silja Renooij mij enorm geholpen bij alle praktische zaken die bij het proefschrift behoren. I would also like to thank Sigbjorn Finne and Mark Shields for being good friends and scienti¯c colleagues { with fond memories of skiijngMount Hood