Dil Odaklı Programlama pratik midir?


12

Dile Yönelik Programlama hakkındaki bu makaleyi okudum . Programlamaya yönelik modern prosedürel / OOP yaklaşımlarındaki bazı zayıflıklara dikkat çekiyor ve bunları çözecek yeni bir programlama paradigması öneriyor

Ben küçük, gevşek bağlı program parçaları içinim: Sadece kullanacağınız birçok küçük şeyi öğrenmek, sadece bit ve parçalarını kullandığınız birkaç büyük şeyden daha iyidir.

Makaleyi okurken, yazarın iki şeyden birini tanıttığı izlenimini edindim:

  • Kolayca oluşturulabilen çok sayıda komut dosyası dili
  • Programcının ihtiyaçlarını karşılamak için kendini yeniden yazabilen tek, kolayca genişletilebilir bir dil

Eğer ikincisini önerirse, "Zaten yapıldı!" Lisp'i örnek alalım. Paul Graham'ın öne sürdüğü gibi, diller yine de buna doğru ilerliyor gibi görünüyor .

Birincisi ile ilgili olarak, hepsini birbirine bağlayan temel bir dil varsa, bu iyi bir fikir olduğunu düşünüyorum. Bana göre zayıf nokta: diller arasındaki iletişim. Bana süreçler arası iletişimi hatırlatan, yordamsal bir kavram ya da mesaj geçişi olan çağrıları kullanır mısınız? Eğer hepsini aynı anda kullanmak kolaysa, küçük alana özgü dillerle çalışma fırsatını memnuniyetle karşılarım. Bu yaklaşım (LOP) pratik olur mu?


Çok büyük bir zihin üfleme potansiyeline sahip.

2
Bu paradigmanın hangi sorunu çözdüğü açık değil. Bu arada, LISP başarılı bir dil örneği değildir.
mouviciel

7
@mouviciel "başarılı" ile tam olarak ne demek istediğinize çok bağlıdır. Programcıların çoğunluğu tarafından kullanılıyor mu? Hayýr. Uzun zamandýr, kullanýyor mu? Evet - 50 yıl ve artıyor. Modern dillerin çoğu ondan bir sürü yararlı özellik çaldı mı? Evet. (Diller Lisp dillerinden daha fazla çalabilir mi? Evet!)
Frank Shearar

2
Yaygın olarak kullanılan bir dil ile kullanışlı bir dil arasında bir fark vardır. Yeni alanları araştıran bir dil genellikle kullanılmaz, ancak uzun vadede herkese katkıda bulunabilir. Öte yandan, Java işe yaramaz, çünkü masaya yeni bir şey getirmez (kesinlikle tüm hesaplar tarafından başarılı bir dil olmasına rağmen).
Matthieu M.7

1
Lisp'e hakim olmak Cobol'a hakim olmaktan daha yararlı olur.
glenatron

Yanıtlar:


8

Uzun zamandır DSL'leri savunuyorum, ancak bandwago olduklarında İyi Fikirler'e ne olacağı konusunda endişeleniyorum. İyi Fikir tanıtımı yapan ürünler üretilir, yapmanız gereken tek şey bir tane almaktır ve ne anlama geldiğini çok dikkatli düşünmek zorunda kalmadan grupta olacaksınız.

Dil nedir? Anlamların iletilebileceği bir kelime ve sözdizimi, değil mi? Her değişken bildirdiğinizde, bir işlev yazdığınızda, bir sınıf tanımladığınızda, varolan bir dile isim ve fiil ekleyerek yeni bir dil oluşturuyorsunuz. Şimdi içinde daha önce yapamayacağınız şeyler söyleyebilirsiniz.

Dile özgü bir dil yapan şeyin doğal olarak iletilen zihinsel kavramları ne ölçüde ifade ettiği ve bence bunun basit bir ölçüsü olduğunu düşünüyorum. Temel olarak, programa dahil edilebilen veya eklenemeyen basit bir bağımsız bağımsız gereksinim X varsa, doğru uygulanması için bazı kod ekleme, silme ve değiştirme Y kümeleri gerekir. Y. Bu tür değişikliklerin N sayısı, dilin alan adına özgü olduğunun bir ölçüsüdür. Daha küçük N, tipik gereksinimler için daha iyidir.

Her zaman süslü sözdizimine, kontrol yapılarına, mesaj geçişine veya neye sahip olduğunuza bağlı değildir. Ne bağlı olduğu gereksinimi ne kadar kısaca uygular. Birçok araç bunu yaptığını iddia edecektir, ancak iddialar gerçek değildir. Gerçek olmalı .

Bazen alışılmadık teknoloji olduğunu gerekli. İşte benim en sevdiğim örnek. Öyleyse, programcılar tarafından anlamak için çaba gerektirebileceği noktasını göstermektedir. Dolayısıyla, etki alanına özgü (ve sürdürülebilirlik) okunabilirlikle aynı şey değildir .

Bu yüzden ikinci yaklaşıma katılıyorum, iyi bir dil, kişinin gerekli dilleri üzerine inşa etmesine izin veren bir dildir. (Lisp'i sevdim.) Ama daha da önemlisi, programcıların çalıştıkları alanlara uygun dilleri nasıl oluşturacaklarını bilmeleri ve bu tür dillerin öğrenme eğrilerini tırmanmaya istekli olmaları gerekiyor.

Gerçekten olduğunu görmüyorum. Bunun yerine "programlar = algoritmalar + veri yapısı" ya da "isimler sınıf haline gelir ve fiiller yöntem haline gelir" diye düşünürler. Düşünce alanlarını nasıl alacağınız ve maksimum kısaltma için onları nasıl dillendirecekleri konusunda çalışmıyorlar.


Bandwagon kısmında kesinlikle katılıyorum - "sivri saçlı patron hangi dilde yazılması gerektiğini biliyor. [...] Java." Başka bir sorun Joel'in "mimari astronot" olarak adlandırdığı şeydir. Ayrıca DSL'lerin birbirlerine reklam infitium (sp?) Üzerinde istiflendiğini görebiliyordum . Sanırım programcı -> yazılım mühendisi -> bilgisayar bilimcisi.
Michael K

Ve anlamak için çaba gerektirmiyorsa, gerçekten buna değmez :)
Michael K

4

Bu oldukça yakut bir yaklaşım.

  • Çekirdek dili basit tutun ve taşlar ile genişletin
  • Maymun yamasıyla belirli alanlar için Ruby lehçeleri oluşturun. Ruby on Rails.

Bunun daha iyi olup olmadığını bilmiyorum, ama sanırım çok pragmatik.


7
RoR, Ruby'nin bir lehçesi değildir.
back2dos

4
@ back2dos: Meta programlamayı düşünüyordum. Tabii RoR olduğu değil , farklı bir programlama dili. Diyalekt ile kastettiğim, Rails altındaki her şey Ruby olsa bile, geliştirici bakış açısından Ruby'yi daha yüksek bir soyutlama seviyesinde kullanıyor. Bir alan adı. Bir lehçe. Görüşleri, modelleri, denetleyicileri kullanıyor ve bunları farklı bir dile benzeyen bir sözdizimi, yani bir lehçe kullanarak programlıyor. Ruby kadar güçlü bir yazı dilinin güzelliği budur.
Nerian

Bence farkı gerçekten görmek önemli. AspectJ, Java'nın bir lehçesidir, AspectR ise sadece bir Ruby kütüphanesidir. Aradaki fark gerçekten dildir. Ruby bu esnekliği ve ifadeyi sağlamak için tasarlandı ve Java değildi. Her ikisi de genel amaçlı diller olarak kabul edilebilir, fark şu ki, Ruby genellikle herhangi bir genel amaç için gerçek bir DSL ihtiyacını ortadan kaldıracak kadar etkileyici olsa da, Java, örneğin genellikle görünümleri, modelleri ve denetleyicileri sık sık kullanmanıza rağmen.
back2dos

1

LOP yaklaşımı son derece pratiktir. "Komut dosyası yazma dillerini" uygulamak zorunda olmanız gerekmediğini unutmayın; yöntem eDSL'ler için de geçerlidir ve bunlar genellikle verimli bir şekilde derlenmiştir. Bu yaklaşımı kelimenin tam anlamıyla tüm geliştirme çalışmalarımda kullanıyorum.


Cehaletimi affedin - bir eDSL, anter dili için önişlemci olabilir, değil mi?
Michael K

@Michael, evet, eDSL'yi bu şekilde uygulamak mümkündür, örneğin bkz. CamlP4. Ancak daha sıklıkla eDSL, dilin kendi özellikleri üzerine inşa edilir (örn. Lisp makroları, C ++ şablonları vb.).
SK-logic

1

Gelecekte Etki Alanına Özel Diller hakkında çok daha fazla şey göreceğiz, şimdi onlar hakkında konuşan insanlar tarafından değerlendirilecek - Martin Fowler'ın da onlardan çok konuştuğunu ve bu konuda Lambda The Ultimate aracılığıyla birkaç ilginç makaleyi fark ettim , diğerleri arasında.

Bu bana bunun programlama dili tasarımı ve programlama platformları açısından rüzgârın esdiği bir yön olduğunu düşündürüyor. Bazı açılardan bir süredir oldu - Ruby'nin avantajlarından biri (bazılarının zaten gözlemlediği gibi) DSL oluşturmayı kolaylaştırması, ancak aslında zaten kullandığımız uygulamalarda ve programlama kütüphanelerinde bir sürü var.


Sen FoF ekleyebilirsiniz ile Barrelfish çok çekirdekli Sürücüler geliştirmek için kullanılır. DSL'leri geliştirmek için bir dil :)
Matthieu M.

0

Yalnız programlama yaparken LOP kullanıyorum. Bazı projelerde programı karşılamanın başka bir yolu olmadığını buldum. Basit bir alegoride, elektrikli el aletlerine LOP kullanımı eşitlenebilir. Atölyede tek başına çalışıyorsanız, işleri manuel olarak yapamaz ve son tarihi karşılayamazsınız. Yanınızda başka kişiler varsa, bu elektrikli aletlerin kullanımını koordine etmek verimlilik ve güvenlik için gereklidir.
Ekip modunda, LOP, Babil Kulesi felaketinden kaçınmak için örgütsel hazırlık gerektirir.

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.