Je suis d'accord avec toi quand tu dis que les arguments du types sont foireux, mais pour le reste...
Dans la façon dont je vois les choses, un algorithme exprimé en C, est l'expression de l'algorithme en lui même (souvent déjà optimisé par le cerveau humain... tiens donc le compilo C sait pas le faire à notre place ? ^^), et le même algorithme en un langage bien plus évolé, sera plus la représentation conceptuelle de l'algorithme que l'algorithme lui-même.
Pour donner un exemple [plus ou moins] concret, immagines que tu codes une fonction WordCount qui compte le nombre de mots différents (uniquement caractères aphanumériques) dans un texte. La meilleure façon de procéder à mon avis (je peux me tromper là dessus mais là n'est pas la question) c'est d'utiliser une table de hachage.
En C tu va coder ta fonction HashString(char *string);, ta fonction AddString(char * string); et ainsi de suite, et à la fin tu retournera juste le nombre d'éléments de la table de hash.
En C# (je dis C# parce que je ne connais pas suffisemment Java pour pouvoir garantir que c'est la même chose, mais en réalité le langage n'a *absolument* aucune importance, c'est juste pour donner quelque chose d'un peu concret) tu va te contenter d'utiliser la classe Hashtable toute faîte, pour le reste ça sera pareil qu'en C...
Maintenant, je ne parle plus de ce qui est réel, mais de ce qui est potentiellement la différence. En C tu utilises des fonctions, et C# le concept de Hashtable dans la librairie standard (ça veut dire que, dans un hypothétique cas idéal, le compilo sait sans problème ce que c'est).
On va mettre dans la fonction principale des deux programmes, uniquement
return WordCount("");.
Dans le cas idéal (en réalité actuellement ça ne l'est probablement pas :/) le compilo C va inliner la fonction... Puis basta...
Dans le cas idéal (ce n'est pas le cas actullement ! :'() le compilateur (comprendre par là le JIT, pke because reflexion toussa le compilo C# en lui même peut quasiment rien optimiser hein) C# va inliner la fonction. Là par contre il y a autre chose.
Dans la boucle de lecture des caractères... tu auras un truc genre
for (int i = 0; i < strlen(string); i++) { } en C, et en C#
for (int i = 0; i < string.Length; i++) { }, (dans la réalité n'importe quel programmeur pas trop con aura décalé le strlen() et le string.Length dans une variable locale, mais là osef)... Toujours dans le cas idéal, le compilateur (JIT toujours) étant au courant du concept de string, il sait que "".Length = 0. Par conséquent, il sait que le code de la boucle for ne sera jamais éxécuté, par conséquent il peut le virer... Du coup le code de hashtable, étant contenu dans le for, ne sera jamais compilé, les fonctions correspondantes non plus, et après une dernière optimisation dûe à la conaissance du concept de hashtable par le compilateur, il restera tout simplement
return 0;
Evidemment ça reste encore purement immaginatif, mais tu ne peux pas nier que d'une part cette optimisation en C# parrait très simple à mettre en oeuvre (encore une fois à cause de la réflexion ce n'est pas le cas, mais ça reste loin d'être impossible...), et que d'autre part elle est complètement impossible à implémenter en C.
Bref, j'espère que cet exemple convaincra tout le monde, parce que je crois pas avoir jamais trouvé d'aussi bon exemple pour exprimer mes idées
