Bir program dili, programların dil semantiğini genişletmesine izin verecek kadar biçimlendirilebilir mi?


15

Bir programcının sınıfları tanımladıktan sonra herhangi bir zamanda genişletmesine / geçersiz kılmasına izin veren (String gibi sınıflar dahil) ruby ​​(ve javascript) gibi dillerdeki özelliklere referansla, teorik olarak programların daha sonra genişletilmesine izin verebilecek bir dil tasarlamak mümkün müdür? anlambilimi.

örnek: Ruby çoklu kalıtıma izin vermez, ancak çoklu kalıtım uygulamasına izin vermek için varsayılan dil davranışını genişletebilir / geçersiz kılabilirim.

Buna izin veren başka diller var mı? Bu aslında dil tasarımcıları için bir endişe konusu mu? Web uygulaması geliştirme için raylar çerçevesi oluşturmak için ruby ​​kullanma seçimine bakıldığında, bu diller çok çeşitli uygulamalar için çerçeve (veya DSL) tasarlamaya izin vermek için çok güçlü olabilir.


2
Semantik uzantılar olarak mı sayılırsınız? Şema'nın hijyenik makroları veya istisnaların kütüphane kodu olarak uygulanmasına izin veren gazetenin yansıması mı? Perligata: Romana gibi sözdizimsel uzantılar ne olacak ?

Bu kavramlardan ziyade bir dil listesi isteyen bir soru gibi görünüyor. Sorunun yönünü değiştiren bekleyen düzenlemeler, neredeyse offtopik olarak kapatmak için oy veriyorum.
Raphael

Doğru hatırlıyorsam, Java bile programların tür sistemini genişletmesine izin veren özellikler alacaktır.
Raphael

1
@Raphael, JSR 305'i mi düşünüyorsun ? Java ek açıklamaları (kısmen) aşağıdaki cevabımda bağladığım Newspeak'i tasarlayan Gilad Bracha tarafından tasarlandı ve ayrıca takılabilir tip sistemleri savundu . JSR 305 , findbugs gibi harici denetleyiciler tarafından kullanılan @Nullableve @NonNullkullanılan tip sistem ek açıklamaları sağlar .
Mike Samuel

"Anlambilimini genişletme" ile ne kastedildiği açık değildir. Ben bakarsak Boost.Spirit benim geçiyor, kişisel zaten "uzanan semantik" eşiğini: C matematiksel operatörler ++ derleyicisi sonra söz konusu dil için bir ayrıştırıcı dönüşür ki, bunun yerine bir dil sözdizimi tanımlamak için kullanılır. Laboratuvar fareleri tarafından "dil anlambilimini genişletme" ile kastedilenin bu olmadığını biliyorum, ama bence oldukça etkileyici.
DevSolar

Yanıtlar:


12

Converge oldukça etkileyici bazı meta programlama olanaklarına sahiptir.

Basit bir düzeyde, bu makro benzeri bir tesis olarak görülebilir, ancak mevcut kodların çoğundan daha güçlü olmasına rağmen, derleme zamanında rasgele kod çalıştırılabilir. Bunu kullanarak, derleyici ile etkileşime girebilir ve ITrees (yani soyut sözdizimi ağaçları) olarak güvenli ve kolay bir şekilde kod üretilebilir.

Şema'nın referans olarak saydam makro tanımlarına izin veren hijyenik makrolarından bir adım .

Kuasiliteraller gibi mekanizmalar , diğer dillerde ayrıştırma ağaçlarının oluşturulmasına ve tahrip edilmesine izin vermiştir, ancak bunlar daha çok kendi kendini değiştirmek yerine alana özgü dillerle (DSL'ler) etkileşim için kullanılır.


Newspeak'in yansıması , istisnaların kütüphane kodu olarak uygulanmasına izin verir.

7.6 İstisna İşleme

Newspeak, etkinleştirme kayıtlarına (3.6) yansıtıcı erişim (7.2) sağladığı için, kural dışı durum işleme yalnızca bir kütüphane sorunudur. Platform, Smalltalk'ta olduğu gibi istisnaları atmayı, yakalamayı ve sürdürmeyi destekleyen standart bir kütüphane sağlayacaktır.


Perligata: Romana , tamamen yeni bir sözdiziminin bir dile nasıl kaplanabileceğini gösterir.

Bu yazıda Perl programlarının Latince yazılmasını mümkün kılan bir Perl modülü - Lingua :: Romana :: Perligata - açıklanmaktadır.


Tartışmasız semantik olarak anlamlı değildi, PyPy semantik Python oldukça statik-analiz alt kümesinde belirtilen diller için tercüman jeneratör, ve onlar ekleme gibi Python yeni dil yapıları ile deney için kullanabilirsiniz Thunks dile.


Ayrıca ilgi çekici Ometa olabilir .

Bu tez bilgisayar bilimi deneyleri üzerinde duruluyor. Özellikle, deneyi desteklemek için özel olarak tasarlanmış yeni programlama dillerinin ve yapılarının araştırmacıların ve programcıların işlerini önemli ölçüde basitleştirebileceğini göstereceğim.

Çok farklı iki deney türünü ele alan bir çalışma sunuyorum. İlk olarak, yeni programlama dillerini ve mevcut dillerin uzantılarını prototiplemelerini kolaylaştırarak programlama dil araştırmacılarının fikirlerini denemelerine yardımcı olmayı amaçlamaktadır. Diğeri, programların farklı eylemler ve olasılıklarla deney yapmalarını sağlayarak, bir programlama paradigması olarak deneyi araştırır - başka bir deyişle, ne olursa olsun dil desteği sağlama girişimidir ...? ya da olası dünya akıl yürütmeleri.

Alex Warth'in tezi, JavaScript + Ometa'da önemli ölçüde yeni anlambilim (dünyalar üzerinden işlemsel anlambilim) tanımlamak için bir Ometa kullanıldığını göstermektedir.


8

"Teorik olarak uygulanabilir mi? *

LS

L

SL

Çalışma zamanı modeli uygulama dilinden önemli ölçüde farklıysa, yeni dil yine de yavaş çalışabilir. Bu durumda, tercümanın bitleri çevrilmiş kodda görünecek ve yavaş çalışmaya devam edecektir. Bununla birlikte, yeni dil çoğunlukla orijinal dil ile aynıysa, sadece birkaç ince ayar ile, kısmi değerlendirmenin dikkatli bir şekilde ayarlanmasıyla hedef koddaki yorumlayıcı bitlerinin çoğunu ortadan kaldırmak mümkün olmalıdır. Sonra performans isabeti sadece yeni özellikler için orada olacak.

Aslında, bu programlama dilleri için "sanallaştırma" teknolojisidir.


6

Tarihsel olarak, Lisp metaprogramlama olanaklarını tanıtan ilk büyük programlama diliydi. Lisp'in makro sistemi programcının yeni kontrol yapılarını, yeni veri şablonlarını, vb. Tanımlamasına izin verir. Örneğin, Ortak Lisp Nesne Sistemi tamamen nesneler veya sınıflar hakkında hiçbir şey bilmeyen bir çekirdek dilin üzerindeki makrolarla tanımlanabilir. Makro sistemi ayrıca alana özgü dillerin tanımlanmasına da izin verir .

Ruby, yansıtma ve metaprogramlama kapasitesi de dahil olmak üzere Lisp'ten çok ilham aldı. Dinamik olarak yazılan birçok dil Lisp'ten bu konuda ilham aldı. (Statik yazım işleri zorlaştırır, çünkü birçok uzantı orijinal tür sistemine sığmaz.)


4

Cevaplarda / yorumlarda henüz belirtilmemiş:

anket:

Özet: Genişletilebilir diller, kullanıcının sözdizimini değiştirmesine veya eklemesine olanak tanıyan ve yeni sözdizimsel formları anlambilim ile ilişkilendiren programlama dilleridir. Bu diller ne işe yarar? Ne tür özellikler eklemek kolaydır ve hangileri değildir? Ciddiye alınacak kadar güçlüler mi? Bu ankette prosedürel, nesne yönelimli, fonksiyonel ve genel amaçlı genişletilebilir dilleri düşündüğümüz soruları yanıtlamaya çalışacağız. Öncelikle ifade gücü (düzenli, bağlamsız), ilgili uyarılar (hijyenik olmayan, belirsizlik) ve çeşitli mekanizmaların kullanım kolaylığı ile ilgileniyoruz.

ve

Özet: Bir dili yeni sözdizimsel biçimlerle genişletme yeteneği güçlü bir araçtır. Yeterince esnek bir makro sistemi, programcıların ortak bir tabandan, problem alanları için özel olarak tasarlanmış bir dile doğru geliştirmelerini sağlar. Bununla birlikte, entegre, yetenekli ve aynı zamanda yaygın olarak kullanılacak kadar basit makro tesisler, Lisp dil ​​ailesiyle bugüne kadar sınırlı kalmıştır. Bu yazıda, Lisp makro sistemlerinin üstün gücü ve kullanım kolaylığı ile Java Syntactic Extender (JSE) adı verilen bir makro olanağı sunuyoruz, ancak Java için daha geleneksel bir cebir sözdizimine sahip bir dil. ...


1
Lütfen her referans için bir veya iki özet cümle yazın; saf link koleksiyonları neredeyse hiçbir zaman "iyi" cevaplar değildir.
Raphael
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.