Inspector Verktyg för språk och kompilator

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