Hop!
Ce topic me trottait dans la tête depuis longtemps, et comme il me reste 20% à attendre pour Kiba 25, je vais commencer simplement et sobrement!
L’idée n’est pas de dire que PHP c’est de la merde (quoi que?), que Java ça craint (quoi que?) et que seul C# nous sauvera tous (merci Bill) mais plutôt de voir ce qui fait qu’on prendra l’un (php) ou l’autre (java).
De mon côté, j’ai 7 ans de PHP, 2 ans de Java, 4 ans de C, 6 mois de C++ (ça fait tâche), donc je pense maîtriser PHP :))
Round 1 : Technique
Aspect 1 : PHP5 (fuck off le 4)
PHP est un langage de script (donc interprété), doté d’un garbage collector utilisant un système de compteur de réfèrences, ce qui est plutôt pas mal quand on n’a pas de réfèrence cyclique (où là, on a des fuites mémoires).
PHP ne garde pas en cache les op codes, c’est à dire qu’il analyse à chaque fois le fichier PHP, ce qui ralentis d’autant plus l’application lorsque on inclût beaucoup de fichiers (pour un exemple simple, avec une classe par fichier, je suis arrivé à 99 fichiers incluts pour 200ms de parsing, et en tout 351ms de temps d’éxécution).
Au niveau objet, php est jeune, très jeune. On retrouve cependant tout ce qu’on a besoin, avec des bugs -> http://bugs.php.net/bug.php?id=38286
Donc :
- héritage unique
- classe abstraite
- interface
En plus, PHP supporte des constantes de classe/interface, et des propriétés/méthodes statiques.
Et ça sera tout.
Au niveau procédural, on a le code “inliné” tout pas beau qui fait qu’un fichier ressemble à une grosse fonction, sans en être une. Et aussi, des fonctions.
Avantages:
- Simple
- Modèle objet
- Mécanisme d’exception (try … catch)
- Une API Conséquente
- Tableaux associatifs ($x[‘x’])
- Copain copain avec mySQL
- Le garbage collector (reference-counting)
- Portable, mais cela a des limites, genre les chemins des fichiers…Inconvénients:
- Simple, ce qui fait qu’un tas de n00b utilisent PHP, et ne cherchent même pas à lire et comprendre une erreur avant de poser une question sur le forum
- Modèle objet incomplêts, déconne
- Passage par copie des objets en PHP4
- API pas objet (ça commence)
- Pas de pré-compilation vers un byte code (donc plus lent)
- Pas thread safe (selon la doc)
- Ne sait pas ce qu’est une exception, préfère les erreurs
- Ne sait pas envoyer une erreur sur la sortie erreur standard en mode ligne de commande
- Pas de blocs finally dans les exceptions (donc redondance de code :/)
- Pas de notions de package/namespace -> nameclash
Aspect 2 : Java 1.5
Parlons de Java (la 1.6 arrive, la 1.7 nous fait coucou avec un truc nouveau “les closures” dont mon enseignant favori de Java a l’air raide dingue… -> http://weblogs.java.net/blog/forax/ )
Encore un langage interprété, mais avec une autre façon de faire. Le code est d’abord pré-compilé vers un byte code spécifique à la machine virtuelle, avant d’être interprété.
Gros avantage : pas besoin de faire du parsing de classe java à chaque fois, c’est fait une fois pour toute.
Sinon Java est un langage objet, avec interface, classes, classes abstraites, notions de package, classes internes (miam), énumération (re-miam), généricité (re-re-miam), classes anonymes (re-re-re-miam).
Son garbage collector détecte les cycles dans les objets, ce qui évite des fuites mémoire comme avec le reference counting. Cela a néanmoins un gros aspect négatif : d’une les objets sont plus lourds, de deux le gc parcourt la mémoire toutes les X secondes, ce qui a (souvent) pour effet de freezer l’application Java.
Sinon Java peut faire tout (bon, par contre pour faire des jeux, comptez plus sur du Core 2 Duo ou équivalent :))
Avantages:
- Pleinement orienté objet
- Types génériques (class Foo<T extends Bar>)
- Enumération (pratique)
- Classes anonymes, et internes
- Gestion par packages
- Pré-compilation vers un bytecode, puis optimisation à la volée
- Portable
- Simple (oui et non)
- Nécessite de réfléchir à ce que l’on doit faire avant pour le faire bien… (comme tout)Inconvénients:
- Garbage collector : incontrôlable, et surtout freeze trop souvent les applications
- Swing (bon ok, ça sort du domaine des serveurs)
- Pas d’héritage multiple (est-ce bien utile?)
- Types primitifs assez restreint, impossibilité d’avoir des entiers non signés comme en C
Aspect 3 : .Net et C#
(je ne mettrai pas plus, je connais pas .Net (me semble d’ailleurs que c’est qu’une tech, pas un langage)
–
(j’ai mis ce que je voulais mettre sur Java, je suis assez HS donc j’ajouterai vos remarques après)
Plusieurs rounds :
Round 1 : Technique
Round 2 : (Facilité de) Développement (IDE, etc)
Round 3 : Serveur