Techniques D'Optimisation Automatique Du Code


Je travaille sur un projet pour convertir automatiquement un langage personnalisé en Java et on m'a demandé de faire quelques optimisations de base du code pendant le processus de conversion. Par exemple, le code personnalisé peut avoir quelque chose comme:

if someFunction(a, b) > x:
    do something
else:
    return someFunction(a, b) + y

Dans ce cas, someFunction est appelé plusieurs fois avec les mêmes entrées, donc des performances supplémentaires peuvent être obtenues en mettant en cache la valeur de someFunction() et en l'appelant une seule fois. Ainsi, une version "optimisée" du code ci-dessus peut ressembler quelque chose comme:

var1 = someFunction(a, b)

if var1 > x:
    do something
else:
    return var1 + y

Actuellement, cela se fait à la main pendant le processus de conversion. J'exécute un programme pour convertir le code dans le langage personnalisé en Java, puis examine manuellement le code converti pour voir ce qui peut être optimisé. Je veux automatiser le processus d'optimisation car ces problèmes se reproduisent encore et encore. Les personnes qui écrivent le code dans la langue personnalisée ne veulent pas s'inquiéter de telles choses, donc je ne peux pas leur demander de s'assurer que le code qu'ils me donnent est déjà optimisé.

Quels sont les tutoriels, les articles, etc... cela détaille comment de telles choses sont faites dans les compilateurs modernes? Je ne veux pas trop avoir à réinventer la roue. Merci à l'avance.

Modifier 1:

On peut supposer que la fonction est pure.

Author: Chuong Ngo, 2016-10-10

1 answers

Ceci est connu comme élimination des sous-expressions redondantes.

Normalement, cela vous obligerait à implémenter un compilateur complet afin de faire l'analyse du flux de données. Un algorithme est donné dans Dragon Book , "6.1.2 La Méthode Valeur-Nombre pour construire des DAG" (pour le CSE local au moins).

 2
Author: Cine, 2016-10-12 03:22:56