torsdag 3. februar 2011 DSL PingLang Actor model
I denne dokumentarserien vil vi bygge et programmeringsspråk sammen. Det blir kun et lite språk, et såkalt domenespesifikt språk (DSL). Teknikkene du får se er derimot generelle, og kan brukes til å implementere mange, ulike DSLer, og også generelle programmeringsspråk om du ønsker det.
I fjor høst kjørte jeg en annen artikkelserie på denne bloggen som het Ping Ring. Her løste jeg en passe enkel programmeringsoppgave i en rekke forskjellige språk, for å studere ulikhetene, og for å se om noen av språkene var bedre egnet enn andre.
Nå vil jeg utvikle et nytt språk vi vil kalle PingLang, som er spesialdesignet for å løse Ping Ring og lignende oppgaver. Du har sett teaseren allerede, og her er den offisielle verdenspremiæren:
Det du ser over er verdens første PingLang-program. Du har aldri sett noe annet skrevet i dette språket, men det er likevel ganske enkelt å forstå, ikke sant? Når HelloWorld starter vil det først printe ut “Hello, world”, deretter vente i fem sekunder, før det printer ut “Take care now!”.
Målet mitt med PingLang er å designe et språk som på enkelte punkter skiller seg fra alle andre programmeringsspråk jeg har vært borti. Jeg ønsker også at det skiller seg fra typiske eksempler på DSL’er. For å løse selve Ping Ring-oppgaven er det selvsagt overkill å implementere et språk som dette, men målet er å lære noe, og det tror jeg at oppgaven legger til rette for.
Merk også at PingLang er implementert som en ekstern DSL. Jeg har implementert flere interne DSLer tidligere, men da snakker vi om å utnytte fleksibiliteten i et eksisterende språk til å skape et slags API hvor man bedre kan uttrykke mening for et bestemt domene. En ekstern DSL er i mye større grad et fullverdig språk, for å si det sånn. Mer om dette siden..
La oss ta en litt grundigere titt på syntaksen jeg har kommet opp med:
PingLang er ikke et vanlig objektorientert språk. Det følger det som heter Actor Model (de som kjenner meg vet at jeg er fasinert av implementasjonen av Actor Model i Erlang). Et PingLang-program inneholder en eller flere actors. En actor begynner med et navn, og avsluttes med et punktum.
Deretter følger null eller flere linjer med opsjoner for actoren. HelloWorld hadde ingen av disse.
Så følger en eller flere eventhandlere, som definerer kodeblokker som skal utføres når diverse events intreffer. HelloWorld-programmet hadde én av disse som håndterte starting-eventet.
Syntaksen er litt mer fleksibel enn det vi er vandt til fra vanlige programmeringsspråk. F.eks. kan en enkel actor med bare én eventhandler og bare en handling skives på én linje slik som dette:
Gjennom denne dokumentaren vil du se meg implementere en sexy editor for det nye språket, med innebygget fargelegging av syntakselementer og en enkel intellisense. Du vil få se hvordan jeg implementerer en parser for PingLang, hvordan jeg omformer kildekoden til et abstrakt syntakstre, og hvordan jeg til slutt implementerer en tolker (interpreter) som vil kjøre programmene skrevet i språket.
Implementasjonen av alle komponentene vil bli gjort i C#, og PingLang kjører på .NET-plattformen. Jeg vil vise endel av koden, men ikke alt. Den komplette implementasjonen vil være tilgjengelig på Github, slik at du både kan lese den der, og laste den ned og kjøre den selv om du ønsker det.
I stedet for å diskutere alle detaljene i implementasjonen, vil jeg bruke artiklene til å snakke litt rundt de ulike elementene man må få på plass når man utvikler et språk, hvilke valg jeg har tatt, og hvilke andre valg man har. Det finnes mange veier til målet, og PingLang vil bare representere én slik vei.
Min egen motivasjon for serien er å lære mer om parser-teknologi, eksperimentere litt med syntaks, samt se litt på hvordan man kan implementere et actor model-rammeverk. Jeg håper du blir med meg på ferden!