Stvaranje DSL-ova u Javi, 1. dio: Što je jezik specifičan za domenu?

Ako ste ikada napisali make datoteku ili dizajnirali web stranicu sa CSS-om, već ste se susreli s DSL-om ili jezikom specifičnim za domenu. DSL-ovi su mali, izražajni programski jezici prilagođeni dizajniranim za određene zadatke. U ovoj četverodijelnoj seriji Venkat Subramaniam predstavlja koncept DSL-ova i na kraju vam pokazuje kako ih graditi pomoću Jave. U ovom prvom članku Venkat objašnjava što je DSL i definira razliku između vanjskog DSL-a i unutarnjeg. Zatim ukazuje na neke DSL-ove koje vjerojatno koristite godinama, možda i ne sluteći.

Ako ste sudjelovali u pisanju ili čak samo korištenju aplikacija, velika je vjerojatnost da ste se već susreli s jezicima specifičnim za domenu ili DSL-ovima - čak i ako to tada niste znali. Datoteka za unos ključne riječi u aplikaciju koja prima ulazne podatke je DSL. Konfiguracijska datoteka je DSL. Makefile je DSL koji se koristi za specificiranje pravila i ovisnosti za izgradnju aplikacije. Ako ste napisali bilo što od ovoga, već ste poduzeli prve korake za stvaranje jezika specifičnih za domenu.

Riječ jezika u izrazu može dovesti vas očekivati DSL će koristiti sintaksu za izražavanje određenih semantiku. Za razliku od jezika opće namjene poput Jave, DSL je prilično ograničen u opsegu i mogućnostima; kao što i samo ime govori, DSL-ovi su usredotočeni na određenu vrstu problema ili domene i na izražavanje uskog skupa rješenja u kontekstu tog ograničenog opsega. I to je dobro - DSL-ovi su jednostavni i sažeti.

U redu, to je L; što je s D i S?

Riječ domena u DSL-u odnosi se na "područje ili sferu znanja, utjecaja ili aktivnosti". (Za više informacija pogledajte Dizajn koji pokreće domena, Eric Evans.) Fokusiranje na domenu daje vam kontekst - logični okvir unutar kojeg možete razvijati modele za aplikaciju.

Riječ specifična u DSL-u daje vam ograničeni kontekst. Pomaže vam da stvari budu relevantne, usredotočene, kratke i izražajne.

Jednostavnost je presudna za uspjeh DSL-a. Osoba upoznata s domenom jezika mora je lako razumjeti. Na primjer, ako izrađujete DSL koji će aktuari koristiti za izražavanje poslovnih pravila u domeni osiguranja, ne želite da troše puno vremena učeći težak i kompliciran jezik. Želite da se usredotoče na izražavanje detalja povezanih s rizicima osiguranja na način da ih mogu lako razumjeti, raspraviti, razviti i održavati. DSL koji stvarate za njih mora se temeljiti na njihovom rječniku, terminima koje svakodnevno koriste za komunikaciju sa svojim vršnjacima. Želite da koriste sintaksu koju ste dali, ali trebalo bi im se činiti da oni samo navode neka diskretna pravila.I to bi trebali moći činiti, a da nemaju dojam da stvarno programiraju ili čak koriste neki jezik.

Stvaranje dobrog DSL-a je poput kuhanja hranjivog obroka; baš kao što želite da djeca jedu povrće, a da se toga uopće ne trude i ne muče, tako želite da klijenti koriste vaš DSL bez brige o njegovoj sintaksi.

Konciznost je još jedan dio pisanja dobrog DSL-a, što znači odabir sintakse koja je istovremeno kratka i izražajna. Lakoća u razumu čini vaš kod lakšim za čitanje i održavanje. Izražajnost pomaže u promicanju komunikacije, razumijevanja i brzine. Na primjer, za nekoga tko razumije množenje matrica, matrixA.multiply(matrixB);manje je izražajan i sažet od matrixA * matrixB. Prvi uključuje pozivanje funkcija i upotrebu zagrada, a uključuje zastrašujući zarez. Ovo potonje već je izraz koji će biti prilično poznat.