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.
źródło
@Nullable
i@NonNull
które są używane przez zewnętrzne kontrolery, takie jak findbugs.Odpowiedzi:
Converge ma kilka imponujących możliwości metaprogramowania.
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.
Perligata: Romana pokazuje, w jaki sposób można stworzyć zupełnie nową składnię na język.
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 .
Praca Alexa Wartha demonstruje użycie Ometa do zdefiniowania znacznie nowej semantyki (semantyka transakcyjna przez światy) w JavaScript + Ometa.
źródło
„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ęzykL. 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.
źródło
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).
źródło
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. ...
źródło