Вы читали мои мысли.
Когда я прошел курс по компиляторам несколько лет назад, я обнаружил, что если вы берете AST и сериализуете его с префиксной нотацией вместо обычной инфиксной нотации и используете круглые скобки для разделения целых операторов, вы получаете Lisp. Хотя я узнал о Scheme (диалекте Lisp) в своих исследованиях старшекурсников, я так и не получил за это высокую оценку. В результате этого курса я определенно оценил Лисп и его диалекты.
Проблемы с тем, что вы предлагаете:
трудно / медленно составить AST в графической среде. В конце концов, большинство из нас может печатать быстрее, чем мы можем двигать мышью. И все же, возникает вопрос: «Как вы пишете программный код с планшета?» Печатание на планшете медленное / громоздкое по сравнению с клавиатурой / ноутбуком с аппаратной клавиатурой. Если бы вы могли создать AST, перетаскивая компоненты из палитры на холст на большом, программирование устройства с сенсорным экраном на планшете могло бы стать реальной вещью.
немногие из наших существующих инструментов поддерживают это. У нас десятилетия разработки, заключающейся в создании все более сложных IDE и все более интеллектуальных редакторов. У нас есть все эти инструменты для переформатирования текста, сравнения текста, поиска текста. Где инструменты, которые могут выполнять поиск по регулярному выражению по дереву? Или разница двух деревьев? Все эти вещи легко сделать с помощью текста. Но они могут сравнивать только слова. Измените имя переменной так, чтобы слова были разными, но семантическое значение одинаково, и эти инструменты сравнения столкнутся с проблемами. Такие инструменты, разработанные для работы с AST вместо текста, позволят вам приблизиться к сравнению семантического значения. Это было бы хорошо.
в то время как преобразование исходного кода программы в AST является относительно понятным (у нас есть компиляторы и интерпретаторы, не так ли?), превращение AST в программный код не так хорошо понято. Умножение двух простых чисел для получения большого составного числа является относительно простым, но разложить большое составное число обратно на простые числа гораздо сложнее; вот где мы с разбором против декомпиляции AST. Вот где различия между языками становятся проблемой. Даже в пределах определенного языка есть несколько способов декомпилировать AST. Например, перебирая коллекцию объектов и получая какой-то результат. Использовать цикл for, проходящий через массив? Это было бы компактно и быстро, но есть ограничения. Используйте итератор какой-то, работает над коллекцией? Эта коллекция может иметь переменный размер, что добавляет гибкости за счет (возможно) скорости. Уменьшение карты? Более сложный, но неявно распараллеливаемый. И это только для Java, в зависимости от ваших предпочтений.
Со временем усилия по разработке будут израсходованы, и мы будем разрабатывать с использованием сенсорных экранов и AST. Печатание станет меньше необходимости. Я вижу, что в качестве логического продвижения от того, где мы находимся, глядя на то, как мы сегодня используем компьютеры, это решит # 1.
Мы уже работаем с деревьями. Лисп - это просто сериализованный AST. XML (и HTML, по расширению) - это просто сериализованное дерево. Для поиска у нас уже есть пара прототипов: XPath и CSS (для XML и HTML соответственно). Когда будут созданы графические инструменты, которые позволят нам создавать селекторы и модификаторы в стиле CSS, мы решим часть # 2. Когда эти селекторы могут быть расширены для поддержки регулярных выражений, мы будем ближе. Все еще ищу хороший графический инструмент сравнения для сравнения двух документов XML или HTML. По мере того, как люди будут разрабатывать эти инструменты, № 2 будет решена. Люди уже работают над такими вещами; их просто нет, пока.
Единственный способ, с помощью которого я смогу декомпилировать эти AST в текст на языке программирования, - это поиск цели. Если я изменяю существующий код, цель может быть достигнута с помощью алгоритма, который делает мой измененный код максимально похожим на исходный код (минимальная разность текстов). Если я пишу код с нуля, целью может быть наименьший, самый трудный код (вероятно, цикл for). Или это может быть код, который распараллеливается настолько эффективно, насколько это возможно (скорее всего, карта / сокращение или что-то, связанное с CSP). Таким образом, один и тот же AST может привести к значительному различию кода, даже на одном языке, в зависимости от того, как поставлены цели. Разработка такой системы решит проблему № 3. Это будет сложным в вычислительном отношении, то есть нам, вероятно, понадобится какая-то схема клиент-сервер,