- « En résumé, mon conseil aux concepteurs et aux développeurs de logiciels de demain est le suivant : ne décidez pas précisément de ce que vous allez faire avant de savoir comment le faire ; et ne décidez pas comment le faire avant d’avoir évalué votre plan au regard de tous les critères de qualité souhaités. Et si vous ne pouvez pas le faire, simplifiez votre conception jusqu’à ce que vous y parveniez. »
- « Un langage de programmation est un outil qui doit aider le programmeur dans les aspects les plus difficiles de son art, à savoir la conception, la documentation et le débogage des programmes. »
- « Les critères objectifs d'une bonne conception linguistique peuvent se résumer en cinq mots clés : simplicité, sécurité, traduction rapide, code objet efficace et lisibilité. »
- « Il est absurde de mettre en place des contrôles de sécurité complexes lors des phases de débogage, sans se fier aux résultats, puis de les supprimer en production, alors qu'un résultat erroné pourrait s'avérer coûteux, voire catastrophique. Que penserions-nous d'un passionné de voile qui porte son gilet de sauvetage à l'entraînement à terre mais l'enlève dès qu'il prend la mer ? »
De nombreux langages de programmation possèdent des caractéristiques de conception destinées à faciliter l'implémentation, au moins de la première version du compilateur ou de l'interpréteur. Par exemple, Pascal, Forth et de nombreux langages assembleur sont spécifiquement conçus pour prendre en charge la compilation en une seule passe .
Les nouveaux langages de programmation sont souvent conçus pour corriger des problèmes (perçus) des langages plus anciens, généralement en ajoutant des fonctionnalités qui, bien qu'elles puissent complexifier l'interpréteur ou le compilateur, simplifient les programmes écrits dans ces langages. Par exemple, les langages intégrant une gestion automatique de la mémoire et un ramasse-miettes ; les langages intégrant des tableaux associatifs ; etc.
En revanche, certains langages de programmation ont été spécifiquement conçus pour faciliter l'écriture d'un compilateur auto-hébergé , généralement en omettant délibérément des fonctionnalités qui rendent la compilation difficile, comme BCPL , Pascal et RPython .
Mise en œuvre
Il existe deux approches générales pour l'implémentation des langages de programmation :
- Interprétation : Le programme est lu en entrée par un interpréteur, qui exécute les actions écrites dans le programme.
- Compilation : Le programme est lu par un compilateur, qui le traduit dans un autre langage, tel que le bytecode ou le code machine . Le code traduit peut être exécuté directement par le matériel ou servir d’entrée à un autre interpréteur ou à un autre compilateur.
Outre ces deux extrêmes, de nombreuses implémentations utilisent des approches hybrides telles que la compilation juste-à-temps et les interpréteurs de bytecode.
Les interpréteurs présentent certains avantages par rapport aux compilateurs JIT et aux compilateurs AOT. En général, les interpréteurs prennent en charge une boucle lecture-évaluation-affichage qui rend le développement de nouveaux programmes beaucoup plus rapide ; les compilateurs obligent les développeurs à utiliser une boucle édition-compilation-exécution-débogage beaucoup plus lente.
Un programme typique, lorsqu'il est compilé avec un compilateur AOT (Ahead-of-Time), s'exécutera (après compilation) plus rapidement que le même programme traité et exécuté avec un compilateur JIT ; lequel peut à son tour s'exécuter plus rapidement que ce même programme partiellement compilé en un langage intermédiaire de type p-code, tel qu'un bytecode , et interprété par une machine virtuelle d'application ; lequel s'exécute à son tour beaucoup plus rapidement qu'un interpréteur pur.
En théorie, un langage de programmation peut d'abord être spécifié, puis son interpréteur ou compilateur implémenté ultérieurement (modèle en cascade). En pratique, les enseignements tirés de l'implémentation d'un langage influencent souvent les versions ultérieures de sa spécification, ce qui conduit à une conception et une implémentation intégrées du langage.
Les interpréteurs et les compilateurs implémentent généralement une sorte de table de symboles .
Interprètes
Un interpréteur est composé de deux parties : un analyseur syntaxique et un évaluateur . Après avoir été lu en entrée par l’interpréteur, un programme est traité par l’analyseur syntaxique. Ce dernier décompose le programme en éléments de langage pour former un arbre d’analyse syntaxique . L’évaluateur utilise ensuite cet arbre pour exécuter le programme.
machine virtuelle
Compilateur juste-à-temps
Compilateurs
Si un compilateur d'un langage de haut niveau donné produit un autre langage de haut niveau, il est appelé transpileur . Les transpileurs peuvent être utilisés pour étendre les langages existants ou pour simplifier le développement de compilateurs en exploitant des implémentations portables et bien optimisées d'autres langages (tels que C ).
De nombreuses combinaisons d'interprétation et de compilation sont possibles, et de nombreuses implémentations de langages de programmation modernes intègrent des éléments des deux. Par exemple, le langage de programmation Smalltalk est généralement implémenté par compilation en bytecode , qui est ensuite interprété ou compilé par une machine virtuelle . Le bytecode Smalltalk étant exécuté sur une machine virtuelle, il est portable sur différentes plateformes matérielles.
Plusieurs implémentations
Les langages de programmation peuvent avoir plusieurs implémentations. Différentes implémentations peuvent être écrites dans différents langages et utiliser différentes méthodes pour compiler ou interpréter le code. Par exemple, les implémentations de Python incluent : CPython , l' implémentation de référence de Python
Processus
Les méthodes de création d'un langage de programmation peuvent varier d'un développeur à l'autre ; toutefois, voici un processus général de création d'un langage de programmation, qui inclut des concepts communs :
- Conception : Les aspects de conception sont pris en compte, tels que les types, la syntaxe, la sémantique et l'utilisation des bibliothèques, pour développer un langage.
- Considérations : La syntaxe, l’implémentation et d’autres facteurs sont pris en compte. Les langages comme Python interprètent le code à l’exécution, tandis que les langages comme C++ adoptent une approche consistant à baser leur compilateur sur celui du C.
- Création d'une implémentation : Une première implémentation est écrite. Les compilateurs la convertiront en d'autres formats, aboutissant généralement à un niveau aussi bas que l'assembleur, voire au binaire.
- Améliorez votre implémentation : les implémentations doivent être améliorées. Développez le langage de programmation afin qu’il possède suffisamment de fonctionnalités pour permettre l’auto-démarrage , c’est-à-dire la capacité d’un langage de programmation à écrire sa propre implémentation.
- Amorçage : Si un compilateur est utilisé, un développeur peut recourir à l’amorçage, qui consiste à réécrire le compilateur du langage de programmation. Cette méthode est utile pour la détection des bogues et la validation du compilateur. L’amorçage présente également l’avantage de ne plus avoir à programmer que le langage lui-même par la suite.
Plus d articles de Worldlex Wiki
Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.
Explorer l index