Je me demande toujours pourquoi les compilateurs ne peuvent pas comprendre des choses simples qui sont évidentes pour l'œil humain. Ils font beaucoup d'optimisations simples, mais jamais de choses un tant soit peu complexes. Par exemple, ce code prend environ 6 secondes sur mon ordinateur pour imprimer la valeur zéro (en utilisant java 1.6) :
int x = 0;
for (int i = 0; i < 100 * 1000 * 1000 * 1000; ++i) {
x += x + x + x + x + x;
}
System.out.println(x);
Il est tout à fait évident que x ne change jamais, donc peu importe combien de fois vous ajoutez 0 à lui-même, il reste zéro. Le compilateur pourrait donc en théorie remplacer cette expression par System.out.println(0).
Ou encore mieux, cela prend 23 secondes :
public int slow() {
String s = "x";
for (int i = 0; i < 100000; ++i) {
s += "x";
}
return 10;
}
Premièrement, le compilateur pourrait remarquer que je crée en fait une chaîne s de 100000 "x", il pourrait donc utiliser automatiquement s StringBuilder à la place, ou encore mieux le remplacer directement par la chaîne résultante puisqu'elle est toujours la même. Deuxièmement, il ne reconnaît pas que je n'utilise pas du tout la chaîne, donc la boucle entière pourrait être rejetée !
Pourquoi, alors que tant de ressources humaines sont consacrées aux compilateurs rapides, ceux-ci sont-ils encore relativement stupides ?
EDIT : Bien sûr, ce sont des exemples stupides qui ne devraient jamais être utilisés nulle part. Mais chaque fois que je dois réécrire un code beau et très lisible en quelque chose d'illisible pour que le compilateur soit content et produise un code rapide, je me demande pourquoi les compilateurs ou un autre outil automatisé ne peuvent pas faire ce travail pour moi.
2 votes
Il semble que vous pourriez obtenir moins de votes négatifs ou de réponses se concentrant sur votre exemple de code si vous utilisiez des exemples du "monde réel" au lieu de bons exemples :-).
2 votes
Javac ne fait plus aucune sorte d'optimisation du bytecode, j'ai entendu dire que dans java 1.4 il en faisait mais le problème était que comme les optimisations vont facilement de triviales à spécifiques à la plateforme, Sun a décidé de supprimer toutes les optimisations. Java pourrait utiliser un stade de précompilation pour ces...
0 votes
La seconde prend moins d'une seconde en Perl, quelle que soit la façon dont je la traduis.
6 votes
Plus
100 * 1000 * 1000 * 1000
est optimisé à 1000000000001 votes
@Brad - Je parie que Perl implémente la concaténation de chaînes de caractères de manière plus efficace que Java. i.e. StringBuilder... essayez cela en Java et comparez les résultats.
2 votes
Vous avez écrit ce code avec l'intention que cela se produise, pourquoi le compilateur le supprimerait-il ? Peut-être que vous utilisez des boucles for pour bloquer votre programme, ou vous voulez juste tester le remplissage de la pile, ...
79 votes
Parce que les ordinateurs sont construits pour obéir, pas pour penser.
6 votes
Vous savez que la JVM effectue une optimisation du bytecode, n'est-ce pas ?
40 votes
Les compilateurs ne sont pas censés effectuer des optimisations qui sont "évidentes à l'œil nu". C'est le rôle des programmeurs. Le compilateur est censé optimiser le code généré au-delà de ce qu'un humain peut faire sans un effort déraisonnable.
2 votes
Rien n'est plus frustrant qu'une technologie qui essaie d'être trop intelligente (la correction automatique de l'orthographe en est un exemple).
14 votes
Si vous savez comment faire ce genre d'optimisations de compilateur et si vous êtes sûr à 100% de ne pas contrevenir aux intentions du programmeur qui a écrit le code, je vous recommande de poursuivre une carrière de développeur de compilateur. Si vous ne savez pas comment faire cela, alors je pense qu'il est très injuste de "demander pourquoi les compilateurs (et leurs développeurs, par procuration) sont si stupides".
0 votes
Parce que les compilateurs sont écrits par des programmeurs, et s'ils pouvaient faire tout ce que les programmeurs peuvent faire, les personnes qui ont écrit les compilateurs seraient au chômage.