7.1 Fondements des langages de programmation
Objectifs d'apprentissage
À la fin de cette section, vous serez en mesure de :
- Décrire ce que sont les HLL
- Résumer le choix des HLL appropriés
- Décrire l'historique des HLL
- Décrire l'implémentation des HLL
Un langage de programmation de haut niveau est conçu pour être facile à lire, à écrire et à comprendre pour les humains. Il fait abstraction de la plupart des complexités du matériel sous-jacent et du code machine, permettant aux programmeurs de se concentrer sur la résolution de problèmes et la conception de logiciels sans avoir à gérer les détails de bas niveau de l'architecture de l'ordinateur.
Que sont les HLL ?
Les langages de programmation de haut niveau donnent aux humains la capacité de diriger les ordinateurs pour effectuer des tâches et des applications. Il existe de nombreux HLL parmi lesquels choisir. Java est un choix populaire pour sa capacité à fonctionner sur divers systèmes d'exploitation (c'est-à-dire Windows, macOS, Linux) et plateformes mobiles (Android). C'est ce qu'on appelle la compatibilité multiplateforme. Pour le développement ciblant spécifiquement les systèmes Windows, C# est une autre option solide. De plus, pour créer les éléments (elements) visuels d'un site web, les programmeurs peuvent utiliser HTML et CSS. HTML fournit la structure et le contenu de la page web, tandis que CSS contrôle la manière dont les pages web sont stylisées et présentées. Au fil du temps, de nombreux HLL ont évolué pour devenir un ensemble d'outils matures utilisés pour créer des applications modernes (Figure 7.2).
Lien vers l'apprentissage
Il est possible que l'utilisation généralisée d'une variété de HLL pour développer des applications en réseau et mobiles à l'échelle mondiale crée des problèmes potentiels de cybersécurité. Certains HLL sont considérés comme plus sécurisés que d'autres. Lisez cet article sur les langages de programmation les plus sécurisés pour plus d'informations sur la sécurité — ou son absence — de ces langages.
Motivations d'apprentissage
L'étude des concepts fondamentaux fournis par les divers HLL est nécessaire pour les choisir correctement, les employer efficacement et programmer de manière efficiente. Du point de vue de l'utilisateur, l'examen des concepts des HLL aide l'utilisateur à mieux penser et exprimer les algorithmes. Du point de vue de l'implémenteur, la compréhension des concepts des HLL aide les programmeurs à s'abstraire des machines (virtuelles) et à mieux spécifier ce qu'ils veulent que le matériel fasse sans descendre au niveau des bits. En fin de compte, l'étude des concepts des HLL aide les programmeurs à mieux utiliser le HLL qu'ils emploient.
Implémentation de l'abstraction
Une façon de se rapporter à l'abstraction (abstraction) est de la considérer comme une manière de penser et d'exprimer des algorithmes pour indiquer ce que le programmeur veut que le matériel fasse. Par exemple, l'instruction suivante représente une forme d'abstraction dans le langage de programmation Java :
System.out.println("Hello world!");
Elle indique au système d'exploitation de l'ordinateur, à un haut niveau d'abstraction, de produire une chaîne de caractères (string), ce qui consiste pratiquement à déplacer les pixels qui forment les caractères un par un vers un périphérique matériel.
L'implémentation d'un haut niveau de tâches serait impossible sans abstraction. Par exemple, vous ne voudriez pas programmer une application de facturation en 1 et 0 (langage machine) ; l'abstraction permet à un programmeur de la construire avec une syntaxe proche de l'anglais.
L'abstraction peut être poussée à des niveaux beaucoup plus élevés. C'est l'un des trois principes centraux (avec l'encapsulation (encapsulation) et l'héritage (inheritance)) dans les HLL orientés objet tels que C++, Java, C# et Python. Divers paradigmes de programmation ont été introduits dans le Chapitre 4 Réalisation linguistique des algorithmes : langages de programmation de bas niveau, en particulier les mécanismes de la programmation orientée objet (POO) et ses standards, perspectives ou ensembles d'idées qui peuvent être utilisés pour décrire la structure et les méthodologies d'un HLL. Les HLL orientés objet aident à organiser la conception logicielle autour des données, ou objets, plutôt que des fonctions (functions) et de la logique, comme nous le verrons dans Modèles de programmation alternatifs.
Choisir les HLL appropriés
L'étude et la compréhension des concepts des HLL nous permettent de les utiliser de la manière la plus efficace en nous familiarisant avec divers critères qui peuvent être utilisés pour les évaluer, ce qui nous aide à choisir le langage le plus approprié pour un projet. Certains de ces critères sont énumérés dans le Tableau 7.1, qui montre également comment ils sont liés aux caractéristiques d'un HLL. Ces critères sont les suivants :
- lisibilité (readability) : mesure la facilité avec laquelle un HLL peut être lu et compris
- aptitude à l'écriture (writability) : mesure la facilité avec laquelle un HLL peut être utilisé pour créer et modifier des programmes
- fiabilité : mesure la conformité aux spécifications
Il existe de nombreux autres critères, notamment l'extensibilité, le coût, la flexibilité, l'efficacité, la portabilité et la maintenabilité. Ceux-ci peuvent être utilisés pour identifier le HLL le mieux adapté à une tâche donnée.
| Caractéristique | Lisibilité | Aptitude à l'écriture | Fiabilité |
|---|---|---|---|
| Simplicité : un ensemble gérable de fonctionnalités et de constructions | • | • | • |
| Orthogonalité : un ensemble relativement petit de constructions primitives peut être combiné d'un nombre relativement petit de manières | • | • | • |
| Types de données : constructions prédéfinies adéquates pour contenir des données | • | • | • |
| Conception de la syntaxe : forme et signification via des constructions auto-descriptives et des mots-clés (keywords) significatifs | • | • | • |
| Supporte l'abstraction : masque toutes les données non pertinentes sur un objet afin de réduire la complexité et d'augmenter l'efficacité | • | • | |
| Expressivité : moyens relativement pratiques de spécifier des opérations | • | • | |
| Vérification de type : test intégré pour les incompatibilités de type | • | ||
| Gestion des exceptions (Exception) : support pour la capture des erreurs d'exécution et la spécification de mesures correctives | • | ||
| Aliasing restreint : présence de deux ou plusieurs méthodes de référencement distinctes pour la même adresse mémoire | • |
Apprendre de nouveaux HLL
L'étude des concepts des HLL facilite l'apprentissage de nouveaux HLL, car la plupart présentent des similitudes en termes de syntaxe, de structure et de sémantique. Il existe également plusieurs bonnes pratiques qui s'appliquent à différents HLL. Une bonne pratique (best practice) est le style et la structure de code les plus acceptés qui peuvent être utilisés pour assurer un développement logiciel approprié, ce qui permet d'apprendre facilement de nouveaux langages une fois qu'un programmeur en a maîtrisé un donné. Les HLL les plus utilisés comme langages d'enseignement aujourd'hui sont Java, C++ et Python. Java et C++ sont des langages qui demandent une quantité d'étude significative pour être maîtrisés, tandis que Python est considéré comme un langage beaucoup plus simple à apprendre.
Lien vers l'apprentissage
HTML et CSS sont des langages de balisage et non exactement des langages de programmation comme Java ou Python. Les standards officiels HTML et CSS sont disponibles auprès du World Wide Web Consortium (W3C).
Meilleure utilisation des HLL
Les programmeurs doivent comprendre comment les HLL prennent en charge certaines fonctionnalités. Par exemple, une variable (variable) donne un nom à une adresse mémoire qui est utilisée dans tout HLL pour contenir une valeur. Cependant, différents langages utilisent les variables différemment. Java est un langage fortement typé (strongly typed), ce qui signifie qu'une variable ne peut contenir qu'une valeur d'un des types de données définis par le langage pendant toute son existence. Par conséquent, une variable qui est un nombre ne peut pas devenir une chaîne de texte. JavaScript est faiblement typé (weakly typed), de sorte qu'une variable peut à différents moments contenir des valeurs de n'importe quel type de données du langage. Elle peut stocker un nombre, puis plus tard, la même variable peut stocker une chaîne de caractères.
Un autre exemple est l'utilisation des pointeurs en C et C++. Comme visible sur la Figure 7.3, le pointeur est la variable qui contient les adresses mémoire réelles de l'ordinateur, mais ils n'existent pas en Java. Cependant, comprendre comment C gère la mémoire facilite la compréhension de la manière dont les données sont transmises d'un endroit à un autre en Java ou C#.
Les langages sont axés sur un objectif
Contrastons à nouveau C/C++ et JavaScript. Une grande partie de la syntaxe et de la grammaire est la même, tout comme les structures de flux de contrôle (flow of control) du langage.
Lien vers l'apprentissage
Vous pouvez consulter le standard C/C++ actuel pour approfondir une comparaison de syntaxe.
Alors pourquoi choisir l'un plutôt que l'autre ? La réponse est que les langages sont conçus pour remplir certains objectifs. C/C++ est un langage de programmation à usage général. À ce titre, il est puissant pour les applications qui incluent à la fois la programmation système et la programmation d'interface (interface) utilisateur graphique (GUI) orientée objet. JavaScript est destiné à la programmation web.
Bien que les langages de programmation diffèrent par leur syntaxe, ils possèdent tous des bibliothèques ou des packages qui sont installés dans le cadre de l'environnement de développement du langage. Ces bibliothèques exposent diverses fonctions via une interface de programmation d'applications (API). Ces fonctions prennent en charge les tâches pour lesquelles le langage est conçu sans nécessiter de codage supplémentaire. Ce qui suit illustre l'utilisation d'une fonction de bibliothèque C++ qui affiche une chaîne de caractères à l'écran :
cout << "Hello world!";
L'API de JavaScript contient un ensemble complet de fonctionnalités qui permettent la manipulation et le comportement dynamique des pages web. Une fonction API JavaScript qui affiche sur la page web :
document.write("Hello world!");
La technologie au quotidien
Utiliser les API de cartes pour naviguer dans votre monde
Les API sont des boîtes à outils pour les programmeurs. Elles fournissent des blocs de construction qui facilitent la création d'applications logicielles. La fonctionnalité des API peut également aider les gens dans des situations de la vie quotidienne. Par exemple, Google fournit une API JavaScript Maps pour personnaliser le contenu des cartes à afficher sur les pages web. Imaginez que vous planifiez un voyage en voiture. Vous pouvez alors utiliser l'API Maps pour créer une carte personnalisée avec votre itinéraire prévu, vos arrêts et les temps de trajet estimés. Imaginez maintenant que vous possédez un café. L'API Maps peut alors vous aider à afficher votre emplacement et vos heures d'ouverture sur une carte, ce qui facilite la tâche de vos clients pour vous trouver. Vous voulez en savoir plus sur la création d'applications avec des API ? Consultez la ressource Maps JavaScript API.
Recherchez les API pour un HLL que nous avons mentionné et trouvez des fonctionnalités qui s'appliquent à la vie quotidienne. Pensez à une application que vous utilisez tous les jours. Comment pensez-vous qu'elle pourrait utiliser des API ? Fournissez quelques scénarios pour expliquer votre choix.
Historique des HLL
L'évolution des HLL a commencé afin que les programmeurs puissent écrire des programmes dans une notation familière plutôt que d'utiliser des nombres (langages machine) ou des mnémoniques (langages d'assemblage). Bien qu'il puisse y avoir des similitudes de syntaxe entre eux, leur développement a eu lieu à des fins distinctes. Il existe une variété de HLL beaucoup plus grande que celles mentionnées dans cette section, mais nous en examinerons quelques-unes de près.
Fortran
Au début des années 1950, IBM a créé l'un des premiers compilateurs HLL pour le langage Fortran, ce qui représente l'une des plus grandes avancées en informatique. Bien que Fortran ait été principalement utilisé en mathématiques et en sciences, il était facilement lisible. Fortran permet aux programmeurs de commenter leur code en commençant les lignes de programme par « ! ». Il utilise des instructions conditionnelles avec des instructions goto pour se ramifier vers différentes parties du code. Il utilise également des instructions itératives « do...end do ». Ce fut également le premier HLL à utiliser un compilateur, un logiciel informatique qui convertit le code source d'un langage à un autre.
! Compute the average
Average = Sum / List_Len
! Count the values that are greater than the average
Do Counter = 1, List_Len
If (Int_List(Counter) > Average) Then
Result = Result + 1
End If
End Do
COBOL
Le Common Business-Oriented Language (COBOL) a été développé pour être un langage de haut niveau pour les affaires, standardisé par le groupe American National Standards Institute (ANSI) en 1968. COBOL représente une étape distincte dans l'évolution de l'informatique en raison des façons dont il différait de Fortran.
L'extrait de code suivant illustre la lecture d'un enregistrement d'inventaire et le calcul du stock disponible :
100-PRODUCE-REORDER-LINE. PERFORM 110-READ-INVENTORY-RECORD. IF CARD-EOF-SWITCH IS NOT EQUAL TO "Y" PERFORM 120-CALCULATE AVAILABLE STOCK IF AVAILABLE STOCK IS LESS THAN BAL-REORDER-POINT PERFORM 130-PRINT-REORDER-LINE 110- READ-INVENTORY-RECORD. READ BAL-FWD-FILE RECORD AT END MOVE "Y" TO CARD-EOF-SWITCH. . . . .
Nous pouvons voir que COBOL a un type de syntaxe très différent de Fortran. Il est conçu différemment car il est très aligné sur les applications commerciales et la programmation d'activités commerciales spécifiques qui constituent les processus d'affaires.
BASIC
Le Beginner’s All-Purpose Symbolic Instruction Code (BASIC) a été développé en 1971. C'est un langage de programmation qui a connu une large utilisation. Une variante de BASIC, appelée Visual Basic (VB), a été le langage responsable d'une grande partie du travail de développement effectué sur les nouvelles générations d'ordinateurs personnels, car il était facile à apprendre et à lire. Aujourd'hui, il a évolué vers Visual Basic .NET.
L'extrait de code suivant illustre le même calcul et la même comparaison d'une moyenne que nous avons faits en Fortran, mais cette fois en BASIC :
REM Compute the average average = sum / listlen REM Count the values that are greater than the average FOR counter = 1 to listlen IF intlist(Counter) > average THEN result = result + 1 End If NEXT
Notez que la syntaxe BASIC a ses racines dans Fortran mais est plus efficace.
Pascal et C
Les langages de programmation introduits jusqu'à présent suivent le paradigme du langage impératif (imperative language) qui met l'accent sur une approche « dire à l'ordinateur quoi faire ». Pascal et C se distinguent en étant à la fois des langages procéduraux et impératifs, et ils ont été inventés à peu près à la même époque. Un langage procédural (procedural language) permet aux programmeurs de regrouper des instructions en blocs de code dans la portée (scope) desquels les variables peuvent être définies et manipulées indépendamment du reste d'un programme. Ces blocs peuvent être nommés, ce qui permet aux programmeurs de créer des fonctions ou des procédures qui peuvent être appelées depuis d'autres parties d'un programme. Similaires à d'autres langages impératifs, Pascal et C se concentrent également sur l'évaluation d'expressions (expression) et le stockage des résultats dans des variables (par exemple, a = 10 ; b = 5 ; c = a + b).
L'extrait de code Pascal suivant illustre le même calcul et la même comparaison de la moyenne calculée précédemment en BASIC :
{ Compute the average }
average := sum / listlen;
{ Count the values that are greater than the average }
for counter := 1 to listlen do
if (intlist[counter] > average) then
result := result + 1;
L'introduction des procédures en Pascal a amélioré la lisibilité des programmes en permettant aux programmeurs d'écrire un code plus modulaire. Pascal est devenu le langage d'enseignement préféré dans les années 1970 et au début des années 1980.
Pascal a été éclipsé dans les applications commerciales par C, qui a vu le jour après l'achèvement des travaux initiaux sur le système d'exploitation UNIX à la fin des années 1960. Cette première version de l'OS a été écrite en langage d'assemblage (assembly), mais au début des années 1970, C est devenu une meilleure alternative. À l'époque, c'était le langage parfait pour créer des systèmes d'exploitation et il a connu un énorme succès commercial.
L'extrait de code C suivant illustre le même calcul et la même comparaison de la moyenne calculée :
/* Compute the average */
average = sum / listlen;
/* Count the values that are greater than the average */
for (counter = 0; counter < listlen; counter++)
if (intlist[counter] > average) result++;
L'introduction des fonctions (functions) dans le langage C a amélioré la lisibilité et l'aptitude à l'écriture des programmes en permettant aux programmeurs d'écrire un code plus modulaire. Le temps d'exécution du langage C était également plus efficace. C est devenu le langage préféré pour les applications commerciales dans les années 1970 et au début des années 1980.
C++ et Objective C
Au milieu des années 1980, les entreprises ont commencé à se concentrer sur l'expérience utilisateur (UX), l'expérience globale d'une personne utilisant une application informatique, en particulier en termes de facilité ou de plaisir d'utilisation, et l'interface utilisateur (UI) (user interface (UI)), le point où les utilisateurs humains interagissent avec un ordinateur, un site web ou une application. Les interfaces utilisateur basées sur Windows ont été adoptées comme de nouveaux paradigmes, ce qui a conduit à la création de standards, de perspectives et d'ensembles d'idées qui devraient être utilisés pour décrire la structure et les méthodologies d'un HLL. Cela a abouti à l'adoption du paradigme POO et à la création de langages POO. Le passage à la POO a permis au logiciel de se concentrer sur les données et les objets.
Le langage de programmation C++ a étendu les fonctionnalités de langage de niveau intermédiaire de C avec des fonctionnalités POO qui ont facilité l'expression des exigences du monde réel dans les programmes, y compris en particulier le support des interfaces utilisateur graphiques (GUI). Microsoft a adopté C++ comme langage de programmation pour ses systèmes Windows.
La syntaxe du code en C++ pour le calcul de base est exactement la même que le code C montré précédemment. Il existe des ajouts syntaxiques majeurs en C++ pour prendre en charge la POO. Il est devenu le langage préféré au milieu des années 1980 et au début des années 1990 et pour la programmation des GUI. Le code de la Figure 7.4 illustre les bases de la programmation GUI Windows utilisant C++ et l'API Win32 pour créer une simple application « Hello World! » avec une interface utilisateur graphique (GUI).
Objective-C est un autre langage hybride des années 1980 qui utilise des fonctionnalités impératives procédurales et orientées objet. Apple l'a adopté pour alimenter ses efforts de développement de systèmes d'exploitation et est devenu populaire pendant un certain temps comme le seul langage accepté par Apple pour la programmation d'applications pour iPhones, remplacé plus tard par Swift.
Java
Les appareils électriques grand public, tels que les fours à micro-ondes et les téléviseurs interactifs, ont nécessité l'invention d'un autre langage POO : Java. Java a évolué pour devenir un langage indépendant de la plateforme, à usage général pour les appareils informatiques, utilisable pour tout, des PC et MAC aux Androids et réfrigérateurs Samsung. À ce jour, il reste l'un des langages les plus largement utilisés pour l'enseignement de la POO et est l'un des HLL les plus populaires au monde.
Comme le montre la Figure 7.5, la syntaxe du code Java pour les calculs typiques est similaire à celle du code C montré précédemment. C'est le cas pour la plupart des HLL modernes introduits depuis 1990.
Lien vers l'apprentissage
Reportez-vous au standard ECMAScript si vous souhaitez approfondir une comparaison de syntaxe qui inclut JavaScript.
Langages de script
Un langage de script (scripting language) est caractérisé par le placement d'une liste d'instructions de code dans un fichier, appelé script. Les instructions de script sont généralement interprétées ligne par ligne plutôt que d'être compilées comme des unités complètes pour produire des programmes exécutables. Il y a des avantages et des inconvénients aux méthodes d'interprétation et de compilation, que nous aborderons dans Approches d'implémentation.
Les langages de script les plus populaires utilisent une syntaxe de type C, mais ils sont destinés à différentes applications. Par exemple, les langages de script JavaScript et PHP sont destinés à la programmation d'applications web.
Concepts en pratique
HLL et applications web
La plupart des HLL utilisés pour développer des applications web sont des langages de script. Ceux-ci incluent JavaScript, PHP, ASP.NET et Python. JavaScript est presque universel pour les applications frontales (navigateur, côté client). Les serveurs web tels que le serveur web Apache et le serveur Internet Information Services (IIS) de Microsoft prennent en charge une interface de passerelle commune (CGI) (Common Gateway Interface (CGI)) qui permet l'invocation de programmes côté serveur, y compris des scripts.
Certains de ces langages de script sont maintenant renforcés par des cadriciels web conçus pour soutenir le développement d'applications dans ces langages particuliers. Par exemple, le cadriciel le plus populaire pour les applications web aujourd'hui en JavaScript est React. Le plus populaire pour Python est Django. Un guide des cadriciels web peut être trouvé sur le site web de Statista.
C#
En 2000, Microsoft a annoncé que C# serait son langage phare. Il possède également la même syntaxe fondamentale que C++ et Java. Cependant, il est destiné à prendre en charge les applications Windows en étant étroitement lié au cadriciel .NET de Microsoft, mais il peut également être utilisé sur Linux et macOS. .Net C# est un outil de développement logiciel multilingue, basé sur des composants, conçu pour bien fonctionner avec tous les langages .Net, y compris C#, Visual Basic.Net et Managed C++.
Pleins feux sur l'industrie
Les HLL dans l'industrie
Les HLL sont importants dans toutes les industries. Python en est un exemple. Une partie de son objectif est de soutenir l'analyse de données pour traiter des données complexes, un objectif majeur de nombreuses industries aujourd'hui. Il le fait avec des outils d'analyse intégrés dans son API qui peuvent traiter (process) des données brutes et produire des informations et des graphiques qui peuvent être utilisés pour prendre des décisions commerciales. Par exemple, une entreprise intéressée par la génération d'une représentation graphique des ventes de ses produits dans diverses régions au cours de l'année écoulée peut utiliser les bibliothèques d'analyse de données et de traçage de Python.
Pouvez-vous expliquer à quel point il sera utile de connaître les HLL dans une industrie de votre choix (par exemple, la finance, le jeu, le voyage) ? Indice : Pensez aux industries qui ont tendance à se spécialiser dans des domaines spécifiques.
Langages basés sur la logique
Les langages de programmation basés sur la logique sont ceux qui intègrent une syntaxe pour représenter des faits et des règles concernant les approches des problèmes. Ils ont été utilisés pour soutenir des approches basées sur des règles dans le cadre du développement de l'intelligence artificielle (IA), la simulation de l'intelligence humaine par des machines telles que les ordinateurs.
Le langage le plus courant pour la programmation basée sur la logique est Prolog. Il est utilisé à la fois pour l'IA et la programmation linguistique. C'est en fait un HLL plus ancien, développé pour la première fois en 1972, qui est resté avec nous, recevant des mises à jour importantes à mesure que l'IA se développait. La Figure 7.6 illustre sur le côté gauche comment les faits et les règles peuvent être spécifiés en Prolog. La fenêtre de requête sur le côté droit illustre comment la base de faits Prolog peut être interrogée pour exploiter les règles disponibles.
L'implémentation des HLL
Tous les langages informatiques peuvent être regroupés en catégories particulières. Celles-ci sont basées sur le support de certains paradigmes de programmation (standards, perspectives ou ensembles d'idées qui peuvent être utilisés pour décrire la structure et les méthodologies d'un HLL). Ces paradigmes incluent l'impératif/procédural, le logique, le fonctionnel, l'orienté objet, l'événementiel (event-driven) (le comportement des programmes est contrôlé par des actions (événements) qui sont écoutées puis traitées ou gérées), et la programmation parallèle (diviser un programme en processus concurrents). Nos HLL modernes sont presque toujours des combinaisons hybrides de ceux-ci. Nous en apprendrons davantage à ce sujet dans les sous-sections suivantes de ce chapitre.
Programmation impérative/procédurale
Comme nous l'avons discuté, les HLL impératifs adoptent l'approche « dire à l'ordinateur quoi faire ». Cette approche est différente de celle des HLL déclaratifs qui indiquent à un programme d'obtenir des informations sans prescrire comment le programme doit s'y prendre. Les langages déclaratifs sont utilisés pour interagir avec des systèmes programmés pour déterminer ces détails. Un exemple de langage déclaratif est le Structured Query Language (SQL) (Structured Query Language (SQL)), qui est utilisé pour spécifier une requête qu'un système de base de données peut traiter pour stocker ou récupérer des données. Les langages impératifs se concentrent généralement sur l'évaluation des expressions et le stockage des résultats dans des variables. Il existe d'autres caractéristiques communes à ces langages, telles que l'itération (iteration) (bouclage ou répétition).
Les langages procéduraux étendent le paradigme impératif. Ils utilisent des appels de procédure pour modifier le flux de contrôle (flow of control). Une fonction (function) peut être appelée de n'importe où dans un programme pour lui faire effectuer une tâche particulière. Certains des langages qui supportent ce paradigme sont Fortran, COBOL, Pascal, Visual Basic, Ada, C, C++ et C#. Les langages de script, y compris Python, JavaScript et PHP, peuvent également être de ce type.
Programmation événementielle
La plupart des langages impératifs adoptent également la programmation événementielle. Ce paradigme permet la génération d'événements (par exemple, lorsqu'un utilisateur clique sur un bouton). En général, les systèmes d'exploitation des ordinateurs traitent constamment des événements de divers types qui résultent d'interactions avec les utilisateurs ou sont générés par des programmes d'application ou du matériel informatique. En programmation événementielle, un programme est invité à écouter des événements sélectionnés, tels qu'un simple clic sur un objet particulier (par exemple, un bouton sur une interface utilisateur). Le programmeur établit un gestionnaire d'événements pour traiter l'événement chaque fois qu'il est déclenché.
Programmation parallèle
Ce paradigme fait référence à la capacité de l'ordinateur à traiter plusieurs tâches simultanément, ce qui est particulièrement utile dans les systèmes multicœurs modernes. Cependant, un programme peut ne pas être autorisé à s'exécuter sur plusieurs cœurs sans une synchronisation (synchronization) appropriée. Par exemple, le programme d'un cœur peut avoir besoin d'un résultat ou d'un élément de données produit par le programme d'un autre cœur. Par conséquent, une programmation parallèle efficace doit disposer des outils permettant de synchroniser les processus. Le langage de programmation Ada a introduit un support intégré pour la programmation concurrente (concurrent programming) utilisant des tâches et des objets protégés. Les tâches Ada sont définies avec le mot-clé task et ont leurs propres déclarations et parties exécutables. Alors que les tâches aident à structurer les programmes en flux concurrents, les objets protégés sauvegardent les données partagées (shared data), garantissant qu'une seule tâche peut y accéder à la fois pour éviter les conditions de concurrence (race condition) et les interblocages (deadlock). D'autres exemples de HLL qui prennent en charge la programmation parallèle incluent C++, Java et C.
Approches d'implémentation
Comme nous l'avons appris, les implémentations de langage sont couramment différenciées entre celles basées sur la compilation (compilation) et celles basées sur l'interprétation. De nombreux langages modernes utilisent un style d'exécution hybride.
Compilation pure
En compilation pure, les programmes sont traduits directement en langage machine. Le compilateur prend l'intégralité du programme source de haut niveau et produit un code objet équivalent. Le compilateur n'est pas utilisé dans l'exécution réelle du programme ; le programme objet est lancé par le système d'exploitation et s'exécute sur la machine sous-jacente du début à la fin, comme le montre la Figure 7.7.
Les avantages de la compilation pure sont une meilleure performance et une meilleure analyse du code pour détecter les erreurs de typage du code source. L'inconvénient est que le programme compilé est dépendant de la plateforme et doit être recompilé pour d'autres machines cibles. Des exemples de langages purement compilés incluent C et C++.
Interprétation pure
En interprétation pure, les programmes sont traduits par un autre programme appelé interpréteur. L'interpréteur exécute le programme ligne par ligne. Parce que l'interpréteur exécute le programme, il n'est pas dépendant de la plateforme et est conçu pour exécuter le code pour la plateforme sur laquelle il réside. Les inconvénients de l'interprétation sont la vitesse d'exécution plus lente due à la nécessité de traduire et d'exécuter chaque ligne. Des exemples de langages purement interprétés sont JavaScript, PHP et Python.
Implémentation hybride
Certains systèmes d'implémentation de langage sont un mélange de compilateurs et d'interprètes, ce qui est connu sous le nom d'implémentation hybride (hybrid implementation), une méthode de traduction de langage qui implique l'utilisation à la fois d'un compilateur et d'un interpréteur. Le compilateur traduit d'abord les programmes HLL en un langage intermédiaire (intermediate language), un langage généré à partir du code source de programmation, mais que le CPU ne peut généralement pas exécuter directement. Certaines implémentations hybrides permettent une interprétation facile pendant l'exécution en utilisant la traduction à la volée (JIT) (just-in-time (JIT) translation), dans laquelle le langage intermédiaire est traduit et exécuté exactement quand cela est nécessaire. Cette méthode est beaucoup plus rapide que l'interprétation pure.
Java est un bon exemple de système d'implémentation hybride, conçu pour donner au langage une indépendance de plateforme. Comme illustré dans la Figure 7.8, le compilateur traduit le code source HLL en bytecode (bytecode) intermédiaire, un code objet produit par la compilation Java qui est ensuite interprété par la machine virtuelle Java (JVM) (Java virtual machine (JVM)), l'interpréteur Java qui traduit le bytecode en code exécutable. Cela permet d'utiliser la même source sur toutes les plateformes pour lesquelles une JVM a été construite.
C#, et les autres langages .NET, sont implémentés avec un système JIT différent. Le compilateur produit du code géré (managed code) dans lequel les langages .NET sont traduits. L'environnement d'exécution est connu sous le nom de Common Language Runtime (CLR) (Common Language Runtime (CLR)), qui prend le code géré et fournit une exécution JIT qui permet à tous les langages de bien fonctionner ensemble. Cette implémentation hybride est destinée à la compatibilité inter-langages en plus de la compatibilité multiplateforme.
Réflexion approfondie
Les HLL et TechWorks
Proposez une application pour TechWorks qui implémentera une partie particulière de l'entreprise (par exemple, finance, ventes, publicité). Énoncez brièvement l'application et son objectif. Pour cette application, quel HLL d'implémentation choisirez-vous — compilé, interprété ou hybride ? Expliquez pourquoi.
Environnements de programmation
Les environnements de programmation comprennent une collection d'outils utilisés dans le développement logiciel. Selon le système d'exploitation et le HLL que vous utilisez, il existe de nombreuses options pour un environnement de développement logiciel. Cet ensemble d'outils est ciblé pour un HLL spécifique qui aide à l'édition du code source, à la compilation et/ou à l'interprétation, au débogage, au stylisme et à d'autres tâches de programmation utiles.
Lien vers l'apprentissage
Cet article fournit un guide intéressant sur les HLL actuels et inclut les avantages, les inconvénients, les utilisations, les salaires moyens et d'autres données utiles.