Programmering

Opprette DSLer i Java, del 1: Hva er et domenespesifikt språk?

Hvis du noen gang har skrevet en makefile eller designet en webside med CSS, har du allerede møtt et DSL- eller domenespesifikt språk. DSL er små, uttrykksfulle programmeringsspråk som er spesialdesignet for spesifikke oppgaver. I denne firedelte serien introduserer Venkat Subramaniam konseptet med DSL og viser deg til slutt hvordan du bygger dem ved hjelp av Java. I denne første artikkelen forklarer Venkat hva en DSL er og definerer forskjellen mellom en ekstern DSL og en intern. Deretter peker han på noen DSL-er du sannsynligvis har brukt i årevis, kanskje uten å engang vite det.

Hvis du har vært involvert i å skrive eller bare bruke applikasjoner, er sjansen stor for at du allerede har opplevd domenespesifikke språk eller DSL-er - selv om du ikke skjønte det på den tiden. En søkeordinputfil til et program som mottar inndata er en DSL. En konfigurasjonsfil er en DSL. En makefile er en DSL som brukes til å spesifisere regler og avhengigheter for å bygge en applikasjon. Hvis du har skrevet noen av disse, har du allerede tatt de første trinnene for å lage domenespesifikke språk.

Ordet Språk i uttrykket kan føre til at du forventer at en DSL vil bruke syntaksen til å uttrykke visse semantikk. I motsetning til et generelt språk som Java, er en DSL ganske begrenset i omfang og evner; Som navnet antyder, fokuserer DSL-er sterkt på en bestemt type problem eller domene, og på å uttrykke et smalt sett med løsninger innenfor rammen av det begrensede omfanget. Og det er bra - DSL er enkle og konsise.

Ok, det er L; hva med D og S?

Ordet domene i DSL refererer til "et område eller sfære av kunnskap, innflytelse eller aktivitet." (For mer informasjon, se Domain-Driven Design av Eric Evans.) Fokusering på et domene gir deg en kontekst - et logisk rammeverk der du kan utvikle modeller for en applikasjon.

Ordet spesifikk i DSL gir deg den avgrensede konteksten. Det hjelper deg med å holde ting relevante, fokuserte, kortfattede og uttrykksfulle.

Enkelhet er avgjørende for suksessen til en DSL. En person som er kjent med språkets domene, må lett forstå det. Hvis du for eksempel lager en DSL som aktuarene vil bruke for å uttrykke forretningsregler innen forsikringsområdet, vil du ikke at de skal bruke mye tid på å lære et vanskelig og komplisert språk. Du vil at de skal fokusere på å uttrykke detaljene knyttet til forsikringsrisiko på en måte som de lett kan forstå, diskutere, utvikle seg og vedlikeholde. DSL-en du lager for dem, må bygges på ordforrådet deres, vilkårene de bruker hver dag for å kommunisere med sine jevnaldrende. Du vil at de skal bruke syntaksen du gir, men det ser ut til at de bare spesifiserer noen diskrete regler. Og de burde være i stand til å gjøre det uten å få inntrykk av at de virkelig programmerer eller til og med bruker et slags språk.

Å lage en god DSL er som å lage et næringsrikt måltid; akkurat som du vil at barna skal spise grønnsaker uten å innse og mase over dem, vil du at klienter skal bruke DSL uten å bekymre deg for syntaksen.

Conciseness er en annen del av å skrive en god DSL, som betyr å velge syntaks som er både kort og uttrykksfull. Terseness innen grunn gjør koden din lettere å lese og vedlikeholde. Uttrykksevne bidrar til å fremme kommunikasjon, forståelse og hastighet. For eksempel for noen som forstår matriksmultiplikasjon, matriseA.multiply (matriseB); er mindre uttrykksfull og kortfattet enn matriseA * matriseB. Førstnevnte innebærer å ringe funksjoner og bruke parenteser, og inkluderer et skremmende semikolon. Sistnevnte er allerede et uttrykk som vil være ganske kjent.

$config[zx-auto] not found$config[zx-overlay] not found