Czytasz mi w myślach.
Kiedy kilka lat temu wziąłem kurs kompilatora, odkryłem, że jeśli weźmiesz AST i serializujesz go, z notacją prefiksu zamiast zwykłej notacji infiksu i użyjesz nawiasów do rozdzielenia całych instrukcji, otrzymasz Lisp. Podczas gdy uczyłem się o Scheme (dialekcie Lisp) podczas moich studiów licencjackich, nigdy tak naprawdę nie doceniłem tego. Zdecydowanie zyskałem uznanie dla Lispa i jego dialektów w wyniku tego kursu.
Problemy z tym, co proponujesz:
komponowanie AST w środowisku graficznym jest trudne / wolne. W końcu większość z nas może pisać szybciej niż my możemy poruszać myszą. A jednak powstaje pytanie: „jak piszesz kod programu za pomocą tabletu?” Pisanie na tablecie jest powolne / kłopotliwe w porównaniu do klawiatury / laptopa z klawiaturą sprzętową. Jeśli możesz utworzyć AST, przeciągając i upuszczając komponenty z palety na płótno na dużym urządzeniu z ekranem dotykowym, programowanie na tablecie może stać się rzeczywistością.
niewiele / żadne z naszych istniejących narzędzi nie obsługuje tego. Mamy dekady rozwoju poświęconego tworzeniu coraz bardziej złożonych IDE i coraz bardziej inteligentnych edytorów. Mamy wszystkie te narzędzia do formatowania tekstu, porównywania tekstu, wyszukiwania tekstu. Gdzie są narzędzia, które mogą wykonywać wyszukiwanie wyrażeń regularnych w drzewie? A może różnica dwóch drzew? Wszystkie te rzeczy można łatwo zrobić z tekstem. Ale mogą tylko porównać słowa. Zmień nazwę zmiennej, tak aby słowa były różne, ale znaczenie semantyczne było takie samo, a te narzędzia porównywania napotkały problemy. Takie narzędzia, opracowane do działania na AST zamiast tekstu, pozwolą zbliżyć się do porównania znaczenia semantycznego. To byłaby dobra rzecz.
podczas gdy przekształcanie kodu źródłowego programu w AST jest stosunkowo dobrze zrozumiane (mamy kompilatory i interpretatory, prawda?), przekształcanie AST w kod programu nie jest tak dobrze zrozumiane. Mnożenie dwóch liczb pierwszych w celu uzyskania dużej liczby zespolonej jest względnie proste, ale uwzględnienie dużej liczby złożonej z powrotem w liczbach pierwszych jest znacznie trudniejsze; to jest miejsce, w którym parsujemy vs dekompilujemy AST. Właśnie tutaj różnice stają się problemem. Nawet w określonym języku istnieje wiele sposobów dekompilacji AST. Iterowanie przez kolekcję obiektów i uzyskiwanie jakiegoś wyniku, na przykład. Użyć pętli for, iterując po tablicy? Byłoby to kompaktowe i szybkie, ale istnieją ograniczenia. Użyj jakiegoś iteratora, działasz na kolekcji? Kolekcja ta może mieć różne rozmiary, co zapewnia elastyczność przy (możliwym) koszcie prędkości. Mapa / Zmniejszenie? Bardziej złożone, ale domyślnie możliwe do zrównoleglenia. I to tylko dla Java, w zależności od twoich preferencji.
Z czasem wysiłek rozwojowy zostanie poświęcony, a my będziemy rozwijać się za pomocą ekranów dotykowych i AST. Pisanie stanie się mniej konieczne. Widzę to jako logiczny postęp z miejsca, w którym jesteśmy, patrząc na dzisiaj, jak korzystamy z komputerów, to rozwiąże # 1.
Już pracujemy z drzewami. Lisp to tylko serializowane AST. XML (i HTML, według rozszerzenia) to tylko zserializowane drzewo. Aby przeprowadzić wyszukiwanie, mamy już kilka prototypów: XPath i CSS (odpowiednio dla XML i HTML). Kiedy tworzone są narzędzia graficzne, które pozwalają nam tworzyć selektory i modyfikatory w stylu CSS, rozwiążemy część # 2. Kiedy te selektory mogą zostać rozszerzone o obsługę wyrażeń regularnych, będziemy bliżej. Wciąż szukam dobrego graficznego narzędzia do porównywania dwóch dokumentów XML lub HTML. Gdy ludzie będą rozwijać te narzędzia, # 2 będzie można rozwiązać. Ludzie już pracują nad takimi rzeczami; po prostu ich jeszcze nie ma.
Jedynym sposobem, w jaki widzę możliwość dekompilacji tych AST do tekstu w języku programowania, byłoby dążenie do celu. Jeśli modyfikuję istniejący kod, cel może zostać osiągnięty przez algorytm, który sprawia, że mój zmodyfikowany kod jest jak najbardziej zbliżony do kodu początkowego (minimalne różnice tekstowe). Jeśli piszę kod od zera, celem może być najmniejszy, najściślejszy kod (prawdopodobnie pętla for). Lub może to być kod, który działa równolegle tak skutecznie, jak to możliwe (prawdopodobnie mapa / redukcja lub coś z udziałem CSP). Tak więc ten sam AST może skutkować znacznie innym kodem, nawet w tym samym języku, w zależności od tego, jak ustalono cele. Opracowanie takiego systemu rozwiązałoby # 3. Byłoby to skomplikowane obliczeniowo, co oznacza, że prawdopodobnie potrzebowalibyśmy pewnego rodzaju konfiguracji klient-serwer,