L’incontournable Hello world
Nous le retrouvons dans presque tous les ouvrages de programmation. Il vient toujours en tête ! Ce sera aussi pour nous l’occasion de nous familiariser avec l’environnement de développement. Dans ce chapitre, il s’agira tout d’abord d’éditer les fichiers source, à savoir hello.cpp et Hello.java. Sur le CD-Rom d’accompagnement figure un éditeur bien pratique pour Windows, que nous pouvons utiliser pour les différentes étapes de la programmation de nos exemples ou exercices : l’éditeur Crimson (voir annexe C). L’environnement de Crimson permet d’éditer les programmes source C++ et Java qui sont des fichiers de texte ASCII, de les compiler et de les exécuter. La compilation et le résultat de l’exécution des programmes peuvent s’afficher dans une fenêtre de travail intégrée à Crimson ; c’est donc l’outil idéal pour cela. Quant aux utilisateurs de Linux, ils ne devraient pas avoir de difficultés à choisir les outils adaptés aux tâches décrites ci-dessous (voir annexe F).Dans ce chapitre, nous allons aussi introduire le fameux make de GNU, qui nous permettra d’automatiser la compilation. Avant de pouvoir utiliser le make ainsi que les compilateurs Java et C++ et de les intégrer dans l’éditeur Crimson, il faudra tout d’abord installer ces produits. Ils sont tous disponibles sur le CD-Rom, comme décrit dans l’annexe B. Un autre éditeur que Crimson peut évidemment être utilisé, mais il faudra alors compiler les programmes avec le make et les exécuter dans une fenêtre DOS (procédures décrites dans l’annexe B). Un outil Open Source beaucoup plus complet, NetBeans, peut aussi être utilisé (voir les annexes E et F pour son installation et son utilisation à travers des exemples complets).Nous avons étendu l’exercice traditionnel en ajoutant la date, qui sera imprimée avec notre incontournable « Hello world ».
Hello world en C++
La première tâche consiste à introduire le code source dans le fichier hello.ccp via l’éditeur Crimson tel que décrit dans l’annexe C.
// hello.cpp #include #include
using namespace std;
int main() { time_t maintenant; time(&maintenant);
cout << « Hello world en C++: » << ctime(&maintenant) << endl; return 0; }
Avant de passer à la compilation, nous allons examiner ce code dans les détails, en laissant de côté le main() et le cout, qui seront analysés et comparés entre les deux langages un peu plus loin. Il en va de même pour le :
using namespace std;
qui identifie un espace de noms, que nous étudierons au chapitre 6. Nous pouvons déjà signaler ici que l’utilisation de namespace n’est disponible que dans le Standard C++. Cet emploi est lié à la disparition en Standard C++ des .h dans les en-têtes. Si nous avions écrit le code suivant :
// hello2.cpp #include #include
int main() { time_t maintenant; time(&maintenant);
cout << « Hello world2 en C++: » << ctime(&maintenant) << endl; return 0; }
nous aurions obtenu en fait le même résultat, excepté que cette dernière version est plus familière aux programmeurs C et C++ traditionnels ! En le compilant, nous obtiendrions ces remarques de codes dépréciés :
C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/backward/ ➥iostream.h:31, from hello2.cpp:4: #warning This file includes at least one deprecated or antiquated header.
Le binaire (hello2.exe) serait tout de même généré et correctement exécutable.
Pour en revenir à la première version, les :
#include #include
using namespace std;
vont en effet de pair, et nous les utiliserons tout au long de cet ouvrage. Nous travaillerons presque exclusivement avec les formes sans les .h, c’est-à-dire avec le Standard C++, même si, à de rares occasions, il nous arrivera d’utiliser des .h, c’est-à-dire des fonctions C qui ne sont pas disponibles dans la bibliothèque du Standard C++.
Les #include et #include sont des fichiers d’en-têtes nécessaires à la définition des classes et des objets utilisés. Si time_t, time et ctime n’étaient pas introduits, la ligne #include ne serait pas obligatoire.
Il faut noter que le fichier du Standard C++ contient en fait l’include , qui est un héritage des fonctions C. Nous reviendrons sur la directive include au chapitre 4, section « Directive include ».
Dans , nous avons la définition de cout et de son opérateur <<.
time_t est un type défini dans la bibliothèque ANSI C++ permettant de définir la variable maintenant, qui sera utilisée pour obtenir la date actuelle au travers de time(&maintenant). Nous reviendrons plus loin sur le &, qui doit être ajouté devant la variable car la fonction C time() s’attend à recevoir une adresse. Le résultat sera obtenu au moyen de << ctime (&maintenant), comme nous allons le voir ci-dessous. Le chaînage des opérateurs << est à noter, ce qui permet d’envoyer une série de blocs de données sans devoir les définir sur des lignes séparées.
Le fichier hello.cpp est ensuite compilé par le compilateur C++, accessible par le chemin d’accès PATH décrit dans l’annexe B. Cette compilation se fait de la manière suivante :
g++ -o hello.exe hello.cpp
Le paramètre –o de g++ indique que le nom hello.exe correspond au fichier binaire compilé à partir des fichiers source inclus dans la ligne de commande (ici, hello.cpp). Avec Linux, nous pourrions utiliser :g++ -o hello hello.cpp
Les fichiers hello.exe ou hello sont les exécutables. Par la suite, nous utiliserons systématiquement l’extension .exe, qui est nécessaire sous DOS. Un programme nommé hello.exe pourra aussi s’exécuter sous Linux, qui possède une propriété d’exécutable pour le fichier. Ce n’est pas le cas sous DOS, où les programmes doivent se terminer avec une extension déterminée comme .bat, .com ou .exe. Lorsque nous exécutons le programme hello.exe, on obtient :
Hello world en C++: Mon Mar 31 14:55:20 2008
Le fichier hello.exe, nommé parfois exécutable binaire, contient le code machine que le processeur pourra directement exécuter grâce aux fonctions du système d’exploitation (DOS ou Linux). Il s’exécutera uniquement sur les machines ayant le même système d’exploitation. Le programme hello.exe peut aussi ne pas fonctionner sur un PC doté d’un processeur ancien, car le compilateur n’aura sans doute pas assuré de compatibilité avec les modèles antérieurs, par exemple, au Pentium 586 d’Intel. Pour fonctionner sous Linux, avec d’autres systèmes d’exploitation ou d’autres types de configurations matérielles, il faudra recompiler le programme hello.cpp sur ce type de machine. Un programme C ou C++ compilable sur différents supports est communément appelé portable. Nous allons voir que cela se passe bien différemment avec Java.
Hello world en Java
Avant tout, une première remarque s’impose concernant le nom des fichiers. Comme le nom d’une classe commence toujours par une majuscule, il est nécessaire de définir le nom du fichier selon le même principe, c’est-à-dire ici Hello.java. Faillir à cette règle est une erreur classique, et la plupart des débutants tombent dans le piège. En effet, si on oublie ce principe, cette classe ne pourra être compilée :import java.util.*;public class Hello { public static void main(String[] args) { Date aujourdhui; aujourdhui = new Date(); System.out.println(« Hello world en Java: » + aujourdhui); } }
La machine virtuelle Java – JRE
Dans cet ouvrage, nous devons tout de même mentionner la machine virtuelle JRE (Java Runtime Environment) bien que nous allons certainement passer la moitié de notre temps à éditer et compiler des programmes Java (l’autre moitié pour le C++).Sur notre machine de développement, l’exécutable java.exe se trouve dans le répertoire C:\Program Files\Java\jdk1.6.0_06\bin. Si nous examinons le répertoire C:\Program Files\Java, nous découvrirons un second répertoire nommé jre1.6.0_06 ainsi qu’un sous-répertoire bin qui contient également un fichier java.exe.Nos amis ou clients à qui nous livrerons la classe compilée Hello.class n’auront pas besoin d’installer JDK, le kit de développement, mais uniquement la machine virtuelle, c’est-à-dire JRE. Sun Microsystems met à disposition différentes distributions de JRE, juste pour exécuter notre Hello.class :
« C:\Program Files\Java\jre1.6.0_06\bin\java.exe » Hello Hello world en Java: Wed Jul 30 13:58:09
et ceci depuis le répertoire C:\JavaCpp\EXEMPLES\Chap01.
Le JDK n’est nécessaire que pour la compilation, c’est-à-dire lorsque nous utilisons la commande javac.exe. Sur une même machine, nous pourrions avoir plusieurs JDK et plusieurs JRE dans le répertoire C:\Program Files\Java (voir annexe B, section « Désinstallation des anciennes versions »).