DSL Oluşturma: Genel amaçlı bir dilde mi yoksa bağımsız olarak mı yazılır?


10

Belirli, belirsiz bir programlama modelini basitleştirmek için alana özgü bir dil tasarlamayı tartışıyorum. Tartışmanın bir parçası, onu mevcut bir dilin / çalışma zamanının (örn. Java) üzerine (komut dosyası olarak) oluşturmayı veya tek başına (kendi derleyici & c) oluşturup oluşturmayacağıdır.

DSL tasarım deneyimine sahip olanlar, artıları / eksileri ve uygun yaklaşıma kesin bir cevabı var mı?


Bu DSL'in tüketicisi kim? ve potansiyel ana bilgisayarlar nelerdir (Java'dan bahsettiniz, diğer olasılıkları mı düşünüyorsunuz)?
Mauricio Scheffer

Ana bilgisayarlar için herhangi bir olasılık düşünün. Tüketici asenkron programlar (hedefli mesajlar) yazanlardır.
Jé Queue

Yanıtlar:


9

DSL'inizi mevcut bir dilin (dahili DSL) üzerine oluşturmanızı öneririm. Bunu birkaç kez Python ile yaptım, DSL tüketicisinin sistem için bir yapılandırma dosyası olarak kullanılan bir python dosyası yazdığı sistemler oluşturdum. Yapılandırma dosyası, tanımladığım yapıları (sınıflar, işlevler) kullanır. Bu yapılar DSL'i oluşturur.

IMO, Python (ana bilgisayar sistemi .NET veya Java ise IronPython veya Jython) veya Ruby (IronRuby, JRuby) gibi bir dil DSL'inizi Java veya C # 'dan daha iyi bir temelde oluşturmak için daha iyidir.

Benim durumumda, ana bilgisayar sistemleri de (C) Python oldu, bu yüzden DSL için Python'u seçmek doğal bir şeydi.

Bazı artıları:

  • Düşük bina maliyeti. Uygulamanız için çok daha az şey var. Bir ayrıştırıcı / derleyici / yorumlayıcı uygulamak için zaman harcamak yerine eldeki soruna odaklanabilirsiniz.
  • Ana bilgisayar diline erişim: Diliniz, mevcut dilin / platformun tüm gücüne erişebilir.

Oldukça dil bilincindeyim, ama neden Python enkarnasyonlarının daha uygun olduğunu düşünüyorsunuz?
Jé Queue

1
Neye göre daha uygun? Sanırım Ruby ve Python aynı faydaların çoğuna sahip, Ruby daha esnek sözdizimi nedeniyle dahili DSL için daha da uygun. Java ve C # için, bu dillerde çok iyi akıcı bir arayüz gördüm (ve daha yeni sürümlerde dahili DSL oluşturma / kullanımını kolaylaştıran, nesne başlatıcı sözdizimi gibi yapılar var) - ancak IMO "düşük tören" dilleri "yüksek tören" dillerinden biraz daha uygun.
codeape

1
"#" Derleme zamanı statik tip kontrolünden yararlanmak için dahili bir DSL uygulamak için C # 'ı seçtim. Dinamik dil DSL'leri, harici DSL'lere göre çok fazla avantaj sağlamaz.
Den

@ Python'da iDSL'leri yapmaya çalıştığımda tam olarak beni hayal kırıklığına uğratan şey bu. Java'da iDSL'niz IDE'den anında destek alıyor gibi hissediyor. Python için yapacak bir IDE bulamadım.
candied_orange

2

Bak Xtext (http://www.eclipse.org/Xtext/) ve XBase (http://blog.efftinge.de/2010/09/xbase-new-programming-language.html). Kullanıcılar programcı değilse, DSL'inizi mevcut bir programlama diline dayandırmanız gerektiğini düşünmüyorum. Onlar için çok karmaşık olacak. Doğru şekilde yapılırsa "temiz" bir DSL çok verimli olabilir.


2

Belirli bir yaklaşım önermek yerine, Martin Fowler'in Etki Alanına Özgü Dilleri karar vermek için mükemmel bir kaynak olarak önermeme izin verin . İç ve dış DSL'lerin göreli değerlerinin kapsamlı, düşündürücü bir incelemesine sahiptir.


1

Üçüncü bir seçenek var - genel amaçlı bir dilin üzerine bir derleyici olarak bir DSL oluşturun. C ++ gibi düşük seviyeli bir şey de dahil olmak üzere, makul derecede metaprogramlama yeteneklerine sahip herhangi bir dil işi yapacaktır. Bu tür şeyler için Lisp ve benzer dilleri tercih ederim, ancak Template Haskell veya Nemerle de aynı düzeyde esneklik sağlayabilir.


1

Martin Folwer, "Alana Özel Diller" adlı kitabında dahili ve harici DSL'leri açıklıyor .
Internal DSL= varolan programlama dilinin bir alt kümesidir, örneğin Ruby / Java vb.
External DSL= bir sözdizimi ve bir kelime hazinesi tanımlarsınız.
Harici bir DSL çok daha etkileyici olabilir, ancak harici bir ayrıştırma ve kod oluşturma gerektirebilir.
Dahili bir DSL ek bir işlem gerektirmez, ancak programlama dışı alan uzmanları (örneğin iş analistleri, test uzmanları) için anlaşılması bazen zor olabilir.

DSL türünüzü seçerken, kullanıcılarının kim olduğunu analiz etmek önemlidir. Çoğunlukla teknik olmayan insanlarsa, harici bir DSL daha iyi bir seçim olabilir. Deneyimli programcılardan oluşan küçük bir ekip için, kullandıkları programlama dili yeterince etkileyici ise dahili bir DSL seçilebilir.

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.