Langage de programmation - Définition

Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs de cet article est disponible ici.

Particularités

Il existe plusieurs caractéristiques qui permettent de comparer les langages entre-eux :

Typage

Le typage est le fait d'attribuer un type aux éléments du code source (variables, fonctions, etc.). Un type définit une structure de données : nombre entier, tableau, chaîne de caractères. Dans certains langages, il existe des types plus évolués (liste chaînée, sémaphore) et il est parfois possible d'en définir de nouveaux.

Les types que l'on trouve dans un langage de programmation dépendent de sa sémantique et donc de ses paradigmes. Beaucoup de langages proposent la notion de variable qui associe un nom à une valeur en mémoire et ce nom ou cette valeur à un type.

Le typage peut être :

Explicite ou implicite
On parle de typage explicite quand les types apparaissent explicitement dans le code source du programme ; un typage implicite est déterminé par le compilateur ou l'interprète.
Fort ou faible
Plus un typage est fort, plus les règles du langage sont strictes et interdisent dès la compilation les manipulations entre données de types différents. On trouve souvent dans les langages typés faiblement la possibilité de faire du transtypage manuel (en anglais cast) pour combler les lacunes du système automatique de typage.
Statique ou dynamique
On parle de typage statique quand la vérification des types se fait dès la phase de compilation, et de typage dynamique lorsque celle-ci est faite durant l'exécution. De plus un typage dynamique associe les types aux valeurs, alors qu'un typage statique associe le type à la variable.

Le typage du langage C est explicite, relativement fort (le compilateur peut générer des avertissements de typages, le transtypage manuel est permis, mais on peut effectuer n'importe quelle opération entre n'importe quels types sans transtypage), et statique. Le langage Objective Caml possède un typage implicite, fort et statique (son typeur est le fruit de nombreux travaux de recherche scientifique).

Les langages fournissent parfois des mécanismes pour convertir une valeur d'un type en une valeur dans un autre type : on peut convertir un entier en flottant sans aucune perte mais l'inverse n'est pas toujours possible. Il ne faut pas confondre la conversion avec le transtypage : le mécanisme de conversion transforme effectivement la donnée, par contre le transtypage se contente de modifier le type associé. Ce mécanisme peut être explicite ou implicite.

Syntaxe

Outre les particularités sémantiques des langages, ils utilisent également des grammaires différentes qui proposent souvent des points communs.

Les particularités syntaxiques ne sont souvent que des détails qui ne changent pas les fonctionnalités proposées par les langages de programmation. Par exemple, dans Objective-C 2, il est possible d'utiliser les accesseurs avec deux syntaxes différentes pour le même résultat :

  • object.message
  • [object message]

Commentaires

Les commentaires sont des parties du programme qui n'apparaissent pas dans l'application finale. Les commentaires permettent de documenter et d'expliquer le code source. Presque tous les langages de programmation permettent d'écrire des commentaires.

Ils sont introduits ou délimités par des caractères spéciaux (# en Bash ou Ruby) ou une instruction particulière (REM en BASIC). Dans les langages dont la syntaxe est inspirée de celle du C (C++, C#, Objective C, D, Java, JavaScript, PHP...), ils sont la plupart du temps écrits de cette façon :

//pour un commentaire sur une seule ligne

Ou encore comme ceci:

/*pour un commentaire
sur plusieurs lignes*/

Il est possible aussi de préciser que certains commentaires doivent être pris en compte par des outils de génération automatique de documentation (Doxygen, Javadoc, Candydoc...) comme ceci: /// avec un signe "/" en plus pour le commentaire sur une ligne.

OU: /** en doublant les " * "
pour un commentaire sur plusieurs lignes */

Indentation

L'indentation est l'utilisation d'espaces ou tabulations en début de ligne. Généralement, elle n'a pas d'incidence sur le fonctionnement du programme et ne sert qu'à améliorer la lisibilité du code.

Pour certains langages, l'indentation est significative et obligatoire : en Python, l'indentation va servir à délimiter une fonction, une classe ou un test conditionnel – à la différence de langages comme C où ce sont les accolades { } qui remplissent cette fonction.

Séparation des instructions

Pour distinguer une instruction de la suivante, il existe principalement deux approches :

  • soit la fin d'une instruction est marquée par un terminateur (un ; en C, Java, etc.) ;
  • soit il existe un séparateur d'instructions (un ; en Pascal, une fin de ligne en bash ou Python).

La nuance est importante, car en C, la dernière instruction d'un bloc doit comprendre un ; (terminateur) alors qu'en Pascal, il est inutile, voire fautif, d'en mettre un (cela consiste à ajouter une instruction vide en fin de bloc). De même, le caractère ; peut être utilisé en C comme instruction vide, ce qui n'aurait pas de sens en Pascal.

Les langages utilisant un terminateur sont réputés engendrer moins de fautes de syntaxe que ceux utilisant un séparateur.

Balisage

Certains langages utilisent des « balises » délimitant des « environnements ». Une balise est généralement un mot-clé associé à plusieurs caractères : \ ; < > ; etc.

Les langages permettant de générer du code source ou des documents utilisent souvent des balises. Par exemple, PHP et JSP utilisent des balises pour délimiter les parties de code à interpréter. XML est également un langage à balises, qui permet de définir des langages de programmation comme XSP ou XSLT.

Stratégie d'évaluation

Une stratégie d'évaluation est un ensemble de règles qui décrivent comment évaluer une expression dans un langage de programmation. La stratégie d'évaluation définit à quel moment les arguments des fonctions et opérateurs sont évalués ou réduits.

On distingue essentiellement deux stratégies :

  • l'évaluation stricte : les arguments des fonctions sont toujours évalués avant que la fonction ne soit appliquée.
  • l'évaluation paresseuse ou évaluation retardée : les arguments ne sont évalués que lorsque leur valeur est effectivement requise. Ce type d'évaluation est généralement utilisé dans les langages fonctionnels.

La plupart des langages ont un système d'évaluation stricte, et utilisent une forme d'évaluation paresseuse pour les expressions booléennes (évaluation court-circuit). Cependant il est possible de créer une évaluation paresseuse dans un langage à évaluation stricte. Par exemple, Scheme fournit la fonction delay qui retarde l'évaluation d'une expression et force qui oblige l'évaluation.

Gestion de la mémoire

Les langages de programmation offrent plus ou moins de libertés au programmeur en ce qui concerne la gestion de la mémoire :

  • Soit elle est entièrement sous le contrôle du développeur qui doit gérer lui-même l'espace mémoire disponible, les allocations et libérations (C).
  • Soit tout peut être contrôlé par le compilateur ou par le moteur d'exécution (Java) : même s'il est possible de donner des directives, la machine virtuelle gère elle-même la mémoire à l'aide d'un ramasse-miettes.

Certains langages proposent un système intermédiaire. En Objective-C, il est possible de la gérer directement, d'activer la gestion automatique de la mémoire ou d'utiliser un système de plus haut niveau.

Réflexivité

On dit d'un langage de programmation est « réflexif » s'il permet, au moment de l'exécution, d'analyser et d'agir sur le fonctionnement interne du programme lui-même.

Le langage Smalltalk fut un précurseur dans le domaine de la réflexivité. Il a d'ailleurs fortement influencé bon nombre de langages réflexifs, tels que Io, Python, Ruby, Java ou Objective-C.

Exceptions

Les exceptions sont des cas limites d'exécution du programme (division par 0, etc.). Lorsqu'elles sont générées, le déroulement du programme est interrompu. Au contraire d'une erreur qui interrompt brutalement le programme, la gestion d'une exception permet d'interrompre proprement un programme, de corriger l'erreur et d'en reprendre l'exécution.

La gestion des exceptions peut être différente selon les langages ; soit :

  • Il n'y en a pas (C) ;
  • Elle signale l'exception sans la traiter (C++, Java) ;
  • Elle permet un traitement : par exemple, la modification du programme par le programme lui-même (comme en Python) pour reprendre une exécution « normalement ».

Concurrence

La programmation concurrente consiste à découper un programme en plusieurs fils d'exécution. La concurrence permet de simuler l'exécution de différentes tâches de façon simultanée ou, dans le cadre d'une interface graphique, d'effectuer des tâches en tâche de fond sans pour autant bloquer le rafraîchissement de l'affichage. La programmation concurrente permet aussi de tirer parti de ressources distribuées (multiples processeurs, cluster de machines, etc.) ou du système d'ordonnancement de processus du système d'exploitation.

Certains langages intègrent directement la concurrence dans leurs primitives (Erlang, Concurrent ML). Généralement, la concurrence est intégrée par l'intermédiaire de bibliothèques spécifiques : le langage C dispose entre autres de la bibliothèque des threads POSIX ; Java dispose d'une classe Thread dans ses bibliothèques standards.

Page générée en 0.078 seconde(s) - site hébergé chez Contabo
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
A propos - Informations légales | Partenaire: HD-Numérique
Version anglaise | Version allemande | Version espagnole | Version portugaise