الأربعاء، 30 أبريل 2014
الثلاثاء، 29 أبريل 2014
Les caractères accentués: le problème de la tour de Babel
Jugeant leur entreprise trop orgueilleuse, Dieu décida de multiplier les langues utilisées par les humains, afin qu'ils ne se comprennent plus. Ainsi échoua la construction de la tour.
L'informatique d'aujourd'hui doit pouvoir tenir compte de la multiplicité des langages.
Ouais, ouais. Vous êtes gentil avec votre affaire de tour de Babel, mais pour moi, le seul problème de langage que j'ai avec Python, c'est quand il m'envoie des injures parce que j'utilise des caractères accentués.
Précisément, c'est la question que nous abordons. Et vous verrez qu'il y a bien un rapport avec la Tour de Babel.
Si tu n'as jamais observé de problème lié aux caractères accentués, tente l'expérience suivante:
- Dans un éditeur de textes, reproduis le texte suivant:
#! /usr/bin/python
print "évitons les problèmes"
print "évitons les problèmes"
- Enregistre le document sous le nom accent.py
- Lance le programme correspondant
$ ./accent.py
- Observe le résultat:
toto@info20:~$ ./accent.py
File "accent.py", line 2
SyntaxError: Non-ASCII character '\xc3' in file accent.py on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
File "accent.py", line 2
SyntaxError: Non-ASCII character '\xc3' in file accent.py on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
Et bien voilà. Vous trouvez agréable ce genre de discours?
Il faut convenir que ce n'est pas un langage de gentleman. Mais il y a une explication. Et nous devrons retourner à la Tour de Babel.
Le codage des caractères: version ASCII
La mémoire de l'ordinateur ne peut contenir que des 0 et des 1, des bits.
Pour que la machine soit, malgré tout, capable de traiter également des caractères alphabétiques, des signes de ponctuation,... on utilise des groupes de 8 bits auxquels on attribue une signification arbitraire.
Par exemple, dans la norme ASCII (American Standard Code for Information Interchange) inventée dans les années 1980, on a décidé d'attribuer un code numérique à chaque caractère de l'alphabet et à quelques signes supplémentaires.
http://fr.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange
Ce codage utilise en fait seulement 7 bits et permet de coder 127 caractères dont 96 sont imprimables.
Les caractères accentués existant dans de nombreuses langues ne sont pas pris en compte.
Ah, je comprends pourquoi il m'insulte avec SyntaxError: Non-ASCII character
Effectivement, les caractères accentués ne figurent pas dans cette norme. Voyons la solution.
Le codage des caractères: version ISO
Un organisme international (l'ISO: International Organization for Standardization) a établi une norme permettant de coder les caractères accentués dans différentes langues. C'est la norme ISO-8859 qui utilise les 8 bits.
La norme ASCII est toujours en vigueur, mais on peut employer les codes non utilisés entre 128 et 255 pour les caractères accentués.
Pour des raisons pratiques que nous n'envisagerons pas ici, la norme ISO n'utilise que les codes compris entre 161 et 255 pour des caractères imprimables: soit 95 codes.
Exemples: "à" -> code 224 ; "é" -> code 233; ...
95 codes pour les caractères accentués "éèâîôù..."? Il n'en faut pas tant. A l'aise, donc.
Les choses ne sont pas si simples. D'autres langues utilisent d'autres caractères accentués. Et l'on a même prévu de traiter la langue thai qui contient un assez grand nombre de caractères particuliers.
C'est la malédiction de Babel?
Il y a de cela, parce que cela complique les choses.
Il existe des variantes dans la norme ISO-8859.
La norme ISO-8859-1 correspond le mieux à l'alphabet accentué des langues européennes.
D'autres normes (ISO-8859-2, ISO-8859-3, ISO-8859-4, ....) utilisent les mêmes codes pour représenter éventuellement d'autres caractères.
Pour les curieux, voir les différentes normes.
- Ouvre ou crée le fichier accent.py décrit plus haut sur cette page.
- Sur la deuxième ligne, ajoute la mention de l'encodage utilisé
#! usr/bin/python
# -*- coding: ISO-8859-1 -*-
print "évitons les problèmes"
# -*- coding: ISO-8859-1 -*-
print "évitons les problèmes"
- Relance la commande
~$ ./accent.py
- Observe le résultat.
toto@info20:~$ ./accent.py
évitons les problèmes
évitons les problèmes
Ah, effectivement, plus de problème maintenant. Mais c'est dommage que Python soit si compliqué. Franchement, je suis déçu.
Ce n'est pas Python qui est compliqué: ce sont les langages humains qui sont complexes.
Tous ces problèmes d'encodage sont également présents dans les pages web, par exemple.
- Pour changer le type d'encodage de la page en cours, dans Firefox, procède comme indiqué dans l'illustration ci-dessous:
> Affichage > Encodage des caractères > Plus d'encodages > Européen de l'Est > Cyrilliique (ISO-8859-5)
- Observe le contenu de la page
- Essaie éventuellement d'autres encodages.
Mais où est donc Python?
Pour lancer un programme écrit en Python, nous avons pris l'habitude de frapper une commande du type
~$ python programme.py
Mais les programmes, même écrits en Python, se lancent généralement plus simplement: on indique simplement le nom du fichier qui contient le programme:
~$ programme.py
ou même plus simplement
~$ programme
Comment cela est-il possible?
- Ouvre l'un des programmes Python écrits précédemment; prenons input.py.
- Ouvre la première ligne et indiques-y la notation suivante:
#! /usr/bin/env python
Le programme devient donc:
#! /usr/bin/env python
longueur = input ("Quelle est la longueur? ")
largeur = input ("Quelle est la largeur? ")
.....
longueur = input ("Quelle est la longueur? ")
largeur = input ("Quelle est la largeur? ")
.....
Très joli. Vous avez emprunté ça au catalogue d'insultes du capitaine Haddock ?
Il est vrai que la notation peut paraître curieuse. Cela demande quelques explications.
Sous Linux, la commande qui lance l'interpréteur Python se trouve dans le répertoire /usr/bin .
La directive contient, en fait, le chemin vers l'interpréteur.
Dans une console Linux, frappe la commande
~$ /usr/bin/env python
L'interpréteur Python démarre.
Les signes #! placés en tête de la ligne
#! /usr/bin/env python
indiquent qu'il s'agit d'une directive qu'il faut traiter séparément des instructions. Ce n'est pas du code Python.
Lorsque la directive figure en tête d'un programme, l'interpréteur de commandes est averti qu'il doit démarrer l'interpréteur Python pour pouvoir exécuter les instructions qui suivent.
- Vérifie que la directive #! /usr/bin/env python figure en première ligne du programme.
- Enregistre le texte du programme et quitte l'éditeur de textes.
- Dans la console, frappe la commande:
~$ input.py
- Observe le résultat
toto@info17:~$ input.py
bash: input.py : commande introuvable
bash: input.py : commande introuvable
Ouaah, ça marche du tonnerre votre truc. Je crois qu'un peu de repos vous fera du bien.
Bah non, tout était prévu. Tirons les conclusions.
- Lorsqu'un programme est lancé dans une console, l'interpréteur de commande cherche cette commande dans un certain nombre de répertoires.
- S'il ne trouve pas la commande dans ces répertoires, il annonce qu'elle est introuvable.
Quels sont les répertoires visités? Ceux qui figurent dans une variable système nommée $PATH
- Dans une console, frappe la commande suivante, en respectant les majuscules et les minuscules
~$ echo $PATH
- Observe le résultat. Tu devrais obtenir quelque chose de semblable à:
~$ /home/toto/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
qui indique les répertoires par défaut, séparés par un signe " : ".
/home/toto/bin (si tu t'appelles "toto")
/usr/local/sbin
/usr/local/bin
...
/home/toto/bin (si tu t'appelles "toto")
/usr/local/sbin
/usr/local/bin
...
Ton répertoire personnel (sans doute /home/toto si tu t'appelles "toto") ne figure pas dans la liste.
- Dans la console, frappe la commande:
~$ ./input.py
où la notation " ./ " désigne le répertoire actuellement actif. Là où se trouve le programme input.py
- Observe le résultat
toto@info17:~$ ./input.py
bash: ./input.py: Permission non accordée
bash: ./input.py: Permission non accordée
Caramba! Encore raté!! Vous n'en avez pas encore assez d'être ridicule?
Tout est toujours sous contrôle. En fait, personne n'a encore reçu l'autorisation d'exécuter ce programme. Mais nous progressons.
- Dans une console, frappe la commande
~$ ls -l
- Parmi les résultas, observe une ligne de type suivant (le nom "toto" est remplacé par le tien) et les couleurs n'apparaissent pas comme ci-dessous:
-rw-r--r-- 1 toto root 141 2008-06-05 15:59 input.py
- le propriétaire du fichier peut le lire et l'écrire (rw - read, write)
- les membres de son groupe peuvent le lire (r - read)
- toute autre personne peut le lire (r - read)
Nous allons rendre le programme exécutable par le propriétaire, c'est-à-dire l'utilisateur, c'est-à-dire toi-même.
- Frappe la commande
~$ chmod u+x input.py
afin de rendre l'utilisateur (u) capable d'exécuter (+x) le programme.
~$ ls -l
-rwxr--r-- 1 toto root 141 2008-06-05 15:59 input.py
Le programme est exécutable, mais seulement par son propriétaire: toi-même.
~$ ./input.py
Hé mais, ça marche!!
Bien sûr. Et plus fort encore: cela fonctionne aussi si l'on supprime l'extension .py du fichier. On peut alors lancer la commande sans même savoir qu'il s'agit d'un programme écrit en Python.
- Modifie et exécute tes autres programmes déjà écrits.
- Renomme temporairement l'un ou l'autre d'entre-eux en supprimant l'extension .py du nom du fichier. Vérifie qu'il est toujours exécuté.
L'extension .py devrait être laissée afin de caractériser le programme aux yeux des humains. Mais l'interpréteur de commandes n'en a plus besoin.
La fonction input()
Tout à fait entre nous, je ne trouve quand même pas terrible l'idée de devoir modifier le texte d'un programme quand je dois modifier les données.
Voilà qui justifie parfaitement l'introduction de cette petite fonction simple mais bien utile: input ().
- Recopie le texte du programme suivant dans l'éditeur de textes:
longueur = input ("Quelle est la longueur? ")
largeur = input ("Quelle est la largeur? ")
surface = longueur * largeur
perimetre = 2 * (longueur + largeur)
print "SURFACE = ", surface
print "PERIMETRE = ", perimetre
largeur = input ("Quelle est la largeur? ")
surface = longueur * largeur
perimetre = 2 * (longueur + largeur)
print "SURFACE = ", surface
print "PERIMETRE = ", perimetre
- Enregistre le document sous le nom input.py.
- Exécute le programme.
La fonction input() demande un argument (qui peut être vide) qui est de type chaîne de caractère.
Elle attend que l'utilisateur frappe quelque chose au clavier.
Elle renvoie une valeur de type correspondant à ce qui a été frappé au clavier.
- En utilisant la fonction input(), revois chacun des programmes précédents (parallelepipede.py,disque.py, TVA.py et MRU.py) afin de le rendre interactif.
Résous chacun des exercices suivants:
1. Une entreprise européenne réalise des affaires avec des partenaires anglais et américains. Afin de convertir ses prix en dollars et en livres sterling, elle souhaite disposer d'un programme convertisseur. Etablis ce programme. Cherche le cours du dollar et de la livre.
Enregistre le programme dans un fichier nommé conversion.py
2. Un programme interactif avec l'utilisateur doit calculer l'altitude et la vitesse d'un objet lâché en chute libre.
L'utlisateur sera invité à fournir successivement l'altitude initiale et le temps de chute après lequel il faut calculer altitude et vitesse.
Dans une deuxième version du programme, ajoute une vitesse initiale verticale fournie par l'utilisateur.
Le programme est enregistré sous le nom chuteLibre.py.
L'utlisateur sera invité à fournir successivement l'altitude initiale et le temps de chute après lequel il faut calculer altitude et vitesse.
Dans une deuxième version du programme, ajoute une vitesse initiale verticale fournie par l'utilisateur.
Le programme est enregistré sous le nom chuteLibre.py.
3. L'organisateur d'une course automobile sur circuit fermé d'une longueur de 4,6 km souhaite tenir les spectateurs régulièrement informés des performances réalisées par les différents concurrents. A cet effet, il pose le problème suivant : Étant donné le temps mis par un concurrent pour effectuer un tour du circuit (temps détaillé en minutes, secondes et centièmes de secondes), il souhaite connaître instantanément la vitesse (exprimée en km/h) à laquelle le concurrent a parcouru un tour du circuit.
Enregistre le programme dans un fichier nommé automobile.py
الاثنين، 28 أبريل 2014
De vrais programmes
Jusqu'à ce point, nous avons écrit des suites d'instructions dont nous avons observé l'exécution immédiate.
Nous allons maintenant passer à de vrais programmes dont le code source pourra être exécuté ultérieurement et le nombre de fois que nous voulons.
En cas de problème, nous allons pouvoir le corriger ou l'améliorer.
Ouvre un simple éditeur de textes. Attention, un logiciel de traitement de textes ne conviendra pas.
- Dans l'éditeur, frappe le texte suivant, en prenant garde de ne pas utiliser de caractères accentués:
longueur = 10
largeur = 20
surface = longueur * largeur
perimetre = 2 * (longueur + largeur)
print "SURFACE = ", surface
print "PERIMETRE = ", perimetre
largeur = 20
surface = longueur * largeur
perimetre = 2 * (longueur + largeur)
print "SURFACE = ", surface
print "PERIMETRE = ", perimetre
- Enregistre le document sous le nom exercice1.py à la racine de ton répertoire personnel (pas dans un sous-répertoire pour l'instant).
- S'il est encore ouvert, ferme l'interpréteur Python (CTRL+ D) ou ouvre une nouvelle fenêtre de terminal.
- Dans la fenêtre de terminal, frappe la commande
~$ python exercice1.py
- Vérifie que l'effet obtenu est identique à celui obtenu lors de l'exécution instruction par instruction.
En cas de problème pendant l'exécution d'un programme, il suffit de suivre les indications données par l'interpréteur pour tenter de localiser la faute et pour la corriger.
Exemple:
toto@info17:~$ python exercice1.py
Traceback (most recent call last):
File "exercice1.py", line 4, in <module>
surface = longueurs * largeur
NameError: name 'longueurs' is not defined
Traceback (most recent call last):
File "exercice1.py", line 4, in <module>
surface = longueurs * largeur
NameError: name 'longueurs' is not defined
Le programme signale une probable faute de frappe à la ligne 4: le nom de la variable longueur a été écritlongueurs.
Méthode de travail pour programmer
La programmation est une discipline très rigoureuse qui demande beaucoup de soin et de précision. Pour être efficace, il est indispensable de se donner une bonne méthode de travail.
- Chercher toutes les données du problème à résoudre
- Chercher tous les résultats qui sont attendus
- Définir la méthode qui permet de passer des données aux résultats
Exemple
Quelle masse de chocolat est nécessaire pour couvrir entièrement un cake de forme parallélépipédique?
- Données du problème: la surface du cake, l'épaisseur de la couche de chocolat, la masse volumique du chocolat
- Résultat attendu: la masse de chocolat
- Méthode:
- calculer le volume de chocolat = surface * épaisseur
- calculer la masse de chocolat = volume * masse volumique
On peut ensuite passer à la rédaction du programme dont la structure est présentée ci-contre.
Ouups, excusez-moi: vous n'auriez pas interverti les points 2 et 3 ? Il y a inversion par rapport au schéma précédent...
Pas du tout: il n'y a pas d'inversion. D'abord, on rassemble les données du problème; ensuite, on s'interroge sur la nature des informations attendues; finalement, on détermine la méthode pour aller des données aux résultats.
Il est impossible de déterminer un chemin (le point 3) sans savoir d'où l'on vient et où l'on va!!
Le premier schéma décrit le processus qui se déroule dans l'ordinateur. Le deuxième décrit la méthode de réflexion qui permet d'écrire le programme d'ordinateur.
Il est impossible de déterminer un chemin (le point 3) sans savoir d'où l'on vient et où l'on va!!
Le premier schéma décrit le processus qui se déroule dans l'ordinateur. Le deuxième décrit la méthode de réflexion qui permet d'écrire le programme d'ordinateur.
- Reprends chacun des exercices de la page 5 et présente-les sous forme de vrais programmes.
- Enregistre-les dans les fichiers nommés parallelepipede.py, disque.py, TVA.py et MRU.py.
- Modifie les valeurs des données de chacun des problèmes et exécute chacun des programmes avec ces nouvelles données.
- Soumets ton travail au professeur.
Utilisation des variables
En informatique, les variables sont des zones de la mémoire centrale dans lesquelles sont notées la valeur de certaines données.
- Frappe les commandes suivantes
>>> toto = 7
>>> print "schtroumpf"
>>> schtroumpf = "Bonjour le monde"
>>> print "toto"
>>> print toto
>>> print schtroumpf
>>> print "schtroumpf"
>>> schtroumpf = "Bonjour le monde"
>>> print "toto"
>>> print toto
>>> print schtroumpf
- Note les résultats
Dès qu'ils ont été utilisés, les noms "toto" et "schtroumpf" ont servi à désigner des zones de la mémoire centrale de l'ordinateur où des données sont stockées. On les appelle des variables
Le contenu d'une variable est indiqué dans l'expression d'affectation
nom_de_variable = valeur
Le contenu d'une variable est indiqué dans l'expression d'affectation
nom_de_variable = valeur
- Frappe les commandes suivantes
>>> hauteur = 10
>>> largeur = 20
>>> perimetre = (hauteur + largeur) * 2
>>> print hauteur * largeur
>>> print perimetre
>>> largeur = 20
>>> perimetre = (hauteur + largeur) * 2
>>> print hauteur * largeur
>>> print perimetre
Les instructions ci-dessus permettent bien de calculer la surface et le périmètre d'un rectangle
Le contenu d'une variable peut être utilisé dans un calcul.
Noms des variables
Sous Python, les noms de variables doivent en outre obéir à quelques règles simples :
- Un nom de variable est une suite de lettres et/ou de chiffres, et doit toujours commencer par une lettre.
- Les lettres accentuées, les cédilles, les espaces, les caractères spéciaux tels que $, #, @, etc. sont interdits, à l'exception du caractère _ (souligné).
- Les caractères majuscules et minuscules sont distincts
Exercices
En utilisant le même type de procédé que dans les calculs du rectangle ci-dessus, réalise les calculs suivants. Soumets chacun de tes calculs au professeur avant de passer au suivant.
- Calcule le volume et la surface d'un parallélépipède rectangle dont on fournit les trois dimensions.
- Calcule la circonférence et la surface d'un disque dont on fournit le rayon. La valeur de pi est approximée à 3.1416.
- Calcule le montant de la TVA (21%) et le prix net d'un article dont on fournit le prix hors TVA.
- Calcule la vitesse d'un mobile en mouvement rectiligne uniforme si l'on fournit la distance parcourue et le temps correspondant.
Types de données en Python
Les programmes informatiques traitent des données de différents types. Voyons ce que cela signifie.
Le type "chaîne de caractères" (string)
- Assure-toi que l'interpréteur Python est actif
- En veillant bien à entourer la phrase par des guillemets, frappe la commande
>>> print "Bonjour tout le monde"
- En veillant à ne pas mettre les guillemets, frappe ensuite la commande
>>> print Bonjour tout le monde
- Note la différence de comportement
- En veillant bien à entourer la phrase par des guillemets, frappe la commande
>>> print "oP78 %@__98[##"
Ouaahh, puissant!! Et il faut vraiment un ordinateur pour faire ça?
L'intérêt de l'ordinateur est plutôt minime. L'expérience nous permet toutefois de tirer une leçon.
Lorsque l'on souhaite faire écrire une suite de caractères en langage Python (même si cette suite n'a aucun sens pour nous), les caractères doivent être entourés de guillemets.
Nous venons ainsi de faire la connaissance d'un premier type de données appelé "chaîne de caractères".
En informatique, on désigne souvent les "chaînes de caractères" par le nom "string" (qui signifie "chaîne", en anglais).
Le type "entier" (int)
- L'interpréteur Python est toujours actif
- En veillant bien à entourer la phrase par des guillemets, frappe la commande
>>> print "5+3"
- En veillant à ne pas mettre les guillemets, frappe ensuite la commande
>>> print 5+3
- Note la différence de comportement
- Effectue ensuite quelques autres additions, soustractions et multiplications (opérateur *)
- Dans le premier cas, l'ordinateur écrit la suite de caractères "5", le signe + et "3". Il s'agit bien d'une chaîne.
- Quand l'écriture n'est pas entourée de guillemets, l'ordinateur écrit le résultat du calcul
- Toujours sans guillemets, frappe la commande
>>> print 4 / 2
- Frappe ensuite les commandes
>>> print 5 / 2
>>> print 14 / 4
>>> print 31 / 9
>>> print 14 / 4
>>> print 31 / 9
Pouaaah!! Ridicule. On a trouvé le premier ordinateur incapable de calculer correctement. Le voilà bon pour la casse, le pauvre.
Contrairement à ce que l'on pourrait croire, les résultats des opérations précédentes sont parfaitement corrects. Simplement, l'ordinateur calcule en nombre entiers, comme vous le faisiez au début de l'école primaire.
>>> print 5/2
2
2
Le résultat est 2 et il reste 1 (ce que l'ordinateur ne dit pas puisque nous ne l'avons pas demandé)
>>> print 14/4
3
3
Les résultat est bien 3 et il reste 2
>>> print 31/9
3
3
Le résultat est 3 et il reste 4
En informatique, le type "entier" est encore appelé "integer" ou "int" (en anglais).
Bon, d'accord, tout ça est bien gentil. Mais on n'ira jamais sur la lune avec un ordinateur qui ne connaît que les nombres entiers.
Pas de panique: il peut aussi traiter les nombres réels.
Le type "réel" (float)
- En n'omettant pas d'indiquer un point à la place de la virgule, frappe les commandes
>>> print 5.7 / 3
>>> print 31/9.0
>>> print 1E3 / 20
>>> print 882.567E15 / 20
>>> print 31/9.0
>>> print 1E3 / 20
>>> print 882.567E15 / 20
- Note les résultats
Pour que l'interpréteur Python travaille dans l'ensemble des réels, il suffit que l'un des termes de l'opération à effectuer:
- contienne un "point" décimal (équivalent de la virgule utlisée en français)
- le signe "E" qui signifie "x 10 exposant" (comme sur les calculatrices scientifiques)
En informatique, le type "réel" est encore appelé "flottant" ou "float" (en anglais).
Flottant? J'aimerais bien savoir ce qui flotte là-dedans, moi.
Tout simple: c'est la virgule qui flotte.
Exemple: 6482 est noté 6.482 E 3
Si ce nombre est divisé par 10000, il devient 6.482 E -1
Si ce nombre est divisé par 10000, il devient 6.482 E -1
En fait, l'exposant de 10 utilisé indique de combien de rangs il faut déplacer la virgule pour obtenir le nombre, en notation plus traditionnelles. Cet exposant sert donc bien à faire "flotter" la virgule.
Dans la mémoire de l'ordinateur, ce type de nombre est représenté comme en notation scientifique:
- un seul chiffre devant la virgule suivi d'un certain nombre de décimales
- l'exposant de 10 nécessaire pour obtenir la valeur correcte du nombre
Remarque: le reste de la division entière
Appliqué aux nombres entier, l'opérateur "/" permet de calculer le résultat de la division entière de deux nombres.
L'opérateur "%" permet de calculer le reste de la division entière.
- Frappe les commandes
>>> print 5 / 3
>>> print 5 % 3
>>> print 20 / 7
>>> print 20 % 7
>>> print 5 % 3
>>> print 20 / 7
>>> print 20 % 7
- Note les résultats
La traduction en langage machine
Notion de "code source"
Lorsque l'on dispose d'un programme exécutable par un ordinateur, on dispose de la traduction en binaire du programme rédigé en langage de haut niveau.
Le texte du programme en langage de haut niveau est appelé "code source".
Un logiciel "Open Source" est un programme pour lequel on dispose du code source.
Un logiciel "fermé" est un programme qui est la propriété d'une personne ou d'une société qui ne souhaite pas diffuser le code source.
Il est extrêmement difficile de reconstituer le code source à partir du code binaire. Si l'on souhaite pouvoir réaliser des modifications au programme, il est presque indispensable de disposer du code source.
Si l'on dispose du code source d'un programme, il est toujours possible d'étudier son fonctionnement et de le modifier en cas de besoin.
Le compilateur
Le code source d'un programme doit être traduits en langage machine. Ce travail est réalisé par un programme spécialisé appelé compilateur.
Il existe un grand nombre de compilateurs. Chacun est spécialisé dans le traitement de l'un ou l'autre langage évolué.
Un texte écrit dans un langage doit être compilé à l'aide d'un compilateur approprié à ce langage précis.
Un texte écrit en langage C doit être compilé par un compilateur C.
Un texte écrit en langage C doit être compilé par un compilateur C.
Les interpréteurs
Dans certains langages, le code source n'est pas préalablement traduit en langage machine par un compilateur.
Dans ce cas, la transformation en langage machine se fait au moment de l'exécution du programme : un interpréteur traduit le programme, ligne par ligne.
Le langage Python est un langage interprété.
Comme pour les langages compilés, il est nécessaire de disposer d'un interpréteur approprié pour chaque langage utilisé. Un programme écrit en langage Python doit être traité par un interpréteur Python.
Quand une ligne du programme doit être exécutée un grand nombre de fois, l'interpréteur la traduit autant de fois qu'elle est exécutée. Il en résulte une perte de temps et donc une moins grande rapidité des programmes en langage interprété par rapport aux langages compilés.
Par contre, il est plus rapide d'exécuter quelques lignes de programme afin de les tester dans un langage interprété.
Les programmes informatiques: de la machine à l'humain
Les langages d'ordinateurs
Un programme informatique est une liste d'instruction destinée à un ordinateur et dont le but est d'accomplir une tâche donnée.
Bah, dans ce cours, il y a aussi plein de listes d'instructions. Chaque fois qu'il y a le logo
, on a droit à une liste d'instructions. Et ce ne sont pas des programmes, que je sache.
Et pourtant, en quelques sortes, on pourrait dire qu'il s'agit de programmes. A la différence que ceux-ci sont rédigés en français et destinés à des humains.
L'ordinateur est donc capable d'exécuter ces instructions à ma place? Bonne nouvelle! Enfin un peu de repos.
Malheureusement, il y a un petit détail qui bloque tout: l'ordinateur est incapable de comprendre une liste d'instructions rédigées en français courant.
Puisque les ordinateurs ne comprennent pas des listes d'instructions en français, voyons comment on peut se faire comprendre d'eux.
Le problème est un peu technique.
Le langage machine
Les seules informations que puisse stocker un ordinateur sont des séries de 0 et de 1. Les données qu'il peut traiter doivent donc être codées sous cette forme.
00110110 11010101 10100011 00111001 10011000 10101100
00100101 01011010 01110110 11011010 10110111 10101101
Dans cette illustration, chaque groupe de 8 bits correspond
- à une instruction (copier, additionner, déplacer,... une donnée) ou
- à une donnée
On ne peut, bien sûr, donner que des instructions connues de l'ordinateur. Pour programmer, il faut donc savoir quelle série de bits correspond à quelle instruction. Ensuite, il faut être capable d'utiliser toutes ces instructions simples pour réaliser des tâches complexes.
Si je comprends bien, programmer, c'est apprendre à faire des choses très complexes à un idiot de première catégorie?
Ce n'est pas tout à fait faux. C'est un exercice dans lequel il faut être intelligent à la place de l'ordinateur.
Les premiers ordinateurs se programmaient dans ce langage : le langage binaire encore appelé langage machine.
L'assembleur et les langages de haut niveau
L'assembleur
Le premier langage inventé fut l'assembleur qui permet de représenter les instructions connues du processeur par des mots très courts (add, mov,...). L'avantage est qu'il ne faut plus connaître les instructions du processeur en termes de 0 et de 1.
Ah oui, superbe idée! Mais, en attendant, l'ordinateur attend toujours sa pâtée de 0 et de 1. Et rien d'autre. Ou alors, je n'ai rien compris à ce qui est indiqué un peu plus haut.
C'est bien correct, l'ordinateur attend bien des 0 et des 1. Et rien d'autre.
On va donc embaucher un traducteur. Et le traducteur sera simplement... un ordinateur.
On va donc embaucher un traducteur. Et le traducteur sera simplement... un ordinateur.
Dans ce processus, l'ordinateur est muni d'un programme appelé compilateur dont le but est de traduire les instructions écrites en assembleur vers le langage machine composé de 0 et de 1.
Quand la traduction est terminée, le code binaire obtenu peut éventuellement être enregistré, confié à un autre ordinateur et exécuté.
On ne peut qu'apprécier le progrès. Mais, pour ma part, je trouve que cela ressemble fort à du martien, ce code "assembleur". Je me demande si je ne vais pas étudier la philosophie plutôt que la programmation...
La philosophie est une belle discipline. Mais les progrès ne se sont pas arrêtés au langage assembleur. Il existe des langages "de haut niveau" qui sont un peu plus proches du langage humain.
Les langages de haut niveau
Dans les langages de haut niveau, on permet au programmeur de donner des instructions qui sont plus complexes que celles du langage machine. Du type "calcule la racine cubique du nombre qui se trouve dans telle case de la mémoire".
A nouveau, il faut disposer d'un programme capable de transformer ces instructions "complexes" en code binaire, compréhensible par l'ordinateur.
- L'avantage des langages de haut niveau pour le programmeur est que le texte des programmes est plus facile à comprendre.
- En contre-partie, il est nécessaire qu'un ordinateur intervienne pour les traduire en langage machine.
Quelques exemples
Un programme qui écrit « Salut tout le monde » à l'écran
En langage C
#include <stdio.h> #include <stdlib.h> int main(void) { printf("Salut tout le monde!\n"); return EXIT_SUCCESS; }
En langage Pascal
Program salut ; Begin Writeln ('Salut tout le monde') ; End.
En langage Python
#! /usr/bin/python print "Salut tout le monde"
D'autres exemples de langages informatique sont illustrés dans l'encyclopédie Wikipedia. Vérifie, pour quelques langages, qu'il s'agit bien d'un moyen terme entre le langage humain et un langage de machine (vois les rubriques Smalltalk, Perl, C++, Cobol,...).
الاشتراك في:
الرسائل (Atom)