TXL est un langage de programmation à usage spécifique conçu à l'origine par Charles Halpern-Hamu et James Cordy à l' Université de Toronto en 1985. L'acronyme « TXL » signifiait à l'origine « Turing eXtender Language » d'après l'objectif initial du langage, la spécification et le prototypage rapide de variantes et d'extensions du langage de programmation Turing , mais n'a plus d'interprétation significative.
Le langage TXL moderne est spécialement conçu pour créer, manipuler et prototyper rapidement des descriptions, des outils et des applications basés sur le langage en utilisant la transformation de source. Il s'agit d'un langage hybride fonctionnel / basé sur des règles utilisant la programmation fonctionnelle du premier ordre au niveau supérieur et la réécriture de termes au niveau inférieur. La sémantique formelle et l'implémentation de TXL sont basées sur la réécriture formelle des termes , mais les structures de termes sont largement cachées à l'utilisateur en raison du style de spécification de modèle de type exemple.
Chaque programme TXL comporte deux composants : une description des structures sources à transformer, spécifiée sous forme de grammaire sans contexte (éventuellement ambiguë) à l'aide d'une forme Backus-Naur étendue ; et un ensemble de règles de transformation d'arbre, spécifiées à l'aide de paires modèle/remplacement combinées à l'aide de la programmation fonctionnelle du premier ordre. TXL est conçu pour permettre au programmeur un contrôle explicite sur l'interprétation, l'application, l'ordre et le retour en arrière des règles d'analyse et de réécriture, permettant l'expression d'un large éventail de techniques basées sur la grammaire telles que l'analyse agile.
Le premier composant analyse l'expression d'entrée dans un arbre à l'aide de la recherche de motifs . Le deuxième composant utilise la réécriture de termes d'une manière similaire à Yacc pour produire la sortie transformée.
TXL est le plus souvent utilisé dans les tâches d'analyse et de réingénierie de logiciels telles que la récupération de conception et dans le prototypage rapide de nouveaux langages et dialectes de programmation.
Exemples
Tri à bulles
%Spécification de la syntaxe définir le programme [répéter le numéro] fin définir
Règles de transformation règle principale remplacer $ [répéter le numéro] N1 [numéro] N2 [numéro] Reste [répéter le numéro] où N1 [> N2] par N2 N1 Repos règle de fin
Factorielle
%Spécification de la syntaxe définir le programme [nombre] fin définir
Règles de transformation fonction principale remplacer [programme] p [nombre] par p [fait][fait0] fonction de fin
fait fonctionnel remplacer [numéro] n [nombre] construire nMinusOne [nombre] n [- 1] où n [> 1] construire factMinusOne [nombre] nMinusOne [fait] par n [* faitMinusOne] fonction de fin fonction fact0 remplacer [numéro] 0 par 1 fonction de fin