Czy istnieje spersonalizowany język programowania, którego można użyć do konwersji na inne?

13

Czy istnieje język programowania, w którym można ustawić własne konfiguracje składni, i przekonwertowałby kod na wybrany język?

Na przykład wybrałbyś określone konfiguracje, takie jak „bloki indeksowane Pythona”, [a,b,c]inicjuje tablice, ^potęgowanie i inne. Skrypt przekonwertuje go na odpowiednik wybranego języka.

Dokkat
źródło
1
Mam nadzieję, że nie. TIMTOWTDI jest prawdopodobnie zły, ale „wynaleźć tyle niezgodnych sposobów, ile chcesz” z pewnością miałoby te same minusy razy sto, a nawet byłoby mniej użyteczne. DSL są czasem tego warte, ale przedefiniowanie połowy składni (lub co gorsza - zamiana dwóch operatorów, co daje pozorną kompatybilność, ale inną semantykę) tylko do cholery ...
Pytam o to, ponieważ w szczególności programuję na javascript i naprawdę bardzo chciałbym móc ustawić kilka cukrów składniowych w moim kodzie, ale język po prostu na to nie pozwala. Nawet przeciążenie operatora nie jest możliwe.
Dokkat 21.01.12
2
W pewnym stopniu to, co opisujesz, brzmi jak makra preprocesora . Teraz, gdybyśmy mogli mieć podobną funkcję dla perla ...
yannis
5
@Dokkat: Zaktualizuj pytanie, aby wyraźnie zaznaczyć, że chodzi o JavaScript. Pytanie - jak zadano - to koszmar utrzymania i wsparcia. Dodanie nowej składni do istniejącego języka (lub użycie preprocesora do zmiany języka prywatnego na język publiczny) jest naprawdę okropne. Jednak. Jeśli podasz konkretne problemy z cukrem związanym ze składnią JavaScript, możesz uzyskać konkretną pomoc.
S.Lott,
3
Te „spersonalizowane języki programowania” są zwykle nazywane „językami specyficznymi dla domeny” lub DSL.
Michael Dillon

Odpowiedzi:

14

Tak, ale prawdopodobnie nie tak, jak myślisz.

Lisp i jego krewni mają potężne systemy makr, które pozwalają ci przeprowadzać dowolne transformacje na twoim źródle, więc w zasadzie możesz używać makr (i makr czytnika, na poziomie postaci), aby tworzyć dowolne rozszerzenia, które ci się podobają. Języki konkatenatywne (i języki autorów w powiązanych obszarach) mają potencjał do podobnej siły metaprogramowania . Dobrym przykładem tego jest Forth , w którym wiele konstrukcji składniowych (takich jak komentarze) może być zdefiniowanych przez użytkownika. Dla współczesnego, nie-ezoterycznego przykładu, podjęto wysiłek, aby zapewnić Perlowi 6 lepszą obsługę w stosunku do Perla 5 również dla składni zdefiniowanej przez użytkownika .

Jon Purdy
źródło
8
I jakoś wiedział Perl byłby (część) odpowiedzi. Sądzę, że makra preprocesora C również pasują do opisu, w niewielkim stopniu.
yannis
Również przeciążenie operatora w C ++ może być przyjemne. Przychodzi mi na myśl przykład hello world. cout << „Cześć”;
Lord Tydus
@LordTydus: Rzeczywiście, a nawet samo przeciążenie operatora pozwala wykonać sporo magii za rozsądnym interfejsem. Byłoby miło, gdyby C ++ miał bardziej ogólne możliwości przeciążania, powiedzmy, przeciążanie operator[]wielu argumentów lub wprowadzanie nowych operatorów, jak w Haskell; ale wątpię, by komisja zrozumiała poprzednie kwestie.
Jon Purdy,
3

Brzmi jak programowanie koncepcyjne .

Nie znam go, ale XL jest językiem specjalnie do niego zaprojektowanym.

XL oferuje składnię i semantykę rekonfigurowalną przez programistę. Wtyczek kompilatora można używać do dodawania nowych funkcji do języka.

Lisp i Forth obsługują również programowanie koncepcyjne, chociaż mniej niż XL. Sugeruję Lisp, ponieważ jest bardzo praktyczny i skuteczny. Najważniejszą rzeczą jest jasna i elastyczna składnia, a nie notacja, którą zapewnia Lisp.


Na przykład wybrałbyś określone konfiguracje, takie jak „bloki indeksowane Pythona”, „[a, b, c]” inicjuje tablice, „^” dla potęgowania i inne.

Możesz być zainteresowany takim językiem jak Haskell, który ma bardzo elastyczną, ale jednolitą składnię.

Pubby
źródło
Właśnie tego szukałem.
Dokkat
2

Nic mi nie wiadomo.

Nie wydaje mi się, aby byłby to szczególnie dobry pomysł - jedną z głównych zalet standardowej składni językowej jest to, że wiele osób może ją odczytać, a jeśli każdy wynalazłby własną składnię, nikt nie byłby w stanie zrozumieć kodu innego użytkownika. .... więc ten język może być dobrą zabawą dla hobbystów, ale nie ma większego zastosowania do niczego praktycznego.

Prawdopodobnie najbliższą rzeczą będzie Lisp, gdzie system makr pozwala pisać własne konstrukcje językowe w bardzo elastyczny sposób. Normalnie nadal trzymałbyś się składni Lisp, ale możesz skutecznie przedefiniować wszystko, jeśli naprawdę chcesz.

W rezultacie Lisps są szczególnie popularni przy wdrażaniu DSL. Dobrym przykładem jest ten dostęp do danych DSL w Clojure (Korma), który dba o cały kod płyty głównej wymagany do dostępu do bazy danych.

mikera
źródło
2

Scala jest często używana w ten sposób do tworzenia DSL, języków specyficznych dla domeny.

Dzieje się tak głównie dlatego, że Scala nie ma operatorów, a składnia wywołująca metodę Scala może być skrócona. Na przykład:

5 jest obiektem typu Integer. Aby obliczyć 5 plus 7, możesz napisać

val ans = 5.add (7) z wyjątkiem tego, że metoda dodawania faktycznie nosi nazwę „+”, więc napiszesz:

val ans = 5. + (7), ale w Scali nie trzeba dołączać „.” w wywołaniach metod lub w nawiasach „()” wokół argumentów, aby wywołać metodę + na obiekcie 5, piszesz

val ans = 5 + 7, co działa idealnie, ponieważ Scala nie ma operatorów, którzy kolidowaliby z twoim sprytnym schematem nazewnictwa metod. Teraz rozszerz ten pomysł na własne klasy i obiekty, w tym fakt, że możesz „przesłonić” metody takie jak +, a także stworzyć własne metody o nazwie >>> lub ::! lub @ * @ lub zwykłe nazwy tekstowe, takie jak fantazyjne.

Michael Dillon
źródło
To jest niesamowite. Spojrzę na Scalę.
Dokkat
1

Nie oznacza to, że powinieneś go używać, ponieważ wciąż jest w większości eksperymentalny, ale jednym z interesujących ostatnich paradygmatów programowania jest Programowanie zorientowane na język (LOP).

Koncepcja programowania zorientowanego na język polega na uchwyceniu wymagań w kategoriach użytkownika, a następnie próbie stworzenia języka implementacji możliwie izomorficznego do opisów użytkownika, tak aby odwzorowanie między wymaganiami a implementacją było jak najbardziej bezpośrednie.

Siergiej Dmitriew wyjaśnia to bardziej szczegółowo .

Taka jest jego ideologia, ale praktycznie sprowadza się do tego, że wspiera zachowanie, o które prosisz. Możesz:

  • Rozszerz istniejący język.
  • Komponuj różne języki.
  • Użyj istniejącego „języka transformacji”, aby przekonwertować nowo zdefiniowane słowa kluczowe na język podstawowy.

Najbardziej aktywnym środowiskiem programistycznym, jakie znam po przestrzeganiu tego paradygmatu, jest bezpłatny Meta Programming System (MPS) firmy JetBrains.

W rzeczywistości zaczyna też być wykorzystywany w oprogramowaniu komercyjnym, więc być może zaczyna się wychodzić z fazy „eksperymentalnej”:

  • Realaxy to edytor skryptów akcji zbudowany w całości na MPS. Wykorzystując moc LOP byli w stanie wdrożyć np. Zamknięcia dla AS3.
  • mbeddr C to rozszerzalny język C oparty na MPS.
Steven Jeuris
źródło
1

Języki specyficzne dla domeny są dość często używane w społeczności Tcl. Na przykład wcale nie jest rzadkością zobaczyć program Tcl, który zawiera zarówno C, jak i SQL jako osadzone DSL (za pośrednictwem pakietów Critcl i Sqlite). Jedynym ograniczeniem wbudowanego DSL jest to, że znacznie lepiej jest, jeśli język osadzony równoważy nawiasy klamrowe, a to okazuje się być naprawdę nieuciążliwym wymaganiem w praktyce!

Innym językiem ułatwiającym DSL jest Standard ML, który pozwala na dostęp do surowych tokenów z ogólnego tokenu systemu (od momentu, w którym identyfikatory są konwertowane na słowa kluczowe). To sprawia, że robi szeroką klasę DSL proste - pod warunkiem, że słuchać niektóre z podstawowych zasad składniowych SML, zwłaszcza w odniesieniu do uwag, smyczki i granice Token - i jest w rzeczywistości używany intensywnie w wielu kluczowych aplikacji napędową języku (dowody twierdzeń itp.)

Nie wszystkie języki sprawiają, że jest to takie proste. W szczególności języki, które automatycznie analizują zawartość wzmocnionych haseł (wiele z nich!) Nie mogą tego zrobić, dlatego wymagają zbudowania DSL przez nadpisujące operatory, poprzez umieszczenie podjęzyka w ciągu lub za pomocą preprocesora, który przepisuje DSL na coś, co może być obsługiwane w języku hosta.

Donal Fellows
źródło
0

AFAIU szukasz języków, które pomogą Ci napisać własny DSL (język specyficzny dla domeny). Jest wielu dobrych kandydatów. Osobiście poleciłbym Ruby lub Io, ponieważ oferują one 1) łatwe przeciążanie operatora, 2) metaprogramowanie i 3) mechanizmy zastępcze method_missing, których można użyć do stworzenia własnego API. Na przykład spójrz na sqldsl , DSL napisany w Ruby, który generuje SQL poprzez czytanie kodu Ruby.

sakisk
źródło
0

Właściwie nie używałem go jako takiego, ale jeśli dobrze pamiętam, TXL jest specjalnie zaprojektowany do tłumaczenia kodu źródłowego. Jako taki, powinieneś być w stanie używać go do określania sposobu tłumaczenia z twojego języka i / lub rozszerzeń językowych na dowolny docelowy język rzeczywisty.

Wygląda na to, że gramatyka jest dostępna dla Javascript. Ale, nie używając go wcześniej, nie jestem pewien, jak to by ci pomogło.

mootinator
źródło
0

Istnieje ładny preprocesor o nazwie PPWizard, dość potężny. Gdy nauczysz się jego składni, możesz tworzyć definicje makr, by kierować reklamy na różne języki - nie żeby to było niezawodne lub zabawne w tej kwestii, ale jest to przydatne narzędzie.

znak
źródło
tutaj kilka linków: SPIS TREŚCI PPWIZARD (oficjalne dokumenty), PPWizard - EDM2 (zewnętrzny odnośnik). Narzędzie jest potężne, ale jego dokumentacja nie jest łatwa do odczytania (być może ze względu na jego moc).
Wolf
0

Być może szukasz kompilatora kompilatora. Kompilator kompilatora przyjmuje definicję języka zapisaną w języku formalnym i tworzy kompilator dla tego języka.

Zajrzyj na http://en.wikipedia.org/wiki/Compiler-compiler

Olivier Jacot-Descombes
źródło
0

Jednym z powszechnych sposobów częściowej personalizacji języka programowania jest użycie preprocesora makr. Na przykład możesz uruchomić „dokkat-lang” przez preprocesor C przed umieszczeniem wyniku w miejscu, w którym pobrałoby go jakieś środowisko javascript.

To, co możesz zrobić, zależy od zaawansowania twojego preprocesora. Zauważ, że wczesne wersje C ++, Objective C i różne języki eksperymentalne zostały wykonane przez wstępne przetworzenie kodu źródłowego przed przekazaniem do podstawowego zestawu narzędzi kompilatora C.

hotpaw2
źródło