Carnet du petit Tom : Physique, biologie et évolution...

18 mars 2007

Geekeries du dimanche IV

Et c'est partie pour une nouvelle fournée de petites choses diverses et variées...

C@fé des sciences

Vous l'avez peut-être noté, mais le c@fé des sciences s'est récemment agrandi, et a accueilli sa première c@fetière ! Ainsi prouvons-nous que ne sommes pas un club de scientifiques machos ;). Sevene nous parle de notre plus bel organe, le cerveau. Bienvenue sevene !!


Subtilité dangereuse du C++

Considérons le bout de code C++ suivant :




int main(){
int i = 5;
for ( int i ; ...)
}


(Note : j'ai voulu mettre un exemple plus explicite, genre "print i", mais je n'ai pas réussi à dire à blogger de ne pas interprêter le code !!!)
Le code s'en sort parfaitement : en sortie de boucle, i vaut 5, même si i est modifié dans la boucle ! Ainsi est-il possible de définir en C++ une variable locale dans une boucle portant le même nom qu'une variable globale, et le compilateur s'en sort très bien. Cela fait froid dans le dos, non ?


Du bourrinage en informatique


En ce moment, je travaille avec un vrai informaticien pour apprendre à optimiser mes codes. Extrait de conversation :

Informaticien : ce machin, ça fait quoi ?
Moi : oh, c'est une petite astuce mathématique pour calculer ci ou ça. Cela me permet d'économiser un peu de mémoire, et c'est plus clair pour moi.
Informaticien : économiser de la mémoire ? Mais c'est complètement con ! ça ne sert à rien d'économiser de la mémoire ici ! La mémoire, on en a beaucoup, tu peux gérer sans problèmes des tableaux avec des tailles typiques de plusieurs gigas...
Moi : ah... mais moi ça me paraissait plus élégant...
Informaticien : l'élégance, on s'en fout, ce qui compte, c'est l'efficacité !



Je me rends donc compte que
1- je suis un vrai bleu en programmation,
2- je raisonne trop comme un pur théoricien.


Sondages

Connnaissez-vous la fameuse nouvelle d'Asimov, qui raconte qu'un jour, un ordinateur (Multivac) serait à même de choisir UN seul électeur représentatif qui déciderait seul du choix du Président ? Voir ce billet pour un extrait. C'est la méthode des quotas, poussée à son paroxysme !


Multivac est d'ailleurs omnipotent : dans une autre nouvelle, son descendant inverse l'entropie et créé un nouveau big-bang...


Conservapedia, a conservative encyclopedia you can trust.

(Via Nicole, qui ne bloggue plus mais n'en est pas moins toujours vivante)
Les "conservateurs" ont leur encyclopédie sur le web : conservapedia ! Les articles sont à l'avenant, mais moins caricaturaux qu'on ne pourrait le croire. Cependant, on sent bien la "patte" des mouvements conservateurs américains, voir par exemple le premier paragraphe de la page "abortion" :


Abortion is the induced termination of a pregnancy.[1] The father of medicine, Hippocrates, expressly prohibited abortion in his ethical Oath long before Christianity. Today abortion is a billion-dollar industry[2][3] in the United States and Western Europe except for Ireland, Malta, Poland and Portugal, where it is generally illegal. Here is a discussion of the position of the United States National Cancer Institute on Abortion.

Plus loin, l'article affirme qu'il y a corrélation entre avortement et cancer du sein, affirmation totalement fausse qui fait partie de la propagande des mouvements anti-avortement aux Etats-Unis (voir aussi cet article récent de Time magazine). Site très surprenant donc : au milieu de choses tout à fait vraies et de réalités objectives, se terrent des mensonges éhontés... Probablement le meilleur moyen de faire passer un message.

Wikiality

Conservapedia est un peu trop molle à mon goût. Les vraies valeurs de l'Amérique vraie sont bien mieux défendues sur wikiality.com. Wikiality est un terme forgé par Stephen Colbert pour désigner la "réalité " forgée sur internet, et en particulier sur wikipedia. Ainsi a-t-on tendance à considérer ce qui est lu sur internet comme parole d'évangile; dans ce cadre la réalité objective n'existe plus, elle est remplacée par une "wikialité". Et pour qu'une chose devienne vraie, il suffit de modifier la page wikipedia correspondante : Stephen Colbert avait ainsi proposer de "régler" le problème de l'extinction des éléphants en modifiant la page wikipedia correspondante (Francis Pisani avait raconté la chose bien mieux que moi). Le site est à l'avenant, et dans le style de son émission. J'adore !





The Baby Satan has a special place in hell for
Charles Darwin
and YOU just for visiting this internets tube!


8 commentaires:

Matthieu a dit…

tu as parfaitement raison de chercher à economiser de la mémoire. tu peux "en avoir beaucoup", ca ne suffira pas face a n'importe quel probleme exponentiel.

pour ta boucle for : le seul truc, c'est que tu ne peux pas utiliser le premier i dans ta boucle.

Anonyme a dit…

Merci pour ton message de bienvenue, Tom!
Inquiétant, le site des Conservateurs...

Tom Roud a dit…

Merci pour vos commentaires.

Pour cette histoire de mémoire, c'est vrai qu'à la réflexion, ce n'était pas si stupide que ça. J'avais également un peu l'impression que l'informaticien en question me prenait de haut (j'avoue même avoir pensé pendant la conversation que j'étais à contre-emploi à faire des simulations ainsi, et que je ferais mieux de faire ce pour quoi j'ai été formé : des gros calculs analytiques bourrins). Ce billet est la preuve que je suis très influençable quand il s'agit de me dénigrer...

Anonyme a dit…

La reponse pour l'economisation memoire, c'est evidemment un compromis. Il est facile de trouver des cas ou tu as raison, et des cas ou ton informaticien aura raison. Ca depend totalement des domaines: si tu bosses sur des images de plusieurs Go, et que grace a une astuce, tu n'as besoin que d'une copie au lieu de 2, et que cette copie tient entierement en memoire vive, c'est clairement utile d'avoir ton astuce. Maintenant, s'il s'agit de sauvegarder quelques MO, et que tu dois tout recalculer a la place... c'est pas tres interessant.

La memoire, c'est comme toutes les autres ressources, des compromis. Ici comme ailleurs, there is no free lunch :) Un exemple, c'est que perso, j'arrete le C sauf en cas de necessite pour le calcul numerique, et je fais tout en python. Ca reste tout a fait gerable niveau memoire (mais en C, ca prendrait certainement 2 a 3 fois de memoire), c'est suffisament rapide, et surtout ca me prend 10 fois moins de temps a debugger et developper. C'est pour la meme raison que beaucoup de gens dans mon domaine (machine learning, traitement du signal) utilisent matlab. C'est gourmand en memoire, mais tout le monde s'en fout.

Sur le code C++, un truc marrant, c'etait lorsque Visual Studio 6 etait le compilateur sous windows, definir i dans une boucle rendait i global au dela du "scope" de la boucle (qui est le code a l'interieur du main dans ton cas), et donc le i au dehors de la boucle etait le meme i qu'a l'interieur (au moment ou le compilo etait developpe, le standard C++ n'etait pas clair la dessus).

Ceci dit, ce type de comportement au niveau des "scope" de variables est assez general. C'est a priori le meme en python et dans la plupart des langages dits dynamiques, je pense. En regle general, ce n'est pas une tres bonne idee, ce type de constructions, pour la meme raison qu'une variable globale doit etre evitee, a moins d'etre inevitable :)

Anonyme a dit…

En tant qu'informaticien, le comportement du code C++ est tout à fait clair. C'est une question de bloc et de portée : il y a deux variables i, de portée locale à leur bloc correspondant (le main et le for), et la variable du bloc le plus imbriqué (for) masque toute autre variable du même nom.

Le code ci-dessous n'est pas équivalent :
int i = 5;
for(; i<10; ...)

Du point de vue du langage, il n'y a pas d'ambiguëté (bon, il y en a eu par le passé comme le fait remarquer Anonyme). Par contre, du point de vue du programmeur, c'est une mauvaise pratique de donner le même nom à deux variables si proches ;)

Anonyme a dit…

Pour rajouter un franc dans le nourrin, je dirai que la remarque de ton informaticien est un brin ambigue. Quand on parle efficacité, on parle complexité. Et tout dépend alors ce que l'on compte : le temps de calcul ou l'occupation mémoire (c'est là où il y a compromis). Faire de l'économie mémoire c'est donc faire de l'efficacité... Bon vu le contexte, il est clair qu'il parle d'efficacité en temps de calcul, la plus courante.

(NB: économiser la mémoire n'est donc pas une preuve d'élégance :))

Anonyme a dit…

A propos du C++ :
Un peu que ça fait froid dans le dos, surtout quand on a passé une semaine à débugger un problème du même genre!

Tom Roud a dit…

@ anonyme et Simon : merci de vos commentaires complémentaires. Je suis d'accord que tout cela est un compromis à trouver. Et je suis d'accord que ce n'est pas très malin de donner le même nom à deux variables.

@ eponyme : comme tu peux l'imaginer, j'ai exactement eu le même problème (d'où mon billet ;) )! Le plus amusant est que la variable en question ne s'appelait pas bêtement i mais avait un joli nom poétique ... précisément donné pour éviter ce genre de problèmes ! Ma créativité a donc des limites...