J'ai été en train de construire des outils (DMS Software Reengineering Toolkit) pour manipuler des programmes à usage général (la traduction de langage étant un cas spécial) depuis 1995, soutenu par une solide équipe de scientifiques informatiques. DMS fournit une analyse générique du parsing, construction d'AST, tables de symboles, analyse de flux de contrôle et de données, application de règles de traduction, régénération de texte source avec des commentaires, etc., tous paramétrés par des définitions explicites de langages informatiques.
La quantité de machinerie dont vous avez besoin pour faire cela bien est immense (surtout si vous voulez être capable de le faire pour plusieurs langages de manière générale), et ensuite vous avez besoin de parseurs fiables pour des langages avec des définitions peu fiables (PHP est l'exemple parfait de ceci).
Il n'y a rien de mal à penser à construire un traducteur de langage à langage ou à essayer, mais je pense que vous trouverez que c'est une tâche beaucoup plus grande pour des langages réels que vous ne le pensez. Nous avons investi environ 100 années-hommes uniquement dans DMS, et encore 6-12 mois dans chaque définition de langage "fiable" (y compris celle que nous avons douloureusement construite pour PHP), beaucoup plus pour des langages difficiles comme le C++. Ce sera une "expérience d'apprentissage infernale"; ça l'a été pour nous. (Vous trouverez peut-être la section Papers techniques sur le site Web mentionné ci-dessus intéressante pour démarrer rapidement cet apprentissage).
Beaucoup de gens tentent souvent de construire une sorte de machinerie généralisée en commençant par une technologie avec laquelle ils sont familiers, qui fait une partie du travail. (Les AST de Python sont un excellent exemple). La bonne nouvelle, c'est que cette partie du travail est faite. La mauvaise nouvelle, c'est que cette machinerie a des milliers d'hypothèses intégrées, dont la plupart vous ne découvrirez que lorsque vous essaierez de la forcer à faire autre chose. À ce moment-là, vous découvrirez que la machinerie est câblée pour faire ce qu'elle fait à l'origine, et résistera vraiment à votre tentative de la faire faire autre chose. (Je soupçonne qu'essayer de faire en sorte que l'AST de Python modèle PHP sera très amusant).
La raison pour laquelle j'ai commencé à construire DMS à l'origine était de construire des fondations qui avaient très peu de telles hypothèses intégrées. Elle en a certaines qui nous donnent des maux de tête. Jusqu'à présent, pas de trous noirs. (La partie la plus difficile de mon travail ces 15 dernières années est d'essayer d'empêcher de telles hypothèses de s'introduire).
Beaucoup de gens font également l'erreur de penser que s'ils peuvent parser (et peut-être obtenir un AST), ils sont bien avancés pour faire quelque chose de compliqué. L'une des leçons difficiles est que vous avez besoin de tables de symboles et d'analyses de flux pour faire une bonne analyse ou transformation de programmes. Les AST sont nécessaires mais pas suffisants. C'est la raison pour laquelle le livre sur les compilateurs d'Aho&Ullman ne s'arrête pas au chapitre 2. (Le PO a raison de prévoir de construire une machinerie supplémentaire au-delà de l'AST). Pour en savoir plus sur ce sujet, consultez Life After Parsing.
La remarque sur "je n'ai pas besoin d'une traduction parfaite" pose problème. Ce que les traducteurs faibles font, c'est convertir les 80% "faciles" du code, laissant les 20% difficiles à faire manuellement. Si l'application que vous envisagez de convertir est assez petite, et que vous n'envisagez de la convertir qu'une fois correctement, alors ce 20% est correct. Si vous souhaitez convertir de nombreuses applications (ou même la même avec des modifications mineures dans le temps), ce n'est pas bien. Si vous essayez de convertir 100K lignes de code source, alors 20% équivaut à 20 000 lignes de code originales difficiles à traduire, comprendre et modifier dans le contexte d'autres 80 000 lignes de programme traduit que vous ne comprenez déjà pas. Cela nécessite un énorme effort. Au niveau du million de lignes, cela est tout simplement impossible en pratique. (Étonnamment, il y a des gens qui se méfient des outils automatisés et insistent pour traduire des systèmes à un million de lignes manuellement; c'est encore plus difficile et ils découvrent généralement cette difficulté avec de longs retards, des coûts élevés et souvent un échec total).
Ce que vous devez viser pour traduire des systèmes à grande échelle est des taux de conversion proches de 99%, sinon il est probable que vous ne pourrez pas terminer la partie manuelle de l'activité de traduction.
Une autre considération clé est la taille du code à traduire. Il faut beaucoup d'énergie pour construire un traducteur fonctionnel et robuste, même avec de bons outils. Bien que cela puisse sembler sexy et cool de construire un traducteur au lieu de simplement faire une conversion manuelle, pour de petits codes (par exemple, jusqu'à environ 100K lignes de code source à notre expérience), l'économie ne justifie tout simplement pas cela. Personne n'aime cette réponse, mais si vous devez vraiment traduire seulement 10K lignes de code source, vous êtes probablement mieux de serrer les dents et de le faire. Et oui, c'est douloureux.
Je considère nos outils comme extrêmement bons (mais bon, je suis assez partial). Et il est encore très difficile de construire un bon traducteur; il nous faut environ 1,5 à 2 années-hommes et nous savons comment utiliser nos outils. La différence est qu'avec autant de machinerie, nous réussissons considérablement plus souvent que nous échouons.