JavaRush /Blog Java /Random-FR /Niveaux de langages de programmation
Marat Sadykov
Niveau 41

Niveaux de langages de programmation

Publié dans le groupe Random-FR

Introduction

Quels sont les différents langages de programmation ? Quels types de concepts y sont intégrés ? Comment se sont-ils développés ? Dans cet article, nous examinerons les types de langages de programmation basés sur ce que l'on appelle les niveaux - des codes machine (bas niveau, proches du matériel informatique) aux langages tels que Java ou C# (haut niveau). Moins la liste de textes du programme subit de transformations pour se transformer en un ensemble de zéros et de uns, plus le niveau est bas.
Niveaux de langages de programmation - 1
Nous examinerons ensuite :
  1. Langages de bas niveau (codes machine et assembleur)
  2. Niveau intermédiaire (C, Fortran….)
  3. Haut niveau (C++, Java, Python, Ruby, JavaScript...)
Le niveau caractérise également le degré de détail dont la liste du futur programme doit être détaillé pour mettre en œuvre la mise en œuvre. Dans quelle mesure ce processus est-il simple pour les humains ? Le niveau d'une langue ne doit pas être considéré comme un indicateur sans ambiguïté de ses capacités. Un langage de programmation est un outil efficace dans un domaine et moins utile dans d’autres. Le menuisier et le charpentier travaillent le bois. Le premier a un outil principal - un jeu de ciseaux, le second - une hache. Cependant, un menuisier rendra une armoire sculptée plus élégante et un menuisier construira une maison plus rapidement. Bien que chacun soit capable de faire le travail de l’autre, ils le feront beaucoup moins efficacement. Diverses données dans un ordinateur sont représentées sous forme d’ensembles de zéros et de uns. Les commandes de contrôle pour son traitement sont les mêmes données contenant des instructions qui déterminent l'emplacement des informations nécessaires et la méthode de modification.

Langages machine (niveau le plus bas)

Nous devrons faire une courte visite de la zone Logiciel à la zone Matériel. Regardons-le sous une forme simplifiée. Le processeur est le « cerveau » principal de l’ordinateur. La carte mère sur laquelle il est installé contient des contrôleurs qui permettent d'interagir avec d'autres appareils via des bus (canaux de données pour la communication).
Niveaux de langages de programmation - 2
Certains fonctionnent à grande vitesse (flèches rouges) : le processeur extrait les commandes de la mémoire et manipule les données, la carte vidéo, notamment dans les jeux 3D, consomme d'énormes quantités de textures, de formes, de coordonnées de pixels et d'autres objets pour construire une image sur l'écran du moniteur. . D'autres (en raison des limitations de la vitesse d'échange d'informations) n'ont pas besoin d'indicateurs aussi élevés. Divers appareils internes et externes sont connectés dans le schéma avec des flèches vertes.

Le monde intérieur du processeur

Toutes les commandes du processeur proviennent de la mémoire pour être exécutées sous forme binaire. Le format, le nombre, le sous-ensemble d'instructions dépendent de son architecture. La plupart d’entre eux sont incompatibles les uns avec les autres et suivent des idéologies différentes. Et aussi le type de commande dépend fortement du mode (profondeur de bits 8/16/32...) et de la source de données (mémoire, registre, pile...) avec laquelle le processeur travaille. La même action peut être représentée par des instructions différentes. Le processeur a des instructions pour ajouter deux opérandes (ADD X,Y) et en ajouter un à celui spécifié (INC X). L'ajout d'un triple à un opérande peut être effectué comme ADD X,3 ou en appelant trois fois INC X. Et, pour différents processeurs, il est impossible de prédire laquelle de ces méthodes sera optimale en termes de vitesse ou d'empreinte mémoire. Pour plus de commodité, les informations binaires sont écrites sous forme hexadécimale. Considérons une partie d'un programme familier (langage C dont la syntaxe est similaire à Java)
int func() {
    int i = getData("7") ;
    return ++i;
   ...
}
Code qui implémente les mêmes actions sous la forme d'une séquence d'instructions pour le processeur : ... 48 83 ec 08 bf bc 05 20 00 31 c0 e8 e8 fe ff ff 48 83 c4 08 83 c0 01 ... voilà à quoi ressemble réellement le langage de programmation de bas niveau pour le processeur Intel. Un fragment qui appelle une méthode avec un argument et renvoie le résultat incrémenté de un. Il s'agit d'un langage machine (code) qui est transféré directement, sans transformations, au processeur pour exécution. Avantages:
  • Nous sommes totalement maîtres de la situation, nous disposons des plus larges possibilités d'utilisation du processeur et du matériel informatique.
  • Toutes les options d'organisation et d'optimisation du code s'offrent à nous.
Inconvénients :
  • Il est nécessaire d'avoir une connaissance approfondie du fonctionnement des processeurs et de prendre en compte un grand nombre de facteurs matériels lors de l'exécution du code.
  • La création de programmes légèrement plus complexes que l'exemple donné entraîne une forte augmentation du temps passé à écrire du code et à le déboguer.
  • Dépendance à la plateforme : un programme créé pour un processeur ne fonctionnera généralement pas sur les autres. Il est possible que pour ce processeur, dans d'autres modes de fonctionnement, une édition de code soit nécessaire.
Les codes machine étaient largement utilisés à l’aube de l’informatique ; il n’existait aucune autre méthode de programmation à l’époque des pionniers de l’informatique. Actuellement, ils sont parfois utilisés par les ingénieurs en microélectronique lors du développement ou des tests de bas niveau de processeurs.

Langage d'assemblage (bas niveau)

Contrairement à un ordinateur, vous et moi percevons mieux les informations sous forme textuelle/sémantique plutôt que sous forme numérique. Vous pouvez facilement nommer une cinquantaine de noms de contacts sur votre smartphone, mais il est peu probable que vous puissiez écrire par cœur leurs numéros de téléphone correspondants. C'est la même chose avec la programmation. Nous gravissons les échelons des types en suivant trois étapes de base :
  • Associons une instruction symbolique à des groupes d'instructions de processeur numérique qui effectuent les actions correspondantes.
  • Soulignons séparément les arguments des instructions du processeur.
  • Introduisons la possibilité de nommer les zones de mémoire, les variables et l'emplacement des commandes individuelles.
Comparons des fragments du programme précédent en code machine (au centre) et en langage assembleur (à droite) :
2004b0     48 83 ec 08      sub    $0x8,%rsp
2004b4     bf bc 05 20 00   mov    $0x2005bc,%edi
2004b9     31 c0            xor    %eax,%eax
2004bb     e8 e8 fe ff ff   callq  getData
2004c0     48 83 c4 08      add    $0x8,%rsp
2004c4     83 c0 01         add    $0x1,%eax
Comme vous pouvez le constater, le processus d'écriture d'un programme a été simplifié : il n'est pas nécessaire d'utiliser des ouvrages de référence pour générer des valeurs de commande numériques, calculer les longueurs de transition, distribuer les données en mémoire entre ses cellules et d'autres fonctionnalités du processeur. Nous décrivons l'action requise à partir d'un ensemble de commandes symboliques et les arguments nécessaires à la logique d'exécution, puis le programme de traduction traduit le fichier texte en un ensemble de zéros et de uns compréhensibles par le processeur. Avantages:
  • Le processus d'écriture et de modification du code a été simplifié.
  • Le contrôle de toutes les ressources matérielles a été maintenu.
  • Il est relativement plus facile de porter le programme sur d'autres plates-formes, mais celles-ci nécessitent des modifications en fonction de la compatibilité matérielle.
Inconvénients :
  • Le langage assembleur est un langage de programmation de bas niveau. Créer même de petites sections de code est difficile. De plus, il faut également prendre en compte le fonctionnement spécifique de l’équipement.
  • Dépendance à la plateforme.
L'exemple de démonstration Java le plus populaire :
public static void main(String[] args) {
    System.out.println("Hello World!");
}
ressemblera (syntaxe NASM, en utilisant l'API Windows et kernel32.lib) à ce qui suit :
global _main
	extern  _GetStdHandle@4
	extern  _WriteFile@20
	extern  _ExitProcess@4

	section .text
_main:
	; DWORD  bytes;
	mov 	ebp, esp
	sub 	esp, 4

	; hStdOut = GetstdHandle( STD_OUTPUT_HANDLE)
	push	-11
	call	_GetStdHandle@4
	mov 	ebx, eax

	; WriteFile( hstdOut, message, length(message), &bytes, 0);
    push	0
	lea 	eax, [ebp-4]
	push	eax
	push	(message_end - message)
	push	message
	push	ebx
	call	_WriteFile@20

	; ExitProcess(0)
	push	0
	call	_ExitProcess@4

	; never here
	hlt
message:
	db  	'Hello, World', 10
message_end:
Comme les codes machine, le langage assembleur est plus souvent utilisé par les ingénieurs et les programmeurs système. Il est utilisé pour écrire des parties du noyau du système d'exploitation dépendantes du matériel et qui sont critiques en termes de temps ou essentielles à l'implémentation des fonctionnalités de pilotes pour divers périphériques. Mais ces derniers temps, ils y ont de moins en moins recours, car son utilisation réduit considérablement la portabilité des programmes vers d'autres plateformes. Parfois, ils utilisent le processus de désassemblage - ils créent une liste assembleur d'un programme à partir de codes numériques pour analyser la logique d'exécution de petits fragments. Dans de rares cas, si le code original de haut niveau n'est pas disponible : analyse des virus pour les combattre ou perte du code source. Le langage assembleur est considéré comme la première/deuxième génération (nous ne considérerons pas séparément les pseudocodes avant l'émergence de l'assembleur et leur différence avec les commandes symboliques). Je voudrais souligner l'utilisation de l'assembleur dans Demo Scene : une fusion d'art, de mathématiques et de codage de bas niveau, incarnant les idées artistiques de leurs créateurs sous la forme de programmes qui génèrent des clips vidéo avec des ressources limitées. Souvent, la taille totale du programme et du fichier de données ne doit pas dépasser 256 octets (le format 4/64 kilo-octets est également populaire). Voici un exemple de programme de 4 Ko :

Langues du groupe C/Fortran (niveau intermédiaire/haut)

Avec le développement des capacités de la technologie informatique, le nombre de fonctionnalités et le calendrier de mise en œuvre du code en assembleur n'étaient plus satisfaisants. Les coûts d'écriture, de test et de maintenance des programmes ont augmenté d'un ordre de grandeur plus rapide que leurs capacités. Il fallait réduire les exigences du programmeur en termes de connaissance du fonctionnement de l'équipement, pour lui donner un outil qui lui permettrait d'écrire dans des langages proches de la logique humaine. Passez à un nouveau niveau de types de langages de programmation. Offrir la possibilité de se diviser en différents modules avec des appels séquentiels supplémentaires (paradigme de programmation procédurale), fournir différents types de données avec la possibilité de les construire, etc. De plus, ces mesures ont apporté une portabilité améliorée du code vers d'autres plates-formes, une organisation plus confortable de travail en équipe. L'un des premiers langages prenant en charge tout ce qui précède était Fortran, développé dans les années 50 du siècle dernier . La possibilité de créer sous forme de texte une description de la logique d'exécution à l'aide de boucles, de branches, de sous-programmes, d'opérer avec des tableaux et de présenter des données sous forme de nombres réels, entiers et complexes a ravi les ingénieurs et les scientifiques. En peu de temps, des « cadres » scientifiques et des bibliothèques ont été créés. Tout cela était une conséquence du fait que Fortran est toujours d'actualité aujourd'hui, bien que dans un environnement scientifique étroit, et se développe, car le bagage de développements est très important, la bibliothèque IMSL seule se développe activement depuis 1970 (!), comment Vous souvenez-vous de nombreux logiciels pertinents similaires ? -les anciens ? Une autre branche de développement des langages à ce niveau est le C. Si Fortran est devenu un outil pour les scientifiques, alors C a été créé pour aider les programmeurs à créer des logiciels d'application : systèmes d'exploitation, pilotes, etc. Le langage permet de contrôler manuellement l'allocation de mémoire et donne un accès direct aux ressources matérielles. Les programmeurs C doivent contrôler les entités de bas niveau, c'est pourquoi beaucoup pensent que C est un langage assembleur avancé et est souvent appelé langage « de niveau intermédiaire ». Ayant introduit le typage des données dans l'assembleur, des éléments de programmation procédurale et modulaire, le langage C reste l'un des principaux langages de programmation système, ce qui est également facilité par le développement rapide de la microélectronique ces derniers temps. Toutes sortes de gadgets, contrôleurs, réseaux et autres périphériques nécessitent des pilotes, la mise en œuvre de protocoles de collaboration et d'autres logiciels de niveau relativement bas pour mettre en œuvre l'interaction avec l'équipement. Tout ce qui précède contribue à la demande actuelle pour cette langue. Les principes orientés objet et fonctionnels ont été développés sous la forme de C++, C#, Java, en s'inspirant beaucoup de la syntaxe C.
  • Simplification du processus de création de code : introduction de types, découpage en modules, réduction des listings de programmes.
  • Logique transparente de l'algorithme sous-jacent en raison de l'abandon des codes machine vers des commandes plus lisibles par l'homme dans un style sémantiquement descriptif.
  • Portabilité. Il suffisait de recompiler le texte du programme pour l'exécuter sur une autre plateforme (éventuellement avec une légère modification).
  • Vitesse des programmes compilés.
Inconvénients :
  • Absence de gestion automatique de la mémoire et nécessité d'une surveillance constante.
  • Manque de mise en œuvre de concepts de programmation orientée objet et fonctionnelle.

Développement de langages de haut niveau

Les langages de programmation de haut niveau, en termes de création de logiciels, commencent de plus en plus à s'éloigner des codes machine et à mettre en œuvre divers paradigmes de programmation en plus des paradigmes procéduraux. Ceux-ci incluent également la mise en œuvre de principes orientés objet. C++, Java, Python, JavaScript, Ruby... - la gamme de langages de ce type est aujourd'hui la plus populaire et la plus demandée. Ils offrent plus de possibilités de mise en œuvre d'une variété de logiciels et il est impossible de déterminer clairement la « spécialisation » de chacun d'eux. Mais la popularité des applications dans les domaines concernés est due aux bibliothèques/frameworks permettant de travailler avec elles, par exemple : JavaScript - Frontend. Le langage a été conçu pour l'interaction entre un navigateur Web client et un utilisateur et un serveur distant. Les bibliothèques les plus populaires sont Angular, React et VUE. Actuellement, il est relativement activement utilisé sur les serveurs Web et autres (backend), Node.js est particulièrement populaire. Ruby -Backend. Il est utilisé pour créer des scripts (fichiers de service) et sur des serveurs web. Le framework principal est Ruby On Rails. Python est un domaine scientifique et technique (outre le domaine Web). C'est une alternative aux packages informatiques et mathématiques standards (Mathematica, Octave, MatLab...), mais possède la sémantique habituelle du langage et un grand nombre de bibliothèques. A de nombreux fans dans le domaine des systèmes d’apprentissage automatique, des statistiques et de l’intelligence artificielle. Les bibliothèques fréquemment utilisées incluent Django, numpy, pandas et tensorflow. C++ – Développement universel et évolutif du langage C. Fournit des capacités de programmation fonctionnelles et orientées objet sans perdre la capacité d’interagir avec le matériel de bas niveau. De ce fait, la productivité et la flexibilité sont réalisées lors de la création de logiciels, mais le prix correspond également : une barrière à l'entrée élevée en raison de la spécification complexe du langage, la nécessité d'un contrôle indépendant sur les ressources lors de l'exécution du programme. De nombreux logiciels mono-utilisateur et système sont écrits avec lui : modules du système d'exploitation (Windows, Symbian...), jeux, éditeurs (Adobe Photoshop, Autodesk Maya...), bases de données (MSSQL, Oracle...), lecteurs ( WinAmp...), etc. Il est à noter que les logiciels modernes sont un produit complexe dont le développement utilise plusieurs langages de programmation à la fois, et il peut être très difficile de déterminer le degré de participation de chacun d'eux à le résultat global.

Progrès supplémentaire

Récemment, un autre type de programmation a gagné en popularité - fonctionnel (poursuite du développement du niveau de langage) . Voici un autre type d'abstraction pour les calculs : des fonctions qui prennent un ensemble de fonctions comme arguments et en renvoient une autre. Le rôle des variables est joué par les mêmes fonctions (les variables qui nous sont familières sont simplement des expressions constantes, semblables à final avant une déclaration de type en Java). La fonction elle-même est fermée dans sa portée, le résultat de son opération ne dépend que des arguments passés. Deux propriétés remarquables en découlent :
  • Pour tester, nous n'avons besoin que d'arguments de fonction (le résultat du travail ne dépend pas de variables externes, etc.).
  • Un programme de style fonctionnel est miraculeusement prêt pour la concurrence : des appels de fonction séquentiels peuvent être émis dans les threads voisins (puisqu'ils ne sont pas affectés par des facteurs externes) et ne nécessitent pas de verrous (c'est-à-dire qu'il n'y a pas de problèmes de synchronisation). Une bonne incitation à consacrer du temps à ce sujet, compte tenu de l'adoption généralisée des processeurs multicœurs.
Cependant, le seuil d'entrée est plus élevé que pour la POO : pour un code efficace, il est nécessaire de construire un programme décrivant l'algorithme d'exécution sous forme de fonctions. Mais aussi pour un style purement fonctionnel, il serait bien de connaître les bases de la logique et de la théorie des catégories. Les plus populaires sont Haskell, Scala, F#. Mais n'ayez crainte, des éléments de programmation fonctionnelle sont apparus en Java (ainsi que dans d'autres langages modernes de troisième génération) et ils peuvent être combinés avec la POO. Vous apprendrez à connaître tous ces détails plus en détail lors du stage en ligne JavaRush. Le domaine de la programmation logique (le prochain niveau de langages) n'a pas encore trouvé d'application pratique à grande échelle en raison de sa faible demande. La création de programmes nécessite une connaissance des principes fondamentaux des mathématiques discrètes, de la logique des prédicats, des outils de contraintes et d'autres branches de la logique mathématique. Le langage actif le plus populaire est Prolog.

Conclusion

Actuellement, les langages les plus courants sont la POO. Java, depuis sa création, a toujours été parmi les premiers, généralement parmi les trois langages les plus populaires. En plus de la POO, il contient des éléments de programmation fonctionnelle et vous pouvez combiner différents styles d'écriture de vos programmes. La gamme d'applications de Java est très large - il s'agit de tâches commerciales, de mise en œuvre de serveurs Web (backend), du langage principal pour la création d'applications Android, d'environnements et de postes de travail de programmation multiplateformes (IDE/AWM) et de modélisation, et bien plus encore. . La position de Java est particulièrement forte dans le secteur des entreprises - un domaine de logiciels d'entreprise qui nécessite un code de haute qualité et de longue durée ainsi que la mise en œuvre de la logique métier la plus complexe.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION