Inspector Verktyg för språk och kompilator-utveckling Erik Mossberg [email protected] Domän-specifika språk (DSLer) har i flera situtationer och av flera anledningar fördelar över generella språk. Användningen av DSLer möjliggör former av programmering som är närmare vad programmeraren vill uttrycka, genom att skapa ett språk för en specifik domän. Då detta språk är enklare och mer relaterat till problemställningen skapar det en bättre kommunikation mellan programmerare och andra icke-programmerare i ett projekt. Genom att ge DSL-funktionalitet till ett program, kan man även utöka funktionalitet, t.ex. genom avancerade konfigurationsfiler eller scriptning. Även om man kan utveckla en DSL genom att ta ett generellt språk och anpassa det, finns det begränsningar eftersom den anpassade koden fortfarande måste vara ett giltigt program i det generella språket. För att få helt fri syntax, som möjlighet till egna blockstrukurer, krävs en kompilator skriven specifikt för det nya språket. Detta ger en avvägning mellan utvecklingskostnad gentemot fördelar, men utvecklingskostnaden kan sänkas med snabb feedback och bra verktyg. Genom att dela upp en kompilator i flera komponenter, som motsvarar steg i kompileringen, får man flera fördelar. Det första steget i en kompilator är en scanner, som konverterar en textfil till mindre enheter. Dessa enheter kallas tokens och representerar de minsta enhetliga delarna i kod, som nyckelord eller operatorer som “+”. I nästa steg bygger en parser ett strukturerat träd baserat på dessa tokens. Kompilatorn har flera efterföljande steg och komponenter, som är olika beroende på tillämpning. Till skillnad från kompilatorer för de flesta generella språk, saknar t.ex. en kompilator som läser konfigurationsfiler ett steg som skriver exekverbara filer. På grund av detta, samt svårigheter med att visualisera de mer abstrakta stegen har vi fokuserat på scanner och parserstegen. Kompilatorutveckling kräver en del arbete, men detta förenklas av generatorer. Generatorerna tillhandahåller automatisk implementation av kompilatorsteg, som scanners och parsers, vars implementation annars kan vara ett ganska mekaniskt arbete. Till detta examensarbete används generatorer som läser in specifikationsfiler och producerar Java-kod, som sedan kompileras med en separat Java-kompilator. Flera specifikationer arbetar vanligtvis tillsammans, och utvecklingsarbetet kan kräva ändringar i flera specifikationer parallellt. Med en IDE specialiserad på språkutveckling kan dessa svårigheter motverkas, samt hjälpa med praktiska utvecklingsproblem som felhantering och projekthantering. 1 Generatorerna har tyvärr nackdelen av att den skapade koden kan vara svårläst för människor. Att debugga genererad kod med en generisk debugger ger en abstraktionsnivå, eftersom det inte är specifikationsfilerna som debuggas, bara dess deriverade kod. Att lägga till kommentarer eller debugkod i den genererade koden är inte alltid hållbart, då det försvinner vid omgenerering. Omgenerering kan också förändra radnumrering, vilket gör det svårt att hantera med generiska debuggingverktyg. Koden kan också verka obfuskerad, med oförklarade sifferkonstanter eller variabelnamn. Detta är ett resultat av designval av generatorerna, som ofta är skapade med prestanda i fokus, men inte nödvändigtvis läsbarhet. Genom att veta vilka delar av specifikationen som är inblandade vid parsning av specifika delar av sitt språk, får man en fördel emot att arbeta med den genererade koden. Detta arbete har identifierat potentiella förbättringar i språkutvecklingsverktyg, samt har implementerat en utvecklingsmiljö som heter Inspector som är tänkt att hjälpa vid kompilatorutveckling. Implementationen är baserad på Eclipse, vilken är en modulär utvecklingsmiljö med existerande stöd för flera språk. Språkutvecklingsfärdigheterna hos våra tänkta användare är ganska breda, från erfarna till nya språkutvecklare. Inspector fungerar som ett analysverktyg för kompilatorer som använder JastAdd för nod-generering, Beaver LALR för parser-generering och JFlex för scanner-generering. Inspector har editorer för specifikationsfiler, samt en anpassningsbar editor för framtagna DSLer. Anpassningarna innebär att man kan få syntax highlighting och outlines för egna språk med minimal ansträngning. Våra analysverktyg använder både existerande vyer som editorer, samt nya vyer specifika för kompilatoranalys. 2