Article de reference

langage de programmation

À carreaux Voici le code source d'un programme informatique en C. Les lignes grises sont des commentaires qui expliquent le programme aux humains. Une fois compilé et exécuté , ...

À carreaux
Page protégée en attente de modifications

Voici le code source d'un programme informatique en C. Les lignes grises sont des commentaires qui expliquent le programme aux humains. Une fois compilé et exécuté , il affichera « Bonjour, monde ! ».

Un langage de programmation est un langage conçu pour exprimer des programmes informatiques , permettant généralement d' écrire des logiciels de manière lisible par l'homme .

L’exécution d’un programme nécessite une implémentation . Il existe deux approches principales pour implémenter un langage de programmationla compilation , où les programmes sont compilés en amont en code machine , et l’interprétation , où les programmes sont exécutés directement. Outre ces deux extrêmes, certaines implémentations utilisent des approches hybrides telles que la compilation à la volée et les interpréteurs de bytecode .

La conception des langages de programmation a été fortement influencée par l'architecture des ordinateurs , la plupart des langages impératifs étant conçus autour de l' architecture omniprésente de von Neumann . Alors que les premiers langages de programmation étaient étroitement liés au matériel , les langages modernes masquent souvent les détails matériels par abstraction afin de permettre un développement logiciel plus performant et plus simple. Ces langages sont appelés langages de haut niveau .

les langages naturels en ce qu'ils permettent la communication d'idées entre les personnes. Autrement dit, les programmes sont généralement lisibles par l'humain et peuvent exprimer des idées complexes. Cependant, les types d'idées que les langages de programmation peuvent exprimer sont en définitive limités au domaine du calcul.

Le terme « langage informatique » est parfois utilisé comme synonyme de « langage de programmation » , mais certains affirment qu'il s'agit de concepts différents. D'aucuns considèrent les langages de programmation comme un sous-ensemble des langages informatiques . D'autres emploient l'expression « langage informatique » pour désigner un langage utilisé en informatique qui n'est pas considéré comme un langage de programmation. Certains perçoivent un langage de programmation comme une construction théorique permettant de programmer une machine abstraite , et un langage informatique comme le sous-ensemble de ce langage s'exécutant sur un ordinateur physique, dont les ressources matérielles sont limitées

John C. Reynolds souligne qu'un langage de spécification formelle est un langage de programmation au même titre que n'importe quel langage destiné à l'exécution. Il soutient que les formats d'entrée textuels, voire graphiques, qui influencent le comportement d'un ordinateur sont des langages de programmation, même s'ils ne sont généralement pas Turing-complets, et remarque que la méconnaissance des concepts de langages de programmation est à l'origine de nombreuses imperfections dans les formats d'entrée.

Histoire

langage machine (des instructions simples exécutables directement par le processeur) , des langages de première génération (1GL) . Ce code était très difficile à déboguer et non portable d'un système informatique à l'autre. Afin de simplifier la programmation, les langages assembleur (ou langages de deuxième génération – 2GL) ont été inventés. S'écartant du langage machine, ils rendaient les programmes plus compréhensibles pour les humains, sans toutefois améliorer la portabilité.

Initialement, les ressources matérielles étaient rares et coûteuses, tandis que les ressources humaines étaient moins onéreuses. Par conséquent, on privilégiait des langages complexes et longs à utiliser, mais plus proches du matériel pour une efficacité accrue. L'introduction des langages de programmation de haut niveau ( langages de programmation de troisième génération – 3GL) a révolutionné la programmation. Ces langages s'affranchissaient des détails techniques du matériel et étaient conçus pour exprimer des algorithmes plus facilement compréhensibles par les humains. Par exemple, les expressions arithmétiques pouvaient désormais être écrites en notation symbolique, puis traduites en code machine exécutable par le matériel. En 1957, le Fortran (FORmula TRANslation) a été inventé. Souvent considéré comme le premier langage de programmation compilé de haut niveau, le Fortran est resté en usage jusqu'au XXIe siècle.

années 1960 et 1970

Deux personnes utilisent un ordinateur central IBM 704 — le premier matériel à prendre en charge l'arithmétique à virgule flottante — en 1957. Fortran a été conçu pour cette machine.

Vers 1960, les premiers ordinateurs centraux (ordinateurs à usage général) ont été développés, mais ils étaient réservés aux professionnels et leur coût était exorbitant. Les données et les instructions étaient saisies par cartes perforées , ce qui empêchait toute saisie supplémentaire pendant l'exécution du programme. Les langages développés à cette époque étaient donc conçus pour une interaction minimale. Après l'invention du microprocesseur , le prix des ordinateurs a considérablement baissé dans les années 1970. Les nouveaux ordinateurs permettaient également une plus grande interaction avec l'utilisateur, grâce à de nouveaux langages de programmation.

Lisp , implémenté en 1958, fut le premier langage de programmation fonctionnelle . Contrairement à Fortran, il prenait en charge la récursivité et les expressions conditionnelles , et introduisait également la gestion dynamique de la mémoire sur un tas et le ramasse-miettes automatique . Pendant les décennies suivantes, Lisp domina les applications d'intelligence artificielle . En 1978, un autre langage fonctionnel, ML , introduisit les types inférés et les paramètres polymorphes .

Après sa publication en 1958 et 1960, ALGOL (ALGOrithmic Language) est devenu la norme en informatique pour la description des algorithmes . Malgré un succès commercial limité, la plupart des langages impératifs populaires — dont C , Pascal , Ada , C++ , Java et C# — descendent directement ou indirectement d'ALGOL 60. Parmi ses innovations reprises par les langages de programmation ultérieurs figurent une meilleure portabilité et la première utilisation de la grammaire BNF hors contexte . Simula , le premier langage à prendre en charge la programmation orientée objet (avec sous-types , répartition dynamique et héritage ), descend également d'ALGOL et a connu un succès commercial. C, autre descendant d'ALGOL, a conservé sa popularité au XXIe siècle. C permet d'accéder à des opérations machine de bas niveau plus facilement que les autres langages contemporains. Sa puissance et son efficacité, générées en partie par des opérations de pointeur flexibles , ont pour prix de rendre plus difficile l'écriture de code correct.

Prolog , conçu en 1972, fut le premier langage de programmation logique , communiquant avec un ordinateur à l'aide de la notation logique formelle . En programmation logique, le programmeur spécifie un résultat souhaité et laisse l' interpréteur décider comment l'obtenir.

des années 1980 aux années 2000

Une petite sélection de manuels de langages de programmation

Dans les années 1980, l'invention de l' ordinateur personnel a transformé le rôle des langages de programmation. Parmi les nouveaux langages apparus dans les années 1980, on peut citer le C++, un sur-ensemble du C capable de compiler des programmes C et prenant également en charge les classes et l'héritage . Ada et d'autres nouveaux langages ont introduit la gestion de la concurrence . Le gouvernement japonais a investi massivement dans les langages dits de cinquième génération , qui ajoutaient la gestion de la concurrence aux constructions de programmation logique, mais ces langages ont été surpassés par d'autres langages prenant en charge la concurrence.

En raison de la croissance rapide d' Internet et du Web dans les années 1990, de nouveaux langages de programmation ont été introduits pour la création de pages web et la mise en réseau . Java , basé sur C++ et conçu pour une portabilité accrue entre les systèmes et une sécurité renforcée, a connu un succès retentissant, ces caractéristiques étant essentielles à de nombreuses applications Internet. Parallèlement, les langages de script à typage dynamiquePython , JavaScript , PHP et Ruby — ont émergé, conçus pour produire rapidement de petits programmes coordonnant des applications existantes . Grâce à leur intégration avec HTML , ils ont également été utilisés pour la création de pages web hébergées sur des serveurs .

Des années 2000 à aujourd'hui

Au cours des années 2000, le développement de nouveaux langages de programmation ayant acquis une large popularité a ralenti. L'une des innovations majeures a été la programmation orientée services (SOP) , conçue pour exploiter les systèmes informatiques distribués dont les composants sont connectés par un réseau. Les services sont similaires aux objets de la programmation orientée objet, mais s'exécutent dans un processus distinct. C# et F# ont favorisé le croisement des idées entre la programmation impérative et la programmation fonctionnelle. Après 2010, plusieurs nouveaux langages – Rust , Go , Swift , Zig et Carbon – ont concurrencé le C pour les logiciels critiques en termes de performances. La plupart de ces nouveaux langages utilisent un typage statique, tandis que quelques-uns, comme Julia , utilisent un typage dynamique .

Certains nouveaux langages de programmation sont classés comme langages visuels, tels que Scratch et LabVIEW . D'autres, comme Ballerina , combinent programmation textuelle et visuelle . Cette tendance a également conduit au développement de projets facilitant la création de nouveaux langages visuels, comme Blockly de Google . De nombreux moteurs de jeu, tels qu'Unreal et Unity, prennent en charge la programmation visuelle.

Définition

Un langage peut être défini en termes de syntaxe (forme) et de sémantique (signification), et est souvent défini via une spécification formelle du langage .

Syntaxe

Arbre d'analyse syntaxique du code Python avec tokenisation par insertion
La coloration syntaxique est souvent utilisée pour aider les programmeurs à reconnaître les éléments du code source. Le langage ci-dessus est Python .

La forme de surface d'un langage de programmation est appelée sa syntaxe . La plupart des langages de programmation sont purement textuels ; ils utilisent des séquences de texte comprenant des mots, des nombres et de la ponctuation, à l'instar des langues naturelles écrites. En revanche, certains langages de programmation sont graphiques et utilisent des relations visuelles entre les symboles pour spécifier un programme.

La syntaxe d'un langage décrit les combinaisons possibles de symboles qui forment un programme syntaxiquement correct. La signification attribuée à une combinaison de symboles est gérée par la sémantique ( formelle ou codée en dur dans une implémentation de référence ). La plupart des langages étant textuels, cet article traite de la syntaxe textuelle.

La syntaxe d'un langage de programmation est généralement définie par une combinaison d' expressions régulières (pour la structure lexicale ) et de la forme de Backus-Naur (pour la structure grammaticale ). Voici une grammaire simple, basée sur Lisp :

un comportement indéfini . Même lorsqu'un programme est bien défini au sein d'un langage, il peut avoir une signification non voulue par son auteur.

Prenons l'exemple du langage naturel : il peut être impossible d'attribuer une signification à une phrase grammaticalement correcte, ou la phrase peut être fausse.

Le fragment de code C suivant est syntaxiquement correct, mais effectue des opérations qui ne sont pas définies sémantiquement (l'opération *p >> 4n'a aucun sens pour une valeur de type complexe et p->imn'est pas définie car la valeur pest un pointeur nul ) :

> 4 + p->im); "
complexe * p = NULL ; complexe abs_p = sqrt ( * p >> 4 + p -> im );

Si la déclaration de type sur la première ligne était omise, le programme générerait une erreur de variable non définie plors de la compilation. Cependant, le programme resterait syntaxiquement correct, car les déclarations de type ne fournissent que des informations sémantiques.

La grammaire nécessaire à la spécification d'un langage de programmation peut être classée selon sa position dans la hiérarchie de Chomsky . La syntaxe de la plupart des langages de programmation peut être spécifiée à l'aide d'une grammaire de type 2, c'est -à-dire qu'il s'agit de grammaires hors contexte . Certains langages, comme Perl et Lisp, contiennent des constructions permettant l'exécution de code pendant la phase d'analyse syntaxique. Les langages qui possèdent des constructions permettant au programmeur de modifier le comportement de l'analyseur syntaxique rendent l'analyse syntaxique indécidable et, de manière générale, estompent la distinction entre analyse et exécution. Contrairement au système de macros de Lisp et aux blocs de Perl BEGIN, qui peuvent contenir des calculs généraux, les macros C se limitent à des remplacements de chaînes de caractères et ne nécessitent pas l'exécution de code.

Sémantique

La sémantique désigne la signification d'un contenu conforme à la syntaxe d'un langage.

Sémantique statique

La sémantique statique définit des restrictions sur la structure des textes valides, restrictions difficiles voire impossibles à exprimer dans les formalismes syntaxiques standards. Pour les langages compilés, la sémantique statique comprend essentiellement les règles sémantiques vérifiables à la compilation. Par exemple, on vérifie que chaque identificateur est déclaré avant d'être utilisé (dans les langages qui l'exigent) ou que les étiquettes des bras d'une instruction `case` sont distinctes. De nombreuses restrictions importantes de ce type, comme la vérification du contexte d'utilisation des identificateurs (par exemple, l'absence d'ajout d'un entier au nom d'une fonction) ou le nombre et le type appropriés des arguments des appels de sous-programmes , peuvent être appliquées en les définissant comme des règles dans une logique appelée système de types . D'autres formes d' analyses statiques, comme l'analyse de flux de données, peuvent également faire partie de la sémantique statique. Les langages de programmation tels que Java et C# intègrent l'analyse d'affectation définie , une forme d'analyse de flux de données, dans leur sémantique statique respective.

sémantique dynamique

stratégie d'évaluation des expressions ou la manière dont les structures de contrôle exécutent conditionnellement les instructions . La sémantique dynamique (ou sémantique d'exécution ) d'un langage définit comment et quand les différentes constructions du langage doivent produire un comportement donné. Il existe de nombreuses façons de définir la sémantique d'exécution. Le langage naturel est souvent utilisé pour spécifier la sémantique d'exécution des langages couramment utilisés. De nombreuses recherches universitaires portent sur la sémantique formelle des langages de programmation , qui permet de spécifier la sémantique d'exécution de manière formelle. Les résultats de ce domaine de recherche ont trouvé une application limitée dans la conception et l'implémentation des langages de programmation en dehors du milieu universitaire.

Caractéristiques

Un langage offre aux programmeurs les fonctionnalités nécessaires au développement de logiciels. Certaines de ces fonctionnalités notables sont décrites ci-dessous.

Système de types

type de données est un ensemble de valeurs autorisées et d'opérations qui peuvent être effectuées sur ces valeurs. Le système de types de chaque langage de programmation définit les types de données existants, le type d'une expression et le fonctionnement de l' équivalence et théorie des types , un langage est entièrement typé si la spécification de chaque opération définit les types de données auxquels elle s'applique. À l'inverse, un langage non typé, comme la plupart des langages assembleur , permet d'effectuer n'importe quelle opération sur n'importe quelles données, généralement des séquences de bits de longueur variable. En pratique, si peu de langages sont entièrement typés, la plupart offrent un certain degré de typage.

Étant donné que différents types (comme les entiers et les nombres à virgule flottante ) représentent les valeurs différemment, des résultats inattendus se produiront si un type est utilisé alors qu'un autre est attendu. La vérification des types signalera cette erreur, généralement à la compilation (la vérification des types à l'exécution est plus coûteuse). Avec un typage fort , les erreurs de type sont toujours détectées, sauf si les variables sont explicitement converties en un autre type. Un typage faible se produit lorsque les langages autorisent la conversion implicite, par exemple pour permettre des opérations entre variables de types différents sans que le programmeur n'ait à effectuer une conversion de type explicite. Plus les cas où cette conversion de type est autorisée sont nombreux, moins les erreurs de type sont détectables.

Types couramment pris en charge

entiers (signés et non signés) et les nombres à virgule flottante (pour les opérations sur les nombres réels non entiers). La plupart des langages de programmation prennent en charge plusieurs tailles de nombres à virgule flottante (souvent appelés ` float` et `double` ) et d'entiers, selon la taille et la précision requises par le programmeur. Stocker un entier dans un type trop petit pour le représenter provoque un dépassement de capacité . La représentation la plus courante des nombres négatifs avec des types signés est le complément à deux , bien que le complément à un soit également utilisé. Parmi les autres types courants , on trouve les booléens (qui sont soit vrais, soit faux) et les caractères (traditionnellement sur un octet , suffisant pour représenter tous les caractères ASCII ).

Les tableaux sont un type de données dont les éléments, dans de nombreux langages, doivent être d'un seul type et de longueur fixe. D'autres langages définissent les tableaux comme des références à des données stockées ailleurs et prennent en charge des éléments de types variés. Selon le langage de programmation, les séquences de plusieurs caractères, appelées chaînes de caractères , peuvent être prises en charge comme des tableaux de caractères ou comme leur propre type primitif . Les chaînes de caractères peuvent être de longueur fixe ou variable, ce qui offre une plus grande flexibilité au prix d'un espace de stockage accru et d'une complexité accrue. Parmi les autres types de données pouvant être pris en charge, on trouve les listes , les tableaux associatifs (non ordonnés) accessibles par clés, les enregistrements dans lesquels les données sont associées à des noms dans une structure ordonnée, et les tuples — similaires aux enregistrements mais sans noms pour les champs de données. Les pointeurs stockent des adresses mémoire, référençant généralement des emplacements sur le tas où d'autres données sont stockées.

Le type défini par l'utilisateur le plus simple est un type ordinal , souvent appelé énumération , dont les valeurs peuvent être associées à l'ensemble des entiers positifs. Depuis le milieu des années 1980, la plupart des langages de programmation prennent également en charge les types de données abstraits , dans lesquels la représentation des données et des opérations est masquée à l'utilisateur , qui ne peut accéder qu'à une interface . L' abstraction des données présente plusieurs avantages : une fiabilité accrue, une complexité réduite, une diminution des risques de conflit de noms et la possibilité de modifier la structure de données sous-jacente sans que le client ait à modifier son code.

Typage statique et dynamique

En typage statique , le type de toutes les expressions est déterminé avant l'exécution du programme, généralement à la compilation. La plupart des langages de programmation statiquement typés les plus répandus exigent que le type des variables soit spécifié explicitement. Dans certains langages, les types sont implicites ; par exemple, le compilateur peut les inférer à partir du contexte. L'inconvénient du typage implicite est le risque d'erreurs non détectées. L'inférence complète des types est traditionnellement associée aux langages fonctionnels tels que Haskell et ML .

Avec le typage dynamique , le type n'est pas associé à la variable, mais seulement à la valeur qu'elle contient. Une même variable peut être réutilisée pour une valeur de type différent. Bien que cela offre une plus grande flexibilité au programmeur, c'est au prix d'une fiabilité moindre et d'une capacité réduite du langage de programmation à détecter les erreurs. Certains langages autorisent les variables de type union auxquelles on peut assigner n'importe quel type de valeur, par exception à leurs règles de typage statique habituelles.

Concurrence

Les langages interprétés tels que Python et Ruby ne prennent pas en charge l'utilisation concurrente de plusieurs processeurs. D'autres langages de programmation permettent de gérer les données partagées entre différents threads en contrôlant l'ordre d'exécution des instructions clés grâce à l'utilisation de sémaphores , en contrôlant l'accès aux données partagées via un moniteur , ou en autorisant la communication entre les threads.

Gestion des exceptions

des erreurs d'exécution qui peuvent les traiter de deux manières principales :

  • Arrêt : fermeture du système et transfert du contrôle au système d’exploitation . Cette option est considérée comme la plus simple.
  • Reprise : le programme reprend son exécution à proximité de l’endroit où l’exception s’est produite. Cela peut entraîner la répétition de l’exception, sauf si le gestionnaire d’exceptions parvient à modifier certaines valeurs pour empêcher sa réapparition.

Certains langages de programmation permettent de dédier un bloc de code à s'exécuter indépendamment du fait qu'une exception se produise avant que le code ne soit atteint ; c'est ce qu'on appelle la finalisation.

Il existe un compromis entre une meilleure gestion des exceptions et une baisse des performances. Par exemple, bien que les erreurs d'index de tableau soient fréquentes, le C ne les vérifie pas pour des raisons de performance. Bien que les programmeurs puissent écrire du code pour intercepter les exceptions définies par l'utilisateur, cela peut alourdir le programme. Les bibliothèques standard de certains langages, comme le C, utilisent leurs valeurs de retour pour signaler une exception. Certains langages et leurs compilateurs offrent la possibilité d'activer ou de désactiver la gestion des erreurs, de manière temporaire ou permanente.

Conception et mise en œuvre

L'architecture des ordinateurs a été l'un des facteurs les plus importants influençant la conception des langages de programmation . Les langages impératifs , les plus couramment utilisés, ont été conçus pour fonctionner de manière optimale sur l'architecture de von Neumann , l'architecture informatique numérique la plus répandue. Dans cette architecture, la mémoire stocke à la fois les données et les instructions, tandis que le processeur , qui exécute les instructions sur les données, est distinct et les données doivent être transférées entre la mémoire et le processeur. Les éléments centraux de ces langages sont les variables, l'affectation et l'itération , cette dernière étant plus efficace que la récursivité sur ces machines.

De nombreux langages de programmation ont été conçus ex nihilo, modifiés pour répondre à de nouveaux besoins et combinés à d'autres langages. Beaucoup sont finalement tombés en désuétude. L'émergence des langages de programmation dans les années 1950 a été motivée par le désir de créer un langage universel, adapté à toutes les machines et à tous les usages, évitant ainsi d'avoir à écrire du code pour différents ordinateurs. Au début des années 1960, l'idée d'un langage universel a été rejetée en raison des exigences différentes liées à la variété des finalités pour lesquelles le code était écrit. la surcharge d'opérateurs , qui peut conférer plusieurs significations à un même opérateur. L'orthogonalité , qui limite le nombre de constructions qu'un programmeur doit apprendre, est une autre caractéristique importante pour la lisibilité. Une structure syntaxique facile à comprendre et des mots clés immédiatement explicites contribuent également à une meilleure lisibilité.

  • La facilité d'écriture désigne la simplicité avec laquelle on peut écrire du code pour résoudre le problème souhaité. Outre les caractéristiques essentielles à la lisibilité, l'abstraction (interfaces permettant de masquer les détails au client) et l'expressivité (permettant des programmes plus concis) facilitent également l'écriture du code par le programmeur. Les premiers langages de programmation étaient étroitement liés au matériel sous-jacent de l'ordinateur, mais avec le temps, la prise en charge de l'abstraction s'est accrue, permettant aux programmeurs d'exprimer des idées plus éloignées d'une simple traduction en instructions matérielles. Moins dépendants de la complexité de l'ordinateur, les programmeurs peuvent ainsi effectuer davantage de calculs avec moins d'efforts de leur part. La plupart des langages de programmation sont fournis avec une bibliothèque standard de fonctions couramment utilisées.
  • La fiabilité signifie qu'un programme fonctionne comme prévu dans un large éventail de circonstances. La vérification des types , la gestion des exceptions et l'aliasing restreint (plusieurs noms de variables accédant à la même région de mémoire) peuvent tous améliorer la fiabilité d'un programme.
  • La conception des langages de programmation implique souvent des compromis. Par exemple, les fonctionnalités visant à améliorer la fiabilité se font généralement au détriment des performances. Une expressivité accrue grâce à un grand nombre d'opérateurs facilite l'écriture du code, mais au détriment de sa lisibilité.

    La programmation en langage naturel a été proposée comme moyen d'éliminer le besoin d'un langage spécialisé pour la programmation. Cependant, cet objectif reste lointain et ses avantages sont sujets à débat. Edsger W. Dijkstra a soutenu que l'utilisation d'un langage formel est essentielle pour éviter l'introduction de constructions dénuées de sens. Alan Perlis a également rejeté cette idée.

    Spécification

    utilisateurs et les développeurs du langage peuvent utiliser pour s'accorder sur la validité d'un code source dans ce langage et, le cas échéant, sur son comportement.

    La spécification d'un langage de programmation peut prendre plusieurs formes, notamment les suivantes :

    • Une définition explicite de la syntaxe, de la sémantique statique et de la sémantique d'exécution du langage. Alors que la syntaxe est généralement spécifiée à l'aide d'une grammaire formelle, les définitions sémantiques peuvent être écrites en langage naturel (par exemple, comme dans le langage C ) ou dans une sémantique formelle (par exemple, comme dans les spécifications Standard ML et Scheme ).
    • Une description du comportement d'un traducteur pour le langage (par exemple, les spécifications C++ et Fortran ). La syntaxe et la sémantique du langage doivent être déduites de cette description, qui peut être rédigée en langage naturel ou formel.
    • Une implémentation de référence ou modèle , parfois écrite dans le langage spécifié (par exemple, Prolog ou ANSI REXX ). La syntaxe et la sémantique du langage sont explicites dans le comportement de l'implémentation de référence.

    Mise en œuvre

    code machine exécutable par le matériel. Ce code machine peut ensuite être exécuté grâce au système d'exploitation . La méthode d'interprétation la plus courante en production est le compilateur , qui traduit le code source, via un langage intermédiaire, en code machine, appelé exécutable . Une fois compilé, le programme s'exécute plus rapidement qu'avec d'autres méthodes d'implémentation. Certains compilateurs offrent des optimisations supplémentaires pour réduire la consommation de mémoire ou de ressources de calcul lors de l'exécution, mais cela augmente le temps de compilation.

    Une autre méthode d'implémentation consiste à exécuter le programme avec un interpréteur , qui traduit chaque ligne de code en code machine juste avant son exécution. Bien que cela puisse faciliter le débogage, l'inconvénient de l'interprétation est qu'elle est 10 à 100 fois plus lente qu'un exécutable compilé. Les méthodes d'interprétation hybrides offrent certains avantages de la compilation et d'autres de l'interprétation grâce à une compilation partielle. L'une de ces méthodes est la compilation à la volée (JIT) , dans laquelle le logiciel est compilé au préalable dans un langage intermédiaire, puis en code machine juste avant son exécution.

    Langues propriétaires

    Bien que la plupart des langages de programmation les plus courants disposent de spécifications et d'implémentations entièrement ouvertes, nombre d'entre eux existent uniquement en tant que langages propriétaires, leur implémentation n'étant disponible que chez un seul fournisseur, lequel peut revendiquer la propriété intellectuelle de ce langage. Les langages propriétaires sont généralement des langages spécifiques à un domaine ou des langages de script internes à un produit unique ; certains sont utilisés exclusivement en interne chez un fournisseur, tandis que d'autres sont accessibles aux utilisateurs externes.Oracle Corporation revendique des droits de propriété sur certains aspects du langage de programmation Java [ et le langage de programmation C# de Microsoft , qui dispose d'implémentations ouvertes de la plupart des parties du système, possède également Common Language Runtime (CLR) comme environnement fermé.

    De nombreux langages propriétaires sont largement utilisés malgré leur nature propriétaire ; on peut citer par exemple MATLAB , VBScript et Wolfram Language . Certains langages pourraient passer d’un système fermé à un système ouvert ; par exemple, Erlang était à l’origine le langage de programmation interne d’Ericsson.

    Les langages de programmation open source sont particulièrement utiles pour les applications de science ouverte , améliorant la capacité de réplication et de partage de code.

    Utiliser

    Des milliers de langages de programmation différents ont été créés, principalement dans le domaine de l'informatique. Les projets logiciels individuels utilisent généralement cinq langages de programmation ou plus.

    Les langages de programmation se distinguent de la plupart des autres formes d'expression humaine par leur exigence de précision et d'exhaustivité. Lorsqu'ils communiquent en langage naturel, les auteurs et locuteurs humains peuvent être ambigus et commettre de petites erreurs, tout en espérant être compris. En revanche, les ordinateurs, pour ainsi dire, « font exactement ce qu'on leur dit de faire » et ne peuvent pas « comprendre » le code que le programmeur a voulu écrire. La combinaison de la définition du langage, du programme et de ses entrées doit spécifier pleinement le comportement externe qui se produit lors de l'exécution du programme, dans le cadre de son contrôle. À l'inverse, les concepts d'un algorithme peuvent être communiqués aux humains sans la précision requise pour son exécution grâce au pseudocode , qui mêle langage naturel et code écrit dans un langage de programmation.

    Un langage de programmation fournit un mécanisme structuré pour définir des données, ainsi que les opérations ou transformations qui peuvent être effectuées automatiquement sur ces données. Le programmeur utilise les abstractions présentes dans le langage pour représenter les concepts impliqués dans un calcul. Ces concepts sont représentés par un ensemble d'éléments les plus simples disponibles (appelés primitives ). La programmation est le processus par lequel les programmeurs combinent ces primitives pour composer de nouveaux programmes, ou adapter des programmes existants à de nouveaux usages ou à un environnement changeant.

    Les programmes informatiques peuvent être exécutés par lots sans intervention humaine, ou bien un utilisateur peut saisir des commandes dans une session interactive d'un interpréteur . Dans ce cas, les « commandes » sont simplement des programmes dont l'exécution est enchaînée. Lorsqu'un langage peut exécuter ses commandes via un interpréteur (tel qu'un shell Unix ou une autre interface en ligne de commande ), sans compilation, il est qualifié de langage de script .

    Mesurer l'usage du langage

    Déterminer quel est le langage de programmation le plus utilisé est complexe, car la définition de son utilisation varie selon le contexte. Un langage peut occuper la plus grande part du temps de développement, un autre générer davantage de lignes de code, et un troisième consommer le plus de temps processeur. Certains langages sont très populaires pour des types d'applications spécifiques. Par exemple, COBOL reste prédominant dans les centres de données d'entreprise, souvent sur les grands ordinateurs centraux ; Fortran est utilisé dans les applications scientifiques et d'ingénierie ; Ada dans les secteurs de l'aérospatiale, des transports, de la défense, des applications temps réel et embarquées ; et C dans les applications embarquées et les systèmes d'exploitation. D'autres langages sont couramment utilisés pour développer de nombreux types d'applications.

    Diverses méthodes de mesure de la popularité d'une langue, chacune sujette à un biais différent quant à ce qui est mesuré, ont été proposées :

    • compter le nombre d’offres d’emploi qui mentionnent la langue
    • le nombre de livres vendus qui enseignent ou décrivent la langue
    • estimations du nombre de lignes de code existantes écrites dans le langage qui peuvent sous-estimer les langages qui ne sont pas souvent trouvés dans les recherches publiques Java , C , C++ , Python , C# , JavaScript , VB.NET , R , PHP et MATLAB .

      En juin 2024, les cinq langages de programmation les plus populaires selon l' indice TIOBE étaient Python , C++ , C , Java et C# . TIOBE publie un classement des 100 langages de programmation les plus utilisés selon son indice et met à jour ce classement chaque mois.

      D'après l'équipe d'IEEE Spectrum, les langages de programmation les plus populaires aujourd'hui pourraient conserver leur position dominante en raison du fonctionnement de l'IA. Par conséquent, les nouveaux langages auront plus de difficultés à s'imposer, car les programmeurs n'écriront pas beaucoup de programmes dans ces langages.

    Dialectes, saveurs et implémentations

    langage d'échange de données est une variante (relativement mineure) ou une extension du langage qui n'en modifie pas la nature intrinsèque. Pour des langages comme Scheme et Forth , les normes peuvent être jugées insuffisantes, inadéquates ou illégitimes par les développeurs, qui s'en écartent souvent pour créer un nouveau dialecte . Dans d'autres cas, un dialecte est créé pour être utilisé dans un langage spécifique à un domaine , souvent un sous-ensemble. Dans l' univers Lisp , la plupart des langages utilisant la syntaxe des expressions S de base et une sémantique similaire à celle de Lisp sont considérés comme des dialectes Lisp, bien qu'ils présentent une grande diversité, tout comme Racket et Clojure par exemple . Comme il est fréquent qu'un langage possède plusieurs dialectes, il peut s'avérer difficile pour un programmeur inexpérimenté de trouver la documentation appropriée. Le langage BASIC possède de nombreux dialectes .

    Classifications

    de programmation impératif permet d'implémenter une logique encodée sous forme de séquence d'opérations ordonnées. La plupart des langages les plus utilisés sont classés comme impératifs.

    Fonctionnel

    Un langage de programmation fonctionnelle permet d'appliquer successivement des fonctions aux paramètres donnés. Bien qu'appréciés par de nombreux chercheurs pour leur simplicité et leur élégance, des problèmes d'efficacité ont empêché leur adoption à grande échelle.

    Logique

    Un langage de programmation logique est conçu de telle sorte que ce soit le logiciel, et non le programmeur, qui décide de l'ordre dans lequel les instructions sont exécutées.

    orienté objet

    La programmation orientée objet (POO) est caractérisée par des fonctionnalités telles que l'abstraction des données , l'héritage et la répartition dynamique des tâches . La POO est prise en charge par la plupart des langages impératifs populaires et par certains langages fonctionnels.

    Marge

    Bien qu'un langage de balisage ne soit pas un langage de programmation à proprement parler, il peut permettre l'intégration avec un langage de programmation.

    Spécial

    Il existe des langages spécialisés qui ne sont pas facilement comparables aux autres langages de programmation.