IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Apprendre à programmer avec Python

Apprendre programmer avec Python


prcdentsommairesuivant

Chapitre 1 : Penser comme un programmeur

Nous allons introduire dans ce chapitre quelques concepts qu'il vous faut connatre avant de vous lancer dans l'apprentissage de la programmation. Nous avons volontairement limit nos explications afin de ne pas vous encombrer l'esprit. La programmation n'est pas difficile : il suffit d'un peu de mthode et de persvrance.

Une part importante de ce chapitre est traduite d'un chapitre similaire de How to think like a computer scientist de Downey, Elkner & Meyers.

1.1. La dmarche du programmeur

Le but de ce cours est de vous apprendre penser et rflchir comme un analyste-programmeur. Ce mode de pense combine des dmarches intellectuelles complexes, similaires celles qu'accomplissent les mathmaticiens, les ingnieurs et les scientifiques.

Comme le mathmaticien, l'analyste-programmeur utilise des langages formels pour dcrire des raisonnements (ou algorithmes). Comme l'ingnieur, il conoit des dispositifs, il assemble des composants pour raliser des mcanismes et il value leurs performances. Comme le scientifique, il observe le comportement de systmes complexes, il bauche des hypothses explicatives, il teste des prdictions.

L'activit essentielle d'un analyste-programmeur est la rsolution de problmes.

Il s'agit l d'une comptence de haut niveau, qui implique des capacits et des connaissances diverses : tre capable de (re)formuler un problme de plusieurs manires diffrentes, tre capable d'imaginer des solutions innovantes et efficaces, tre capable d'exprimer ces solutions de manire claire et complte.

La programmation d'un ordinateur consiste en effet expliquer en dtail une machine ce qu'elle doit faire, en sachant d'emble qu'elle ne peut pas vritablement comprendre un langage humain, mais seulement effectuer un traitement automatique sur des squences de caractres. Un programme n'est rien d'autre qu'une suite d'instructions, encodes en respectant de manire trs stricte un ensemble de conventions fixes l'avance que l'on appelle un langage informatique. La machine est ainsi pourvue d'un mcanisme qui dcode ces instructions en associant chaque mot du langage une action prcise.

Vous allez donc apprendre programmer, activit dj intressante en elle-mme parce qu'elle contribue dvelopper votre intelligence. Mais vous serez aussi amen utiliser la programmation pour raliser des projets concrets, ce qui vous procurera certainement de trs grandes satisfactions.

1.2. Langage machine, langage de programmation

A strictement parler, un ordinateur n'est rien d'autre qu'une machine effectuant des oprations simples sur des squences de signaux lectriques, lesquels sont conditionns de manire ne pouvoir prendre que deux tats seulement (par exemple un potentiel lectrique maximum ou minimum). Ces squences de signaux obissent une logique du type tout ou rien et peuvent donc tre considrs conventionnellement comme des suites de nombres ne prenant jamais que les deux valeurs 0 et 1. Un systme numrique ainsi limit deux chiffres est appel systme binaire.

Sachez ds prsent que dans son fonctionnement interne, un ordinateur est totalement incapable de traiter autre chose que des nombres binaires. Toute information d'un autre type doit tre convertie, ou code, en format binaire. Cela est vrai non seulement pour les donnes que l'on souhaite traiter (les textes, les images, les sons, les nombres, etc.), mais aussi pour les programmes, c'est--dire les squences d'instructions que l'on va fournir la machine pour lui dire ce qu'elle doit faire avec ces donnes.

Le seul langage que l'ordinateur puisse vritablement comprendre est donc trs loign de ce que nous utilisons nous-mmes. C'est une longue suite de 1 et de 0 (les "bits") souvent traits par groupes de 8 (les octets ), 16, 32, ou mme 64. Ce langage machine est videmment presqu'incomprhensible pour nous. Pour parler un ordinateur, il nous faudra utiliser des systmes de traduction automatiques, capables de convertir en nombres binaires des suites de caractres formant des mots-cls (anglais en gnral) qui seront plus significatifs pour nous.

Ces systmes de traduction automatique seront tablis sur la base de toute une srie de conventions, dont il existera videmment de nombreuses variantes.

Le systme de traduction proprement dit s'appellera interprteur ou bien compilateur, suivant la mthode utilise pour effectuer la traduction (voir ci-aprs). On appellera langage de programmation un ensemble de mots-cls (choisis arbitrairement) associ un ensemble de rgles trs prcises indiquant comment on peut assembler ces mots pour former des phrases que l'interprteur ou le compilateur puisse traduire en langage machine (binaire).

Suivant son niveau d'abstraction, on pourra dire d'un langage qu'il est de bas niveau (ex : Assembler) ou de haut niveau (ex : Pascal, Perl, Smalltalk, Clarion, Java...). Un langage de bas niveau est constitu d'instructions trs lmentaires, trs proches de la machine . Un langage de haut niveau comporte des instructions plus abstraites ou, plus puissantes . Cela signifie que chacune de ces instructions pourra tre traduite par l'interprteur ou le compilateur en un grand nombre d'instructions machine lmentaires.

Le langage que vous allez apprendre en premier est Python. Il s'agit d'un langage de haut niveau, dont la traduction en codes binaires est complexe et prend donc toujours un certain temps. Cela pourrait paratre un inconvnient. En fait, les avantages que prsentent les langages de haut niveau sont normes : il est beaucoup plus facile d'crire un programme dans un langage de haut niveau ; l'criture du programme prend donc beaucoup moins de temps ; la probabilit d'y faire des fautes est nettement plus faible ; la maintenance (c'est--dire l'apport de modifications ultrieures) et la recherche des erreurs (les bugs ) sont grandement facilites. De plus, un programme crit dans un langage de haut niveau sera souvent portable, c'est--dire que l'on pourra le faire fonctionner sans gure de modifications sur des machines ou des systmes d'exploitation diffrents. Un programme crit dans un langage de bas niveau ne peut jamais fonctionner que sur un seul type de machine : pour qu'une autre l'accepte, il faut le rcrire entirement.

1.3. Compilation et interprtation

Le programme tel que nous l'crivons l'aide d'un logiciel diteur (une sorte de traitement de texte spcialis) sera appel dsormais programme source (ou code source). Comme dj signal plus haut, il existe deux techniques principales pour effectuer la traduction d'un tel programme source en code binaire excutable par la machine : l'interprtation et la compilation.

  • Dans la technique appele interprtation, le logiciel interprteur doit tre utilis chaque fois que l'on veut faire fonctionner le programme. Dans cette technique en effet, chaque ligne du programme source analys est traduite au fur et mesure en quelques instructions du langage machine, qui sont ensuite directement excutes. Aucun programme objet n'est gnr.
Image non disponible
  • La compilation consiste traduire la totalit du texte source en une fois. Le logiciel compilateur lit toutes les lignes du programme source et produit une nouvelle suite de codes que l'on appelle programme objet (ou code objet). Celui-ci peut dsormais tre excut indpendamment du compilateur et tre conserv tel quel dans un fichier ( fichier excutable ).
Image non disponible

Chacune de ces deux techniques a ses avantages et ses inconvnients :

L'interprtation est idale lorsque l'on est en phase d'apprentissage du langage, ou en cours d'exprimentation sur un projet. Avec cette technique, on peut en effet tester immdiatement toute modification apporte au programme source, sans passer par une phase de compilation qui demande toujours du temps.

Par contre, lorsqu'un projet comporte des fonctionnalits complexes qui doivent s'excuter rapidement, la compilation est prfrable : il est clair en effet qu'un programme compil fonctionnera toujours nettement plus vite que son homologue interprt, puisque dans cette technique l'ordinateur n'a plus (re)traduire chaque instruction en code binaire avant qu'elle puisse tre excute.

Certains langages modernes tentent de combiner les deux techniques afin de retirer le meilleur de chacune. C'est le cas de Python et aussi de Java. Lorsque vous lui fournissez un programme source, Python commence par le compiler pour produire un code intermdiaire, similaire un langage machine, que l'on appelle bytecode, lequel sera ensuite transmis un interprteur pour l'excution finale. Du point de vue de l'ordinateur, le bytecode est trs facile interprter en langage machine. Cette interprtation sera donc beaucoup plus rapide que celle d'un code source.

Image non disponible

Les avantages de cette mthode sont apprciables :

  • Le fait de disposer en permanence d'un interprteur permet de tester immdiatement n'importe quel petit morceau de programme. On pourra donc vrifier le bon fonctionnement de chaque composant d'une application au fur et mesure de sa construction.
  • L'interprtation du bytecode compil n'est pas aussi rapide que celle d'un vritable code binaire, mais elle est trs satisfaisante pour de trs nombreux programmes, y compris graphiques.
  • Le bytecode est portable. Pour qu'un programme Python ou Java puisse s'excuter sur diffrentes machines, il suffit de disposer pour chacune d'elles d'un interprteur adapt.

Tout ceci peut vous paratre un peu compliqu, mais la bonne nouvelle est que tout ceci est pris en charge automatiquement par l'environnement de dveloppement de Python. Il vous suffira d'entrer vos commandes au clavier, de frapper <Enter>, et Python se chargera de les compiler et de les interprter pour vous.

1.4. Mise au point d'un programme - Recherche des erreurs ( debug )

La programmation est une dmarche trs complexe, et comme c'est le cas dans toute activit humaine, on y commet de nombreuses erreurs. Pour des raisons anecdotiques, les erreurs de programmation s'appellent des bugs (ou bogues , en France)4, et l'ensemble des techniques que l'on met en oeuvre pour les dtecter et les corriger s'appelle debug (ou dboguage ).

En fait, il peut exister dans un programme trois types d'erreurs assez diffrentes, et il convient que vous appreniez bien les distinguer :

4 "bug" est l'origine un terme anglais servant dsigner de petits insectes gnants, tels les punaises. Les premiers ordinateurs fonctionnaient l'aide de "lampes" radios qui ncessitaient des tensions lectriques assez leves. Il est arriv plusieurs reprises que des petits insectes s'introduisent dans cette circuiterie complexe et se fassent lectrocuter, leurs cadavres calcins provoquant alors des court-circuits et donc des pannes incomprhensibles. Le mot franais "bogue" a t choisi par homonymie approximative. Il dsigne la coque pineuse de la chtaigne.

1.4.1. Erreurs de syntaxe

Python ne peut excuter un programme que si sa syntaxe est parfaitement correcte. Dans le cas contraire, le processus s'arrte et vous obtenez un message d'erreur. Le terme syntaxe se rfre aux rgles que les auteurs du langage ont tablies pour la structure du programme.

Tout langage comporte sa syntaxe. Dans la langue franaise, par exemple, une phrase doit toujours commencer par une majuscule et se terminer par un point. ainsi cette phrase comporte deux erreurs de syntaxe

Dans les textes ordinaires, la prsence de quelques petites fautes de syntaxe par-ci par-l n'a gnralement pas d'importance. Il peut mme arriver (en posie, par exemple), que des fautes de syntaxe soient commises volontairement. Cela n'empche pas que l'on puisse comprendre le texte.

Dans un programme d'ordinateur, par contre, la moindre erreur de syntaxe produit invariablement un arrt de fonctionnement (un plantage ) ainsi que l'affichage d'un message d'erreur. Au cours des premires semaines de votre carrire de programmeur, vous passerez certainement pas mal de temps rechercher vos erreurs de syntaxe. Avec de l'exprience, vous en commettrez beaucoup moins.

Gardez l'esprit que les mots et les symboles utiliss n'ont aucune signification en eux-mmes : ce ne sont que des suites de codes destins tre convertis automatiquement en nombres binaires. Par consquent, il vous faudra tre trs attentifs respecter scrupuleusement la syntaxe du langage.

Il est heureux que vous fassiez vos dbuts en programmation avec un langage interprt tel que Python. La recherche des erreurs y est facile et rapide. Avec les langages compils (tel C++), il vous faudrait recompiler l'intgralit du programme aprs chaque modification, aussi minime soitelle.

1.4.2. Erreurs smantiques

Le second type d'erreur est l'erreur smantique ou erreur de logique. S'il existe une erreur de ce type dans un de vos programmes, celui-ci s'excute parfaitement, en ce sens que vous n'obtenez aucun message d'erreur, mais le rsultat n'est pas celui que vous attendiez : vous obtenez autre chose.

En ralit, le programme fait exactement ce que vous lui avez dit de faire. Le problme est que ce que vous lui avez dit de faire ne correspond pas ce que vous vouliez qu'il fasse. La squence d'instructions de votre programme ne correspond pas l'objectif poursuivi. La smantique (la logique) est incorrecte.

Rechercher des fautes de logique peut tre une tche ardue. Il faut analyser ce qui sort de la machine et tcher de se reprsenter une par une les oprations qu'elle a effectues, la suite de chaque instruction.

1.4.3. Erreurs l'excution

Le troisime type d'erreur est l'erreur en cours d'excution (Run-time error), qui apparat seulement lorsque votre programme fonctionne dj, mais que des circonstances particulires se prsentent (par exemple, votre programme essaie de lire un fichier qui n'existe plus). Ces erreurs sont galement appeles des exceptions, parce qu'elles indiquent gnralement que quelque chose d'exceptionnel s'est produit (et qui n'avait pas t prvu). Vous rencontrerez davantage ce type d'erreur lorsque vous programmerez des projets de plus en plus volumineux.

1.5. Recherche des erreurs et exprimentation

L'une des comptences les plus importantes acqurir au cours de votre apprentissage est celle qui consiste dboguer efficacement un programme. Il s'agit d'une activit intellectuelle parfois nervante mais toujours trs riche, dans laquelle il faut faire montre de beaucoup de perspicacit.

Ce travail ressemble par bien des aspects une enqute policire. Vous examinez un ensemble de faits, et vous devez mettre des hypothses explicatives pour reconstituer les processus et les vnements qui ont logiquement entran les rsultats que vous constatez.

Cette activit s'apparente aussi au travail exprimental en sciences. Vous vous faites une premire ide de ce qui ne va pas, vous modifiez votre programme et vous essayez nouveau. Vous avez mis une hypothse, qui vous permet de prdire ce que devra donner la modification. Si la prdiction se vrifie, alors vous avez progress d'un pas sur la voie d'un programme qui fonctionne. Si la prdiction se rvle fausse, alors il vous faut mettre une nouvelle hypothse. Comme l'a bien dit Sherlock Holmes : Lorsque vous avez limin l'impossible, ce qui reste, mme si c'est improbable, doit tre la vrit (A. Conan Doyle, Le signe des quatre).

Pour certaines personnes, programmer et dboguer signifient exactement la mme chose. Ce qu'elles veulent dire par l est que l'activit de programmation consiste en fait modifier, corriger sans cesse un mme programme, jusqu' ce qu'il se comporte finalement comme vous le vouliez. L'ide est que la construction d'un programme commence toujours par une bauche qui fait dj quelque chose (et qui est donc dj dbogue), laquelle on ajoute couche par couche de petites modifications, en corrigeant au fur et mesure les erreurs, afin d'avoir de toute faon chaque tape du processus un programme qui fonctionne.

Par exemple, vous savez que Linux est un systme d'exploitation (et donc un gros logiciel) qui comporte des milliers de lignes de code. Au dpart, cependant, cela a commenc par un petit programme simple que Linus Torvalds avait dvelopp pour tester les particularits du processeur Intel 80386. Suivant Larry GreenField ( The Linux user's guide , beta version 1) : L'un des premiers projets de Linus tait un programme destin convertir une chane de caractres AAAA en BBBB. C'est cela qui plus tard finit par devenir Linux ! .

Ce qui prcde ne signifie pas que nous voulions vous pousser programmer par approximations successives, partir d'une vague ide. Lorsque vous dmarrerez un projet de programmation d'une certaine importance, il faudra au contraire vous efforcer d'tablir le mieux possible un cahier des charges dtaill, lequel s'appuiera sur un plan solidement construit pour l'application envisage.

Diverses mthodes existent pour effectuer cette tche d'analyse, mais leur tude sort du cadre de ces notes. Veuillez consulter votre professeur pour de plus amples informations et rfrences.

1.6. Langages naturels et langages formels

Les langages naturels sont ceux que les tres humains utilisent pour communiquer. Ces langages n'ont pas t mis au point dlibrment (encore que certaines instances tchent d'y mettre un peu d'ordre) : ils voluent naturellement.

Les langages formels sont des langages dvelopps en vue d'applications spcifiques. Ainsi par exemple, le systme de notation utilis par les mathmaticiens est un langage formel particulirement efficace pour reprsenter les relations entre nombres et grandeurs diverses. Les chimistes utilisent un langage formel pour reprsenter la structure des molcules, etc.

Les langages de programmation sont des langages formels qui ont t dvelopps pour dcrire des algorithmes et des structures de donnes.

Comme on l'a dj signal plus haut, les langages formels sont dots d'une syntaxe qui obit des rgles trs strictes. Par exemple, 3+3=6 est une reprsentation mathmatique correcte, alors que $3=+6 ne l'est pas. De mme, la formule chimique H2O est correcte, mais non Zq3G2

Les rgles de syntaxe s'appliquent non seulement aux symboles du langage (par exemple, le symbole chimique Zq est illgal parce qu'il ne correspond aucun lment), mais aussi la manire de les combiner. Ainsi l'quation mathmatique 6+=+/5- ne contient que des symboles parfaitement autoriss, mais leur arrangement incorrect ne signifie rien du tout.

Lorsque vous lisez une phrase quelconque, vous devez arriver vous reprsenter la structure logique de la phrase (mme si vous faites cela inconsciemment la plupart du temps). Par exemple, lorsque vous lisez la phrase la pice est tombe , vous comprenez que la pice en est le sujet et est tombe le verbe. L'analyse vous permet de comprendre la signification, la logique de la phrase (sa smantique). D'une manire analogue, l'interprteur Python devra analyser la structure de votre programme source pour en extraire la signification.

Les langages naturels et formels ont donc beaucoup de caractristiques communes (des symboles, une syntaxe, une smantique), mais ils prsentent aussi des diffrences trs importantes :

Ambigut.

Les langages naturels sont pleins d'ambiguts, que nous pouvons lever dans la plupart des cas en nous aidant du contexte. Par exemple, nous attribuons tout naturellement une signification diffrente au mot vaisseau, suivant que nous le trouvons dans une phrase qui traite de circulation sanguine ou de navigation voiles. Dans un langage formel, il ne peut pas y avoir d'ambigut. Chaque instruction possde une seule signification, indpendante du contexte.

Redondance.

Pour compenser toutes ces ambiguts et aussi de nombreuses erreurs ou pertes dans la transmission de l'information, les langages naturels emploient beaucoup la redondance (dans nos phrases, nous rptons plusieurs fois la mme chose sous des formes diffrentes, pour tre srs de bien nous faire comprendre). Les langages formels sont beaucoup plus concis.

Littralit.

Les langages naturels sont truffs d'images et de mtaphores. Si je dis la pice est tombe ! dans un certain contexte, il se peut qu'il ne s'agisse en fait ni d'une vritable pice, ni de la chute de quoi que ce soit. Dans un langage formel, par contre, les expressions doivent tre prises pour ce qu'elles sont, au pied de la lettre .

Habitus comme nous le sommes utiliser des langages naturels, nous avons souvent bien du mal nous adapter aux rgles rigoureuses des langages formels. C'est l'une des difficults que vous devrez surmonter pour arriver penser comme un analyste-programmeur efficace.

Pour bien nous faire comprendre, comparons encore diffrents types de textes :

Un texte potique :

Les mots y sont utiliss autant pour leur musicalit que pour leur signification, et l'effet recherch est surtout motionnel. Les mtaphores et les ambiguts y rgnent en matres.

Un texte en prose :

La signification littrale des mots y est plus importante, et les phrases sont structures de manire lever les ambiguts, mais sans y parvenir toujours compltement. Les redondances sont souvent ncessaires.

Un programme d'ordinateur :

La signification du texte est unique et littrale. Elle peut tre comprise entirement par la seule analyse des symboles et de la structure. On peut donc automatiser cette analyse.



Pour conclure, voici quelques suggestions concernant la manire de lire un programme d'ordinateur (ou tout autre texte crit en langage formel).

Premirement, gardez l'esprit que les langages formels sont beaucoup plus denses que les langages naturels, ce qui signifie qu'il faut davantage de temps pour les lire. De plus, la structure y est trs importante. Aussi, ce n'est gnralement pas une bonne ide que d'essayer de lire un programme d'une traite, du dbut la fin. Au lieu de cela, entranez-vous analyser le programme dans votre tte, en identifiant les symboles et en interprtant la structure.

Finalement, souvenez-vous que tous les dtails ont de l'importance. Il faudra en particulier faire trs attention la casse (c'est--dire l'emploi des majuscules et des minuscules) et la ponctuation. Toute erreur ce niveau (mme minime en apparence, tel l'oubli d'une virgule, par exemple) peut modifier considrablement la signification du code, et donc le droulement du programme.


prcdentsommairesuivant

Licence Creative Commons
Le contenu de cet article est rédigé par Gérard Swinnen et est mis à disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transposé.
Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright © 2013 Developpez.com.