Vous avez lu dans mes pensées.
Lorsque j'ai suivi un cours sur les compilateurs, il y a quelques années, j'ai découvert que si vous prenez un AST et le sérialisez, avec la notation préfixe au lieu de la notation infixe habituelle, et utilisez des parenthèses pour délimiter des instructions entières, vous obtenez Lisp. Alors que j'avais appris le Scheme (un dialecte de Lisp) dans mes études de premier cycle, je n'avais jamais vraiment acquis une appréciation de celui-ci. Ce cours m'a permis de mieux comprendre Lisp et ses dialectes.
Problèmes avec ce que vous proposez:
il est difficile / lent de composer un AST dans un environnement graphique. Après tout, la plupart d’entre nous pouvons taper plus vite que nous ne pouvons déplacer une souris. Et pourtant, une question qui se pose est "comment écrivez-vous du code de programme avec une tablette?" Taper sur une tablette est lent / fastidieux, comparé à un clavier / ordinateur portable avec un clavier matériel. Si vous pouviez créer un AST en glissant-déposant des composants d'une palette sur un canevas, sur un grand écran tactile, la programmation sur tablette pouvait devenir une réalité.
peu / aucun de nos outils existants ne supporte cela. Nous avons des décennies de développement dans la création d'EDI de plus en plus complexes et d'éditeurs de plus en plus intelligents. Nous avons tous ces outils pour reformater le texte, comparer du texte, rechercher du texte. Où se trouvent les outils permettant d'effectuer l'équivalent d'une recherche d'expression régulière dans un arbre? Ou un diff de deux arbres? Toutes ces choses se font facilement avec du texte. Mais ils ne peuvent que comparer les mots. Modifiez un nom de variable, de telle sorte que les mots soient différents mais que la signification sémantique soit la même et que ces outils diff rencontrent des problèmes. De tels outils, développés pour opérer sur des AST au lieu de texte, vous permettraient de vous rapprocher de la signification sémantique. Ce serait une bonne chose.
Bien que la transformation du code source du programme en AST soit relativement bien comprise (nous avons des compilateurs et des interprètes, n'est-ce pas?), la transformation d'un AST en code de programme n'est pas aussi bien comprise. Multiplier deux nombres premiers pour obtenir un grand nombre composé est relativement simple, mais il est beaucoup plus difficile de factoriser un grand nombre composé en nombres premiers. c'est là où nous en sommes avec l'analyse vs la décompilation des AST. C'est là que les différences entre les langues deviennent un problème. Même dans une langue donnée, il existe plusieurs façons de décompiler un AST. Itérer dans une collection d'objets et obtenir un résultat, par exemple. Utilisez une boucle for, en parcourant un tableau? Ce serait compact et rapide, mais il y a des limites. Utilisez un itérateur de quelque sorte, opérant sur une collection? Cette collection pourrait être de taille variable, ce qui ajoute de la flexibilité aux dépens (possibles) de la vitesse. Carte / Réduire? Plus complexe, mais implicitement parallélisable. Et ce n'est que pour Java, selon vos préférences.
Avec le temps, les efforts de développement seront déployés et nous développerons à l'aide d'écrans tactiles et d'AST. Taper deviendra moins une nécessité. Je vois cela comme une progression logique de l'endroit où nous sommes, en regardant comment nous utilisons les ordinateurs, aujourd'hui, cela résoudra le problème # 1.
Nous travaillons déjà avec des arbres. Lisp est simplement des AST en série. XML (et HTML, par extension) n'est qu'un arbre sérialisé. Pour effectuer une recherche, nous avons déjà quelques prototypes: XPath et CSS (pour XML et HTML, respectivement). Lorsque des outils graphiques nous permettant de créer des sélecteurs et des modificateurs de style CSS sont créés, nous avons résolu une partie de # 2. Lorsque ces sélecteurs pourront être étendus pour prendre en charge les expressions rationnelles, nous serons plus proches. Je cherche toujours un bon outil de comparaison graphique pour comparer deux documents XML ou HTML. Alors que les gens développent ces outils, le n ° 2 sera résolu. Les gens travaillent déjà sur de telles choses; ils ne sont tout simplement pas là, pas encore.
La seule façon pour moi de pouvoir décompiler ces AST en langage de programmation serait de rechercher un objectif. Si je modifie du code existant, l'objectif peut être atteint par un algorithme qui rend mon code modifié aussi semblable que possible au code de départ (diff textuel minimal). Si j'écris du code à partir de zéro, l'objectif pourrait être le code le plus petit et le plus strict (probablement une boucle for). Ou bien ce pourrait être un code qui se parallélise le plus efficacement possible (probablement une carte / réduction ou quelque chose impliquant le CSP). Ainsi, le même AST pourrait donner lieu à un code considérablement différent, même dans le même langage, en fonction de la manière dont les objectifs ont été définis. Développer un tel système résoudrait le problème # 3. Ce serait un calcul complexe, ce qui signifie que nous aurions probablement besoin d'une sorte d'arrangement client-serveur,