Matriochka C. Système de langage de programme en couches

Essayons d'imaginer la chimie sans le tableau périodique de Mendeleïev (1869). Combien d'éléments fallait-il garder à l'esprit, et sans ordre particulier... (Puis - 60.)

Pour ce faire, il suffit de penser à un ou plusieurs langages de programmation à la fois. Mêmes sentiments, même chaos créatif.

Et nous pouvons désormais revivre les sentiments des chimistes du XIXe siècle lorsqu'on leur proposait toutes leurs connaissances, et un peu plus, dans un seul tableau périodique.

Matriochka C. Système de langage de programme en couches


Le livre « Matriochka C. Le système en couches de langage de programme" présente toutes les unités du langage C en un coup d'œil. Cela vous permet de les organiser, de corriger les informations obsolètes et même de clarifier le concept même du programme.

Aujourd’hui, l’information sur la programmation a encore plus besoin d’être systématisée que les éléments chimiques il y a 150 ans.

La première nécessité est d’enseigner. Mendeleïev a commencé à créer son système lorsqu'il a été confronté à la question de savoir par quel élément commencer à donner des cours : O, H, N, He, Au... En même temps, c'était plus facile pour lui - il enseignait la chimie aux meilleurs - étudiants de Université de Saint-Pétersbourg. La programmation est déjà enseignée à l’école et débutera bientôt à la maternelle.

Le deuxième besoin est une approche scientifique. Grâce au tableau périodique, de nouveaux éléments ont été découverts et les informations sur les anciens ont été corrigées. Elle a contribué à la création du modèle de l'atome (1911). Et ainsi de suite.

Le troisième besoin est de clarifier le concept de programme.

La programmation moderne a un pied coincé dans les années 50 du XNUMXe siècle. À l’époque, les programmes étaient simples, mais les machines et les langages machines étaient complexes, donc tout tournait autour des machines et des langages.

Désormais, tout est inversé : les programmes sont complexes et primaires, les langages sont simples et secondaires. C’est ce qu’on appelle l’approche appliquée, que tout le monde semble connaître. Mais les étudiants et les développeurs restent convaincus que tout est pareil.

Ce qui nous ramène à la première conférence de Privatdozent Mendeleev. Que dire aux étudiants de première année ? Où est la vérité ? Telle est la question.

Le livre « Matriochka C » propose sa réponse à cette question. Système en couches de langage de programme". De plus, il s'adresse non seulement aux étudiants, mais aussi aux programmeurs formés, puisque ce sont eux, c'est-à-dire nous, qui devons rechercher la vérité et changer la vision du monde.

Ce qui suit est un résumé du livre.

1. Introduction

En 1969 est créé le langage C qui devient le langage de programmation fondamental et le reste pendant 50 ans. Pourquoi cela est-il ainsi? Tout d’abord, parce que C est appliqué la langue qui a donné le programme humain voir à la place machinerie. Cette réalisation a été assurée par les langages de la famille C : C++, JavaScript, PHP, Java, C# et autres. Deuxièmement, c'est une langue courte et belle.

Cependant, le langage C lui-même est généralement mélangé à la machine assembleur, ce qui complique et déforme sa perception. L’autre extrême est l’imposition d’une certaine « philosophie » au langage : procédural, objet, fonctionnel, compilé, interprété, typé, etc. Cela ajoute de l’émotion, mais n’aide pas à mieux décrire la langue.

La vérité est au milieu, et pour le langage C, elle se situe strictement entre la perception philosophique et la perception machine.

Le langage C n'est pas indépendant, il obéit au langage écrit ordinaire, et en même temps il contrôle le langage assembleur lui-même. Ce poste décrit Modèle de discours du programme, selon lequel le programme est divisé en trois types subordonnés : parole, code, commande. Le langage C est responsable du deuxième type de code.

Après avoir déterminé la place de la langue dans le programme, vous pouvez organiser les informations la concernant, ce qui rend Système de langage de programme en couches, représentant le langage C dans l'esprit du système périodique - sur une seule page.

Le système est construit en tenant compte communautés de langues appliquées, découlant de leur subordination de la parole. Un ensemble d'unités Matryoshka C vous permet de décrire et de comparer différents langages, créant ainsi une série de Matryoshkas : C++, PHP, JavaScript, C#, MySQL, Python, etc. Il est digne et correct que différentes langues soient décrites par des unités de la langue fondamentale.

2. CHAPITRE 1. Modèle vocal du programme. Effacer C

Le premier chapitre présente modèle de discours du programme, reflétant une approche appliquée. Selon lui, le programme comporte trois types séquentiels évidents :

  1. discours - discours direct du programmeur résolvant le problème,
  2. codé - encodage d'une solution sous une forme mathématique en langage C (ou tout autre)
  3. et commande - commandes directes de la machine.

Le modèle vocal explique pourquoi C est un langage simple et compréhensible. Xi est construit à l’image et à la ressemblance du discours humain qui nous est familier.

Le premier type de programme est le discours direct du programmeur. La parole correspond à la pensée humaine. Les programmeurs débutants écrivent des programmes en utilisant la parole - d'abord en russe, puis en traduisant étape par étape les actions dans un langage codé. Et c’est précisément sur ce modèle qu’a été créé le langage C.

Les conclusions du programmeur, exprimées oralement, sont converties sous une forme numérique codée. Cette transformation devrait être appelée une réflexion, puisque parole et code ont la même nature (réflexion – naissance – genre). Ceci est assez évident si l’on compare les types parole (à gauche) et code (à droite) du programme.

Matriochka C. Système de langage de programme en couches

Il est curieux que la réflexion se fasse très simplement – ​​avec seulement deux types d’expressions.

Cependant, la description moderne du langage C (de 1978) ne contient pas une 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 sommes obligés de faire preuve de créativité et d’introduire ces noms.

Le choix des mots doit être précis et clair. Cela nécessitait une approche particulière, brièvement exprimée comme suit : utilisation stricte de la langue maternelle. Pour les Anglais, ce serait l’anglais, mais nous ne sommes pas anglais. Nous allons donc utiliser ce que nous avons et essayer de parler russe.

La réflexion s'effectue par deux types d'expressions :

  1. calcul (HF) - reflète un changement dans les propriétés d'un objet. La propriété d'un objet est exprimée par un nombre, alors une action sur une propriété est une action sur un nombre - une opération.
  2. subordination (Pch) - reflète un changement dans l'ordre des actions. Le prototype de Pch est une phrase complexe de discours, donc la plupart des types de Pch commencent par des conjonctions de subordination « si », « sinon », « pendant », « pour ». D'autres types de PC les complètent.

Au fait, pouvez-vous croire que dans la description C, il n'y a pas de nom pour les expressions de calcul - elles sont simplement appelées « expressions » ? Après cela, il ne sera plus surprenant qu'il n'y ait pas de nom ni d'association pour le type de subordination, ni même le manque de noms, de définitions et de généralisations en général. En effet, le fameux K/R (« The C Language », Kernighan/Ritchie, 1978) n'est pas une description, mais un guide d'utilisation du langage.

Cependant, j'aimerais quand même avoir une description de la langue. C'est pourquoi on lui propose Système de langage de programme en couches.

3. CHAPITRE 2. Système de couches. Bref C

Toute description doit être précise et extrêmement concise. Dans le cas d’un langage de programme, une description frontale est difficile.

Ici, nous avons un programme. Il est constitué de modules. Les modules sont constitués de sous-programmes et de collections (structure). Les sous-programmes sont constitués d'expressions individuelles : déclarations, calculs, subordination. Il existe jusqu'à dix types de subordination. La subordination relie les sous-niveaux et les sous-programmes. Il existe également plusieurs publicités. Cependant, les déclarations sont incluses non seulement dans les sous-programmes et sous-niveaux, mais également dans les modules et collections. Et la plupart des expressions sont constituées de mots si difficiles à décrire qu'ils sont généralement simplement répertoriés dans deux listes - des mots originaux et des mots dérivés, avec lesquels vous vous familiariserez tout au long de l'apprentissage et de l'utilisation de la langue. Ajoutons à cela des signes de ponctuation et un certain nombre d'autres expressions.

Dans une telle présentation, il n’est pas facile de comprendre qui s’est appuyé sur qui.

Une approche hiérarchique directe pour décrire une langue serait trop complexe. Une recherche détournée conduit à une description du langage basée sur sa nature vocale et son côté commandement. Ainsi, le système de couches est né, coïncidant en partie avec le système périodique de Mendeleïev, qui est également pli. Comme il s'est avéré 42 ans après sa publication (1869), la périodicité du système est associée à l'électronique couches (1911, modèle de Bohr-Rutherford de l'atome). De plus, les systèmes en couches et périodiques sont similaires dans la disposition tabulaire de toutes les unités sur une seule page.

La description des unités linguistiques est brève - seulement 10 types d'expressions et 8 types d'autres unités, ainsi que significatives et visuelles. Bien que inhabituel pour la première connaissance.

Les unités linguistiques sont divisées en 6 niveaux :

  1. unités - lignes du tableau
  2. départements - groupes spéciaux de genres (parties de la première ligne)
  3. genre - cellules (niveau principal de division)
  4. superespèces - séparateurs d'espèces (niveau rare)
  5. types - formules unitaires en bas de la cellule ou séparément
  6. modèles - les unités elles-mêmes (pour les mots uniquement)

Des exemples de mots décrivent dictionnaire - un sous-système distinct composé des mêmes six niveaux.

La composante vocale du langage C est assez évidente, même si elle mérite encore d’être décrite. Mais la partie commande du langage est précisément liée au contrôle de compilation, au cours duquel le troisième type de programme est créé - la commande. Nous arrivons ici à l’aspect le plus passionnant du langage C : la beauté.

4. CHAPITRES SUIVANTS. Beau Si

Le langage C est la base de la programmation moderne. Pourquoi? Premièrement, en raison de la plus grande correspondance avec la parole. Deuxièmement, parce qu’il contourne magnifiquement les limites du traitement des numéros de machine.

Qu’a proposé exactement Xi ? Image et calque.

Le mot « image » est une traduction du mot anglais « type », qui vient du grec « prototype » - « type ». Dans la langue russe, le mot « type » ne véhicule pas la pierre angulaire du concept exprimé ; de plus, il est confondu avec le sens auxiliaire « type ».

Initialement, l’image résolvait un problème de calcul purement machine, puis devint une piste pour la naissance des langages objets.

La couche a immédiatement résolu plusieurs problèmes – à la fois machine et appliqués. Par conséquent, la considération commencera par une image monotâche et passera à une couche multitâche.

L’un des aspects désagréables de la programmation historique est que la plupart des concepts, y compris les concepts de base, sont donnés sans définition. "Le langage de programmation (nom des rivières) a des types de nombres entiers et flottants..." et ils ont continué à gratter. Il n’est pas nécessaire de définir ce qu’est un « type » (image), car les auteurs eux-mêmes ne le comprennent pas complètement et le passeront sous silence « par souci de clarté ». S'ils sont épinglés au mur, ils donneront une définition vague et inutile. Cela aide beaucoup de se cacher derrière des mots étrangers : pour les auteurs russes - derrière l'anglais (type), pour les Anglais - derrière le français (sous-programme), le grec (polymorphisme), le latin (encapsulation) ou leurs combinaisons (polymorphisme ad hoc).

Mais ce n'est pas notre destin. Notre choix se porte sur des définitions à visière surélevée en russe pur.

Image

Image est un nom préfiguratif d'une grandeur, définissant 1) les propriétés intrinsèques de la grandeur et 2) la sélection des opérations pour la grandeur.

Le mot « type » (type) correspond à la première partie de la définition : « propriétés intrinsèques d'une quantité ». Mais le sens principal de l’image se trouve dans la deuxième partie : « sélection des opérations aux quantités ».

Le point de départ pour introduire une image en C est un calcul normal, comme l'opération d'addition.

Papier Les mathématiques, qu’elles soient écrites à la main ou imprimées, ne font pas beaucoup de distinction entre les types de nombres, supposant généralement qu’ils sont réels. Leurs traitements sont donc sans ambiguïté.

machine Les mathématiques divisent strictement les nombres en entiers et en fractions. Différents types de nombres sont stockés différemment en mémoire et traités par différentes instructions du processeur. Par exemple, les instructions d'addition d'entiers et de fractions sont deux instructions différentes correspondant à deux nœuds processeur différents. Mais il n'existe pas de commande pour ajouter des arguments entiers et fractionnaires.

Appliqué les mathématiques, c'est-à-dire le langage C, séparent les types de nombres, mais combinent les opérations : l'addition des nombres entiers et/ou des fractions s'écrit avec un seul signe d'action.

Une définition claire du concept image permet de parler définitivement de deux autres concepts : valeur и opération.

Ampleur et fonctionnement

Valeur — le numéro en cours de traitement.

Opération — traiter les valeurs des valeurs initiales (arguments) pour obtenir le nombre final (total).

L'ampleur et l'opération sont interdépendantes. Chaque opération est une quantité car elle a un résultat numérique. Et chaque valeur est le résultat du transfert d'une valeur vers/depuis le registre du processeur, c'est-à-dire le résultat de l'opération. Malgré cette relation, l'essentiel est la possibilité de leur description séparée, mais avec la répétition d'un mot dans différentes sections du dictionnaire, ce qui se produit dans MA3.

L'approche machine a divisé tous les nombres utilisés par le programmeur en les équipes и données. Auparavant, les deux étaient des nombres, par exemple, les commandes étaient écrites sous forme de codes numériques. Cependant, dans les langages appliqués, les commandes ont cessé d'être des nombres et sont devenues en mots и signes d'action. Seules les « données » restent sous forme de nombres, mais il est absurde de continuer à les appeler ainsi, car dans le passage d'un point de vue machine à un point de vue mathématique, les nombres sont des quantités qui sont divisées par l'original (données) et finale (requis). « Donnée inconnue » semblera stupide.

Les équipes étaient également réparties en deux types d'actions : mathématiques et service. Actions mathématiques - opérations. Nous reviendrons aux choses officielles plus tard.

Dans les langages C, les opérations mathématiques habituelles sur papier et sur machine, sans ambiguïté ou uniques, deviennent presque universellement multiples.

Les opérations multiples sont plusieurs opérations du même nom avec différents types d'arguments et des actions différentes, de signification similaire.

Les arguments entiers correspondent à une opération entière et les arguments fractionnaires correspondent à une opération fractionnaire. Cette différence est particulièrement nette lors de l’opération de division, lorsque l’expression 1/2 donne un total de 0 et non de 0,5. Une telle notation ne correspond pas aux règles des mathématiques papier, mais le langage C ne s'efforce pas de s'y conformer (contrairement à Fortran) - il joue selon ses propres appliqué règles.

Dans le cas du mélange d'entiers et de fractions, le seul correct est inclus conversion des valeurs des arguments — transformation sélective d'une valeur d'une image à une autre. En effet, lorsqu'on additionne un nombre entier et un nombre fractionnaire, le résultat est fractionnaire, donc l'image de l'opération ramasse l'opération de conversion d'un argument entier en une valeur fractionnaire.

Un certain nombre d'opérations restent à effectuer plurielEt Célibataire. De telles opérations ne sont définies que pour un type d'arguments : reste de division - arguments entiers, empilement (opérations au niveau du bit) - entiers naturels. Ma3 indique la multiplicité des opérations avec des signes (#^) indiquant les images pour lesquelles l'opération est définie. Il s’agit d’une propriété importante mais jusqu’alors négligée de chaque opération.

Toutes les fonctions sont des opérations unitaires arbitraires. L'exception concerne les opérateurs - fonctions sans support, intégré au langage (opérations originales).

Promotion

Promotion - les actions accompagnant l'opération.

Si l'on considère l'opération comme l'action principale, alors on peut distinguer deux actions d'accompagnement qui assurent l'opération et en diffèrent. Il s’agit 1) du contrôle variable et 2) de la subordination. Cette action est appelée assistance.

Ici, nous devons faire une parenthèse et parler séparément des traductions russes des manuels de programmation. Un nouveau mot a été introduit dans le texte du K/R pour enregistrer les actions déclaration (expression), qui tentait de diviser les concepts de commande machine en différentes actions : 1) opération, 2) déclaration et 3) soumission (appelées « constructions de contrôle »). Cette tentative a été enterrée par les traducteurs russes, remplaçant « expression » par le mot « opérateur », qui :

  1. est devenu synonyme du mot machine « commande »,
  2. s'est avéré être synonyme de l'expression « signe d'action »,
  3. et a également reçu un nombre illimité de valeurs supplémentaires. Autrement dit, il s'est transformé en quelque chose de similaire à l'article anglais "uhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh".

Considérez les actions d'accompagnement, ou assistance.

Contrôle variable

Contrôle variable (UP) - création/suppression de cellules variables.
L'UE se produit implicitement lors de la déclaration d'une variable, qui est déjà écrite pour une autre raison - pour indiquer l'image de la valeur. Une seule vue est explicitement gérée variables supplémentaires en utilisant les fonctions malloc() et free().

Il convient de noter que les actions implicites sont plus pratiques pour l'écriture, car elles ne nécessitent rien du tout, mais elles sont plus difficiles à comprendre - elles sont plus difficiles à prendre en compte et à interpréter.

Soumission

Soumission — connecter/désactiver les sections de calque.

Le langage C offrait une méthode appliquée de contrôle de l'ordre des actions, différente de l'assembleur - la subordination. Il reflète et développe une phrase complexe avec une division claire entre la partie principale (clause de subordination) et la partie subordonnée (sections de sous-niveau/sous-programme).

La déclaration et la soumission sont entièrement construites sur le concept couche.

Couche

Couche est un ensemble sélectif limité d’expressions à un seul niveau.

La couche a explicitement et implicitement assumé plusieurs tâches à la fois :

  1. organiser le programme
  2. limiter la visibilité des noms (implicitement),
  3. gestion des variables (cellules mémoire) (implicite),
  4. définition des clauses subordonnées de subordination,
  5. définitions de fonctions et de sélections et autres.

Il n'y avait pas de concept de couche dans les langages machine, donc il n'apparaissait pas dans K/R, et si quelque chose n'y était pas, alors l'introduire dans les livres suivants serait une hérésie et une libre pensée. Par conséquent, le concept de calque n'est pas du tout apparu, bien qu'il soit extrêmement utile et assez évident.

Sans couche, il est impossible d'expliquer brièvement et clairement de nombreuses actions et règles du programme. Par exemple, pourquoi est-il aussi simple que trois kopecks que c'est mauvais, et le plus délicat est-il bon. Vous ne pouvez que jurer impuissant, comme l'a fait Dijkstra (« la compétence des programmeurs est une fonction qui dépend inversement de la fréquence d'apparition des instructions goto dans leurs programmes. » En bref, seules les chèvres utilisent goto. Le niveau de justification est Dieu.) Certes, ce n'est pas si effrayant si vos livres Nous n'avons rien à expliquer du tout, mais, comme nous l'avons déjà dit, ce n'est pas notre destin.

À propos, on peut supposer que Dan Ritchie a laissé goto précisément comme clé pour rechercher un concept sans nom, car il n'y avait ni besoin ni beauté dans l'expression goto. Mais il fallait une explication simple et compréhensible des nouveaux principes du langage, que Richie lui-même ne voulait pas donner, et qui reposent précisément sur le concept couche.

Déviation

Déviation — changer les propriétés habituelles du nouveau nom.

L'écart le plus important est précisément lié aux propriétés des couches du programme et est décrit par un mot « statique », qui a une signification différente dans chaque type de couche.

5. LE DERNIER CHAPITRE. Point commun des langues appliquées

Les langues appliquées sont figuratif langues (ayant une image, « tapée »). Ils reposent sur l’utilisation explicite ou implicite de l’image. De plus, là encore une contradiction apparaît : une image explicite est plus compréhensible, mais moins pratique, et vice versa.

Matriochka C. Système de langage de programme en couches

(Le plan de table n'a pas encore été livré, le tableau est donc présenté avec une image.)

Après C, le développement des langages appliqués a pris le chemin de l'augmentation de leur figurativité. Le plus important pour comprendre l’imagerie avancée est le descendant direct du C – le langage C++. Il développe l'idée d'une sélection arbitraire d'opérations sur les quantités et l'incarne sur la base de l'expression synthétique sélection, qui reçoit un nouveau nom - objet. Cependant, le C++ n'est pas aussi concis et expressif que le C en raison de la surcharge de nouveaux types de collections et de leurs règles associées. Au fait, parlons de « surcharge ».

Surcharge et polymorphisme

Le mot « surcharge » est un terme obsolète d'apprentissage automatique désignant la création plusieurs opérations.

Programmeurs de machines (systèmes) pluralité les opérations pourraient bien être ennuyeuses : « Que signifie ce signe (+) : additionner des entiers, additionner des fractions, ou même décaler ?! A notre époque, on n’écrivait pas comme ça ! D’où la connotation négative du mot choisi (« overkill », « fatigué »). Pour un programmeur d’applications, les opérations multiples constituent la pierre angulaire, la principale réussite et l’héritage du langage C, si naturelles qu’elles sont souvent méconnues.

En langage C++ pluralité étendu non seulement aux opérations originales, mais aussi aux fonctions - à la fois individuelles et combinées en classes - méthodes. Avec plusieurs méthodes, il était possible de les remplacer dans des classes étendues, ce que l'on appelait vaguement « polymorphisme ». La combinaison du polymorphisme et de la surcharge a produit un mélange explosif qui s'est divisé en deux polymorphismes : « vrai » et « ad hoc ». Il n'est possible de comprendre cela qu'en dépit des noms attribués. La route vers la publicité est pavée de noms étrangers.

Une déclaration de la forme « surcharge » est mieux exprimée dans le mot annonce supplémentaire — ajout d'une déclaration d'une fonction du même nom avec des arguments d'une image différente.

Une déclaration de la forme « polymorphisme » est mieux appelée réannonce — une déclaration superposée dans une nouvelle couche d'extension d'une fonction du même nom avec des arguments de la même image.

Il sera alors facile de comprendre que les mêmes méthodes de différentes images (arguments) - annoncé en outre, et une image - ré-annoncé.

Les mots russes décident.

Piste

La prise en compte des concepts de langages hautement figuratifs confirme l'importance d'une définition claire des concepts fondamentaux. Avec C correctement décrit, l'apprentissage des langages à haute figuration sera facile et agréable.

Ceci est particulièrement important pour langages implicites hautement figuratifs (PHP, Javascript). Pour eux, l’importance des objets (images composites) devient encore plus élevée qu’en C++, mais le concept même d’image devient implicite et insaisissable. Du point de vue de la commodité, ils sont devenus plus simples, mais du point de vue de la compréhension, ils sont devenus plus difficiles.

Par conséquent, vous devez commencer à apprendre les langages de programmation avec le langage C et aller plus loin dans l'ordre dans lequel les langages de la famille C apparaissent.

Il en va de même pour la description des langues. Différentes langues ont un ensemble de genres d'unités identique ou plus petit que le langage C. Le nombre de types et d’échantillons peut différer dans les deux sens : C++ a plus de types que C, tandis que JavaScript en a moins.

Le langage MySQL mérite une mention particulière. Il semblerait qu'il n'y ait rien en commun, mais il est parfaitement décrit par Matriochka, et apprendre à le connaître devient plus rapide et plus facile. Ce qui est important, compte tenu de son importance pour le Web – la voie à suivre de la programmation moderne. Et là où il y a MySQL, il y a d'autres SQL. Eh bien, toutes sortes de Fortran-Pascal-Pythons sont également décrites par Matryoshka, dès qu'ils mettent la main dessus.

De grandes choses nous attendent donc : une description appliquée du langage C et une description unifiée des langages qui le suivent. « Nos objectifs sont clairs, nos tâches sont définies. Au travail, camarades ! (Applaudissements nourris et prolongés, se transformant en ovation. Tout le monde se lève.)"

Vos avis seront écoutés avec beaucoup d'attention, votre aide à la création du site des poupées gigognes sera reçue avec une grande gratitude. Des informations plus complètes sur le livre se trouvent sur le site Web, intelligemment cachées dans Matryoshka C.

Source: habr.com

Ajouter un commentaire