1. Livres & vidéos
  2. Intelligence Artificielle
  3. Première approche
Extrait - Intelligence Artificielle Premiers pas vers le Deep Learning avec JavaScript
Extraits du livre
Intelligence Artificielle Premiers pas vers le Deep Learning avec JavaScript Revenir à la page d'achat du livre

Première approche

Concept

1. Origine

JavaScript est un langage fonctionnel conçu par Brendan Eich dans les locaux de Netscape Communications Corporation. Son usage initial était l’usage web avec le navigateur Netscape Navigator que l’on peut considérer aujourd’hui comme une sorte d’ancêtre à Firefox.

En novembre 1996, Netscape décide de soumettre JavaScript comme standard auprès de l’ECMA (organisation internationale privée) ce qui a donné la terminologie ECMAScript. Cet organisme définit les évolutions du langage. La dernière version lors de la rédaction de cet ouvrage est l’ECMAScript 2024 (ES15).

Il existe également une terminologie obsolète JScript dans l’univers Microsoft pour désigner une implémentation basée sur ECMA mais ajoutant des capacités d’interaction avec les composants COM.

2. JavaScript n’est pas Java

Java est un langage de programmation-objet développé initialement par Sun (James Gosling et Patrick Naughton). C’est un langage dont le code source est compilé puis interprété par une plateforme d’exécution (JVM pour Java Virtual Machine). JavaScript n’est pas une forme « interprétée » du langage Java, il s’agit d’un langage bien distinct malgré son nom, preuve en est qu’un...

Hello world

1. Conception d’une première page

Nous allons commencer par exécuter un premier programme JavaScript car rien ne remplace la pratique pour assimiler un langage. Pour cela, nous utiliserons un navigateur Internet si possible récent (Edge, Chrome, Firefox…) pour visualiser le résultat de notre programme.

Pour écrire un programme de test, il vous suffira de vous munir d’un éditeur de texte de préférence avec coloration syntaxique, voici une liste de quelques éditeurs gratuits :

Nous placerons nos tests dans un même répertoire comme « exemples ». Il suffit, si l’on souhaite travailler avec Visual Studio Code (ou VSCode), de faire par le menu File/Open Folder et de choisir votre répertoire de travail.

Dans le menu File, vous utiliserez New File… puis vous saisirez le nom de votre fichier comme « test1.html ». Dans la partie gauche, le volet Explorer vous donne accès à tous les fichiers et sous-répertoires de votre répertoire de travail.

Nous allons maintenant saisir une page HTML 5 minimale avec à l’intérieur un code JavaScript. Vous noterez que VSCode vous propose une aide à la saisie, par exemple, il vous suffit de saisir [<] pour avoir accès aux différentes balises HTML, si vous n’en voulez...

Avant de commencer

1. La console JavaScript

Si vous rencontrez des problèmes, sachez que vos navigateurs (Edge, Chrome, Firefox…) disposent des « consoles JavaScript » capables de vous signaler les erreurs avec également leurs localisations dans le code source. C’est un outil indispensable lorsque vous travaillez en JavaScript.

L’instruction JavaScript console.log sert à écrire directement dans la console, ce qui est pratique pour effectuer un test sans que cela impact le rendu de la page HTML.

console.log(  "mon code est passé par là" ); 

Ces consoles sont accessibles par le menu Développement de vos navigateurs ou bien par une combinaison de touches (en général la touche [F12] suffit).

Dans les exemples de console ci-dessous, nous avons volontairement oublié un caractère guillemet dans notre code "Hello World".

Sous Edge, en invoquant [F12], une boîte de dialogue apparaît, en sélectionnant l’onglet Consoles, vous pourrez voir apparaître vos erreurs au chargement de la page.

Si vous cliquez sur le lien associé à l’erreur, il vous indiquera exactement l’endroit qui pose problème.

Avec Chrome, nous avons également cette console par la touche [F12]. Si vous activez dans vos paramétrages AI Innovations, vous aurez également une assistance par l’intelligence artificielle pour corriger vos erreurs. Il vous suffit d’aller sur la partie droite de votre message d’erreur, d’activer Understand this error. Vous avez également le numéro de ligne qui pose problème après le nom du fichier de test toujours sur la partie droite de l’erreur.

Si vous faites maintenant l’exécution directement dans VSCode, il se comportera comme le navigateur, et vous proposera d’aller directement à l’erreur via l’éditeur ce qui sera plus pratique en cliquant sur le lien à côté de l’erreur (« ….html :4 »).

VSCode sera en réalité « connecté » à votre navigateur si celui-ci le permet avec l’avantage que vous pourrez aussi déboguer votre code JavaScript dans ce dernier. Pour cela...

Conventions

Vous avez probablement hâte de réaliser vos premiers programmes mais je vous conseille de ne pas sauter cette partie contenant des conseils d’écriture. C’est une section à lire plus qu’à pratiquer.

1. Une syntaxe proche du C

a. Comparatif

Comme nous l’avons indiqué dans l’introduction, la syntaxe est proche du C sur les principales composantes du langage (test, condition, boucle…). Aussi, si vous êtes familiarisés avec ce langage ou des langages également proches syntaxiquement (Java, PHP…), il vous sera d’autant plus aisé d’appréhender JavaScript.

Exemple d’une boucle dans le langage C :

int compteur; 
for (compteur = 0; compteur<10; compteur++) { 
 
    printf("Hello World"); 
} 

Même exemple de boucle en JavaScript (nous détaillerons la syntaxe des boucles ultérieurement ainsi que l’usage de let).

let compteur; 
for (compteur = 0; compteur < 10; compteur++) { 
  console.log("Hello World"); 
} 

console.log sert à écrire dans le terminal avec Node.js ou bien dans la console de votre navigateur.

b. Casse

HTML offre beaucoup de souplesse dans son interprétation et n’est donc pas sensible à la casse et cela même si le format XHTML a tenté avec plus...

Structure de données

Nous allons ici étudier les différents types de valeur à disposition de manière succincte. Cette section est indispensable à la réalisation de vos premiers programmes. Il est conseillé d’en faire une première lecture avant de réaliser quelques tests.

1. Les valeurs primitives

a. Chaîne de caractères

Une chaîne de caractères est comme son nom l’indique un ensemble de caractères. Elle est délimitée par les caractères " ou . L’opérateur + peut être utilisé pour effectuer une concaténation de chaînes.

À noter que cet opérateur + ne modifie pas une chaîne mais crée une nouvelle chaîne à chaque fois.

Si vous avez besoin d’intégrer les caractères de délimitation également dans votre chaîne, il suffit d’utiliser juste avant le caractère \ (anti-slash).

Exemples

Une chaîne simple :

"une chaîne de caractères" 

Une chaîne simple avec un autre délimiteur :

'une autre chaîne de caractères' 

Une chaîne avec des guillemets à l’intérieur :

"bonjour \"vous\"" 

Il existe d’autres séquences pour ajouter des caractères particuliers empruntés au langage C.

\’

Simple apostrophe

\"

Simple guillemet

\\

backslash

\n

Saut de ligne

\r

Début de ligne

\t

Tabulation

\b

backspace

\f

Saut de page (impression)

\Octal

Le caractère correspondant au nombre en octal selon le jeu de caractères courant.

Il existe bien sûr de nombreuses fonctions de manipulation de chaînes, nous les aborderons dans la partie objet de cet ouvrage.

Il existe également depuis la version 2015 les template string. Il s’agit de chaînes entre `. Vous avez la possibilité de mettre des expressions JavaScript à l’intérieur de la séquence ${}. Par exemple, `1+1=${1+1}` sera équivalent à la chaîne " 1+1=2 ". C’est d’autant plus pratique si vous avez des variables ou des valeurs de fonctions à insérer dans votre chaîne facilement.

Version avec un +

"1+1= " + maValeur + " ... " + ... 

Version avec...

Variables

Dans cette section, nous allons découvrir l’usage des variables. Il est recommandé de tester vous-même les exemples.

1. Introduction

Une variable est une structure de données associant un nom à une valeur. Cette valeur étant potentiellement variante, on comprendra aisément le terme de « variable ».

La convention de nommage est celle par défaut, on veillera donc à commencer un nom de variable par une minuscule.

On affecte une valeur à une variable par l’opérateur =.

maVariable=maValeur; 

JavaScript reste faiblement typé, cela signifie qu’une variable n’est pas associée à un type de données en particulier, seule compte la valeur avec laquelle elle est associée. Cette valeur peut être une valeur primitive comme une chaîne, un entier…. mais également une structure plus complexe comme une fonction, un tableau, un objet…

Grâce à l’instruction typeof que nous avons abordé à titre d’exemple précédemment, nous pouvons toujours connaître la nature d’une valeur.

Afin d’agrémenter nos exemples sur les variables, nous utiliserons des fonctions très simples sans arguments. Les fonctions seront détaillées dans le prochain chapitre.

Voici une présentation succincte de la syntaxe des fonctions.

// Déclaration d'une fonction 
function maFonction() { 
} 
// Appel de fonction 
maFonction() ; 

2. Contexte d’usage d’une variable

a. Portée globale

Votre variable est déclarée à partir du moment où elle est initialisée.

Exemple

maVariable = 10; 

Ici, maVariable est déclarée et initialisée avec une valeur 10. Elle représente donc ici un nombre.

maVariable = false; 

Dans notre dernier exemple, elle devient un booléen. Cela fait partie de la souplesse de JavaScript, le type d’une variable peut évoluer selon les affectations (seule la valeur compte) !

Par défaut, une variable est accessible dans un contexte global, cela signifie qu’elle sera utilisable partout dans votre code. Ce comportement est valable y compris si la variable est initialisée à l’intérieur d’une fonction. On parlera par défaut...

Opérateurs

Cette section nécessite moins de pratique, les opérateurs seront utilisés régulièrement dans les chapitres qui suivront.

1. Calcul

Les opérateurs de calcul servent aux expressions JavaScript.

+

Concaténation de chaînes, de tableaux, ou addition de nombres

-

Soustraction de nombres

*

Multiplication de nombres

/

Division de nombres

=

Affectation de valeur à une variable, ex: let x = 10 ;

%

Modulo, calcul du reste de la division, ex: 6 % 3 ; // 0

L’opérateur % est très pratique pour savoir si vous êtes en présence d’un nombre pair ou pas car si c’est bien le cas alors le reste de la division par 2 donnera 0.

Exemple 4 % 2 = 0 mais 5 % 2 = 1 car 4 est pair et 5 est impair.

Lors d’une division par 0, la constante Infinity sera associée au nombre :

Exemple

let a = 1 / 0; 
alert( a == Infinity ); // true 
Infinity est bien considéré comme un nombre par l'interpréteur 
JavaScript. 

Exemple

alert( typeof Infinity );   // number 

2. Affectation

Les opérateurs d’affectation sont utilisés avec une variable pour initialiser ou altérer le contenu.

=

Affectation de valeur à une variable

let x = 10

++

Incrémentation du nombre de la variable d’une unité

let x = 10;x++; // x = 11

--

Décrémentation du nombre de la variable d’une unité

let x = 10 x-- ; // x = 9

Les opérateurs ++ et -- peuvent être postfixés ou préfixés à la variable. Lorsqu’ils sont placés en fin de variable, cela signifie qu’ils ne seront appliqués qu’après la fin de l’expression en cours. Dans le cas contraire, cela sera effectué pendant l’évaluation de l’expression.

La forme postfixée est la plus courante.

Exemples

  let x = 10;  
  let y = 1 + ( x-- );  
  // Y vaut alors 11 et X vaut 9  
  let x = 10;  
  let y = 1 + ( --x ); 
  // Y vaut alors 10 et x vaut 9 

Booléen

Avant de nous intéresser aux contrôles de flux de données, il nous faut étudier les expressions booléennes autorisées. Comme nous l’avons...

Fonctions

Cette section est importante car JavaScript est un langage fonctionnel, il est donc nécessaire de bien comprendre et de pratiquer cette partie.

1. Déclaration

a. Introduction

JavaScript est un langage fonctionnel, la fonction est donc une structure centrale dans le développement. Maîtriser JavaScript revient souvent à maîtriser la subtilité des fonctions.

Une fonction est un bloc de code qu’il est possible d’exécuter sur demande uniquement. Elle segmente le programme en unités que le développeur peut réutiliser selon les moments souhaités dans l’obtention du traitement. Le choix de la répartition en fonctions (ou non) est à la libre appréciation du développeur, sachant que ce choix sera guidé par l’expérience du développeur et par la pérennité du projet développé.

Une fonction possède un nom (sauf cas particulier que nous aborderons ultérieurement) et éventuellement des arguments.

Les arguments d’une fonction servent à « paramétrer » l’exécution de la fonction, ils représentent des informations que l’on passe à la fonction au cours de son exécution. Ces paramètres reviennent à avoir des variables locales initialisées pendant l’appel de la fonction.

Concernant la convention de nommage, les fonctions commencent par une minuscule. Il existe une variante dans l’usage des fonctions mais qui concerne la programmation-objet que nous aborderons ultérieurement.

b. Syntaxe de déclaration

La déclaration utilise le mot-clé function suivi de « 0 à n » paramètres (ou arguments) entre parenthèses et séparés par une virgule. Deux accolades, ouvrante puis fermante, délimitent le corps de la fonction.

Exemple

function helloWorld() { 
  alert( "Hello" ); 
} 

Pour rappel, l’accolade ouvrante peut également être mise à la ligne suivante selon la préférence du développeur (syntaxe selon le langage pascal).

Voici le même exemple avec des accolades positionnées « à la pascal ».

function helloWorld()  
{ 
 alert( "Hello"...

Contrôle de flux

Il vous est recommandé de pratiquer dans cette partie car cela touche à des usages courants.

1. Test conditionnel

a. Expression booléenne implicite

Pour rappel, une conversion implicite est effectuée pour toutes les valeurs non booléennes dans une expression booléenne. Ainsi une chaîne vide, 0, un objet de référence null ou une absence d’initialisation (undefined) seront considérés comme un booléen « faux », les cas restants seront « vrais ».

Cette conversion peut également être utilisée pour exploiter une astuce pour raccourcir les expressions avec l’opérateur ||.

Nous avions déjà abordé l’usage de && pour garantir certains critères. Avec l’opérateur || c’est un peu l’inverse, nous exécuterons une partie de l’expression de droite si des critères sont à faux, cela sert alors à avoir une valeur par défaut.

Exemple

let a; 
let b = a || "par défaut"; 
alert( b ); // « par défaut » 
// Deuxième cas 
let a = "ok"; 
let b = a || "par défaut"; 
alert( b ); // « ok » 

Dans le premier cas, nous aurons bien le message « par défaut » car la variable « a » n’étant pas initialisée elle est implicitement considérée comme un booléen à « faux » et oblige l’interpréteur à évaluer puis retourner le deuxième argument en résultat s’il est « vrai » (« par défaut » est une chaîne non vide, elle est « vraie »).

Dans le second cas, la valeur de la variable « a » étant initialisée, elle prend implicitement une valeur booléenne à « vrai », comme nous avons une évaluation paresseuse (donc évaluer uniquement ce qui est nécessaire dans une expression), l’interpréteur sait que le résultat doit être à « vrai » et arrête l’évaluation de l’expression en retournant cette première...