Wat ontwikkelaars moeten weten over domeinspecifieke talen

Een domeinspecifieke taal (DSL) is een taal die bedoeld is voor gebruik in de context van een bepaald domein. Een domein kan een zakelijke context zijn (bijv. bankieren, verzekeren, enz.) of een toepassingscontext (bijv. een webtoepassing, database, enz.) In tegenstelling hiermee kan een taal voor algemene doeleinden (general-purpose language, GPL) worden gebruikt voor een breed scala aan zakelijke problemen en toepassingen.

Een DSL probeert niet het iedereen naar de zin te maken. In plaats daarvan wordt hij gemaakt voor een beperkt toepassingsgebied en gebruik, maar hij is krachtig genoeg om de problemen en oplossingen in dat gebied weer te geven en aan te pakken. Een goed voorbeeld van een DSL is HTML. Het is een taal voor het webapplicatiedomein. Het kan niet worden gebruikt voor, laten we zeggen, het kraken van getallen, maar het is duidelijk hoe wijdverbreid HTML op het web wordt gebruikt.

Een maker van een GPL weet niet waar de taal gebruikt zou kunnen worden of welke problemen de gebruiker ermee wil oplossen. Dus wordt een GPL gemaakt met generieke constructies die potentieel bruikbaar zijn voor elk probleem, oplossing, bedrijf, of behoefte. Java is een GPL, omdat het wordt gebruikt op desktops en mobiele apparaten, ingebed in het web in het bankwezen, de financiële sector, verzekeringen, productie, enzovoort, en nog veel meer.

Classificatie van DSL’s

In de DSL-wereld zijn er twee soorten talen:

  • Domeinspecifieke taal (DSL): De taal waarin een DSL wordt geschreven of gepresenteerd
  • Host taal: De taal waarin een DSL wordt uitgevoerd of verwerkt

Een DSL die in een aparte taal is geschreven en door een andere host-taal wordt verwerkt, wordt een externe DSL genoemd.

Dit is een DSL in SQL die in een host-taal kan worden verwerkt:

SELECT account
FROM accounts
WHERE account = '123' AND branch = 'abc' AND amount >= 1000

Op die manier zou een DSL in het Engels kunnen worden geschreven met een gedefinieerd vocabulaire en vorm die in een andere host-taal kan worden verwerkt met behulp van een parser-generator zoals ANTLR:

if smokes then increase premium by 10%

Als de DSL en de hosttaal dezelfde zijn, dan is het DSL-type intern, waarbij de DSL in de semantiek van de taal wordt geschreven en door die taal wordt verwerkt. Dit worden ook wel embedded DSL’s genoemd. Hier volgen twee voorbeelden.

  • Een Bash DSL die kan worden uitgevoerd in een Bash engine:
    if today_is_christmas; then apply_christmas_discount; fi 

    Dit is geldige Bash die is geschreven als Engels.

  • Een DSL geschreven in een GPL zoals Java:
    orderValue = orderValue
    .applyFestivalDiscount()
    .applyCustomerLoyalityDiscount()
    .applyCustomerAgeDiscount();

    Dit gebruikt een vloeiende stijl en is leesbaar zoals Engels.

Ja, de grenzen tussen DSL en GPL vervagen soms.

DSL voorbeelden

Een aantal talen die voor DSL’s worden gebruikt zijn:

  • Web: HTML
  • Shell: sh, Bash, CSH, en dergelijke voor *nix; MS-DOS, Windows Terminal, PowerShell voor Windows
  • Markup talen: XML
  • Modelleren: UML
  • Gegevensbeheer: SQL en zijn varianten
  • Business rules: Drools
  • Hardware: Verilog, VHD
  • Builtools: Maven, Gradle
  • Numerieke berekeningen en simulaties: MATLAB (commercieel), GNU Octave, Scilab
  • Verschillende soorten parsers en generatoren: Lex, YACC, GNU Bison, ANTLR

Waarom een DSL?

Het doel van een DSL is het vastleggen of documenteren van de eisen en het gedrag van één domein. Het gebruik van een DSL kan zelfs nog beperkter zijn voor bepaalde aspecten binnen het domein (bijvoorbeeld de handel in grondstoffen in de financiële wereld). DSL’s brengen bedrijfs- en technische teams samen. Dit betekent niet dat een DSL alleen voor zakelijk gebruik bestemd is. Ontwerpers en ontwikkelaars kunnen een DSL bijvoorbeeld gebruiken om een applicatie weer te geven of te ontwerpen.

Een DSL kan ook worden gebruikt om broncode te genereren voor een behandeld domein of probleem. Het genereren van code uit een DSL wordt echter niet als verplicht beschouwd, omdat het primaire doel ervan domeinkennis is. Maar als het wordt gebruikt, is het genereren van code een groot voordeel bij domain engineering.

DSL voors en tegens

Aan de positieve kant zijn DSL’s krachtig voor het vastleggen van de attributen van een domein. En omdat DSL’s klein zijn, zijn ze gemakkelijk te leren en te gebruiken. Tenslotte biedt een DSL een taal voor domeinexperts en tussen domeinexperts en ontwikkelaars.

Achter de keerzijde staat dat een DSL slechts beperkt wordt gebruikt binnen het beoogde domein en doel. Ook heeft een DSL een leercurve, hoewel deze niet erg hoog hoeft te zijn. Bovendien, hoewel het gebruik van hulpmiddelen voor het vastleggen van DSL voordelen kan hebben, zijn ze niet essentieel, en de ontwikkeling of configuratie van dergelijke hulpmiddelen is een extra inspanning. Tenslotte is voor het maken van DSL’s zowel domeinkennis als kennis van taalontwikkeling nodig, en het komt zelden voor dat iemand beide heeft.

DSL-software-opties

Open source DSL-software-opties zijn onder andere:

  • Xtext: Xtext maakt de ontwikkeling van DSL’s mogelijk en is geïntegreerd met Eclipse. Het maakt het genereren van code mogelijk en is door verschillende open source en commerciële producten gebruikt om specifieke functies te bieden. MADS (Multipurpose Agricultural Data System) is een interessant idee gebaseerd op Xtext voor “modellering en analyse van landbouwactiviteiten” (het project lijkt echter niet meer actief te zijn).
  • JetBrains MPS: JetBrains MPS is een geïntegreerde ontwikkelomgeving (IDE) om DSL’s te maken. Het noemt zichzelf een projectionele editor die een document opslaat als de onderliggende abstracte boomstructuur. (Dit concept wordt ook gebruikt door programma’s als Microsoft Word.) JetBrains MPS ondersteunt ook het genereren van code naar Java, C, JavaScript, of XML.

DSL best practices

Wilt u een DSL gebruiken? Hier zijn een paar tips:

  • DSL’s zijn geen GPL’s. Probeer beperkte reeksen problemen in het definitieve domein aan te pakken.
  • U hoeft niet uw eigen DSL te definiëren. Dat zou vervelend zijn. Zoek naar een bestaande DSL die aan uw behoefte voldoet op sites als DSLFIN, die een lijst geeft van DSL’s voor het financiële domein. Als u geen geschikte DSL kunt vinden, kunt u uw eigen DSL definiëren.
  • Het is beter om DSL’s “als Engels” te maken dan te technisch.
  • Code generatie vanuit een DSL is niet verplicht, maar het biedt aanzienlijke en productieve voordelen als het wordt gedaan.
  • DSL’s worden talen genoemd, maar ze hoeven, in tegenstelling tot GPL’s, niet uitvoerbaar te zijn. Uitvoerbaar zijn is niet de bedoeling van een DSL.
  • DSL’s kunnen met tekstverwerkers worden geschreven. Het gebruik van een DSL-editor maakt controles van syntaxis en semantiek echter eenvoudiger.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *