Logo DartDart - Le nouveau langage du Web

JavaScript

Dart a pour objectif de concurrencer et remplacer JavaScript. Il veut combler ses défauts qui ne peuvent pas être résolus en faisant évoluer le langage, de plus il souhaite être plus performant et plus rigoureux.

Le concept

JavaScript est le langage de script le plus répandu sur le Web. Il s'agit d'un langage orienté objet par prototype, c'est un concept qui diffère de la programmation orienté objet par classe qu'on a l'habitude d'utiliser avec Java, C++ et Dart.

Le concept de prototype est comparable à celui de classe. Cependant un prototype est aussi un objet dont le code est mutable, on peut y ajouter ou modifier des méthodes et des attributs. On construit un prototype à partir d'une fonction qui porte le nom du prototype, elle est comparable à un constructeur dans un langage orienté objet.

Pour créer un prototype "Cercle", on écrira :

function Cercle(x, y, rayon) {
	this.x = x;
	this.y = y;
	this.rayon = rayon;
}
			

Le mot clé "this" fait référence à la fonction, le prototype. On peut lui donner des attributs internes, ici on lui donne un point (x, y) et un rayon, dont les valeurs sont passées en paramètre. On peut aussi déclarer une fonction dans un prototype, ce qui correspond à une méthode. Ce concept est souple et puissant, mais le code est difficile à maintenir car il peut être dur à comprendre. De plus, JavaScript n'offre pas de mécanisme d'encapsulation, on ne peut donc pas protéger les données d'un objet à l'autre.

Ses défauts

Ce langage possèdent de nombreux défauts qui ne peuvent être corrigés en le faisant évoluer.

Le principal inconvénient qui pose des problèmes aux développeurs Web est l'interprétation différente selon le navigateur, et même selon la version du navigateur. En effet, ils embarquent chacun un moteur JavaScript différent, qui sont plus ou moins performants selon le constructeur. Des librairies JavaScript sont apparues afin de pallier ce problème de compatibilité, on trouve le plus courament jQuery ou encore Dojo.

Il n'est pas très sécurisé, le code est modifiable par le client avec des outils de mofication des pages, comme Firebug sous Mozilla Firefox ou nativement sous Chrome. Les contrôles effectués côté client sont donc potentiellement inutiles. De plus, il est peu performant malgrés que les moteurs des navigateurs soient de plus en plus efficaces et rapides. Il est non-typé ce qui rend le code plus difficile à maintenir. Cela peut aussi être vu comme avantage pour rendre le codage plus souple. Enfin, dans le cas d'applications web complexes, il devient difficile de structurer et de maintenir le code JavaScript.

Quelques exemples

La portée d'une variable est au niveau d'une fonction, et pas au niveau d'un bloc (entre les { }) comme on a l'habitude de voir dans d'autres langages comme le C.

function test1() {
	var p = 2;
	function f(p) { // Masque le p déclaré plus haut
		var j = p;
		return j - i; // Le i déclaré dans test1()
	}
	var i = 5;
	alert( f(p*3) ); // Affiche "1" => (2*3 - 5)
	return j; // Provoque une erreur car la fonction n'y a pas accès
}
		

Notre fonction test1 possède deux variables ,p et i, et une fonction f. Le paramètre p de cette fonction interne masque la variable p de test1. On peut aussi voir qu'elle a accès à la variable i malgrés qu'elle soit déclarée après. Enfin, une fonction n'a pas accès aux variables déclarées dans les fonctions qu'elle contient, dans notre exemple, test1 n'a pas accès à j, qui est déclaré dans f.

Les variables passées à une fonction anonyme font toujours référence à la dernière donnée :

function test2() {
	var tab = [];

	for (var i=0;i<2;i++) {
		// Ajoute la fonction alert() pour afficher i
		tab.push((function() { alert(i); }));
	}

	for (var j=0;j<2;j++) {
		tab[j]();
	}
}
		

On commence par ajouter dans un tableau une fonction affichant l'indice courant du tableau, on utilise une variable i d'une boucle qui varit donc au cours du parcours. Lors de l'appel des fonctions ajoutées au tableau, on peut voir que c'est toujours la valeur 2 qui est affichée. Cela signifie la dernière valeur de i, on fait toujours référence à la variable.

Quelques erreurs de conception

JavaScript possède d'autres défauts qui semblent être des incohérences dûes à des erreurs de conception. Les exemples suivants proviennent du site wtfjs.com.

Les fonctions Math.min() et Math.max() ont un comportement étrange, en effet on constate que Math.min() vaut + l'infini alors que Math.max() vaut - l'infini. On a donc Math.min() > Math.max() qui renvoie true.

Un dernier exemple est le parcours d'un tableau avec une boucle for. Supposons le code suivant :

function allNames() {
	var names = [ 'dan', 'anthony', 'pavel' ];
	for (name in names) {
		console.log(name);
	}
}

allNames();
		

La logique voudrait que l'on affiche dans la console les valeurs du tableau à chaque indice. Cependant c'est l'indice lui-même qui est retourné. Nous obtenons donc ce résultat dans la console : 0 1 2.

JavaScript est le langage Web le plus utilisé côté client malgrés ses défauts qui génèrent un code parfois difficile à comprendre, et donc une maintenance difficile, des failles de sécurité etc ... Ces défauts ne peuvent pas être corrigés par une simple évolution du langage, c'est pourquoi on trouve de nombreuses librairies disponibles. Dart tente d'améliorer le codage côté client.