Alana özgü dil nedir? Kullanan var mı? Ve ne şekilde?


107

Sanırım bir tür giriş arıyorum ve bunu kullanan var mı bir bakıyorum. Kullanmanın belirli avantajları var mı?

Wikipedia:

alana özgü dil (DSL) , belirli bir problem alanına, belirli bir problem temsil tekniğine ve / veya belirli bir çözüm tekniğine adanmış bir programlama dili veya spesifikasyon dilidir.

Bunu nasıl uyguladığınıza veya belirli bir senaryoda nasıl faydalı olabileceğine dair belirli örnekler verebilir mi?


Aslında alana özgü dil, programlamada iyi tanımlanmış bir anlamı olan bir terimdir - wikipedia makalesine bakın
1800 BİLGİ

Aşağıda belirtildiği gibi, DSL tek bir dil değil, özel amaçlı dillerden oluşan bir sınıfın adıdır.
dmckee --- eski moderatör kedicik

R'nin bir DSL olduğunu söyleyebilir miyim?
Srikar Doddi 01

2
Sınırda, ama yapmam. R, tüm genel amaçlı yapılara sahiptir ve çok çeşitli hesaplamalar için kullanılır; sayısal hesaplamalar ve istatistikler çok dar bir alan değildir. Yine de tanımın iyi bir testidir.
Charlie Martin

Yanıtlar:


114

Alana özgü dil, belirli bir alan veya bir dizi endişeyle ilgilenmek için yazılmış bir dildir. Yazılım yapılarını açıklamak için make, ant ve rake veya dil oluşturma için lexx ve yacc gibi pek çok şey var. Son yıllarda, bazı şeylerin daha kolay inşa edilmesini sağlamak için bir araya gelmesiyle popüler hale geldiler. Bunların arasında en önemlisi, yeni DSL'ler oluşturmayı kolaylaştıran çeşitli özelliklere sahip olan Ruby'nin artan popülaritesi olmuştur.

Martin Fowler, burada olduğu gibi bu fikrin büyük bir savunucusu .


4
Ruby'nin yeni bir DSL oluşturmayı kolaylaştıran hangi özellikleri var?
Lernkurve

2
@Lernkurve - Ruby'nin metaprogramlaması vardı, bu da yardımcı oldu. rubylearning.com/blog/2010/11/23/…
James Black

@CharlieMartin "groovy" hakkında bana bilgi verir misiniz? tam olarak hangi dil türü? Bilmek istiyorum lütfen yardım edin ..
G dangi

2
Groovy, JVM'de çalışan bir betik dilidir. Temelde Ruby'ye bir Java yanıtı olması amaçlanmıştır. Genel amaçlı bir dildir, ancak DSL'leri yazmak için kullanılabilir. docs.groovy-lang.org/docs/latest/html/documentation/…
Charlie Martin

1
Gradle'ın mükemmelliğini eklemek istiyorum. Yanılmıyorsam, bir yapıyı tanımlayan kendi dilleri vardır.
Neon Warge

67

DSL'leri, daha genel bir programlama dilinde yazılmış fonksiyonlar için aşırı karmaşık argümanlar olarak düşünebilirsiniz. Gerçek programlama dili DSL kodunu ayrıştırır ve onunla bir şeyler yapar, tipik olarak DSL kodu yalnızca ne yapmak istediğinize odaklanır ve daha büyük sistem nasıl olduğunu anlar .

DSL örnekleri arasında tüm sorgu dilleri (SQL, XPath, ...), tüm şablon dilleri (Django, Smarty, ...), kabuk betikleri, özellikle dimi gibi şeyler, komutla çalışan bir web tarayıcısı (çoğunlukla otomatik test için kullanılır ), veri depolama ve değişim dilleri (XML, YAML, ...) ve LaTex, HTML veya CSS gibi belge dilleri.

TCL ve Lisp gibi çok esnek sözdizimine sahip bazı diller, DSL'lerini doğrudan dile getirir ... mümkün olduğunda. Dillerin çoğu, genellikle harici dosyalardan yüklenen dizeleri kullanır.

Bunları kullanmanın belirli avantajları var mı? Bunları amaçlanan amaçları için kullanmak, tıpkı SQL veya HTML'yi DSL'ler olarak düşünmeden kullandığınız (sanırım) gibi, bilmeden onlara döneceğiniz noktaya kadar çok avantajlıdır.

İhtiyaç duyabileceğiniz her türlü uygulama için yeterli sayıda DSL olduğunu söylemeye cesaret edeceğim; neredeyse kesinlikle kendi kitabınızı nasıl yazacağınızı öğrenmenize gerek yok.


1
Komik yeterince, liste vermedi bir örnek aklıma gelen ilk biridir: regex
CoffeeTableEspresso

12

(sorunun özüne değinerek)

Sanırım DSL'i ilk kez bir yerde ve tanımını "alana özgü dil" olarak gördüğümde, bunun daha önce duymadığım belirli, somut bir dil olduğunu da düşündüm - ama hayır, bu, belirli bir uygulama alanına göre uyarlanmıştır.

İronik olarak, TCL'yi bir "araç komut dili" olarak yeni duymuş olsaydınız, DSL'ler gibi, çeşitli araçlar için çok sayıda TCL olacağını düşünebilirsiniz - ama hayır, belirli bir komut dosyası dilinin özel adıdır.


10

Sanırım belirli bir alan için problemleri çözmeye uygun bir dil. Bir kural işleme dili veya hizmet açıklama dili olabilir.

Alana özgü bir dilin (DSL) zıttı, genel amaçlı bir dildir .


10

Her şey bir DSL ...

Assembler: MOV R1'den R2'ye
Derleyiciler: Atama İfadeleri - A = A + 1, Koşullar - IF (DOĞRU) ..., Dal - RETURN
HTML: ... iç içe geçmiş bir yapıyı tanımlayın
TCP / IP: tanımla / dan adresler
PDF: kağıt üzerinde metin / görüntü yerleşimini
açıklayın Yazı Tipleri: karakterleri tanımlayın

Belirli bir süreci tanımlamak için kullandığımız herhangi bir dil DSL'dir. Ne yazık ki, en temel süreçlerimizi bile tanımlayacak alana özgü diller yok, bu yüzden yaptığımız her şeyi açıklamak için sahip olduğumuz birkaç dili kullanıyoruz. "Web sitemdeki tüm html dosyalarını sıkıştırın" tamamlanması için 300 satırlık 3 veya 4 farklı Dil gerekir.

Bir DSL oluşturmak için, hatırlayabileceğiniz ve dokümantasyon gerektirmeyen bir işlemi açıklamak için gereken minimum karakter sayısını belirleyin. Hız ve kullanım kolaylığının birincil tasarım kriterleri olduğunu unutmayın. Ayrıştırma o kadar hızlıdır ki, kullandığınız herhangi bir sözdizimi iyidir, çoğu durumda sözdizimim olarak doğal dili tercih ederim, "Çalışanlara ayın başında ödeme yap", ancak alana özgü, yalnızca alana özgü, en iyi sözdizimini siz belirlersiniz soruna uyuyor.

Uygun olabilecek ancak Veri (XML) tanımlamak için kullanılan HTML gibi soruna uymayan diğer çözümleri kullanmaktan uzak dururdum. CSV çok kullanışlıdır, çoğu soruna uyar. JSON, kullanım kolaylığı kısmına uymuyor, gereksiz komplikasyonlar ekleyen, çoğu sorun için CSV çalışmasıydı. EXCEL'i DSL için çok kullanıyoruz, küçük sorunları tanımlamak için harika çalışıyor, ağaç yapıları veya menüler gibi 65K'dan 1M'ye kadar satırlar, A sütunu düzey, diğer sütunlar simgeler, renkler, etiketler ve benzerleridir (EXCEL bir düzenlenebilir CSV).

HTML'nin sayfa düzeni sorununu gerçekten çözmediğini buldum, bu yüzden ondan kurtuldum ve uygun bir DSL tanımladım. Sayfada HEADER, BODY, FOOTER, SOL / SAĞ KENARLAR ve SOL / SAĞ TAM KENARLAR olmak üzere 6 bölge tanımladım. Daha sonra sayfa üreticisine belirli hücrelere BAŞLIK ÇUBUĞU, DURUM ÇUBUĞU, MENÜLER, TABLO, FORMLAR, ... eklemesini söyleyebilirim. Bu Hücrelerin her biri daha sonra herhangi bir derinlikte Sıralara ve Sütunlara bölünebilir. Herhangi bir stil için sayfa düzeni saniyeler sürer.

BODY, Çalışanlarımın Bir Tablosu
HEADER, Collins Software'e giriş yapan bir Başlık Çubuğu başlığı 'Merhaba Dünya' içeriyor

Menü DSL sayfa düzeni DSL'e uymuyor, bu yüzden menüler için benzersiz bir DSL oluşturdum.

Kaynak Ana Menüm
* tanımla: menü, m, Seviye, Etiket, Simge, İşlem;
m, 0, dosya;
m, 1, open, open.gif, Dialog Open File;

Her problem benzersizdir, bilgisayar herhangi bir formatı kullanabilir, DSL'lerin tasarlandığı insandır, bu yüzden insanlar tarafından yazabilecekleri bir şey anlayabilir ve dili gerçek kelimelerden çıkarabilir; çünkü tarif ettiğimiz gerçek insanlar, yerler ve şeyler.


8

DSL, programcı olmayanlar tarafından kullanılacak bir dil geliştirmenin iyi bir yoludur. Örneğin, bir şirketteki finans çalışanları için bir DSL'iniz varsa, teknik özelliklerine göre programlama yapmak yerine, yapılmasını istedikleri programı yazmalarına izin verebilirsiniz. Sonra, eğer çok yavaşsa, yazdıklarını istedikleri gibi alabilir, hızlandırmak için derlenmiş bir dilde yazabilirsiniz.


5

İyi! yukarıda açıklanan birçok şey var. Benim gibi biri gelip anlayacağı için bunu çok daha basit bir şekilde açıklamaya çalışacağım.

Genel amaçlı diller geniş amaçlar için kullanıldığından, DSL yalnızca belirli bir etki alanı için yapılmıştır. HTML veya CSS gibi.

Sadece bir kişinin veya tek en iyi arkadaşınızın anlayabileceği ve başka kimsenin anlayamadığı bir kağıda talimat yazıp yazmadığınızı söyleyebilirsiniz. O zaman bir DSL olabilir. Ancak talimatları birçok kişinin anlayabileceği ve takip edebileceği terimlerle yazdıysanız, bu DSL değildir.

Kullanıcılar için bir bilgisayarın Seri portu üzerinden çalıştırılabilecek bir Switch board oluşturmuş ve Kullanıcı o kart için o kart üzerinde çalıştırılabilecek bir program istemekte ve buna göre Röle anahtarları açılıp kapanacaktır. Bu yüzden bazı talimatlar yazdım ve kullanıcıya bu panoyu bu talimatlara göre programlamasını söyledim. Bu bir DSL örneğidir. Yeni bir Dil icat etmedim, bunun yerine mikro denetleyicinin EEPROM'dan okuyabileceği ve buna göre ayrıştırabileceği ve belirli bir görevi yerine getirebileceği Dizeler oluşturdum.


4

DSL'leri neden sevdiğimi tartışan kısa bir blog yazısı yazdım:

Keşke Etki Alanına Özgü Diller (DSL'ler) Kullanmış olsaydık Daha Fazla

İçinde bir DSL şu şekilde tanımlıyorum:

Belirli bir sorun alanına yönelik çözümleri iletmek için özel olarak tasarlanmış küçük bir programlama dili.

Kullanım açısından, daha önce Ant, Yapılandırılmış Sorgu Dili (SQL) veya Basamaklı Stil Sayfaları (CSS) kullandıysanız, bir DSL kullandınız.

DSL'leri kullanmayı seviyorum çünkü çözümlerin belirli sorun alanlarına iletilmesini kolaylaştırmaya odaklanıyorlar ve bunu alan uzmanlarının dahil edilmesini teşvik edecek şekilde yapıyorlar.


3

Etki Alanına Özgü Dil (DSL) için basit bir örnek, web tabanlı uygulamalar adı verilen belirli etki alanı için kullanılan HTML'dir.


3

Kısa süre önce DSL'i duydum ama gerçekten yararlı bir örnek buldum: LUNA (eski lunascript).

Asana ekibi tarafından kendi platformları için yapılmış özel yapım bir programlama dili / çerçevesi.

Daha da ileride bulduğum gibi, birçok şirket uygun bir rekabet avantajı yaratmak için kendi çerçevelerini ve dillerini oluşturur, bazı örnekler:

  • AbAp ile SAP
  • PeopleSoft, PeopleCode ile
  • Objective-C ile Apple
  • Facebook'ta FBML ve FQL gibi şeyler var

Bunlar alana özgüdür çünkü onları neredeyse yalnızca bu platformlarda çalışmak için kullanacaksınız.

Umarım bu cevap kavramı netleştirmenize yardımcı olur.


3
Objective-C etki alanına özgü bir dil değildir
boraseoksoon

Ayrıca Apple tarafından (ve Apple için) yapılmadı.
Alexander Rossa

2

Makine Öğreniminde kullanılan bir DSL örneği python'da patsy'dir: https://patsy.readthedocs.io/en/latest/formulas.html#

R: https://stat.ethz.ch/R-manual/R-devel/library/stats/html/formula.html adresindeki DSL formülüne dayanmaktadır

https://cran.r-project.org/web/packages/Formula/vignettes/Formula.pdf

ve Hadley, gelişmiş R kitabında bir DSL w / R'nin nasıl oluşturulacağını açıklayan güzel bir bölüme sahiptir: http://adv-r.had.co.nz/dsl.html

Derin öğrenme alanı bir şekilde (veya şimdi bile) sabitlendiğinde, Apache MXnet projesinde benzer bir şeyin ortaya çıktığını görmek isterim. Ancak, henüz teklif sayfasında bunun için herhangi bir teklif görmedim .


1

Alana özgü diller, alan süreçlerinizi ve bilginizi, belirli alanınızdaki kavramları ve mantığı doğrudan kullanan bir dilde ifade eder.

Topluluk kesinlikle büyüyor, ancak yine de diğer "ana akım" teknolojiler düzeyinde değil.

DSL'ler çoğu zaman şirketlerin içindeki üretkenliği artırmak için yapılır, bu yüzden onu gizli tutarlar ve sonuçlarını / içgörülerini paylaşmazlar.

Burada, konuşmacının Projeksiyonel düzenleme teknolojisi ile JetBrains MPS kullanarak bazı DSL örnekleri verdiği bir konferans : https://vimeo.com/197381453


1

DSL - alana özgü dil. Etki alanı nedir başlayalım - etki alanı tanımlanmış bir alan, kapsamdır. Bu etki alanı web sitesi görünümü olabilir ve bunun için CSS'ye sahipsiniz ve ikinci etki alanı web sitesi yapısı olabilir ve burada HTML'ye sahipsiniz.

Ancak alan adı aynı zamanda Şirket X Uygulaması da olabilir. Ve bu alan kapsamında bazı diller oluşturulabilir. Dil demek değildir - kendi dilbilgisi, sözdizimi, derleyici veya çalışma zamanı ile tamamen tatlandırılmış bir şey. DSL, etki alanı sorunlarını çözen araçların bir listesi olabilir.

OOP ve modelinin, etki alanı nesnelerini sınıflara ve yöntemlere göre bu nesne davranışları olarak temsil ettiğini düşünelim. Böyle bir yapı oluşturur ve bu nesnelere davranışlar verirsek, bu kavramları kullanarak bir kod yazabiliriz. Şu sözde kod örneğini düşünün:

cookie = async getCookie(cookieId)
user = async getUser(userId)
result async user.buy(cookie)
if (result.isError()) {
  error.showAlert("User has not enough money")
} else {
  confirmation.showSuccess("Cookie was bought")
}

Yukarıdan ne kadar GPL (genel amaçlı dil) ve ne kadar spesifik alan terminolojisi ve araçları. Bu ikisinin bir karışımıdır, ancak burada tüm komutlar alana özeldir. Bununla birlikte, yukarıda, etki alanının bazı x uygulamaları olduğu DSL'de yazıldığını söyleyebiliriz.

Bu örnekle ileriye doğru daha da soyut araçlar oluşturabilirim ve çoğunlukla bu araçlarla kontrol akışını gerçekleştirebilirim, düşünün (bu daha fazla FP, ama umarım ne demek istediğimi anlarsın):

waitForMany(getCookie(cookieId), getUser(userId)
  .andThen([cookie, user] -> user.buy(cookie))
  .andThen(showSuccess("Cookie was bought"))
  .whenError(showError("User has not enough money"))

Gördüğünüz gibi, oldukça fazla soyutlamayı başardım ve bu soyutlamayı kontrol akışını gerçekleştirmek için kullandım. Ve her şey GPL'ye dayanıyor ve GPL kapsamında çalışıyor.

Gerçeği ortaya çıkarmak için hepimiz DSL yazıyoruz, kullanabileceğiniz her alana özel soyutlama nazikçe. Ancak bu soyutlamaların çoğu eksiksiz çözümler değildir, bu yüzden bu kelimeyi çok sık kullanmamaya çalışıyoruz. Ancak, etki alanınızı soyutlayan bir dizi araç, işlevlere sahipseniz, bunlar bir tür DSL oluşturur.

DSL nedir, birçok şey, örneğin kurallar dizisi sağlayan herhangi bir çerçeve DSL'dir. Birinin React geliştiricisi olduğunu iddia ettiğini görürseniz, o zaman onun Domain Spesifik Geliştirici olduğunu bilirsiniz, çünkü React tam olarak DSL'dir ve yerel web platformunu kullanmak için bir alternatiftir. Mevcut etki alanına özel araçlardan işlevsellik oluşturabiliyorsanız, DSL kullanarak yazıyorsunuz demektir. React'te daha derine inersek, üzgünüm bu DSL'den olmayan herkes: D, bir dizi bileşen oluşturabilir ve bunları yapı taşları olarak oluşturabilir ve hurra !, şimdi DSL'in üzerine DSL yaptınız.

Evet, DSL burada çok kez tekrarlandı, üzgünüm.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.