Le hors-série N°11 de Programmez.com est consacré au langage python. Ce langage qui a connu une popularité croissante est en effet dorénavant utilisé dans de nombreux contextes pour de petits projets, ce qui peut justifier une série d’articles à son sujet.

Néanmoins, plusieurs articles sont rédigés d’une manière maladroite (en étant poli), notamment l’article qui compare la syntaxe de python avec celle de C# ou C++. Comme si on choisissait un langage de programmation en fonction de sa capacité à faire du code golf. Il est vrai que python obtient généralement de bons scores dans le domaine (j’apprécie python notamment pour ça). De mon côté, la capacité à écrire un Hello World de manière succincte n’est pas ma préoccupation première quand je dois résoudre un problème.

Par ailleurs, si un Hello World s’écrit effectivement brièvement en python :

print("Hello World")

Voici la version attribuée au langage C# :

using system;
namespace Hello
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World");
        }
    }
}

Mais cette version ne représente pas la situation courante. En l’état actuel, un développeur C# écrirait plutôt simplement :

Console.Write("Hello World");

Le deuxième exemple choisi reprend la célèbre Conjecture de Collatz appliquée au nombre 299999. Et en comparant python avec C++ cette fois-ci.

Côté python, ça donne :

n=2999999
i=0
print(i,">",n)
while n!=1
    if n%2==0:
        n=n//2
    else:
        n=(3*n+1)//2
    i+=1
print(i,">",n)

Côté C++, voici le code verbeux attribué à C++ :

#include <iostream>
using namespace std;
int main()
{
    unsigned int n=2999999;
    unsigned int i=0;
    cout<<i<<">"<<n<<endl;
    while(n!=1)
    {
        if(n%2==0)
        {
            n=n/2;
        }
        else
        {
            n=(3*n+1)/2;
        }
        ++i;
    }
    cout<<i<<">"<<n<<endl;
    return 0;
}

Pourtant ce code peut être amélioré :

#include <iostream>
int main()
{
    int n=2999999, i=0;
    std::cout<<i<<">"<<n<<std::endl;
    while(n!=1)
    {
        n = n%2==0 ? n/2 : (3*n+1)/2;
        i++;
    }
    std::cout<<i<<">"<<n<<std::endl;
}

Et si le but est de faire un code court, alors allons-y en 7 lignes en C++ au lieu de 10 lignes en python :

#include<iostream>
int i,n=2999999;
main()
{
    for(printf("%d>%d\n",i,n);n>0;i++)n=n%2?(3*n+1)/2:n/2;
    printf("%d>%d\n",i,n);
}

Sachant que l’on peut encore faire mieux (ce qui veut dire pire en terme de lisibilité).

Ceci démontre que la longueur d’un programme n’est pas un argument en faveur d’un langage de programmation.

De toute façon, comparer les langages de programmation et arriver à la conclusion qu’un langage serait meilleur qu’un autre est une faute grave pour un développeur (c’est plutôt que le développeur devrait s’extérioriser). Tout ce qu l’on peut dire, c’est que certains langages sont plus adaptés que d’autres dans certains contextes. Par exemple, on évitera d’utiliser le langage interprété qu’est python pour de trop gros projets (ou simplement pour sauver la planète, cf. l’article Pourquoi l’utilisation du langage de programmation Python serait en train de « détruire la planète »). Par ailleurs, il ne faut pas oublier que la plupart des langages évoluent de nos jours rapidement (y compris python). Et du coup, les syntaxes attribuées a C++ pour les listes et les dictionnaires ont dorénavant des syntaxes améliorées ce qui annihile les critiques inutiles contre cet excellent langage. Sinon, pourquoi ne pas avoir utilisé la syntaxe de python par exemple version 2.7 ?

Enfin, concernant le supposé « coup de grâce » de python contre les autres langages au sujet de sa bibliothèque, il est difficile de faire ce genre de comparaison. D’autant plus que si C++ a a effectivement une bibliothèque standard incomplète, bien d’autres impressionnantes bibliothèques viennent en renfort (l’auteur semble ignorer boost).

En conclusion, un article, voire un hors-série, à ignorer.