Il est écrit dans l'article que l'optimisation sera globale et non plus locale.
De quoi s'agit - il ?
D'analyse de flot, très probablement.
L'analyse de flot consiste à analyser toutes les branches d'exécutions du code, de produire un graphe de dépendances des données afin de détecter ce qui sera exécuté et ce qui ne le sera pas (qu'on appelle code mort).
Typiquement, un objet C hérite de A et B, or dans le code on exécute que C.méthode(), B.méthode(), mais jamais A.méthode()
A.méthode() est donc du code mort à ne pas inclure dans le code finale et à ne pas tester à (l'eventuelle) résolution dynamique de branche.
Une analyse de flot peut être plus ou moins profonde. Ainsi une analyse très profonde peut être munie d'un moteur logique qui va par exemple détecter qu'une variable n est forcément pair (n := n*2;) et 10 km plus loins que l'on teste sa parité.
Le moteur logique vire le test, ayant déduit qu'il ne sert à rien.
Tout ceci permet d'optimiser avec bonheure toute sorte de choses faisable jusqu'ici par un humain mais rendant le code très vite illisible et inmaintenable.
Ce genre d'algorithme est passeblement exponenentielle et est surtout très gourmand en mémoire.
Lisaac qui est pour le moment le seul compilateur objet à implémenter ce type d'algorithme (oui je sais, prosélytisme), utilise environ 256 à 512 Mo pour compiler 50 000 lignes (pour 90 secondes de compilation sur une bonne machine).
« Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker
[^] # Re: Compilation lente <=> Analyse de flot
Posté par Ontologia (site web personnel) . En réponse à la dépêche Lancement du projet GlobalGCC. Évalué à 10.
De quoi s'agit - il ?
D'analyse de flot, très probablement.
L'analyse de flot consiste à analyser toutes les branches d'exécutions du code, de produire un graphe de dépendances des données afin de détecter ce qui sera exécuté et ce qui ne le sera pas (qu'on appelle code mort).
Typiquement, un objet C hérite de A et B, or dans le code on exécute que C.méthode(), B.méthode(), mais jamais A.méthode()
A.méthode() est donc du code mort à ne pas inclure dans le code finale et à ne pas tester à (l'eventuelle) résolution dynamique de branche.
Une analyse de flot peut être plus ou moins profonde. Ainsi une analyse très profonde peut être munie d'un moteur logique qui va par exemple détecter qu'une variable n est forcément pair (n := n*2;) et 10 km plus loins que l'on teste sa parité.
Le moteur logique vire le test, ayant déduit qu'il ne sert à rien.
Tout ceci permet d'optimiser avec bonheure toute sorte de choses faisable jusqu'ici par un humain mais rendant le code très vite illisible et inmaintenable.
Ce genre d'algorithme est passeblement exponenentielle et est surtout très gourmand en mémoire.
Lisaac qui est pour le moment le seul compilateur objet à implémenter ce type d'algorithme (oui je sais, prosélytisme), utilise environ 256 à 512 Mo pour compiler 50 000 lignes (pour 90 secondes de compilation sur une bonne machine).
« Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker