Essayons d'imaginer la chimie sans le tableau périodique de Mendeleïev (1869). Combien d'éléments fallait-il garder en tête, et dans un ordre aléatoire... (À l'époque - 60.)
Pour cela, il suffit de penser à un ou plusieurs langages de programmation. Les mêmes sentiments, le même désordre créatif.
Et maintenant, nous pouvons ressentir les sentiments des chimistes du XIXe siècle, lorsqu'on leur a proposé tous leurs connaissances, et un peu plus, dans un seul tableau périodique.

Le livre « Matriochka C. Système en couches du langage de programmation » présente toutes les unités du langage C comme sur un plateau. Cela permet de les organiser, de corriger les informations obsolètes et même de préciser la notion même de programme.
Aujourd'hui, les informations sur la programmation ont besoin d'être systématisées encore plus que les éléments chimiques il y a 150 ans.
La première nécessité - l'enseignement. Mendeleïev a commencé à créer son système lorsqu'il a été confronté à la question : par quel élément commencer à donner des cours : O, H, N, He, Au... Pour lui, c'était plus facile - il enseignait la chimie aux meilleurs - étudiants de l'université de Saint-Pétersbourg. Alors que la programmation est déjà enseignée à l'école et va bientôt commencer à la maternelle.
La deuxième nécessité - l'approche scientifique. Grâce au tableau périodique, de nouveaux éléments ont été découverts et des informations sur les anciens ont été corrigées. Elle a aidé à créer le modèle de l'atome (1911). Et ainsi de suite.
La troisième nécessité - préciser la notion de programme.
La programmation moderne est coincée d'un pied dans les années 50 du XXe siècle. À l'époque, les programmes étaient simples, tandis que les machines et les langages machines étaient complexes, donc tout tournait autour des machines et des langages.
Maintenant, c'est l'inverse : les programmes sont complexes et primaires, les langages sont simples et secondaires. Cela s'appelle l'approche appliquée, qui semble familière à tous. Mais les étudiants et les développeurs continuent d'être convaincus que tout reste inchangé.
Cela nous ramène à la première conférence du Privat-Docteur Mendeleïev. Que dire aux étudiants de première année ? Où est la vérité ? Voici la question.
Sa réponse est proposée par le livre « Matriochka C. Système en couches du langage de programmation ». En effet, il s'adresse non seulement aux étudiants, mais aussi aux programmeurs expérimentés, car c'est eux qui doivent chercher la vérité et renverser leur vision du monde, c'est-à-dire nous.
Voici un résumé du livre.
1. Introduction
En 1969, le langage C a été créé, devenant ainsi un langage fondamental de la programmation et le demeurant depuis 50 ans. Pourquoi est-ce le cas ? Tout d'abord, parce que C est un langage pratique , qui donne un aspect humain au programme plutôt que machine. Cet accomplissement a été renforcé par les langages de la famille C : C++, JavaScript, PHP, Java, C# et d'autres. Deuxièmement, c'est un langage court et élégant.
Cependant, le langage C lui-même est souvent confondu avec l'assembleur, compliquant ainsi et déformant sa perception. L'autre extrême est l'imposition d'une certaine « philosophie » au langage : procédurale, orientée objet, fonctionnelle, compilée, interprétée, typée, etc. Cela ajoute des émotions, mais n'aide pas à mieux décrire le langage.
La vérité se situe au milieu, en ce qui concerne le langage C — strictement au milieu entre la perception philosophique et machine.
Le langage C n'est pas autonome, il obéit à un discours écrit ordinaire, et en même temps, il contrôle lui-même le langage assembleur. Cette position est décrite par le modèle de discours du programme, selon lequel le programme est divisé en trois formes subordonnées : discours, code, commande. Le langage C répond à la deuxième forme, le code.
En définissant la place du langage dans le programme, on peut organiser les informations le concernant, ce qui rend le système de couches du langage du programme, représentant le langage C à la manière du système périodique de Mendéléiev — sur une seule page.
Ce système est construit en tenant compte de la communauté des langages appliqués, découlant de leur subordination discursive. Un ensemble d'unités de la Matriochka C permet de décrire et de comparer différents langages, créant une série de Matriochkas : C++, PHP, JavaScript, C#, MySQL, Python, etc. Il est juste et approprié que différents langages soient décrits par les unités du langage fondamental.
2. CHAPITRE 1. Modèle de discours du programme. C compréhensible
Dans le premier chapitre, le modèle de discours du programmeest présenté, reflétant l'approche appliquée. Selon celui-ci, le programme a trois formes successives évidentes :
- discours — le discours direct du programmeur qui résout un problème,
- code — la codification de la solution sous une forme mathématique en langage C (ou tout autre)
- et commande — les instructions machine immédiates.
Le modèle de discours explique pourquoi C est un langage simple et compréhensible. C est construit à l'image et à la ressemblance de notre discours humain habituel.
Le premier type de programme est le discours direct du programmeur. Le discours correspond à la pensée humaine. Les programmeurs débutants écrivent des programmes en utilisant d'abord leur langue maternelle, puis traduisent progressivement leurs actions en langage de code. C'est selon ce modèle que le langage C a été créé.
Les raisonnements du programmeur, exprimés verbalement, se transforment en une forme codée et numérique. Cette transformation doit être appelée réflexion, car le discours et le code ont une nature commune (réflexion — naissance — genre). C'est assez évident si l'on compare la forme verbale (à gauche) et la forme codée (à droite) du programme.

Il est intéressant de noter que la réflexion se produit très simplement — avec seulement deux types d'expressions.
Cependant, la description moderne du langage C (de 1978) ne contient pas de liste suffisante de noms ni pour décrire le langage en général, ni pour la tâche de réflexion en particulier. Par conséquent, nous devons nous engager dans la créativité et introduire ces noms.
Le choix des mots doit être précis et clair. Pour cela, une approche particulière a été nécessaire, résumée comme suit : une utilisation stricte de la langue maternelle. Pour les Anglais, ce serait l'anglais, mais nous ne sommes pas des Anglais. Donc, utilisons ce que nous avons et essayons de parler en français.
La réflexion est réalisée par deux types d'expressions :
- calcul (Cc) — reflète le changement des propriétés d'un objet. La propriété d'un objet est exprimée par un nombre, donc une action sur la propriété est une action sur le nombre — une opération.
- subordination (Sc) — reflète le changement de l'ordre des actions. Le modèle de Sc est la proposition complexe avec subordination, donc la plupart des types de Sc commencent par des conjonctions subordonnées comme «si», «sinon», «tant que», «pour». D'autres types de Sc les complètent.
À propos, pouvez-vous croire qu'il n'y a pas de nom pour les expressions de calcul dans la description de C — elles sont simplement appelées «expressions» ? Après ça, il n'est pas surprenant qu'il n'y ait pas de nom et de regroupement pour le genre subordination, et en général, un manque de noms, de définitions et d'abstractions. Tout cela parce que le célèbre K/R («Le langage C», Kernighan/Ritchie, 1978) n'est pas une description, mais un guide d'application du langage.
Cependant, avoir une description du langage serait tout de même souhaitable. C'est pourquoi il est proposé le système de couches du langage du programme.
3. CHAPITRE 2. Système en couches. C bref
Toute description doit être précise et aussi concise que possible. Dans le cas du langage de programmation, une description frontale est difficile.
Nous avons un programme. Il est constitué de modules. Les modules sont composés de sous-programmes et de sélections (structure). Les sous-programmes se composent d'expressions distinctes : déclarations, calculs, sous-ordres. Il existe au total dix types de sous-ordres. Les sous-ordres relient des sous-niveaux et des sous-programmes. Il y a aussi plusieurs déclarations. D'ailleurs, les déclarations ne sont pas seulement incluses dans les sous-programmes et sous-niveaux, mais également dans les modules et les sélections. La plupart des expressions sont composées de mots, si difficiles à décrire que l'on se contente généralement de les donner sous forme de deux listes : mots de base et mots dérivés, avec lesquels il faudra se familiariser tout au long de l'apprentissage et de l'utilisation de la langue. Ajoutons à cela la ponctuation et une série d'autres expressions.
Dans cette présentation, il est difficile de comprendre qui se tenait sur qui.
Une approche hiérarchique directe de la description de la langue serait excessivement complexe. La recherche de chemins détournés conduit à une description de la langue basée sur sa nature verbale et son aspect commandant. Ainsi est née le Système Couche, qui coïncide en partie avec le Système Périodique de Mendeleïev, qui est également couche. Il s'est avéré, 42 ans après sa publication (1869), que la périodicité du système est liée aux couches électroniques (1911, modèle de l'atome de Bohr-Rutherford). De plus, le Système Couche et le Système Périodique partagent la disposition tabulaire de toutes les unités sur une seule page.
La description des unités de langue est concise — seulement 10 types d'expressions et 8 types d'autres unités, et elle est à la fois substantielle et visuelle. Bien que peu familière pour une première rencontre.
Les unités de langue sont divisées en 6 niveaux :
- ordres — lignes du tableau
- sections — groupes particuliers de types (parties de la première ligne)
- types — cellules (niveau principal de division)
- sous-types — séparateurs des types (niveau rare)
- types — formules d'unités en bas de la cellule ou séparément
- exemples — les unités elles-mêmes (uniquement pour les mots)
Les exemples de mots sont décrits par le dictionnaire — un sous-système distinct composé des mêmes six niveaux.
L'élément verbal de la langue C est assez évident, bien qu'il mérite tout de même d'être décrit. En revanche, la partie commande de la langue est liée à la gestion de la compilation, durant laquelle un troisième type de programme est créé — le programme de commande. Ici, nous touchons au côté le plus captivant de la langue C — sa beauté.
4. CHAPITRES SUIVANTS. Le beau C
Le langage C est à la base de la programmation moderne. Pourquoi ? Tout d'abord, en raison de sa plus grande adéquation avec le langage naturel. Ensuite, parce qu'il a contourné magnifiquement les limitations du traitement numérique par machine.
Qu'a proposé le C ? Image et type.
Le mot « image » est la traduction du mot anglais « type », qui vient du grec « prototype » — « modèle ». En russe, le mot « тип » ne transmet pas la rigueur du concept exprimé, en plus il se mélange avec la signification fonctionnelle « вид ».
À l'origine, l'image résolvait un problème purement machine de calcul, puis elle est devenue la piste de décollage pour la naissance des langages orientés objet.
Le type résolvait immédiatement plusieurs tâches — tant machines qu'appliquées. C'est pourquoi l'examen commencera par l'image unidimensionnelle et passera au type multitâche.
Une des caractéristiques désagréables de la programmation historique est que la plupart des concepts, y compris les fondamentaux, sont donnés sans définitions. « Le langage de programmation (nom de rivières) a des types de chiffres entiers et flottants... » — et on passe à autre chose. Qu'est-ce qu'un « type » (image) — la définition n'est pas nécessaire, car les auteurs eux-mêmes ne le comprennent pas complètement et le balayent « pour clarifier ». S'ils sont acculés au mur, ils donneront une définition floue et inutile. Cela aide beaucoup à se cacher derrière des mots étrangers : pour les auteurs russes — derrière les mots anglais (type), pour les Anglais — derrière les mots français (subroutine), grecs (polymorphisme), latins (encapsulation) ou leurs combinaisons (polymorphisme ad-hoc).
Mais ce n'est pas notre destin. Notre choix — des définitions avec les yeux grands ouverts dans un russe clair.
Image
Image — c'est un nom prototype de la grandeur, déterminant 1) les propriétés propres de la grandeur et 2) le choix d'opérations pour la grandeur.
Au mot « type » (vue) correspond la première partie de la définition : « propriétés propres de la grandeur ». Mais le sens principal de l'image réside dans la deuxième partie : « choix d'opérations pour les grandeurs ».
Le point de départ pour introduire l'image dans le langage C est un calcul courant, par exemple, l'opération d'addition.
Mathématiques sur papier, écrites à la main ou typées, ne font pas de distinction particulière entre les types de chiffres, les considérant généralement comme réels. Par conséquent, leurs opérations sont univoques.
Machine Les mathématiques distinguent strictement les nombres en entiers et en décimaux. Différents types de nombres sont stockés différemment en mémoire et sont traités par différentes instructions du processeur. Par exemple, les instructions d'addition des entiers et des décimaux représentent deux instructions différentes, correspondant à deux nœuds différents du processeur. En revanche, l'instruction d'addition d'un entier et d'un décimal n'existe pas.
Appliquée Les mathématiques, c'est-à-dire le langage C, distinguent les types de nombres mais unifient les opérations : l'addition pour les entiers et/ou les décimaux s'exprime par un seul signe d'opération.
Une définition claire du concept de forme permet de parler de manière précise de deux autres concepts : quantité et opération.
Quantité et opération
Quantité — le nombre traité.
Opération — le traitement des valeurs des quantités d'origine (arguments) pour obtenir le nombre final (le résultat).
Quantité et opération sont interdépendantes. Chaque opération est une quantité, car elle a un résultat numérique. Et chaque quantité est le résultat du transfert de valeur vers le registre du processeur/de ce dernier, c'est-à-dire — le résultat de l'opération. Malgré cette interdépendance, il est cependant essentiel de pouvoir les décrire séparément, même si cela implique la répétition d'un même mot dans différentes sections du dictionnaire, ce qui se produit dans le ma3.
L'approche machine divisait tous les nombres utilisés par le programmeur en des commandes et données. Auparavant, les deux étaient effectivement des nombres, par exemple, les instructions étaient écrites sous forme de codes numériques. Cependant, dans les langages appliqués, les instructions ont cessé d'être des nombres et sont devenues mots et signes d'action. Seules les « données » sont restées des nombres, mais continuer à les désigner ainsi est absurde, car en passant de la perspective machine à celle mathématique, les nombres sont des quantités qui se divisent en données d'origine (données) et en résultats (recherchés). « Donnée inconnue » semblerait ridicule.
Les instructions se sont également divisées en deux types d'actions : les actions mathématiques et les instructions auxiliaires. Les actions mathématiques sont des opérations. Nous aborderons les instructions auxiliaires plus tard.
Dans les langages C, les opérations mathématiques univoques ou singulières, que ce soit sur papier ou en machine, deviennent presque systématiquement multiples.
Les opérations multiples – plusieurs opérations homonymes avec des formes d'arguments différentes et des actions proches par leur sens.
Une opération entière correspond à des arguments entiers, et une opération décimale à des arguments décimaux. Cette différence est particulièrement évidente lors de l'opération de division, lorsque l'expression 1/2 donne un résultat de 0, et non 0,5. Un tel enregistrement ne respecte pas les règles de l'arithmétique traditionnelle, mais le langage C ne cherche pas à les suivre (contrairement à Fortran) — il joue selon ses propres règles. Dans le cas d'un mélange de nombres entiers et décimaux, la seule méthode correcte est
la conversion des valeurs des arguments — une transformation sélective de la valeur d'une forme à une autre. En effet, lors de l'addition d'un nombre entier et d'un nombre décimal, le résultat est un nombre décimal, donc la forme de l'opération implique l'opération de transformation de l'argument entier en valeur décimale. Une série d'opérations reste
uniques . De telles opérations ne sont définies que pour un seul type d'arguments : le reste de la division — pour les arguments entiers, et l'alignement (opérations bit à bit) — pour les entiers naturels. Ma3 indique la multiplicité des opérations avec des signes (#^) en précisant les formes pour lesquelles l'opération est définie. C'est une propriété importante, mais souvent négligée, de chaque opération., et Toutes les fonctions sont des opérations uniques arbitraires. L'exception est faite pour les opérateurs —des fonctions sans parenthèses
, intégrées dans le langage (opérations de base). L'assistance— une action accessoire à l'opération.
Si l'on considère l'opération comme l'action principale, on peut en distinguer deux accessoires qui la soutiennent et en diffèrent. Ce sont 1) la gestion de la variable et 2) la soumission. Cette action est appelée
Si l'on considère l'opération comme l'action principale, on peut en distinguer deux accessoires qui la soutiennent et en diffèrent. Ce sont 1) la gestion de la variable et 2) la soumission. Cette action est appelée assistance.
Il convient ici de faire une pause et de parler séparément des traductions russes des manuels de programmation. Dans le texte K/R, un nouveau mot a été introduit pour décrire les actions statement.
qui a tenté de séparer les concepts de la commande machine en différentes actions : 1) opération, 2) déclaration et 3) soumission (appelée « constructions de contrôle »). Cette tentative a été enterrée par les traducteurs russes, qui ont remplacé « expression » par « opérateur », ce qui : est devenu un synonyme du mot machine « commande », s'est avéré être un synonyme de l'expression « signe d'action »,
- et a également acquis un nombre illimité de significations additionnelles. En d'autres termes, cela s'est transformé en quelque chose ressemblant à l'article anglais « euh... ».
- Considérons les actions accessoires, ou
- les assistances.
Gestion de la variable Gestion de la variable.
Gestion de la variable
Gestion de la variable (UP) — création/suppression de cellules de variable.
L'UP se produit implicitement lors de la déclaration d'une variable, qui est déjà écrite pour une autre raison — pour indiquer la dimension de la grandeur. Seul un type est géré explicitement. de variables additionnelles à l'aide des fonctions malloc() et free().
Il convient de noter que les actions implicites sont plus faciles à écrire, car elles ne nécessitent rien de plus à écrire, mais elles sont plus difficiles à comprendre — elles sont plus difficiles à prendre en compte et à interpréter.
Subordination
Subordination — connexion/déconnexion de sections de couche.
Le langage C a proposé une méthode de contrôle de l'ordre des actions différente de celle de l'assembleur — la subordination. Elle reflète et développe la phrase subordonnée, avec une séparation explicite entre la partie principale (phrase de subordination) et la partie subordonnée (sections de sous-niveau/sous-programme).
Tant la déclaration que la subordination sont entièrement basées sur le concept de couche.
Une couche
Une couche — est un ensemble d'expressions limité et unidimensionnel.
Une couche a explicitement et implicitement pris en charge plusieurs tâches :
- organisation du programme,
- limitation de la visibilité des noms (implicitement),
- gestion des variables (cellules mémoire) (implicitement),
- définition des sections subordonnées pour la subordination,
- définition des fonctions et choix, et autres.
Dans les langages machine, il n'y avait pas de concept de couche, donc cela n'est pas apparu dans le C/R, et s'il n'y avait pas quelque chose là-bas — l'introduire dans les livres ultérieurs serait une hérésie et un libertinage. Par conséquent, le concept de couche n'a pas du tout émergé, bien qu'il soit extrêmement utile et tout à fait évident.
Sans couche, il est impossible d'expliquer de manière concise et claire de nombreuses actions et règles du programme. Par exemple, pourquoi un simple goto, comme trois kopecks, est mauvais, alors qu'une boucle while compliquée est bonne. On peut seulement s'en prendre à son impuissance, comme le faisait Dijkstra (« la qualification des programmeurs est une fonction inverse de la fréquence d'apparition des instructions goto dans leurs programmes ». En résumé, seuls des idiots utilisent goto. Niveau de justification — Dieu.) Cependant, cela n'est pas si terrible si vos livres ne doivent rien expliquer du tout, mais comme nous l'avons déjà dit, ce n'est pas notre destin.
En fait, on peut supposer que Dennis Ritchie a laissé le mot-clé goto comme un moyen de rechercher un certain concept non nommé, car il n'y avait ni nécessité ni beauté dans l'expression goto. Cependant, il y avait un besoin d'une explication simple et claire des nouveaux principes du langage, que Ritchie ne voulait pas fournir, et qui reposent précisément sur ce concept. couche.
Dérive
Dérive — modification des propriétés habituelles du nouveau nom.
La dérive la plus importante est liée aux propriétés de couche du programme et est décrite par un seul mot : « static », qui a des significations différentes dans chacun des types de couches.
5. DERNIER CHAPITRE. Univers des langages appliqués
Les langages appliqués — ce sont des langages figuratifs possédant une image, « typés ». Ils reposent sur l'utilisation explicite ou implicite d'une image. Et ici encore, on observe une contradiction : une image explicite — plus compréhensible, mais moins pratique, et vice versa.

(Le balisage du tableau n'a pas encore été fourni, donc le tableau est donné sous forme d'image.)
Après C, le développement des langages appliqués a suivi la voie de l'augmentation de leur figurativité. Le plus important pour comprendre ce haut niveau de figurativité est le descendant direct de C — le langage C++. Il développe l'idée d'une sélection arbitraire d'opérations pour des valeurs et la concrétise sur la base de l'expression C de sélection, qui reçoit un nouveau nom — objet. Cependant, C++ n'est pas aussi concis et expressif que C, en raison du surchargement de nouveaux types de sélection et des règles qui y sont associées. À propos, parlons de la « surcharge ».
Surcharge et polymorphisme
Le mot « surcharge » (overload) — un terme obsolète du langage machine, désignant la création d'opérations multiples.
Pour les programmeurs machine (système) la multiplicité d'opérations pouvait être irritante : « Que signifie ce signe (+) : addition de nombres entiers, addition de nombres décimaux ou simplement décalage ?! À notre époque, on n'écrivait pas cela ! » D'où la connotation négative du mot choisi (« surenchère », « ras-le-bol »). Pour le programmeur appliqué, les opérations multiples sont la pierre angulaire, la principale réalisation et l'héritage du langage C, si naturelles qu'elles passent souvent inaperçues.
Dans le langage C++ la multiplicité elle s'est propagée non seulement aux opérations initiales, mais aussi aux fonctions — tant individuelles que regroupées en classes — méthodes. Avec de multiples méthodes est apparue la possibilité de les redéfinir dans des classes étendues, qui a été vagues nommée « polymorphisme ». L'association du polymorphisme et de la surcharge a donné un mélange explosif, qui s'est divisé en deux polymorphismes : « véritable » et « ad-hoc ». On ne peut comprendre cela qu'en opposition aux noms attribués. Des noms étrangers pavent la route vers ad.
Une déclaration de type « surcharge » serait mieux exprimée par le mot redéclaration — ajoutant une déclaration de la même fonction avec des arguments d'un autre type.
Une déclaration de type « polymorphisme » devrait plutôt être appelée redéclaration — une déclaration qui recouvre dans une nouvelle couche d'extension la fonction du même nom avec des arguments du même type.
Il sera alors facile de comprendre que les méthodes ayant le même nom mais des types différents (arguments) — sont redéclarées, alors qu'un même type — est redéclaré.
Les mots russes résolvent.
Piste d'atterrissage
L'examen des concepts des langages de haut niveau confirme l'importance d'une définition claire des concepts fondamentaux. Avec un C correctement décrit, l'apprentissage des langages de haut niveau sera facile et agréable.
C'est particulièrement important pour les langages de haut niveau implicites (PHP, JavaScript). Pour eux, l'importance des objets (types composés) devient encore plus élevée que dans C++, mais le concept même de type devient implicite et difficile à saisir. En termes de commodité, ils sont devenus plus simples, mais en termes de compréhension — plus complexes.
C'est pourquoi il est préférable de commencer l'apprentissage des langages de programmation par le langage C et de progresser ensuite dans l'ordre d'apparition des langages de la famille C.
Il en va de même pour la description des langages. Différents langages ont un ensemble de types d'unités coïncidant, ou moins, qu'en C. Le nombre de types et d'exemples peut varier dans les deux sens : C++ a plus de types que C, tandis que JavaScript en a moins.
Un langage méritant une mention spéciale est MySQL. À première vue — rien à voir, mais il se décrit très bien avec Matriochka, et la familiarité avec lui devient plus rapide et plus simple. Ce qui est important, compte tenu de son importance pour le web — la route principale de la programmation moderne. Et là où il y a MySQL, il y a d'autres SQL. Eh bien, et tous les Fortrans-Pascals-Pythons se décrivent également avec Matriochka, dès que l'on s'y met.
Nous nous attendons à de grandes réalisations : une description pratique du langage C et une description uniforme des langages qui le suivent. « Nos objectifs sont clairs, les tâches sont définies. Au travail, camarades ! (Applaudissements enthousiastes et prolongés, se transformant en ovation. Tout le monde se lève.) »
Vos avis seront accueillis avec un grand soin, votre aide pour créer le site des matriochkas sera accueillie avec une immense gratitude. Des informations plus complètes sur le livre sont disponibles sur un site habilement caché dans la matriochka C.
Source : habr.com
