Du danger potentiel des langages haut niveau

Aujourd'hui, avec l'évolution exponentielle des capacités des pièces des ordinateurs, on observe un degré d'abstraction matérielle assez impressionnant de la part des logiciels et services associés, dans le sens où les possibilités que les nouvelles technologies offrent deviennent tout simplement hallucinantes. On peut bien sûr s'enthousiasmer de ce progrès, en se disant que bientôt le pc familial fera tout (comme cela commence à se faire, voir Win Media Center), et que ça c'est la convergence comme on peut en rêver, mais moi cet emballement et cette multiplication des nouvelles technologies, nouveaux produits etc. aurait plutot tendance à m'inquiéter...

Je m'explique. Les langages en vogue de nos jours (C++ notamment) sont certes très puissants mais n'en sont pas pour autant extrêmement compliqués, ils produisent donc un code indéniablement efficace, mais (très) peu optimisé par rapport à ce qu'on obtiendrait en assemblé écrit à la main ; ceci n'est néanmoins pas dramatique vu les services que rendent ces langages haut niveau et les horizons qu'ils offrent.

Ce qui est plus embêtant de mon point de vue c'est l'emballement des unités de mesures informatiques. Par exemple la cadence des microprocesseurs se compte maintenant en gigahertz, la capacité des disques durs en centaine de gigaoctets, celle des barettes de RAM en gigaoctets, la définition des écrans est aux alentours de 2000x1500x32, la capacité des lignes réseau de l'odre de quelques Mbps... Afin de maitriser et exploiter à fond ces ressources on est passé des langages bas niveau (machine, assemblé) à des langages plus haut tels que le C, C++, java (enfin celui-ci est indépendant de la plateforme sur laquelle il est éxécuté, c'est encore une autre histoire), langages sans lesquels -il faut le reconnaître- des logiciels commes ceux dont nous pouvons disposer aujourd'hui seraient tout simplement impensables. Ce qui me préoccuppe là-dedans c'est que le programmeur en vient à ne plus se soucier du moindre bit (soit, même du simple octet), du moindre pixel, du moindre cycle machine à sauver... Je veux dire par là qu'on peut coder en C++ avec des fonctions mathématiques ultra puissantes ou des concepts tels la POO sans avoir la moindre connaissance de l'architecture de sa machine, de son principe de fonctionnement. On peut presque coder une application graphique sublime et totalement fonctionnelle avec des librairies telles que SDL, GTK+ ou wxWidgets sans se soucier de l'organisation de ses variables en mémoire. Là où c'est dangereux c'est que si seuls les developpeurs du compilateur qui produit l'exécutable maitrisent le code à ce niveau, tout le pouvoir est entre leurs mains. Non pas que je ne fasse pas confiance à ce genre de programmeurs (je me demande comment de si bons pourraient être 'corruptibles'), mais que si une faille existe à ce niveau, au bas de la pyramide, alors il y a potentiellement du souci à se faire. Il ne faut surtout pas oublier qu'un ordinateur fonctionne grâce notamment à son processeur, que ce processeur n'est absolument multi-tâches, que ce processeur ne comprend qu'un langage, le langage machine, qu'il ne sait faire que des opérations 'élémenaires', et qu'en principe on devrait utiliser ses registres au plus au lieu d'utiliser la mémoire directement. C'est justement ceci qui est inquiétant... Je me demande si tout le monde est au courant de ceci. Les langages haut niveau couramment utilisés aujourd'hui mettent à disposition du programmeur des outils simples et puissants afin de lui faciliter la tâche de conception d'un logiciel, avec des concepts comme les tableaux, les fonctions, etc.. On remarque cependant que la plupart des bugs des logiciels d'aujourd'hui provienent de fuites de mémoire ou de dépassements de capacité (on adresse de la mémoire indisponible, en dépassant la capacité dun tableau par exemple). Il me semble que des erreurs telles sont assez fréquentes, mais pas assez dramatiques pou être remarquées, au niveau de la mémoire dont on dispose maintenant (qu'est-ce que 2Ko par rapport à 512Mo voire 1Go de ram ?).

Les langages dont le niveau s'éloigne de plus en plus de celui de la machine, dont l'abstraction par rapport au matériel se fait toujours plus grande sont donc à utiliser avec prodance et précautions, du fait de l'importante marge niveau de programmation/matériel qui est toute comblée par le compilateur, mais aussi car le programmeur, s'il ne connait que les langages 'haut niveau' pourrait être tenté de coder comme un 'bourrin', ne se souciant pas de la qualité du code qui sera produit, par ignorance simple de l'aspect, des contraintes, des possibilités, du code que comprend son processeur, de son matériel aussi.

De ces constations je tâcherais de retenir deux choses :

pacHa - juin 2004

PS : aujourd'hui, le 27 juillet 2004, je viens de lire ca, et j'ai pensé que c'était un bon complément à ce qui précède. Voila.