[TO] Combat de Boxe des Langages Orienté Web - PHP, Java, C#, Ruby, etc

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) :smiley: 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 :

  1. héritage unique
  2. classe abstraite
  3. 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 :confused:
    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

Java (Server Page) :
Au niveau Objet, on peut dire qu’il est à peu près complet (il manque le destructeur mais bon…).

Pour :
Ce que j’aime bien avec le couple JSP et Servlet c’est le fait qu’il tourne constamment en mémoire chez le serveur qu’il y ait ou pas un visiteur, ça ressemble plus à un vrai serveur qu’à un simple script appelé de temps en temps par le serveur web. JSP et Servlets “existent” dès le chargement de l’application Web par le serveur Web (Tomcat ?) et continuent d’exister après le passage du visiteur.
Les applications web construites en JSP/Servlet ont (pour moi) le gros avantage de pouvoir se partager la mémoire. Exemple : On a un vrai DatabaseConnectionPool (singleton permettant de fournir des connections au serveur de base de donnée sur demande et surtout d’en réutiliser des déjà ouverte : grâce au partage de mémoire).

Edit : Je précise que je connais les deux langage (plus longtemps pratiqué le PHP, mais c’est en développement perso alors que le JSP/Servlet je l’ai utilisé en production)

Pour participer est-ce qu’on est obligé de connaître les deux :D?
Pour Java, la liste est longue, il faudrait ordonner par ordre d’importance:

  • Avantage: basé sur Java, un langage compilé: c’est un avantage pour la fiabilité puisque les erreurs vues à la compilation sont beuacoup plus facile à corriger (moins de problèmes vus aux test unitaires.
  • Inconvénient: Les JSP sont compilées “à la volée” ce qui revient aux problèmes d’un langage interprété. Mais en séparant bien le code entre JSP et servlet, voire en utilisant les taglib, on limite beaucoup ce problème face aux pages actives entièrement interprétées.

-Autre avantage:vraiment multiplateforme (la m^ chose pour PHP j’imagine :wink: ), toutes les machines exécutant la machine virtuelle peuvent lancer du Java, donc un serveur basé sur Java: Windows, UNIX/Linux (sur tous les procs), AS400 …

  • beaucoup de bibliothèque sur de nombreuses technologies: on peut interfacer Java quasiment avec tout: Tout type de base de données, des documents office (open ou non), toutes les services TCP possibles: LDAP, Mail, FTP…

-Langage presque pur Objet relativement facile d’approche, possibilité d’héritage simple, interface, classes abstraites. De bonnes possibilité d’architecture avec une gestion de package “normée” basée sur le nom de domaine…

Non. Pas la peine de connaître les deux :slight_smile: mais ça peut aider.

continuer ce topic m’intérrèsse enormément j’ai apris bcp de truc là !

Je vais essayer d’y participer un peu :
quelque commentaires apres 3 mois de stage (language : c# ou vb.net et framework ; ADO.net et ASP.net) pour un habitué du php comme moi

Au niveau objet :
les languages sont complets, il manquent tout de mêmes l’heritage multiple qui peu peut etre se compensé par les interfaces et l’heritages sous contrat (je crois que c’est la meme pour php5). je n’ais pas trouver de destructeur , mais le garbage collecteur s’en occupe. J’ai bcp aprécié les propriétés

la gestion des évènements
Je la trouve extrèmement poussé en dotnet, on peu déclencher des scripts vb.net ou C# à chaque évènement et faire des pages hyper dynamique. Je n’ais pas réussi à faire l’équivalent en PHP, peut être une solution avec l’AJAX.( je pense qu’ADO.net le gére de facon intégrée, a vérifier)

ADO.net
Extrément satisfaisant, complet répond a tout les demandes que sa soit connecté ou déconnecté.Le fait de sauté la couche dotnet pour y laiser une couche/driver/provider spécifique à la SGBD (comme oracle data provider) est une tres bonne idée. Les outils pour la programamtion déconecté sont surprenant (même si je l’utilise pas souvent). PHP Possede le framework PDO qui est moins performant (qui j’espere va ratraper ADO) et je ne sais pas ce qu’il donne pour la programmation déconecté.(connaissé vous d’autre framework ?)


A priori les nombreux objet ASP.net semblent idéal pour tout ce qui est workflow et developement pour une entreprise. On a cas appellé l’objet on gère les évenment on connecte avec un objet ADO.net et le tour est jouer ! Probleme attention à l’infantilisation du développeur. Les objets ASP.net manque de clarter les propriété Read Only qui sont tout de meme writeable mais seulement au prochain databind. Peut être que j’ai manquer de temps pour me familiariser, mais j’ai trouver ces objets peu flexible , ou du moins il ne faut pas modifier l’usage d’un objet en rajoutant une couche suplémentaire mais en modifiant cette objet ce qui ne m’etait pas accessible. Je dirais donc probleme de flexibilité.

Le Kit de developpement
Visual studio.net est extrement complet (y a t’il un équivalent pour les projets PHP ?) mais il possde de nombreux bug surtout dans sont querybuilder (sont il corigés ??)sont parseur de requete a ses limites, et il ne comprend pas des requetes qui sont spécifiques à oracle (table() par exemple) (c’est pas grave ADO.net avec ODP les gèrent) ils a aussi du mal avec les grosse requetes paramétrés.
Les check in/out avec visual source safe sont apréciable , exist’il des kits de devellopement PHP compatible avec Trac/SVN ???

La portabilité ?
Peut on mettre un projet dotnet sur un autre serveur que ISS ?

Moralité :
esqu’un language pour les script serveur ne doit pas rester qu’un préprocesseur hypertext ?
Doit on faire confiance en la valeur/intelligence de sont équipe de developpement ou sur sa license dot.net ?
si il y a usage d’objet (et que leurs fléxibilités n’est pas abordable au profane comme moi) , comment répondre parfaitement au besoin ? en utilisant que des objets dotnets ??

PS; si mon avis dérange ou donne naissance à des troll , aucun prob je l’effacerais

Pas de troll! Sérieusement, ce n’est pas le but. Soyons objectifs :slight_smile: du reste, je trouve PHP à chier sur le temps d’éxécution à cause du parsing.

Je supprimerai vos messages pour faire un gros post avec tous les aspects (c’est mieux, non? [comme ça je peux abuser de mes droits de modéro :D])

Ceci étant je ne voulais pas faire C#/.Net car je ne connais pas du tout, mais si vous êtes capable de me fournir de bonnes desc :slight_smile:

franchement, je vois pas ce que tu lui trouves à redire sur les temps d’execution :neutre: … 'fin pour ma part, après ~5 ans d’exp. pro sur PHP (et presque le double en perso), j’ai n’ai jamais eu de ralentissement bloquant, même sur des gros projets multi-utilisateur, type appli. financière etc … :neutre: … j’utilise aussi bcp PHP en tant que langage de script en ligne de commande pur pour effectuer pas mal d’opération au lieu de passer par le serveur web, et ça permet un gain considérable en vitesse :neutre: …

sinon pour ma part, ce que j’aime avec PHP c’est sa grande portabilité système, sa facilité de prise en main pour qui à déjà manier le C, et le nombre d’extension déjà présente permettant d’accroitre grandement les possibilités du langage :oui: …
je me sers beaucoup des capacités objets en PHP5, et j’espère que les points négatifs soulevés par SN seront intégrés dans PHP6 (notemmant l’op-code) :oui: …

et je n’ai pas assez d’exp en JSP pour donner un avis sur ce langage (j’ai déjà du mal à installer correctement un Tomcat, alors :paf:) …

je ne donnerais pas mon avis sur les techno .Net, car déjà ce n’est pas le débat :paf:, et pour ma part ces technos ne sont pas encore assez portable sur des systèmes autre que Windows (ce qui est, de mon point de vue et sans troll inside, un handicap majeur) :neutre: …

C’est vrai,Mais un codeur PHP averti (ya juste quelque truc à savoir) c’est faire avec , et est capable de pondre du code tres optimisé.

d’accord :confused: si tu corrige les fautes :smiley:

Java:

  • La présence du serveur et des servlet permet l’exécution de batch complexe, et donc de faire des applications de grande taille avec des processus métier bien partagé.
    (c’est un peu lié à l’architecture …)

  • L’ EDI: Eclipse pour ne pas le nommer, est très puissant et permet d’éditer correctement les sources Java, JSP, gère les processus de:

  • Compilation

  • Debug (éventuellement à distance)

  • lancement du serveur (Tomcat avec plugin ou WAS avec WSAD)

  • packaging des livrable serveur: sous forme d’ear (standard dans WSAD, plugin sinon)

  • plugin Ant: pour le lancement de script de compilation en XML (equivalent d’un makefile)

  • plugin CVS

  • pour l’édition de sources beaucoup d’outils aussi

    • refactoring: permet de renommer une classe, une méthode une variable, déplacer des sources et de bien propager toutes les modifications (très fiable, en dehors de JSP)
    • Recherche des liens entre méthodes et variable dans tous les sens:
    • Affichage des hiérarchioe de classes dans les 2 sens

Inconvénient (il en faut quand même)

  • programmation pur Objet en Java fortement recommandée, sous peine de voir l’application se transformer en plats de raviolits, variante objet du plat de spaguettis.

  • De même l’utilisation de pattern trop complexes et mal compris peut la transformer en “plat de lasagne” @deltree (c’est de moi) à savoir une multiplication de couche certes nécessaire mais contenant beaucoup trop de code.

  • à cause de 2 précédents éléments on a tendance à considérer qu’il faut des “gros profil”, ce qui est faux de mon avis: dans un projet bien hiérarchisé et bien suivi, avec de bonnes règles de base, la programmation Java reste simple.

  • La configuration des serveurs peut-être complexe.

Oui, mais atta :slight_smile: je voudrais faire ça Aspect Technique, Aspect Serveur, etc.

Ca serait mieux je pense.

Je te filerai mon appli pour que tu teste :slight_smile: mais 200ms rien que pour des fichiers, c’est simplement trop :slight_smile:

petit HS, mais qui peut-être ajouté, la plupart de mes clients (bon ok 2/3) en sont restés au jdk1.4, et le dernier en est au jdk1.3.
L’inconvénient est la complexité introduite par release, et que certains développeurs soient dépassés par les évolutions du langage (j’en ai vu qui utilisent encore des Vector! et sans passer par l’interface, avec l’enumeration…)

oui, c’est pas mal :super:

deltree> oui, mais bon :stuck_out_tongue: si tu te lances à java maintenant, je doute que tu ailles faire du 1.4 alors que tu as le 1.5 ou 1.6 :slight_smile:

Heu… ce Topic est censé être un Topic sur les langages orientés Web alors il faudrait peut-être préciser qu’on parle de JSP/Servlet et pas du Java en général ?
D’accord on peut mettre n’importe quel code Java dans un Servlet et ça marche, mais quel interêt à mettre du swing par exemple ?

C’est vrai, mais si on parle de JSP, il faut bien préciser que ce ne sont pas des JSP seule, mais bien avec du code Java incluant non seulement servlet, mais aussi Bean, et toutes Classe utilitaire que l’on veut utiliser avec.
C’est donc une combinaison JSP/Java :slight_smile:

Mettre du swing dans un servlet, ça va afficher une fenêtre sur le serveur normalement, c’est vrai qu’au niveau de l’intérêt [:paysan] Dans une applet à la limite, mais ça n’a plus rien à voir avec les JSP du coup.

le seul inconvénient que je trouve pour asp .net … c’est qu’il faut windows server … et ce n’est pas du tout un troll !!

:neutre:

Raynor> justement :slight_smile: C ou C++ te permettent certainement de faire du web (apache? :))

L’idée est tant en fait de voir les différents langages dispos, les différentes (java en serveur web est assez particulier par rapport à php en module apache, etc).

je suis d’accord. windows server est LOURD [:doute]

sinon est-ce qu’on se fait jeter des pierres si on parle de RoR ? [:shy]

je confirme pour le C et C++ j’ai déjà vu sa !
je vais me renseigner pour connaitre le serveur

Tu m’intéresse, je ne connait pas du tout :slight_smile:

une idée pour noter les différentes solution par fonctionnalité? (histoire d’avoir plusieurs notes et de ne pas définir le premier en tout, mais le premier par catégorie).