Accéder au contenu principal

Les bases de la programmation : Qu’est-ce-que programmer ?

Les bases de la programmation

Qu’est-ce-que programmer ?

”Tout le monde dans ce pays devrait apprendre à programmer un ordinateur, parce que ça vous apprend à penser.

Steve JOBS

La programmation est le fait de faire des programmes, des logiciels, des applications, etc. 

Le programmeur explique à l’ordinateur ce qu’il doit faire et doit imaginer la façon dont l’utilisateur va utiliser le programme qu’il développe. Pour ce faire, le programmeur doit utiliser un langage.

Remarque: les termes de programme, logiciel, application, exécutable, etc. recouvrent la même idée. La différence se situe surtout au niveau des entreprises. Par exemple Apple parle d’application (extension .app), là où Microsoft parle d’exécutable  (extension .exe). Du point de vue du programmeur, c’est la même chose.

Programmer est du domaine de l’écrit, même s’il existe quelques essais de programmation graphique cela reste limité à des programmes simples, et comme dans toute langue écrite les règles sont beaucoup plus strictes qu’à l’oral. Cela oblige à une plus grande rigueur de pensée, à plus de précision, à plus de clarté, et donc à organiser ses réflexions. 

Les langages

Il existe une pléthore de langages informatiques plus ou moins utilisés par les développeurs. Comme toute langue, il faut un certain temps pour apprendre un langage de programmation et une fois que l’on a investi de nombreuses journées à en apprendre un, on a des difficultés à en apprendre un nouveau.

Cette difficulté, très humaine, à apprendre un nouveau langage, entraine que certains sont détournés de leur but premier. Par exemple, le JavaScript est un langage utilisé dans les pages web, et, comme de nombreuses sociétés veulent un site web, de nombreux développeurs ont appris ce langage et pour certains ce fût leur premier. Mais un site web c’est aussi un serveur qui peut exécuter des programmes et le projet Node.JS permet à ces développeurs habitués au JavaScript de l’utiliser côté serveur.

Evidemment, il est normalement moins efficace d’utiliser un langage pour ce quoi il n’a pas été conçu. Un site web, côté serveur, peut par exemple être programmé en PHP qui est l’acronyme de ”Personal Home Page” et est donc spécialisé pour faire des pages web personnelles. Il est donc plus logique d’utiliser PHP côté serveur plutôt que JavaScript, mais cela demande d’apprendre un nouveau langage.

Parfois, des langages pensés pour un domaine particulier se trouvent cependant être excellents dans d’autres domaines. C’est le cas de Perl qui a été développé pour traiter des fichiers de base de données en texte de millions de lignes et en faire des rapports formatés, et qui s’intègre très bien avec un serveur web. On ne peut donc pas simplement dire qu’utiliser un langage pour une autre utilisation, que ce pourquoi il a été conçu au départ, est forcément une erreur. La réalité, c’est qu’il faut choisir un langage en tenant compte de nombreux facteurs, dont le temps d’apprentissage peut faire partie. Plus le programmeur aura d’expérience, plus il connaitra de langages et  plus le choix du langage sera pertinent car décidé sur d’autres critères que le temps d’apprentissage.

Il arrive que le langage soit tellement spécifique que l’on ne puisse pas lui faire faire grand chose d’autre. Comme, par exemple, SQL qui permet de gérer ou interroger une base de données relationnelles et qui n’a pas vraiment d’autres applications.

Chaque langage a donc ses spécificités, sa notation, ses types de données, sa structure interne, avec un seul fichier par projet ou des milliers, ses mots-clefs, ses concepts, etc. Mais il y a aussi beaucoup de choses communes et c’est la raison de ce livre. Les langages ne viennent pas de nulle part et sont des adaptations ou des évolutions d’autres langages. De plus, tous les langages fonctionnent sur un ordinateur et celui-ci est toujours composé des mêmes éléments électroniques, un ou plusieurs processeurs et de la mémoire vive.

Les langages informatiques traduisent la volonté du programmeur en quelque chose compréhensible par l’ordinateur. Mais cette traduction ne peut pas venir d’un langage humain comme le français car les ordinateurs sont très précis et ne supportent pas les approximations. Même le meilleur des langages comprendra des éléments propres à l’informatique car il faut expliquer précisément ce que l’on veut avec des algorithmes.

Les algorithmes

Un algorithme est une suite d’instructions permettant de faire une opération complexe, c’est à dire une opération qui ne peut pas être faite avec une opération de base.

Un algorithme n’est normalement pas attaché à un langage particulier, c’est une façon de voir la programmation par l’œil d’un mathématicien, une abstraction de la programmation. Mais la réalité est qu’une opération de base dépend du langage employé et que donc ce n’est pas si indépendant que cela. L’algorithme, du point de vue du programmeur, c’est donc la façon dont vous allez organiser vos instructions, vous pourriez en faire un schéma, l’écrire en français ou directement dans votre langage de programmation préféré. Il n’y a absolument pas besoin de savoir faire le schéma d’un algorithme pour programmer, il suffit de savoir penser.

Prenons l’exemple d’un langage qui a une instruction pour lire une image dans un fichier ”lireImage(monficher)”, ce n’est pas un algorithme mais une instruction. Si, par contre, vous demandez à l’ordinateur de parcourir le répertoire de l’utilisateur, et pour chaque fichier image trouvé, de lire le fichier, puis si l’image a pu être lue, d’ouvrir une nouvelle fenêtre, puis de mettre l’image dans cette fenêtre, là nous avons un algorithme.

Si l’algorithme ne contient qu’une liste d’instructions, certains pourraient dire que ce n’est pas un algorithme, mais c’est juste un algorithme simple. Dans la plus part des cas, la liste d’instructions n’est pas suffisante, il faut souvent savoir le résultat d’une instruction pour connaître quelle sera l’instruction suivante.

Un algorithme est généralement en partie indépendant du langage. Certes les instructions de base diffèrent d’un langage à l’autre et donc les algorithmes aussi, mais globalement comme les langages qui ont la même utilité se ressemblent, les algorithmes sont transposables d’un langage à l’autre. C’est comme traduire du français à l’anglais, il y a des différences mais on y arrive. 

Ainsi on pourrait écrire en pseudo-langage :

  • Parcourt le répertoire de l’utilisateur
  • Pour chaque fichier image trouvé
    • Lit le fichier et met l’image en mémoire
    • Si le fichier a bien été lu
      • Ouvre une nouvelle fenêtre
      • Met l’image dans la fenêtre
    • Fin du si

Dans cet exemple on a une boucle (pour chaque fichier) et un test (si le fichier est bien lu). Le fait que la boucle soit définie par des accolades, des mots-clefs de début et de fin de boucle, des tabulations en début de ligne, dépend du langage mais l’idée est la même, l’algorithme est le même.

En fait, l’algorithme a de l’intérêt pour ce qui ne suit pas une progression linéaire, grâce aux boucles et aux tests. L’algorithme définit à quel moment la suite d’instructions s’arrête pour ”sauter” à une autre suite d’instructions. Pour comprendre le fait que l’algorithme est une question de ”sauts”, le plus simple est de passer par un vieux BASIC car chaque instruction est attachée à un numéro de ligne. Le premier programme que tout le monde écrit en BASIC est :

10 PRINT ”Bonjour”

20 GOTO 10

RUN

La première ligne enregistre PRINT ”Bonjour” dans la ligne 10, cette instruction écrit à l’écran ”Bonjour”. La deuxième ligne enregistre la commande GOTO 10 dans la ligne 20, cette instruction dit qu’il faut sauter à la ligne 10. La troisième ligne exécute le programme, c’est-à-dire parcourt toutes les lignes enregistrées et les exécutent une à une dans l’ordre. La première ligne trouvée est la numéro 10 qui affiche Bonjour, puis on passe à la 20 qui dit de revenir à la 10, la 10 affiche Bonjour, puis la 20 dit de revenir à la 10 et ainsi de suite à l’infini. L’utilisateur est obligé de tuer le programme pour qu’il s’arrête. C’est donc un programme avec un bug, car on ne peut pas en sortir normalement.

Le deuxième programme que l’on écrit demande à l’utilisateur d’entrer son nom et l’affiche.

10 PRINT ”Quel est votre nom ?”

20 INPUT A$

30 PRINT ”Bonjour ”,A$

La ligne 20 indique qu’il faut que le programme attende que l’utilisateur entre quelque chose au clavier et le range dans une variable (un espace mémoire avec un nom).  La ligne 30 affiche Bonjour suivit de la valeur de la variable A$ qui contient ce que l’utilisateur a entré. Ce programme est très simple et fini faute de ligne à exécuter.

Un troisième programme pourrait faire une boucle avec une condition :

10 PRINT ”Quel est votre nom ?”

20 INPUT A$

30 IF A$ = ”” THEN GOTO 60

40 PRINT ”Bonjour ”,A$

50 GOTO 10

60 PRINT ”FIN”

En ligne 50 on retrouve notre GOTO 10 qui retourne au début du programme indéfiniment, mais la ligne 30 teste si la valeur entrée par l’utilisateur est vide (l’utilisateur a juste appuyé sur entrée) et dans ce cas saute à la ligne 60 qui affiche FIN et qui termine le programme puisqu’il n’y a pas de ligne suivante.

Programmer, c’est donc décider des listes d’instructions qui seront exécutées par l’ordinateur ainsi que des sauts entre ces listes. Comme les programmes sont de plus en plus complexes, les langages évoluent vers plus de possibilités de sauts à travers des abstractions qui cachent ces sauts et les organisent dans une structure qui reste compréhensible.

Développer, c’est choisir les outils informatiques d’un projet, choisir un ou des langages pour ce projet et programmer dans ces langages pour aboutir à un programme fini.

Les librairies

Le choix du langage est parfois aussi le choix de librairies. 

Une librairie est comme un lexique métier. Lorsque vous êtes charpentier, vous utilisez des outils de charpentier qui ont des noms que les charpentiers connaissent mais pas les artisans d’autres métiers. Ce sont des mots correspondant à des outils, des méthodes, des actions, des techniques spécifiques.

Une librairie en programmation va contenir des éléments permettant de résoudre des problèmes particuliers. Par exemple, une librairie de retouches photo contiendra les moyens d’augmenter le contraste d’une image, de la redimensionner, de lui appliquer des filtres, … Tous les programmes utilisent des librairies, mais il arrive qu’une librairie n’existe que dans un seul langage et dans ce cas vous pouvez être amené à choisir le langage parce que vous avez besoin d’une librairie spécifique.

Remarque: les systèmes d’exploitation comme Android, Windows, IOS, MacOS, Linux, etc. comprennent tous des librairies permettant à votre programme d’interagir avec le système et à s’intégrer à lui. Certaines librairies système sont prévues pour un type de langage particulier et ont du mal à en sortir.

Le travail du programmeur n’est donc pas uniquement de connaître les langages, mais aussi de connaître les librairies, du moins grossièrement pour savoir lesquelles choisir. Une fois le langage et les librairies choisis, le programmeur doit-être à l’aise pour rechercher les informations dans les documentations des librairies car celles-ci sont souvent gigantesques. Malheureusement elles sont souvent aussi en anglais.


Commentaires

Posts les plus consultés de ce blog

xCode: auto-incrémentation du BUILD_VERSION

 Lorsque vous envoyez votre application à Apple, vous devez mettre à jour deux valeurs, le numéro de version et le numéro de build : Pour le numéro de Version, ce n'est pas vraiment un problème puisque celui-ci n'augmente que lors d'une mise à jour sur l'appStore. Cela peut être fait à la main. Pour le numéro de Build, c'est plus embêtant. Si vous êtes comme moi, et que vous faites de nombreuses bêta, il faut mettre à jour le numéro à chaque envoi de l'app, et on oublie souvent d'incrémenter la valeur. Le plus simple est alors d'incrémenter automatiquement la valeur à chaque compilation. Ainsi plus besoin de s'en occuper. J'avais trouvé ce script, à insérer avant la compilation : Cela fonctionnait très bien, mais xCode a changé, et les nouveaux projets ne range plus directement le numéro de Build dans le fichier Info.plist et cela ne fonctionne donc plus. J'ai donc cherché une nouvelle méthode, et la voici. Tout d'abord il faut changer l&

Les bases de la programmation : Le binaire

Le binaire ”Ce monde est un code binaire où nous avons seulement deux options : accepter ou refuser. ” Ardit BEQIRI Lorsque l’on parle d’ordinateur on dit très souvent que ce n’est qu’un outil qui traite des 0 et 1, et ce n’est pas faux. Si l’on résume un ordinateur à de l’électronique, effectivement la mémoire, le processeur, les périphériques peuvent se résumer à des suites binaires, donc des suites de 0 et de 1. Mais c’est comme dire que le cerveau n’est qu’un imbroglio de neurones, c’est réducteur. La complexité du système est tel que l’on peut oublier qu’à la base c’est un système binaire, du reste un utilisateur d’ordinateur n’a même pas à savoir comment cela fonctionne, et même un programmeur n’a pas toujours à le savoir. Cependant, tous les langages informatiques comprennent une partie binaire. Et donc la compréhension du binaire est essentielle à un moment ou à un autre. En fait il y a plusieurs sujets interconnectés, la logique binaire, les opérations binaires, les nombr

/etc/skel/

 Je ne connaissais pas... honte à moi ! Le répertoire /etc/skel/ peut contenir des fichiers et des répertoires qui seront dupliqué à la création d'un utilisateur (avec adduser). C'est tout simple, très unix. Par exemple, comme je suis en train de faire un serveur de mail, et que j'ai décidé d'utiliser Maildir pour stocker les messages, j'ai besoin d'un répertoire Maildir dans chaque $HOME de mes utilisateurs. Je mets donc ce qu'il faut dans /etc/skel/ et c'est fini. Chaque création d'un utilisateur, créera les répertoires qui vont bien... Génial.