Czy język programu może być wystarczająco plastyczny, aby umożliwić programom rozszerzenie semantyki języka?

15

W odniesieniu do funkcji w językach takich jak ruby ​​(i javascript), które pozwalają programiście rozszerzyć / przesłonić klasy w dowolnym momencie po ich zdefiniowaniu (w tym klasy takie jak String), czy teoretycznie wykonalne jest zaprojektowanie języka, który może pozwolić programom na późniejsze rozszerzenie jego semantyka.

np .: Ruby nie zezwala na wielokrotne dziedziczenie, ale mogę rozszerzyć / zastąpić domyślne zachowanie języka, aby umożliwić implementację wielokrotnego dziedziczenia.

Czy są na to inne języki? Czy to jest rzeczywiście przedmiotem zainteresowania projektantów języków? Patrząc na wybór użycia ruby ​​do budowy frameworka do tworzenia aplikacji internetowych, takie języki mogą być bardzo wydajne, aby umożliwić projektowanie frameworków (lub DSL) dla szerokiej gamy aplikacji.

sandeepkunkunuru
źródło
2
Czy liczysz jako rozszerzenia semantyczne Higieniczne makra Scheme lub odbicie gazety, które pozwalają na implementację wyjątków jako kodu biblioteki? Co z rozszerzeniami składniowymi, takimi jak Perligata: Romana ?
To wydaje się być pytaniem o listę języków zamiast pojęć. W oczekiwaniu na zmiany zmieniające kierunek pytania, praktycznie głosuję na zamknięcie jako offtopic.
Raphael
Jeśli dobrze pamiętam, nawet Java dostanie funkcje, które pozwolą programom rozszerzyć system typów.
Raphael
1
@ Rafael, myślisz o JSR 305 ? Adnotacje w Javie zostały zaprojektowane (częściowo) przez Gilada Brachę, który zaprojektował Newspeak, który podłączyłem w mojej odpowiedzi poniżej, a także poparł systemy wtykowe . JSR 305 dostarcza adnotacje systemowe typu jak @Nullablei @NonNullktóre są używane przez zewnętrzne kontrolery, takie jak findbugs.
Mike Samuel
Niejasne, co należy rozumieć przez „rozszerzanie semantyki”. Jeśli spojrzę na Boost.Spirit , który już przekracza mój osobisty próg „rozszerzania semantyki”: Operatory matematyczne w C ++ są używane do opisania składni języka, a następnie kompilator przekształca się w parser dla tego języka. Wiem, że nie to rozumie się przez „rozszerzanie semantyki języka” przez szczury laboratoryjne, ale myślę, że jest to dość imponujące.
DevSolar

Odpowiedzi:

12

Converge ma kilka imponujących możliwości metaprogramowania.

Na prostym poziomie można to postrzegać jako narzędzie podobne do makr, chociaż jest ono potężniejsze niż większość istniejących narzędzi do makr, ponieważ dowolny kod można uruchomić w czasie kompilacji. Korzystając z tego, można wchodzić w interakcje z kompilatorem i generować kod bezpiecznie i łatwo jako ITrees (inaczej abstrakcyjne drzewa składniowe).

co stanowi krok w górę od higienicznych makr Scheme, które umożliwiają referencyjnie przejrzyste definicje makr.

Mechanizmy takie jak quasiliterals pozwoliły na konstruowanie i destrukcję drzew parsowanych w innych językach, ale są one częściej używane do interakcji z językami specyficznymi dla domeny (DSL) zamiast do samodzielnej modyfikacji.


Refleksja Newspeak pozwala na implementację wyjątków jako kodu biblioteki.

7.6 Obsługa wyjątków

Ponieważ Newspeak zapewnia odblaskowy dostęp (7.2) do rekordów aktywacyjnych (3.6), obsługa wyjątków jest kwestią czysto biblioteczną. Platforma zapewni standardową bibliotekę, która obsługuje zgłaszanie, wychwytywanie i wznawianie wyjątków, podobnie jak w Smalltalk.


Perligata: Romana pokazuje, w jaki sposób można stworzyć zupełnie nową składnię na język.

W tym artykule opisano moduł Perla - Lingua :: Romana :: Perligata - który umożliwia pisanie programów w języku Perl po łacinie.


Prawdopodobnie nieistotne semantycznie, PyPy jest generatorem interpreterów dla języków, których semantyka jest określona w wysoce statystycznie analizowanym podzbiorze Pythona, i używają go do eksperymentowania z nowymi konstrukcjami językowymi w Pythonie, takimi jak dodawanie thunks do języka.


Interesujący może być również Ometa .

Niniejsza rozprawa koncentruje się na eksperymentach w dziedzinie informatyki. W szczególności pokażę, że nowe języki programowania i konstrukcje zaprojektowane specjalnie w celu wspierania eksperymentów mogą znacznie uprościć zadania badaczy i programistów.

Prezentuję pracę, która dotyczy dwóch bardzo różnych rodzajów eksperymentów. Pierwszy ma na celu pomóc badaczom języków programowania eksperymentować z ich pomysłami, ułatwiając im prototypowanie nowych języków programowania i rozszerzeń istniejących języków. Drugi bada eksperymentowanie jako paradygmat programowania, umożliwiając programom eksperymentowanie z różnymi działaniami i możliwościami - innymi słowy, jest to próba zapewnienia wsparcia językowego, co jeśli ...? lub możliwe rozumowanie światów.

Praca Alexa Wartha demonstruje użycie Ometa do zdefiniowania znacznie nowej semantyki (semantyka transakcyjna przez światy) w JavaScript + Ometa.

Mike Samuel
źródło
8

„Czy jest to teoretycznie wykonalne? *

Oczywiście, że jest. Zawsze można napisać tłumacza w języku ( ) dla innego języka ( SL.S. ) i pisać programy w nowym języku. Ludzie często tego nie robią, ponieważ napisanie takiego interpretera może wymagać dużo pracy, a dodatkowa warstwa interpretacji będzie miała wpływ na wydajność (współczynnik 10-100).

Oba problemy mają rozwiązania. Język L. można zaprojektować za pomocą rozbudowanych narzędzi do metaprogramowania, aby ułatwić implementację tłumaczy. Języki takie jak Scheme mają to.

Można zaimplementować częściowy ewaluator, aby interpreter mógł zostać przekształcony w kompilator (od do L)S.L. ). Wtedy nie dostaniesz wydajności, ponieważ dodatkowa warstwa interpretacyjna została wyeliminowana.

Nowy język może nadal działać wolno, jeśli jego model wykonawczy różni się znacznie od języka implementacji. W takim przypadku bity interpretera pojawią się w przetłumaczonym kodzie i nadal będą działać wolno. Jeśli jednak nowy język jest w większości taki sam, jak język oryginalny, z kilkoma drobnymi poprawkami, powinno być możliwe wyeliminowanie większości bitów interpretera w kodzie docelowym poprzez staranne dostrojenie częściowej oceny. Wtedy hit wydajności będzie dostępny tylko dla nowych funkcji.

W efekcie jest to technologia „wirtualizacji” dla języków programowania.

Uday Reddy
źródło
6

Historycznie Lisp był pierwszym ważnym językiem programowania, który wprowadził narzędzia do metaprogramowania. System makr Lisp pozwala programiście definiować nowe struktury kontrolne, nowe szablony danych itp. Na przykład Common Lisp Object System można zdefiniować całkowicie za pomocą makr powyżej podstawowego języka, który nie wie nic o obiektach lub klasach. System makr umożliwia także definiowanie języków specyficznych dla domeny .

Ruby czerpie wiele inspiracji z Lisp, w tym zdolność refleksyjności i metaprogramowania. Wiele dynamicznie pisanych języków czerpie inspirację z Lisp. (Pisanie statyczne komplikuje rzeczy, ponieważ wiele rozszerzeń nie pasuje do oryginalnego systemu typów).

Gilles „SO- przestań być zły”
źródło
4

Nie wspomniano jeszcze w odpowiedziach / komentarzach:

Badanie:

Abstrakcyjny: Języki rozszerzalne to języki programowania, które pozwalają użytkownikowi modyfikować lub dodawać składnię oraz kojarzyć nowe formy składniowe z semantyką. Do czego służą te języki? Jakie funkcje można łatwo dodać, a które nie? Czy są wystarczająco potężni, aby traktować ich poważnie? W tej ankiecie postaramy się odpowiedzieć na takie pytania, jakie rozważamy w językach proceduralnych, obiektowych, funkcjonalnych i uniwersalnych. Interesuje nas przede wszystkim moc ekspresji (zwykła, bezkontekstowa), związane z nią zastrzeżenia (niehigieniczność, niejednoznaczność) i łatwość użycia różnych mechanizmów.

i

Streszczenie: Umiejętność rozszerzenia języka o nowe formy składniowe jest potężnym narzędziem. Wystarczająco elastyczny system makr pozwala programistom budować od wspólnej bazy do języka zaprojektowanego specjalnie dla ich problematycznej dziedziny. Jednak zintegrowane, zdolne, a jednocześnie wystarczająco proste, aby można je było powszechnie stosować, zostały dotychczas ograniczone do rodziny języków Lisp. W tym artykule przedstawiamy narzędzie do makr, zwane Java Syntactic Extender (JSE), o doskonałej mocy i łatwości użycia systemów makr Lisp, ale dla Java, język o bardziej konwencjonalnej składni algebraicznej. ...

Vor
źródło
1
Napisz jedno lub dwa zdania podsumowujące dla każdego odniesienia; czyste zbiory linków prawie nigdy nie są „dobrymi” odpowiedziami.
Raphael