Affichage des articles dont le libellé est informatique. Afficher tous les articles
Affichage des articles dont le libellé est informatique. Afficher tous les articles

dimanche 5 octobre 2008

L'optimisation des fonctions récursives en C/C++




Lors de mes pérégrinations geekesques, j’ai pu entendre dansquelques contrées universitaires, que les compilateurs C/C++ savaient optimiserles fonctions récursives. Certains disaient qu’elles étaient transformé enboucles itérative d’autres disaient que si elles étaient écrites correctementelles devenaient récursives terminales.

Qu’est-ce qu’une fonction récursive correctementécrite ?

int fonction_recursive(int parametre){

if(parametre==0){



return parametre;

}

else

{

int tmp=parametre- 1;

return fonction_recursive(tmp);

}



}



C’est une fonction qui retourne uniquement un appel de fonction.



Ce que j’appelle une fonction récursive non correctement écrite c’est :

int fonction_recursive(int parametre){

if(parametre==0){

return parametre;

}

else

{

int tmp=parametre- 1;

returntmp + fonction_recursive(tmp);

}



}



Ici le return contient un appel de fonction plus uneopération. On m’a dit que ce type de fonction n’est pas optimisable par lecompilateur car pour mémoriser la variable tmp, le compilateur devra la placersur la pile. La pile grossira a chaque appel de fonction, ce qui nuira auxperformances, de plus à partir d’un certain nombre d’appels on se trouveconfronté a un stack overflow. On m’a dit aussi que certains compilateurs commeGCC sont capable d’optimiser les fonctions récursives correctement écrites.J’entends par optimisation effectuer les appels récursifs sans faire grossir lapile (vu qu’aucune variable n’a besoin d’être mémorisé) et donc sans aller audevant de quelques déconvenues (stack overflow…).

Ne sachant pas si le compilateur C/C++ de visual studio 2008pouvait en faire autant j’ai décidé de mener une expérience. Deuxcompilateurs : GCC 3.4.5 (mingw) et le VC++ 2008 le tout sous Windows.

Sur les deux plateformes la fonction correctement écrite estoptimisé, petit bémol VC++ (contrairement à GCC) n’est pas capable d’optimiser les fonctionset de générer des informations de débogage. Du coup on ne peut pas voir avec ledébogueur si la pile grossit ou pas. Pour s’avoir si l’optimisation était passéej’ai du passé en paramètre à la fonction un argument de très grande valeur.Cette valeur provoquait un stack overflow sans optimisation. Avecl’optimisation la fonction se terminait sans erreur.

La fonction non correctement écrite est (à ma grandesurprise) optimisé par VC++ mais pas par GCC (expérience à renouveler avec GCC4.3), la encore seule un argument de très grande valeur m’a permis de vérifierque l’optimisation a été bien effectuée.

mercredi 6 août 2008

Logiciel Libre

Tout d'abord qu'est-ce que le logiciel libre ? Je dirais que c'est un logiciel dont le code source est disponible pour tous, gratuitement et dans sa totalité ; ce genre de logiciel n'appartient à personne en particulier, donc à tout le monde. J'ai décris la le point commun que partagent tous les logiciels libres quelque soit leur licence, car oui, de nombreuses licences existent, et elles décrivent autant d'utilisations différentes de logiciels libres. Les logiciels libres sont souvent gratuits, et à peu près n'importe quelle personne relativement compétente en programmation peut contribuer à un logiciel libre. Dans la plupart des cas, les licences sont virales, par exemple, quelqu'un qui conçois un nouveau logiciel dont le code est basé sur un logiciel libre, devra le distribuer selon les termes de la licence du logiciel libre dont il est issu. Quel est l'intérêt des logiciels libres ? En fait, il n'y a pas un intérêt mais plusieurs, la disponibilité du code source, permet à tout le monde de l'étudier (cette étude nécessite néanmoins certaines compétences dans le domaine de la programmation que tout le monde ne possède pas) et donc d'apprendre des techniques de conception de logiciels etc.… Cette même disponibilité du code permet à chacun d'adapter le logiciel à ses besoins. Elle permet de concevoir son logiciel sans partir de zéro, et donc d'économiser du temps en basant son logiciel sur le code sources d'autres logiciels libres. Le fait que tel ou tel logiciel libre n'appartienne à personne donc à tout le monde présente un avantage, si l'entreprise qui maintenait un logiciel libre coule, une autre entreprise ou une communauté pourra le maintenir. Il faut rajouter à ces avantages, que la plupart des logiciels libres sont gratuits.

Parmi les logiciels libres connus on peut citer, Firefox, OpenOffice.org, amsn, VLC, et bien sur Linux.

Cette description ne prétend pas être exhaustive, elle tente juste de planter le décor

Le monde du logiciel libre est divisé en deux catégories, ceux qui voient le logiciel libre comme un modèle économique performant, et ceux qui le voient comme une religion.

Les premiers sont ceux qui font parfois de l'argent grâce aux logiciels libres, ils tirent leurs revenus des services associés à ces logiciels. Sans totalement rejeter l'aspect économique des logiciels libres, les seconds considèrent que tous les logiciels doivent être libres, ils haïssent les logiciels propriétaires et ne s'en cachent pas.

Ceux qui considèrent le logiciel libre comme une religion, sont pour la plupart des prosélytes, ils tentent de convaincre leur entourage de privilégier systématiquement les logiciels libres au détriment des logiciels propriétaires. On les retrouve parmi les étudiants en informatique, les enseignant chercheurs, les trolleurs de certains forums etc.… Il parait difficile de nos jours d'aborder un sujet sur un forum dont la thématique est essentiellement centré sur l'informatique sans tomber sur la guerre : Logiciel Libre Vs Logiciel Propriétaire. Je pense que c'est essentiellement du à ce type de personnes. Ils ne manquent d'ailleurs pas d'arguments plus ou moins pertinents pour convaincre et persuader leurs interlocuteurs.

Lorsqu'un logiciel libre s'impose comme une alternative à un logiciel propriétaire certains d'entre eux n'hésitent pas à inventer des bugs au logiciel propriétaire en question, et même parfois à inventer des qualités au logiciel libre en question. Pour eux, c'est une victoire d'installer L**** sur le pc de leur grand-mère, c'est une gloire d'avoir un ordinateur totalement dépourvu de logiciel propriétaire (y compris le Bios). Ils se plaisent à penser que ceux qui n'aiment pas l**** ont peur de perdre leur repère en changeant de système d'exploitation. Ils se plaisent à penser que ceux qui ne sont pas de leur avis sont atteints du syndrome de Stockholm.

Pour eux ceux qui ne sont pas de leur avis sont des pros MS. Ils considèrent le soutien du logiciel libre comme un engagement dans l'intérêt du bien public, un peu comme l'écologie. Certains vont même voir des hommes politiques afin de les convaincre de privilégier les logiciels libres dans leurs administrations etc.…

Il ne faut toutefois pas perdre de vue, que le modèle économique du logiciel libre, contrairement à ce que prétendent certains de ces détracteurs peut être rentable, et que de grosses entreprises en tire parti IBM, Oracle, RedHat, Google, etc.

Privilégier les logiciels libres, c'est certes barrer la route aux entreprises qui n'ont pas basé leur économie la dessus, mais cela peut aussi faire le jeu d'autres entreprises.

Ce qui est amusant c'est qu'il n'existe pas de pro-logiciel propriétaire, je n'ai pas encore vu quelqu'un rejeter un logiciel sous prétexte qu'il était libre, je n'ai jamais vu de sites web faisant la promotion du logiciel propriétaire, je n'ai jamais vu quelqu'un se féliciter d'avoir un ordinateur totalement dépourvu de logiciels libres. De manière générale les utilisateurs de logiciels propriétaires, utilisent les logiciels qui leur plaisent qu'ils soient propriétaires ou non. Je pense que personne ne me reprochera de voir comme un non sens le militantisme pro logiciel propriétaire ; et bien de la même façon, je considère le militantisme pro-logiciel libre comme un non sens. Je ne crois pas être le seul â être sceptique vis-à-vis de ce mouvement, je pense même pouvoir trouver des gens qui ne se sentent pas investi d'une mission religieuse ou politique parmi les partisans des logiciels libres (Linus Torvalds pour ne citer que lui : http://www.lemondeinformatique.fr/actualites/lire-le-fosse-entre-linus-torvalds-et-richard-stallman-s-agrandit-23961.html).

La liberté ? Parlons-en ! Pourquoi les logiciels libres sont ils nommés ainsi ? Parce que selon licences, ils peuvent garantir des droits à l'utilisateur ; par exemple si un utilisateur utilise un logiciel sous licence GPL, il a le droit d'avoir un accès au code source du logiciel et de pouvoir le modifier. Ces libertés font en effet défaut à la plupart des logiciels propriétaires. Prenons maintenant l'exemple d'un développeur qui souhaite distribuer son logiciel sous licence GPL, il à la garantie que toute les modifications de son logiciel par d'autres personnes seront à leur tour distribué sous licence GPL (si et seulement si distribution il y a).

Ce dernier point peut apparaître comme une restriction vis-à-vis des gens qui utilisent dans leur logiciel des bouts de code issus de logiciels libres, en effet, ça l'est, cette restriction a pour but d'assurer la pérennité du logiciel libre, en évitant ainsi qu'il se fasse phagocyter par les logiciels propriétaires. Ce n'est donc pas si « libre » que ça (bien que cela dépende des licences), on peut donc déduire que ce n'est pas parce qu'un logiciel est « libre » qu'on peut en faire ce que l'on en veut. Une des licences les plus libres (comprenez qui offre le moins de restrictions possible) est selon moi, la licence BSD, car elle permet à quiconque de réutiliser tout ou partie d'un logiciel sous cette licence dans à peu près n'importe quel logiciel, qu'il soit libre ou pas. Les prosélytes du logiciel libres voient souvent (pour ne pas dire tout le temps) le monde du logiciel (libre ou pas) de manière manichéenne, selon eux, de même manière qu'il y à le bien et le mal, il y a le logiciel libre et celui qui ne l'est pas. Les visions manichéennes sont bien souvent erronées, et cette vision du monde du logiciel ne fait pas exception à la règle. Des logiciels peuvent être conçu avec (et pas forcément à partir de) des logiciels propriétaires. Des logiciels propriétaires sont parfois conçus avec des briques issues de logiciels libres. Le monde du logiciel est complexe de nos jours, aussi, les logiciels libres et propriétaires cohabitent dans un grand nombre d'ordinateurs. De même qu'il existe d'excellent logiciels libres et de piètres logiciels propriétaires, il existe d'excellents logiciels propriétaire et de piètres logiciels libres. Certaines entreprises ont adopté des modèles économiques basés à la fois sur les logiciels libres et propriétaires.

Probablement motivés par l'amour du logiciel libre et la haine absolue du logiciel propriétaire (en particulier ceux de certains éditeurs…) quelques rares prosélytes commettent des actions qui sont moralement discutables (http://www.pcinpact.com/actu/news/43059-iso-sc34-insultes-lettre-ouverte.htm).

Et moi (grand naïf que je suis) qui pensait que ce type de méfaits étaient réservés aux mafias et aux multinationales…

Aussi, j'ai l'impression que certains prosélytes sont ignorants, et plaident aveuglément une cause qu'ils connaissent mal. Ainsi ils citeront les avantages d'un logiciel à code ouvert sans avoir jamais lu le code source d'un logiciel libre (ce n'est pourtant pas ce qui manque sur sourceforge…) et sans avoir contribué a l'élaboration d'un logiciel libre. De la même manière, ils prétendront que tel ou tel logiciel propriétaire est mal codé ; accusation curieuse dans la mesure ou il est difficilement possible (dans un cadre légal) de lire le code source d'un logiciel propriétaire, à moins bien sur, de faire partie des développeurs du logiciel en question.

D'autres prosélytes sont plus logiques (sans êtres plus intelligents pour autant) en affirmant ouvertement qu'ils préfèrent utiliser un mauvais logiciel libre plutôt qu'un bon logiciel propriétaire, même si ce dernier est gratuit.

Pour finir, j'ai l'impression que ces prosélytes ternissent l'image du logiciel libre, alors qu'avec une approche un peu plus ouverte (d'esprit) et donc moins extrémiste, ils arriveraient à faire comprendre à bon nombre de personnes (non pas l'intérêt de privilégier systématiquement les logiciels libres) les intérêts de ces logiciels.