Başkalarına dönüştürmek için kullanabileceğiniz kişiselleştirilebilir bir programlama dili var mı?


13

Kendi sözdizimi yapılandırmalarınızı ayarlayabileceğiniz bir programlama dili var mı ve kodu seçtiğiniz bir dile çevirir mi?

Örneğin, "Python'un dizine alınmış blokları" gibi belirli konfigürasyonları seçersiniz, [a,b,c]dizileri başlatır, ^üs alma ve diğerleri için. Bir komut dosyası onu dil seçiminize eşdeğer yapar.


1
Eminim hayır. TIMTOWTDI tartışmasız kötüdür, ancak "istediğiniz kadar uyumsuz yol icat edin" kesinlikle yüzlerce kez dezavantajlı olacaktır ve daha az yararlı olacaktır. DSL'ler bazen değer, ama sözdizimi yarısını yeniden tanımlanması (ya da daha kötüsü - belirgin Compability ama farklı sözcüklerle veren iki operatörleri takas) ... durup dururken için

Bunu soruyorum çünkü özellikle javascript üzerinde programlıyorum ve gerçekten, benim kodumda birkaç sözdizimi şekeri ayarlamak mümkün ama dil sadece izin vermez. Operatör aşırı yüklemesi bile mümkün değildir.
Dokkat

2
Bir dereceye kadar, tanımladığınız şey önişlemci makroları gibi geliyor . Şimdi perl için benzer bir özelliğe sahip olsaydık ...
yannis

5
@ Dokkat: Lütfen soruyu özellikle JavaScript ile ilgili olduğunu belirtmek için güncelleyin . Soru - sorulduğu gibi - bir bakım ve destek kabusu. Mevcut bir dile yeni sözdizimi eklemek (veya özel dilinizi genel bir dile değiştirmek için bir ön işlemci kullanmak) gerçekten korkunçtur. Ancak. Belirli JavaScript sözdizimi şekeri sorunlarını listelerseniz , özel yardım alabilirsiniz .
S.Lott

3
Bu "kişiselleştirilmiş programlama dilleri" normalde "alana özel diller" veya DSL'ler olarak adlandırılır.
Michael Dillon

Yanıtlar:


14

Evet, ama muhtemelen düşündüğünüz şekilde değil.

Lisp ve akrabaları, kaynağınızda rasgele dönüşümler yapmanıza izin veren güçlü makro sistemlere sahiptir, bu nedenle prensipte istediğiniz herhangi bir uzantıyı yapmak için makroları (ve karakter düzeyinde okuyucu makrolarını) kullanabilirsiniz. Birleştirici diller (ve ilgili alanlardaki yazarların dilleri) benzer meta programlama gücü potansiyeline sahiptir . Bunun iyi bir örneği Forth olan (örneğin, yorumlar) sözdizimsel yapıların bir çok kullanıcı tanımlı olabilir. Çağdaş, ezoterik olmayan bir örnek için, kullanıcı tanımlı sözdizimi için Perl 6'ya Perl 5 üzerinde gelişmiş destek verme çabası da vardır.


8
Bir şekilde Perl'in cevabın bir parçası olacağını biliyordum. Sanırım C önişlemci makroları da açıklamaya uyuyor.
yannis

Ayrıca operatör C ++ aşırı yükleme güzel olabilir. Merhaba dünya örneği akla geliyor. cout << "Merhaba";
Lord Tydus

@LordTydus: Gerçekten ve hatta sadece aşırı yükleme, aklı başında bir arayüzün arkasında biraz sihir yapmanıza izin verir. C ++ 'ın daha genel aşırı yükleme yeteneklerine sahip olması, örneğin operator[]çoklu argümanlar için aşırı yükleme yapması veya Haskell'deki gibi yeni operatörler getirmesi iyi olurdu ; ancak komitenin ayrıştırma sorunlarını geçeceğinden şüpheliyim.
Jon Purdy

3

Kavram programlama gibi geliyor .

Buna aşina değilim, ama XL özellikle bunun için tasarlanmış bir dildir.

XL, programcı tarafından yeniden yapılandırılabilir sözdizimi ve anlambilim özelliğine sahiptir. Derleyici eklentileri dile yeni özellikler eklemek için kullanılabilir.

Lisp ve Forth, XL'den daha az olmasına rağmen konsept programlamayı da destekler. Lisp'i çok pratik ve etkili olduğu için öneririm. En önemli şey, Lisp'in sağladığı notasyon değil, açık ve esnek bir sözdizimidir.


Örneğin, "Python'un dizine eklenmiş blokları", "[a, b, c]" dizileri başlatır, üs ve diğerleri için "^" gibi belirli yapılandırmalar seçersiniz.

Haskell gibi çok esnek ancak tekdüze bir sözdizimine sahip bir dil ilginizi çekebilir.


Aradığım şey buydu.
Dokkat

2

Bildiğim kadarıyla değil.

Bunun özellikle iyi bir fikir olacağını düşünmüyorum - standart bir dil sözdiziminin temel faydalarından biri, birçok insanın okuyabiliyor olması ve eğer herkes kendi sözdizimini icat etmiş olsaydı, kimse başka birinin kodunu anlayamazdı. .... yani bu dil bir hobici için eğlenceli olabilir ama pratik bir şey için çok fazla kullanılamaz.

Var olan en yakın şey muhtemelen, makro sisteminin kendi yeni dil yapılarınızı çok esnek bir şekilde yazmanıza izin verdiği Lisp olacaktır. Normalde hala Lisp sözdizimine bağlı kalırsınız, ancak gerçekten istiyorsanız her şeyi etkili bir şekilde yeniden tanımlayabilirsiniz.

Sonuç olarak, Lisps DSL uygulamaları için özellikle popüler olma eğilimindedir. Buna güzel bir örnek, Clojure'daki (Korma) veri erişim DSL'sine , veritabanı erişimi için gereken tüm kaynak koduyla ilgileniyor.


2

Scala genellikle bu şekilde DSL'lere, Etki Alanına Özel Diller oluşturmak için kullanılır.

Bunun nedeni Scala'nın operatörleri olmaması ve sözdizimini çağıran Scala yönteminin kısaltılmasıdır. Örneğin:

5, bir Tamsayı nesnesidir. 5 artı 7 hesaplamak için yazabilirsiniz

val ans = 5.add (7) dışında, ekleme yöntemi aslında "+" olarak adlandırılır, böylece şunu yazarsınız:

val ans = 5. + (7) ancak Scala'da "." ifadesini eklemenize gerek yoktur. yöntem çağrıları veya argümanların etrafındaki "()" parantezlerinde, nesne 5 üzerindeki + yöntemini çağırmak için şunu yazarsınız:

val ans = 5 + 7, Scala'nın akıllı yöntem adlandırma düzeninize müdahale edecek hiçbir operatörü olmadığı için mükemmel çalışıyor. Şimdi bu fikri kendi sınıflarınıza ve nesnelerinize taşıyın, + gibi yöntemleri "geçersiz kılabilir" ve >>> veya :: adlı kendi yöntemlerinizi oluşturabilirsiniz! veya @ * @ veya yalnızca fancify gibi düz metin adları kullanabilirsiniz.


Bu harika. Scalaya bir göz atacağım.
Dokkat

1

Hala çoğunlukla deneysel olduğu için kullanmanız gerektiğini söylememek, ancak son zamanlarda ilginç bir programlama paradigması Dil Odaklı Programlama (LOP).

Dil Odaklı Programlama kavramı, kullanıcının şartlarında gereksinimleri yakalamak ve daha sonra, kullanıcının açıklamalarına mümkün olduğunca izomorfik bir uygulama dili oluşturmaya çalışmaktır, böylece gereksinimler ve uygulama arasındaki eşleme mümkün olduğunca doğrudan olur.

Sergey Dmitriev bunu daha ayrıntılı olarak açıklıyor .

Bunun ideolojisi budur, ancak pratikte istediğin davranışı desteklediği kaygılıdır. Yapabilirsin:

  • Mevcut bir dili genişletin.
  • Farklı diller oluşturun.
  • Yeni tanımladığınız anahtar kelimeleri temel bir dile dönüştürmek için mevcut bir 'dönüşüm dilini' kullanın.

Bu paradigmayı takip ettiğimi bildiğim en aktif programlama ortamı JetBrains'in ücretsiz Meta Programlama Sistemi'dir (MPS).

Aslında ticari yazılımlarda da kullanılmaya başlandı, belki de 'deneysel' aşamasından çıkmaya başlıyor:

  • Realaxy , tamamen MPS üzerine inşa edilmiş bir actioncript editörüdür. LOP'un gücünü kullanarak örneğin AS3 için kapaklar uygulayabildiler.
  • mbeddr C , MPS'ye dayanan genişletilebilir bir C dilidir.

1

Etki alanına özgü diller, Tcl topluluğunda oldukça yaygın olarak kullanılmaktadır. Örneğin, hem C hem de SQL'i gömülü DSL'ler olarak içeren bir Tcl programını (Critcl ve Sqlite paketleri aracılığıyla) görmek hiç de nadir değildir. Gömülü bir DSL'deki tek kısıtlama hakkında, gömülü dilin kıvırcık parantezlerini dengelemesi çok daha iyi ve pratikte gerçekten zahmetsiz bir gereklilik olduğu ortaya çıkıyor!

DSL'leri kolaylaştıran bir diğer dil, genel sistem belirteçinden (belirteçlerin anahtar kelimelere dönüştürüldüğü noktadan önceki) ham belirteçlere erişmenizi sağlayan Standart ML'dir. Bu , özellikle yorumlar, dizeler ve token sınırlarıyla ilgili olarak SML'nin temel sözdizimi kurallarından bazılarına uymaları şartıyla geniş bir DSL sınıfı yapmayı kolaylaştırır ve aslında dil için bir dizi önemli sürüş uygulamasında yoğun olarak kullanılır (teorem kanıtlayıcıları vb.)

Tüm diller bu kadar kolay değildir. Özellikle, hazır terimlerin içeriğini otomatik olarak ayrıştıran diller (birçoğu!) Bunu yapamaz, bu nedenle DSL'nin alt dili bir dizenin içine koyarak geçersiz kılan operatörler tarafından oluşturulmasını veya DSL'yi ana bilgisayar dili içinde ele alınabilecek bir şeye yeniden yazan bir ön işlemci kullanarak.


0

AFAIU, kendi DSL'nizi (Etki Alanına Özel Dil) yazmanıza yardımcı olabilecek diller arıyorsunuz. Çok iyi adaylar var. Şahsen Ruby veya Io'yu öneriyorum, çünkü 1) kolay operatör aşırı yüklemesi, 2) meta programlama ve 3) method_missingkendi API'nizi oluşturmak için kullanabileceğiniz yedek mekanizmalar sunuyorlar . Örneğin, Ruby'de yazılmış ve Ruby kodunu okuyarak SQL üreten bir DSL olan sqldsl'ye bir göz atın .


0

Aslında değil kullanılan başına bunu, ama eğer doğru geri çağırmak, txl özellikle kaynak kodunu çevirmek için tasarlanmıştır. Bu nedenle, dili ve / veya dil uzantılarından herhangi bir hedef gerçek dile nasıl çevrileceğini belirtmek için kullanabilirsiniz.

Javascript için kullanılabilir bir dilbilgisi var gibi görünüyor . Ancak, daha önce kullanmamış olsaydım, bunun size nasıl yardımcı olacağını tam olarak bilmiyorum.


0

Orada oldukça güçlü PPWizard denilen güzel bir önişlemci var. Sözdizimini öğrendikten sonra, farklı dilleri hedeflemek için makro kusurları oluşturabilirsiniz - bu konu için kusursuz veya eğlenceli olacağını değil, yararlı bir araçtır.


burada bazı bağlantılar: PPWIZARD İÇERİKLERİ (resmi dokümanlar), PPWizard - EDM2 (harici referans). Araç güçlüdür, ancak belgelerinin okunması kolay değildir (belki gücü nedeniyle).
Kurt


0

Bir programlama dilini kısmen kişiselleştirmenin yaygın bir yolu, bir makro ön işlemci kullanmaktır. Örneğin, sonucu bazı javascript ortamının indireceği yere koymadan önce C önişlemcisi üzerinden "dokkat-lang" çalıştırabilirsiniz.

Ne kadar yapabileceğiniz, ön işlemcinizin karmaşıklığına bağlıdır. C ++, Objective C ve çeşitli deneysel dillerin ilk sürümlerinin, stok C derleyici araç zincirine beslenmeden önce kaynak kodunu önceden işleyerek yapıldığını unutmayın.

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.