Les différences et les similarités entre Java et C#
Alors que Sun
Microsystems a centré sa stratégie d’affaires sur la création d’un langage
multi-platforme selon le principe du write once and run everywhere, Microsoft a
pour sa part choisi d’assurer la compatibilité de plusieurs langages de
programmation avec le framework .Net.
En adoptant cette stratégie, le choix du langage de programmation à utiliser
avec .Net est devenu avant tout une affaire de style et de préférences
personnelles. En effet :
• Quelque soit le langage de programmation utilisé les performances obtenues en
aval sont pratiquement les mêmes (rappelons à ce sujet qu’avant d’être compilé
en langage natif, le code source est transformé en une sorte de pseudo-code
appelé Microsoft Intermediate Language).
• Même si les langages utilisés sont différents, les types de données auxquels
ils font appel sont standardisés . Cela améliore l’interopérabilité des
applications multi-langages et offre une plus grande flexibilité aux
programmeurs (qui peuvent par exemple écrire une même application avec plusieurs
langages ou encore implémenter l’héritage d’un composant codé en C# à partir
d’un programme écrit en VB.net).
• Les développeurs n’ont pas besoin d’apprendre un nouveau langage de
programmation pour tirer profit de .Net .Cela est partiellement dû au fait que
la plupart des fonctionnalités sont implémentées au niveau du framework et non
au niveau du langage de programmation comme c’est le cas de Java.
Les ressemblances entre Java et C# sont flagrantes même si Microsoft n’a pas
cessé d’affirmer depuis la création de son nouveau langage que C# est d’abord un
dérivé de C++. Notre objectif dans ce document n’est pas de savoir laquelle des
deux firmes a copié l’autre. C’est d’abord à des fins de migration que nous
souhaitons passer en revue les différences et les similitudes entre ces deux
langages.
Les similarités
• Les deux langages sont transformés en pseudo-code avant d’être compilés en
langage natif. Dans Java le pseudo-code est appelé bytecode et sous .Net il est
appelé Microsoft Intermediate Language.
• Les deux langages disposent d’un garbage collector qui permet de libérer
automatiquement la mémoire occupée par les objets non pointés.
• Dans les deux langages toutes les classes dérivent d’une classe générique
Object. De ce fait tout est objet aussi bien en Java qu’en C#.
• Les deux langages ne permettent pas d’implémenter directement l’héritage
multiple (ils le font par le biais des interfaces).
• Les deux langages contrôlent les limites des tableaux via le mécanisme du
bound checking (autrement dit le compilateur vérifie si l'on ne va pas écrire
dans le tableau avec un index supérieur à sa limite maximale. En C++, une telle
situation conduit à l'écriture des données dans une zone de mémoire
n'appartenant pas au tableau ce qui entraîne un dysfonctionnement du programme
voire même un plantage généralisé).
• Les commentaires inclus dans le code source des programmes, peuvent être
utilisés pour générer automatiquement la documentation des API.
• Les deux langages utilisent les packages pour éviter la collision des classes
qui portent le même nom mais qui appartiennent à des packages différents (les
namespaces sont pour C# ce que les packages sont pour Java).
• La plupart des mots-clés en Java ont un homologue en C# (exemple : class, new,
this, static, throw, break, and null que les deux langages empruntent au C++).
En revanche la plupart des mots clés Java qui n’ont pas d’équivalent en C++
portent des noms différents en C# (exemple : les mots-clés Java super, import,
package et final sont respectivement appelés base, using, namespace et sealed en
C#). Il est important de noter que plusieurs classes et méthodes portent le même
nom dans les deux langages. Une différence minime se situe souvent au niveau des
méthodes qui commencent avec une majuscule en C#. Par exemple :
• L’équivalent de Object.Equals() en C# est Object.equals() en Java.
• L’équivalent de Object.Finalize() en C# est Object.finalize().
• L’équivalent de Object.ToString() en C# est Object.toString().
NB : cette règle n’est pas toujours vraie mais elle permet souvent aux
programmeurs de se retrouver dans les deux langages.
Comme nous avons pu le voir dans cette section, il y a de grandes similarités «
cosmétiques » entre les deux langages. Ces similarités permettent de réduire les
coûts de formation et font le bonheur des programmeurs impliqués dans les
projets de migration et/ou de transition.
Les différences
Dans cette section nous allons énumérer les substrats propres à C# ainsi que ses
principales différences par rapport au langage Java.
• Comme Visual Basic, C# possède une boucle de type foreach qui permet de
parcourir facilement et rapidement les éléments d’une collection.
• Comme Visual Basic, C# dispose d’un mot clé enum qui permet d’associer un
ensemble de constantes prédéfinies aux propriétés des objets.
• Comme Turbo Pascal et Delphi, C# dispose d’un type struct qui permet de
regrouper dans des blocs les constructeurs, les constantes, les variables, les
méthodes, les indexes, les propriétés, et les opérateurs (voir l’exemple
suivant).
public struct Employé
{
public int Empid;
public string Empnom;
public string Empemail;
public string Empsalaire;
}
Les structs ressemblent à bien des égards aux vieux records de Pascal (pas
étonnant qu’ils soient repris dans C# parce qu’Anders Hejlsberg, l’inventeur du
Turbo Pascal, est également l’inventeur de C#).
En matière de référencement, la différence entre un struct et une classe normale
est que le struct contient physiquement les données qu’il regroupe et ne
nécessite pas d’allocation au niveau du heap alors que les classes sont
référencées par des pointeurs (ou handles). On parle alors de value types par
opposition aux reference types dans le cas des classes normales.
• Par défaut, les méthodes de C# ne sont pas virtuelles. Elles doivent être
déclarées explicitement comme virtual afin qu’il soit possible de les réécrire
au niveau des classes dérivées (en Java, par contre, la réécriture d’une
méthode, héritée d’une classe parent, au niveau de la classe dérivée peut se
faire implicitement sauf lorsque la méthode de la classe parent est de type
final).
• C# utilise les delegates qui ressemblent à bien des égards aux pointeurs de
fonctions de C++ mais qui sont plus sécurisés et fortement typés.
• C# supporte le modèle COM (Component Object Model) et l’API Windows.
• C# autorise la surcharge des opérateurs. La surcharge dont il est question ici
permet à un utilisateur d’écrire des expressions à l'aide de types qu'il définit
lui même. Dans ce cas la sémantique associée à l’opérateur de base change pour
revêtir celle que le programmeur veut lui associer. A noter que les opérateurs
ne sont pas nécessairement des symboles. Parfois la définition de nouveaux
opérateurs est autorisée. A titre d’exemple on peut surcharger l’opérateur (+)
pour définir des opérations spéciales d’addition sur les nombres complexes comme
le montre le programme décrit dans l’URL suivante :
http://www.c2i.fr/code.aspx?IDCode=371
• Le générateur de documentation de C# repose sur XML et permet plus de
flexibilité que Javadocs.
Beginning PHP 5 and MySQL E-Commerce: From Novice to Professional
New Page 2
Livre à
l'intention des développeurs déjà familiarisés avec PHP et MySQL. Il
contient plusieurs exemples qui montrent comment développer des
applications de commerce électronique de qualité. Outre les questions
relatives au design et à la programmation, ce livre donne des conseils
pour augmenter les ventes en ligne et diminuer le coût de traitement des
commandes grâce aux services web XML.