Langage de programmation moderne de haut niveau : exemples et comparaisons. Bref aperçu des langages de programmation célèbres Extensions des langages de programmation

Les GPU sont désormais de plus en plus utilisés pour résoudre des problèmes informatiques, mais la question reste ouverte : comment écrire des programmes efficaces pour les configurations appropriées ?

15/06/2011 Andreï Adinets

Les GPU sont désormais de plus en plus utilisés pour résoudre des problèmes informatiques, mais la question reste ouverte : comment écrire des programmes efficaces pour les configurations appropriées ? La solution standard - une combinaison de CUDA ou OpenCL - permet d'implémenter l'algorithme relativement rapidement, mais il est difficile de les utiliser pour créer une version optimisée pour une configuration spécifique. Des outils de programmation de GPU à un niveau supérieur sont nécessaires, qui peuvent être créés, par exemple, à l'aide de langages extensibles.

Il y a à peine trois ans, les unités de traitement graphique (Graphical Processing Units, GPU) étaient considérées uniquement comme des cartes vidéo pour PC, mais maintenant l'attitude à leur égard a changé - des modèles spéciaux de GPU de serveur sont apparus, axés sur la résolution de problèmes informatiques, les performances de double -la précision des calculs a augmenté, les systèmes ont enregistré des performances record, se classant au sommet du Top500. Comment écrire des programmes efficaces pour de telles machines ? La réponse standard est une combinaison de CUDA ou OpenCL pour programmer le GPU et le MPI au niveau du cluster. Ces outils sont disponibles, activement soutenus par les fabricants d'équipements, et de nombreux programmes ont déjà été écrits pour eux, mais ils présentent également des inconvénients.

CUDA et OpenCL sont des extensions du langage C ; ils ne sont pas difficiles à apprendre, bien qu'il s'agisse d'outils d'assez bas niveau. Avec leur aide, vous pouvez implémenter relativement rapidement un algorithme pour le GPU, mais créer une version optimisée pour une application et une configuration spécifiques s'avère beaucoup plus difficile. Toutes les optimisations devront être effectuées manuellement, ce qui augmentera la taille du code et dégradera sa lisibilité. Bien que les programmes créés avec OpenCL soient portables sur un large éventail d'architectures, les performances ne seront pas maintenues dans cette portabilité. Nécessite des outils de programmation GPU de niveau supérieur.

De tels outils peuvent être créés de différentes manières : en introduisant un nouveau langage de programmation ; ajouter des directives à un langage existant, comme cela se fait dans le modèle PGI Accelerator ou CAPS HMPP ; profitez des langages extensibles. Langages extensibles- des langages de programmation dont la syntaxe et la sémantique ne sont pas fixes, mais peuvent être modifiées en fonction des besoins du programmeur. Par rapport aux langages traditionnels, les langages extensibles présentent de nombreux avantages : il est plus facile de leur ajouter de nouvelles fonctionnalités ; ils sont ouverts ; l'apprentissage de nouveaux modèles de programmation basés sur de tels langages est plus facile, car seules des extensions relativement petites doivent être apprises ; Avec l'aide de tels langages, il est plus facile d'affiner et d'optimiser les programmes.

Langages extensibles

Pour qu'un langage soit extensible, il doit contenir :

  • un mécanisme d'extension sans changement de compilateur, également supporté par tous les compilateurs, ce qui signifie notamment la présence d'une interface standard d'interaction avec les compilateurs ;
  • des constructions pour étendre et manipuler l'arborescence de code, telles que des macros ou des quasi-citations, pour étendre le langage ;
  • des outils puissants pour écrire des extensions, tels que le langage lui-même étendu, et un autre langage dont la puissance signifie que le code d'extension peut faire la même chose que n'importe quel programme dans ce langage.

Il s'avère qu'il existe relativement peu de langages qui satisfont à ces exigences : Lisp, Nemerle, Seed7, xoc et Stratego. Dans le même temps, xoc, destiné à étendre le langage C, utilise un langage Zeta distinct pour écrire des extensions, et Stratego est un langage de domaine pour créer des convertisseurs de code source. Nemerle est un langage extensible qui utilise un framework. Filet.

Tous les langages extensibles prennent en charge les mécanismes permettant de travailler avec l'arborescence du programme, et plus particulièrement il s'agit de la construction de quasi-citation - la spécification d'un objet représentant l'arborescence du programme en utilisant le code source lui-même.

Le langage Nemerle utilise une construction pour cela, par exemple en créant un arbre composé d'une déclaration de variable i avec une valeur initiale de 0. La quasi-citation est similaire à la création d'objets chaîne avec des constantes chaîne. En figue. 1 montre un exemple de quasi-citation. La construction d'interpolation permet de substituer des valeurs variables dans un modèle fixe au sein d'une quasi-quote. Dans Nemerle, les constructions $(...) sont utilisées pour cela si vous devez substituer une liste, par exemple. Les langages extensibles contiennent également des constructions d'analyse d'arborescence de programme. Dans le langage Nemerle, on utilise pour cela l'opérateur match(...) ( ... ), un analogue du switch du langage C, dont les branches sont des constructions quasi-citantes. Dans ce cas, l'interpolation est interprétée comme la déclaration de nouvelles variables qui, si la comparaison réussit, reçoivent les valeurs des sous-arbres correspondants. Par exemple, pour l'opérateur de correspondance match(e) (| => ... ), si e contient un arbre, il ira dans la variable a et dans la variable b .

Les outils permettant de travailler avec l'arborescence du programme sont utilisés dans les constructions d'extensions de langage. En langage Nemerle, il s'agit de macros - fonctions spéciales exécutées au stade de la compilation et renvoyant un fragment de l'arborescence du programme, qui se substitue à leur appel. Dans ce cas, la macro accepte des fragments de programme comme paramètres et peut les transformer. En principe, vous pouvez appeler une macro de la même manière qu’une fonction normale ; mais une fonctionnalité plus intéressante consiste à lier l’appel de macro à une syntaxe spéciale. Cela permet d'introduire de nouvelles structures syntaxiques dans le langage Nemerle et ainsi d'élargir le langage.

En figue. La figure 2 montre un exemple de macro avec une extension syntaxique qui permet de déclarer une boucle multidimensionnelle avec des variables et le nombre d'itérations pour chaque dimension, et sur la figure. La figure 3 donne un exemple de la transformation de programme effectuée par cette macro. Notez que la macro qui implémente cette extension occupe moins de 30 lignes de code source et inclut plusieurs contrôles d'erreur. Avec l’approche traditionnelle, la mise en œuvre d’une telle extension nécessiterait beaucoup plus de code et nécessiterait en outre d’étudier le fonctionnement interne du compilateur.

Historiquement, le premier à apparaître en Lisp a été le mécanisme de macro, dans lequel le programme est représenté comme une liste régulière et ne nécessite pas de constructions spéciales pour travailler avec l'arborescence du programme, c'est donc dans ce langage que la programmation extensible est devenue la plus répandue. Les macros de Nemerle sont similaires à celles de Lisp. Dans le système xoc, le mécanisme d'extension est implémenté via des extensions de grammaire et des attributs d'arbre d'analyse. Toute extension spécifie nécessairement deux attributs : le type de structure syntaxique et l'expression dans le langage de base dans lequel elle est convertie.

Les langages extensibles se caractérisent par la mise en œuvre de nombreuses constructions standards via des macros. Dans le langage Nemerle, toutes les boucles et opérateurs conditionnels, à l'exception de match, sont implémentés via des macros, et en Lisp, les macros sont des constructions de boucles et des déclarations de fonctions standard.

Comment utiliser les langues ?

Pour un langage de programmation extensible, vous pouvez écrire des constructions qui vous permettent de programmer des GPU de la manière la plus pratique, ce qui a été réalisé dans le cadre du projet NUDA (Nemerle Unified Device Architecture), dont le but est de créer des extensions du langage Nemerle. pour la programmation GPU. OpenCL est utilisé comme interface pour interagir avec le GPU et comme langage cible pour présenter le programme.

Tout d’abord, nous devons implémenter l’exécution sur le GPU d’un sous-ensemble de code en langage Nemerle. Dans le même temps, les opérateurs de langage familiers tels que les boucles et les branchements, ainsi que le travail avec des types de données, des structures et des tableaux simples, doivent être pris en charge. Le code du GPU est placé dans des fonctions distinctes ou dans des noyaux NUDA. Chaque noyau est marqué d'une macro nukernel qui, basée sur le code du noyau, génère du code OpenCL et une méthode stub pour appeler le noyau côté hôte. Avant la génération du code, toutes les macros sont développées, à l'exception des macros de bouclage et de branchement. Si une fonction doit être appelée dans le noyau, la fonction doit être marquée avec une macro nucode, qui générera du code OpenCL pour la fonction. Le noyau est appelé à l'aide de la macro nucall ; En plus des paramètres du noyau, il reçoit également la configuration de la grille de threads avec laquelle il démarre.

Le plus souvent, le corps de la boucle est utilisé comme noyau pour le GPU, j'aimerais donc transférer immédiatement la boucle vers le GPU. Cela peut être implémenté dans Nemerle - la macro correspondante dans NUDA s'appelle nuwork. Il prend la taille du bloc de thread comme paramètres requis et, sur la base du contexte actuel et de l'analyse du code du corps de la boucle, détermine un ensemble de variables qui doivent être transmises au noyau en tant que paramètres. Le corps du noyau est formé à partir du corps de la boucle, du calcul des indices de boucle via le numéro de thread global, ainsi que d'une condition qui permet à la boucle de s'exécuter correctement même lorsque la taille globale de la grille n'est pas divisible par la taille. du groupe de threads. La boucle est remplacée par un appel à la macro nucall, qui appelle le noyau généré.

En principe, il est possible d'autoriser l'utilisation de tableaux de langage Nemerle classiques dans les programmes GPU, mais cela entraîne une surcharge importante - le tableau doit être copié dans la mémoire GPU à chaque fois que le noyau est appelé, puis recopié. Par conséquent, les programmes GPU utilisent des types de tableaux spéciaux avec une synchronisation paresseuse entre le GPU et le CPU. Cela permet, d'une part, de ne pas encombrer le texte du programme avec des commandes de copie de données, et d'autre part, d'éviter les frais généraux de copie de données. Pour de tels tableaux, comme pour les tableaux classiques de Nemerle, la gestion de la mémoire est utilisée à l'aide du garbage collection. Pour allouer de la mémoire à de tels tableaux, il existe une macro nouvelle, qui doit être appliquée à l'opérateur d'allocation de mémoire habituel.

En figue. 4 à gauche se trouve un programme d'ajout de tableaux classique, et à droite se trouve un programme similaire, mais effectuant des calculs sur le GPU. Il est assez simple d'obtenir des programmes GPU à partir de programmes classiques - il vous suffit d'appliquer des macros aux boucles et aux opérations d'allocation de mémoire, tandis que la quantité de code reste pratiquement inchangée. Un programme écrit avec NUDA prend moins de 20 lignes de code. Un programme similaire, mais en C pur et OpenCL prend plus de 100 lignes.

En plus des macros qui facilitent le travail avec le GPU, le système d'extension NUDA comprend également des annotations pour la conversion de boucles. Les annotations sont essentiellement des macros spéciales. Par exemple, l'annotation en ligne est appliquée à une boucle avec un nombre fixe d'itérations et la déroule complètement. L'annotation dmine effectue un déroulement de boucle profonde. Le « déroulement profond » signifie que la création de plusieurs copies du corps de la boucle et le brassage sont effectués non seulement pour la boucle elle-même, mais également pour les boucles imbriquées si elles sont indépendantes.

Effet

Pourquoi un programmeur doit-il apprendre un nouveau langage et maîtriser de nouvelles bibliothèques de langages extensibles ? La principale réponse est la productivité. Disposant d'un algorithme de boucles parallèles fonctionnant avec des tableaux et écrit en langage Nemerle, il suffit d'ajouter quelques annotations pour obtenir un programme pour le GPU. Dans ce cas, le programme fonctionnera sur n'importe quel appareil prenant en charge OpenCL, y compris les GPU nVidia et AMD, ainsi que les processeurs x86. Pour obtenir la même chose en utilisant uniquement les technologies OpenCL ou CUDA, vous devrez dépenser beaucoup plus de ressources, qui seront consacrées non seulement à l'écriture du code source, mais également au débogage de l'interaction entre l'hôte et le GPU.

Une autre raison est la performance du code généré. Sur CUDA ou OpenCL, les conversions de boucles devront être effectuées manuellement et séparément pour chaque architecture. Il s’agit d’un processus long et sujet aux erreurs, et le code résultant est difficile à lire et impossible à maintenir. Avec NUDA, ce travail peut être effectué à l'aide d'annotations. Par exemple, pour plusieurs noyaux, vous pouvez optimiser le fonctionnement de la convolution d'image ou de la multiplication matricielle à l'aide d'annotations inline et dmine. Sans augmenter la taille du code source, vous pouvez obtenir des gains de performances de deux à cinq fois. De plus, si les mêmes transformations étaient effectuées manuellement, cela entraînerait une augmentation du code plusieurs fois, et parfois d'un ordre de grandeur, sans parler du temps consacré au débogage et à la sélection des paramètres d'analyse optimaux. Par exemple, un programme universel annoté de sept lignes dans NUDA pour la multiplication matrice-matrice transposée en double précision s'exécute sur un nVidia Tesla C2050 seulement 40 % plus lentement que l'implémentation la plus rapide actuellement (CUBLAS 3.2). Un programme similaire écrit à la main nécessiterait 70 lignes de code. Naturellement, pour les tâches standard, vous pouvez écrire manuellement le code une fois pour augmenter la productivité, mais pour des tâches spécifiques, réduire les coûts de main-d'œuvre et augmenter la productivité sera très utile. Enfin, les gains de productivité s'appliquent également à la création d'extensions elle-même : il est plus facile de les créer à l'aide de langages extensibles qu'à l'aide d'outils traditionnels. L'ensemble du système NUDA, malgré ses fonctionnalités, ne nécessite que 12 000 lignes de code, sans compter les tests. C'est relativement peu ; par exemple, le compilateur du langage Nemerle (build 9025) prend environ 130 000 lignes.

Le langage extensible est un outil puissant et son utilisation dans le calcul parallèle en est encore à ses balbutiements. Il existe de nombreux problèmes intéressants dans le développement de langages de programmation parallèles, et chacun d'entre eux peut être résolu en utilisant une combinaison d'extensions et de bibliothèques. Vous pouvez ajouter des blocs de code asynchrones et des boucles parallèles au langage, et créer des constructions pratiques pour programmer des systèmes de cluster, tels que des tableaux distribués. Enfin, vous pouvez utiliser des extensions pour créer un langage de programmation parallèle à part entière, tel que Chapel ou X10.

Andreï Adinets([email protégé]) - Chercheur junior Centre informatique de recherche de l'Université d'État de Moscou (Moscou).



En plus d'utiliser les commentaires pour obtenir un programme parallèle, ils servent souvent à étendre les langages de programmation existants. Des opérateurs supplémentaires et de nouveaux éléments pour décrire les variables sont introduits, permettant à l'utilisateur de définir explicitement la structure parallèle du programme et, dans certains cas, de contrôler l'exécution du programme parallèle. Ainsi, le langage High Performance Fortran (HPF), en plus des opérateurs Fortran traditionnels et du système de commentaires spécial, contient un nouvel opérateur FORALL, introduit pour décrire les boucles de programmes parallèles. La fonctionnalité la plus intéressante de HPF est le tableau de mappage multi-niveaux - tableau de modèles - tableau de processeurs virtuels - processeurs physiques, qui permet le mappage le plus flexible des données utilisateur sur un ordinateur réel.

Un autre exemple est le langage mpC, développé à l'Institut de programmation système de l'Académie des sciences de Russie en tant qu'extension de l'ANSI C. L'objectif principal de mpC est la création de programmes parallèles efficaces pour des systèmes informatiques hétérogènes. L'utilisateur peut spécifier la topologie du réseau, la distribution des données et des calculs ainsi que les transferts de données requis. L'envoi des messages est organisé via l'interface MPI.

Le système DVM est conçu pour créer des applications informatiques portables et efficaces dans les langages C-DVM et Fortran-DVM pour des ordinateurs parallèles avec des architectures différentes. L'abréviation DVM correspond à deux notions : Mémoire Virtuelle Distribuée et Machine Virtuelle Distribuée. Le premier reflète la présence d’un espace d’adressage unique. La seconde reflète l'utilisation de machines virtuelles pour un schéma en deux étapes de mappage des données et des calculs sur une machine parallèle réelle. Le modèle de programmation implique la spécification d'instructions DVM à l'aide de commentaires spéciaux, ce qui signifie une version du programme pour une exécution séquentielle et parallèle. Trois groupes de directives sont pris en charge : les directives de distribution de données, les directives de distribution de calcul et les spécifications de données distantes. Le compilateur traduit le programme en langage Fortran ou C, en utilisant l'une des technologies de programmation parallèle existantes (MPI, PVM, Router) pour organiser l'interaction interprocesseur. Le système DVM comprend également la bibliothèque de support LIB-DVM, un débogueur DVM, un prédicteur d'exécution de programme DVM et un analyseur de performances de programme DVM. Le système a été développé à l'Institut de mathématiques appliquées du nom. M.V.Keldysh RAS.



Langages de programmation spéciaux

S'il est nécessaire de refléter plus précisément soit les spécificités de l'architecture des systèmes parallèles, soit les propriétés d'une certaine classe de problèmes dans un certain domaine, des langages de programmation parallèles spéciaux sont utilisés. Le langage Occam a été créé pour programmer des systèmes transordinateurs, et le langage à affectation unique Sisal a été conçu pour programmer des machines à flux. Un développement très intéressant et original est le langage déclaratif NORM, créé sous la direction de I.B. Zadykhailo à l'Institut de mathématiques appliquées du nom. M.V.Keldysh RAS pour décrire la solution de problèmes de calcul à l'aide de méthodes de grille. Le haut niveau d'abstraction du langage permet de décrire des problèmes dans une notation proche de la formulation originale du problème par un mathématicien, que les auteurs du langage appellent classiquement programmation sans programmeur. Un langage à affectation unique ne contient pas de constructions de langage de programmation traditionnelles qui fixent l'ordre de calcul et masquent ainsi le parallélisme naturel de l'algorithme.

Bibliothèques et interfaces prenant en charge l'interaction entre des processus parallèles

Avec l'avènement des ordinateurs massivement parallèles, les bibliothèques et les interfaces prenant en charge l'interaction de processus parallèles se sont généralisées. Un représentant typique de cette direction est la Message Passing Interface (MPI), dont la mise en œuvre est disponible sur presque toutes les plates-formes parallèles, allant des supercalculateurs à pipeline vectoriel aux clusters et réseaux d'ordinateurs personnels. Le programmeur détermine lui-même explicitement quels processus d'application parallèles, à quel endroit du programme et avec quels processus doivent soit échanger des données, soit synchroniser leur travail. Habituellement, les espaces d'adressage des processus parallèles sont différents. En particulier, le MPI et le PVM suivent cette idéologie. D'autres technologies, telles que Shmem, permettent d'utiliser à la fois des variables locales (privées) et partagées (partagées) accessibles à tous les processus d'application, et implémentent un schéma pour travailler avec la mémoire partagée à l'aide d'opérations Put/Get.

Le système Linda se démarque quelque peu, n'ajoutant que quatre fonctions supplémentaires d'entrée, de sortie, de lecture et d'évaluation à n'importe quel langage séquentiel, ce qui vous permet de créer des programmes parallèles. Malheureusement, la simplicité de l’idée sous-jacente se transforme en gros problèmes de mise en œuvre, ce qui fait de cette belle technologie davantage un objet d’intérêt académique qu’un outil pratique.

Bibliothèques thématiques parallèles

Souvent, dans la pratique, les programmeurs d'applications n'utilisent aucune construction parallèle explicite, se tournant vers des sous-programmes et des fonctions de bibliothèques de sujets parallèles dans des fragments à temps critique. Tout parallélisme et toute optimisation sont cachés dans les appels, et l'utilisateur ne peut écrire que la partie externe de son programme et utiliser avec compétence les blocs standards. Des exemples de telles bibliothèques sont Lapack, ScaLapack, Cray Scientific Library, HP Mathematical Library, PETSc et bien d'autres.

Quelques bibliothèques thématiques parallèles

BLAS et LAPACK sont des bibliothèques qui implémentent des opérations de base d'algèbre linéaire, telles que la multiplication matricielle, la multiplication matrice-vecteur, etc.

ScaLAPACK comprend un sous-ensemble de procédures LAPACK repensées pour être utilisées sur les ordinateurs MPP, notamment : la résolution de systèmes d'équations linéaires, l'inversion matricielle, les transformations orthogonales, les recherches de valeurs propres, etc.

FFTW, DFFTPack - transformation de Fourier rapide.

PETSc est un ensemble de procédures et de structures de données permettant de résoudre en parallèle des problèmes scientifiques avec des modèles décrits sous forme d'équations aux dérivées partielles.

Progiciels et systèmes logiciels spécialisés

Et enfin, le dernier domaine qui mérite d’être mentionné est l’utilisation de progiciels et de systèmes logiciels spécialisés. Généralement, dans ce cas, l’utilisateur n’a pas besoin de programmer du tout. La tâche principale est de spécifier correctement toutes les données d'entrée nécessaires et d'utiliser correctement les fonctionnalités du package. Ainsi, de nombreux chimistes utilisent le progiciel GAMESS pour effectuer des calculs de chimie quantique sur des ordinateurs parallèles, sans réfléchir à la manière dont le traitement parallèle des données est implémenté dans le progiciel lui-même.

Travaux de cours

sur le thème : « Langages de programmation »


Introduction

1. Langages de programmation

1.1 Historique du développement des langages de programmation

2. Examen des langages de programmation modernes

2.1 C ses variétés

2.2 Pascal

2.3Fortran

2.4 DE BASE

Conclusions et offres

Liste de la littérature utilisée

Introduction

Au stade actuel de développement de la technologie informatique, il est impossible d'imaginer un spécialiste hautement qualifié qui ne connaît pas les technologies de l'information. Étant donné que l'activité de tout sujet dépend en grande partie du degré de connaissance de l'information, ainsi que de la capacité de l'utiliser efficacement. Pour s'orienter librement dans les flux d'informations, un spécialiste moderne de tout profil doit être capable de recevoir, traiter et utiliser des informations, principalement à l'aide d'ordinateurs, ainsi que de télécommunications et d'autres nouveaux moyens de communication, y compris la capacité de gérer les langages de programmation.

La pertinence de ce sujet est due au fait que les progrès de la technologie informatique ont déterminé le processus d'émergence de systèmes de signes nouveaux et diversifiés pour l'enregistrement des algorithmes - les langages de programmation.

L'objet de l'étude était les langages de programmation et l'histoire du développement des langages de programmation.

Le but du cours est d'étudier la classification des langages de programmation et leur développement.

Objectifs de recherche:

1. Afficher les informations générales et les niveaux des langages de programmation.

2. Consultez l'historique du développement des langages de programmation.

3. Passez en revue les langages de programmation modernes.

Objectifs de recherche:

1. Introduction aux langages de programmation.

2. Considération de l'histoire du développement des langages de programmation.

3. Examen des langages de programmation modernes.

Le premier chapitre traite des informations générales sur les langages de programmation et l'historique de leur développement.

Le deuxième chapitre donne un aperçu des langages de programmation modernes.

Ce travail de cours a utilisé des méthodes de recherche.

Moyens techniques utilisés : PC : Core 2 DuoE6600 2,4 GHz 2 x 4 Mo L2 ; 2 x 1 024 Mo DDR3-1 333 MHz ; NVIDIAGeForce 8600 GT 512 Mo ; Disque dur HitachiDeskstar 7K1000 1 To ; Imprimante : Canon LBP3010.

Logiciel Windows XPProfessionalSP3. Ce travail de cours a été réalisé sous Microsoft Word 2003 et d'autres programmes ont également été utilisés : Microsoft PowerPoint, Nero StartSmart.

1. Langages de programmation

Un langage de programmation est un système de notation utilisé pour décrire avec précision des programmes informatiques ou des algorithmes. Les langages de programmation sont des langages artificiels. Ils diffèrent des langues naturelles par le nombre limité de « mots » et des règles très strictes d'écriture des commandes (opérateurs). Par conséquent, lorsqu’ils sont utilisés aux fins prévues, ils ne permettent pas la libre interprétation des expressions caractéristiques du langage naturel.

Il est possible de formuler un certain nombre d'exigences pour les langages de programmation et de classer les langages en fonction de leurs fonctionnalités.

Exigences de base pour les langages de programmation :

clarté - l'utilisation dans le langage, si possible, de symboles déjà existants, bien connus et compréhensibles tant pour les programmeurs que pour les utilisateurs d'ordinateurs ;

unité - l'utilisation des mêmes symboles pour désigner des concepts identiques ou liés dans différentes parties de l'algorithme. Le nombre de ces caractères doit être aussi minimal que possible ;

flexibilité - la possibilité d'une description relativement pratique et simple des méthodes courantes de calculs mathématiques en utilisant l'ensemble limité de moyens visuels disponibles dans la langue ;

modularité - la capacité de décrire des algorithmes complexes sous la forme d'un ensemble de modules simples qui peuvent être compilés séparément et utilisés dans divers algorithmes complexes ;

sans ambiguïté - enregistrement sans ambiguïté de n'importe quel algorithme. Son absence pourrait conduire à des réponses incorrectes lors de la résolution de problèmes.

Actuellement, il existe plusieurs centaines de langages de programmation réellement utilisés dans le monde. Chacun a son propre domaine d'application.

Tout algorithme est une séquence d'instructions à la suite de laquelle vous pouvez passer des données initiales au résultat en un nombre fini d'étapes. En fonction du degré de détail des instructions, le niveau du langage de programmation est généralement déterminé - moins il y a de détails, plus le niveau du langage est élevé.

Sur la base de ce critère, on peut distinguer les niveaux de langages de programmation suivants :

· machine;

· orienté machine (assembleurs);

· indépendant de la machine (langages de haut niveau).

Les langages machine et les langages orientés machine sont des langages de bas niveau qui nécessitent de spécifier des détails fins sur le processus de traitement des données. Les langues de haut niveau, en revanche, imitent les langues naturelles en utilisant certains mots du langage parlé et des symboles mathématiques courants. Ces langages sont plus conviviaux.

Différents types de processeurs ont différents jeux d'instructions. Si un langage de programmation se concentre sur un type spécifique de processeur et prend en compte ses fonctionnalités, on parle alors de langage de programmation de bas niveau. Dans ce cas, « niveau faible » ne signifie pas « mauvais ». Cela signifie que les opérateurs du langage sont proches du code machine et se concentrent sur des commandes spécifiques du processeur.

Lors de la programmation en langage machine, le programmeur peut contrôler chaque instruction et chaque cellule mémoire et utiliser toutes les capacités des opérations machine disponibles. Mais le processus d’écriture d’un programme en langage machine est très long et fastidieux. Le programme s'avère encombrant, difficile à visualiser et difficile à déboguer, modifier et développer.

Par conséquent, dans le cas où il est nécessaire de disposer d'un programme efficace qui prend en compte au maximum les spécificités d'un ordinateur particulier, à la place des langages machine, des langages orientés machine (assembleurs) qui leur sont proches sont utilisés. .

Le langage assembleur est un langage de bas niveau spécifique à une machine dans lequel des noms mnémoniques courts correspondent à des instructions machine individuelles. Utilisé pour représenter des programmes écrits en code machine sous une forme lisible par l'homme.

Le langage assembleur permet au programmeur d'utiliser des codes mnémoniques textuels (c'est-à-dire facilement mémorisables par une personne), d'attribuer des noms symboliques aux registres de l'ordinateur et de la mémoire à sa discrétion, et également de définir des méthodes d'adressage qui lui conviennent. De plus, il vous permet d'utiliser différents systèmes numériques (par exemple décimal ou hexadécimal) pour représenter des constantes numériques, d'utiliser des commentaires dans le programme, etc.

Les langages de bas niveau créent des programmes très efficaces et compacts car le développeur a accès à toutes les capacités du processeur. En revanche, cela nécessite une très bonne compréhension de l’ordinateur, rend difficile le débogage de grandes applications et le programme final ne peut pas être transféré sur un ordinateur doté d’un autre type de processeur. De tels langages sont généralement utilisés pour écrire de petites applications système, des pilotes de périphériques et des modules d'interface avec des équipements non standard, lorsque la compacité, les performances et la possibilité d'accéder directement aux ressources matérielles deviennent les exigences les plus importantes. Dans certains domaines, tels que l'infographie, les bibliothèques sont écrites en langage assembleur pour implémenter efficacement des algorithmes de traitement d'image à forte intensité de calcul.

Ainsi, les programmes écrits en langage assembleur nécessitent beaucoup moins de mémoire et de temps d’exécution. La connaissance du langage assembleur et du code machine d'un programmeur lui permet de comprendre l'architecture de la machine. Bien que la plupart des professionnels du logiciel développent des programmes dans des langages de haut niveau, les logiciels les plus puissants et les plus efficaces sont écrits entièrement ou partiellement en langage assembleur.

Des langages de haut niveau ont été développés afin de libérer le programmeur de la prise en compte des caractéristiques techniques des ordinateurs spécifiques et de leur architecture. Le niveau de langage est caractérisé par son degré de proximité avec le langage naturel et humain. Le langage machine n’est pas semblable au langage humain ; il est extrêmement pauvre en moyens visuels. Les moyens d'écrire des programmes dans des langages de haut niveau sont plus expressifs et familiers aux humains. Par exemple, un algorithme de calcul utilisant une formule complexe n'est pas divisé en opérations distinctes, mais est écrit de manière compacte sous la forme d'une expression unique utilisant des symboles mathématiques familiers. Il est beaucoup plus facile de créer le vôtre ou de comprendre le programme de quelqu’un d’autre dans cette langue.

Un avantage important des langages de haut niveau est leur universalité et leur indépendance par rapport aux ordinateurs. Un programme écrit dans un tel langage peut être exécuté sur différentes machines. Le compilateur de programme n'a pas besoin de connaître le système de commande de l'ordinateur sur lequel il compte effectuer des calculs. Lors du passage à un autre ordinateur, le programme ne nécessite aucune modification. De tels langages ne sont pas seulement un moyen de communication entre une personne et une machine, mais aussi entre les personnes. Un programme écrit dans un langage de haut niveau peut être facilement compris par tout spécialiste connaissant le langage et la nature de la tâche.

Ainsi, on peut formuler les principaux avantages des langages de haut niveau par rapport aux langages machine :

L'alphabet du langage de haut niveau est beaucoup plus large que l'alphabet du langage machine, ce qui augmente considérablement la clarté du texte du programme ;

l'ensemble des opérations autorisées ne dépend pas de l'ensemble des opérations de la machine, mais est choisi pour des raisons de commodité lors de la formulation d'algorithmes pour résoudre des problèmes d'une certaine classe ;

le format de phrase est assez flexible et pratique à utiliser, ce qui vous permet de spécifier une étape assez significative du traitement des données à l'aide d'une seule phrase ;

les opérations requises sont spécifiées à l'aide de notations mathématiques généralement acceptées ;

Zalina 13 janvier 2016 à 15:42

Différents langages de programmation et leurs domaines d'application. Conférence sur Yandex

  • Blog de l'entreprise Yandex,
  • Développement de sites Web,
  • La programmation,
  • Programmation industrielle

Nous avons décidé de consacrer notre premier article cette année à un sujet très basique, sur lequel une conférence a été donnée au Small ShAD. Il est fréquenté par des lycéens intéressés par la technologie, d'où la spécificité de la présentation - la conférence sera particulièrement intéressante pour ceux qui commencent tout juste à programmer et réfléchissent à la direction à développer. Pour eux, Yandex propose un cours « Introduction à la programmation (C++) », qui peut être suivi sur la plateforme Stepic.org.

Le conférencier Mikhail Gustokashin est conservateur des programmes académiques chez Yandex, directeur du centre des concours étudiants de la Faculté d'informatique de l'École supérieure d'économie. Mikhail a formé des dizaines de lauréats et lauréats des Olympiades panrusses de programmation.

La conférence explique quels sont les langages de programmation, en quoi ils diffèrent, comment ils sont apparus et lesquels sont les meilleurs et lesquels sont les pires. Au début, nous parlerons un peu de l'histoire des langues - comment elles sont apparues, comment les gens ont commencé à programmer, comment tout s'est développé, ce qui se passe maintenant. La deuxième partie abordera les tâches pour lesquelles quelle langue est adaptée, comment « choisir votre langue préférée et profiter de la vie ». Le conférencier expliquera également un peu comment, à son avis, vous pouvez apprendre tout cela et ensuite trouver un emploi.

Comme toujours, sous la coupe se trouve une transcription détaillée de la conférence afin que vous puissiez naviguer dans son contenu.

Histoire des langages de programmation

Commençons depuis le début. Au début, les ordinateurs n’avaient même pas de clavier ! C'est-à-dire que tout allait très mal - ils n'avaient ni clavier ni écran, ils n'avaient que des cartes perforées (ce sont des petites choses avec ou sans trous). En conséquence, soit ils y ont collé les épingles, soit ils y ont allumé une lumière. S'il y a un trou (ou vice versa pas), cela signifie un zéro ou un un. Et les programmes à cette époque étaient écrits à l'aide de codes machine - chaque opération sur un ordinateur (addition, soustraction, certaines opérations plus complexes) avait une sorte de code machine. Les gens eux-mêmes ont choisi ce code à partir d'un panneau, toutes sortes d'adresses en mémoire, ils ont tout frappé avec leurs mains et l'ont mis dans le lecteur - et tout a été compté. Bien sûr, le travail d'un programmeur n'était probablement pas particulièrement intéressant à l'époque - faire des trous - et avec le développement de la science et de la technologie, bien sûr, ils ont commencé à proposer toutes sortes de choses plus « intéressantes ». Par exemple, l'assembleur, qui rendait déjà la vie un peu plus facile.

Eh bien, comment a-t-il rendu la vie plus facile ? Au lieu de se rappeler qu'il existait une sorte de code « magique » pour la commande, on utilisait toutes sortes de mots similaires à l'anglais « humain » - certains add ou mov - puis des registres ou des zones de mémoire, variables avec lesquelles ils étaient nécessaires. ont été répertoriés pour effectuer des opérations. Mais il est clair que cela, en général, a également nécessité beaucoup d’efforts mentaux pour garder en tête dans quel registre nous avons quoi, où se trouvent quelles variables et ce qui se passe en général. Pourquoi est-ce arrivé? Parce que les ordinateurs étaient « stupides » et ne pouvaient rien comprendre de plus « intelligent ». En fait, assembler du code machine à partir d'un assembleur nécessite également du temps et de la mémoire (à cette époque, bien sûr, il y en avait peu).

Peu à peu, il est devenu évident qu’il était très difficile de développer des programmes aussi vastes et complexes. La productivité du programmeur dans ces équipes était extrêmement faible - c'est-à-dire qu'il écrivait plusieurs lignes par jour (significatives), et chaque ligne ne faisait rien de spécial - quelques opérations arithmétiques simples. Et les gens voulaient rendre les langues beaucoup plus proches du langage humain, en particulier de l'anglais, pour rendre l'écriture de programmes plus facile et plus pratique. Et c'est parti !

Langues anciennes et mortes

L'une des premières langues était le Fortran. À propos, il était également perforé sur des cartes perforées - il existait des cartes perforées spéciales pour perforer les programmes Fortran. Mais si vous prenez ce Fortran maintenant, à mon avis, il se situe même entre 50 et 60. est apparu - et si vous essayez d'écrire quelque chose dessus, vous serez très désagréable, je vous le garantis ! Le Fortran moderne est toujours vivant, mais il est assez différent de ce qu'il était auparavant.

Autres langages - je vais maintenant écrire une chose dont vous avez probablement entendu parler lors de divers événements où ils parlent de l'histoire de la programmation - c'est COBOL. C'était un langage pour écrire des applications métiers. Que sont les applications métiers ? Certaines transactions dans les banques, autre chose, tout cela était écrit en Cobol. Bien sûr, ce n’est pas très populaire ici. Je pense qu'il vous sera très difficile de trouver un programmeur Cobol à Moscou. Et quelque part pas à Moscou - avec encore plus de difficulté. Mais, étonnamment, il y a à peine 10 ans, plus de la moitié du code écrit par l’humanité l’était en Cobol. Et à ce jour, une partie importante de toutes les transactions bancaires est effectuée à l'aide de programmes qui y sont écrits (COBOL), et les gens y écrivent encore quelque chose.

Il existe aussi un langage « drôle », il s'appelait Algol (la 68ème version, qui caractérise l'année de sa création). C'est un langage algorithmique. En général, ils ont pu faire quelque chose là-bas, mais maintenant nous ne sommes plus très intéressés par ce qu'ils peuvent faire. Et avec cela, nous pouvons terminer notre excursion dans l'Antiquité et dans des langues relativement peu utilisées et passer à ce qui est encore vivant (et vivant activement).

Langues anciennes mais vivantes

Algol a été inventé en Europe et Fortran a été principalement utilisé aux États-Unis - il n'y a pas de grandes différences. Quelle tendance est perceptible ? Au début, tout était compliqué et pour écrire, il fallait être presque un ingénieur, un ingénieur électricien, pour comprendre où sont connectés quels contacts et autre chose pour la programmation. Ensuite, il fallait aussi s'asseoir avec les morceaux de papier et compter le souvenir, en prendre soin. Et progressivement, tout est devenu de plus en plus simple, de plus en plus simple puis encore plus simple pour le programmeur - penser le moins possible pour une personne, faire le plus possible automatiquement. Vers la fin de cette période (le conférencier désigne l'Algol et le Kobol), commencent à apparaître des langues qui, en un sens, ont « survécu » jusqu'à nos jours.

BASIQUE. Peut-être que certaines personnes y écrivent encore quelque chose, au moins j'ai vu que dans certaines institutions où ils enseignent en QBasic - il y a une fenêtre bleue où « 1989 » est écrit. En général, il « vit de toutes ses forces » ! Il a été inventé comme langage pour les non-programmeurs. À cette époque, un programmeur était un métier très spécialisé. Et ici, ils vous disent : "Nous avons un langage Basic sympa, et toute personne raisonnable peut y écrire un programme - c'est facile." Encore une fois, le BASIC et le BASIC moderne constituent une énorme différence. Toutes ces lignes numérotées après 10, toutes sortes de GOTO et autres horreurs - elles n'ont plus rien à voir avec le BASIC moderne, et même avec le BASIC de 1989, elles n'ont plus rien à voir avec cela.

Une autre histoire amusante est celle de la langue pascale, largement connue dans les milieux universitaires, principalement en Russie et dans les pays de l'ex-Union soviétique. Il a été et continue d’être utilisé de manière surprenante comme langue d’enseignement. Dans le reste du monde, il est moins courant, mais il est également bien vivant. Il existe une personne comme Wirth - c'est un scientifique, un théoricien. Il a participé à la discussion sur Algol, il n'a pas aimé ce qui s'est passé et il a proposé sa propre langue - Pascal. Et puis la société Borland (et avant cela de nombreuses autres sociétés - Apple était notamment impliquée) l'a pris et a tout gâché. Il avait une théorie belle et cohérente – « tout ira bien » – et ils l’ont prise et l’ont bourrée de ce dont les gens avaient besoin pour travailler. Eh bien, cela ne s’est pas avéré aussi beau qu’il le souhaitait.

Et enfin... C a été inventé par des ingénieurs. Si Pascal a été inventé par un scientifique, alors C a été inventé par Kernighan et Ritchie, ils ont travaillé comme ingénieurs chez Bell. Comment est-ce arrivé? A cette époque, il était impossible d'écrire quoi que ce soit de systémique dans ces langages (le conférencier pointe du doigt Fortran, COBOL, Algol). Qu’est-ce que « systémique » ? Par exemple, un système d'exploitation, des pilotes, autre chose. Ces langages étaient destinés aux calculs mathématiques, aux calculs commerciaux, pour autant. Et tout le reste a été écrit en Assemblée. Il y avait certains langages, ils sont maintenant morts, c'est-à-dire que le langage C n'est pas apparu immédiatement depuis Assembly, mais à travers des choses intermédiaires.

À quoi ça sert? Kernighan et Ritchie adoraient jouer au jouet Asteroids : un vaisseau spatial vole, et il y a des astéroïdes, il leur tire dessus et ils s'effondrent. Ils avaient un serveur sur lequel ils jouaient, mais il y avait beaucoup de monde et le jouet était lent. Et ils ont découvert quelque part dans leur bureau qu’ils avaient une sorte d’ordinateur que personne n’utilisait. Mais il y avait un problème : c'était une architecture différente et le jeu était écrit en Assembly.

Bien sûr, ils l'ont réécrit et ont même ajouté quelques fonctionnalités pour y jouer. Mais cela les a amenés à l’idée que réécrire à chaque fois pour une nouvelle architecture n’est pas très intelligent. Et ils ont décidé d'écrire un langage de haut niveau qui serait adapté à la programmation système, c'est-à-dire dans lequel il serait possible de gérer la mémoire, dans lequel il serait possible de comprendre où se trouvent les choses et comment accéder à ces morceaux de mémoire. . C’est ainsi qu’est apparu le langage C, qui a eu une énorme influence sur tout ce qui a suivi. Tous (le conférencier désigne Algol, Fortran et d'autres langages mentionnés) ont eu une grande influence, mais C - juste oui...

En conséquence, il s’agissait du langage principal d’Unix, un système d’exploitation encore plus populaire à l’époque qu’il ne l’est aujourd’hui. Et vers les années 80, la situation était à peu près la suivante (le conférencier montre le Basic, le C et d'autres langages mentionnés). Disons que tout cela s'est déjà lentement éteint dans notre pays (le conférencier efface les mentions de Assembly Language, Fortran et Algol)... Et dans les années 80, les ordinateurs sont devenus plus petits, plus intelligents, moins chers, et les gens voulaient toutes sortes de choses étranges pour rendre la vie encore meilleure, pour vivre encore plus de plaisir.

Langues des années 80

L’une des premières bizarreries était qu’il s’agissait d’un langage C++. Le langage C présente un grand nombre de défauts (enfin, généralement énormes) - vous pouvez tout y faire, y compris vous tirer une balle dans le pied, vous tirer une balle dans le pied avec la fiction, dans l'autre pied, tirer un pied dans l'autre pied, en général - quoi que vous vouliez faire. Mais en même temps, certaines choses architecturales y sont assez difficiles à réaliser - encore une fois, comme dans Assembly, nous devons savoir où nous en sommes, quelle mémoire nous avons allouée et quelle mémoire nous avons allouée ; Elle est là tout le temps "circulant" quelque part, cette mémoire - c'est-à-dire que nous l'avons allouée, oublié de la supprimer, supprimé la mauvaise chose, dépassé les limites de la mémoire, en général - nous avons accumulé un tas de problèmes.

C++ a été créé à l’origine comme un ensemble d’ajouts au langage C destinés à faciliter le développement. A cette époque, la programmation orientée objet est devenue à la mode et les gens ont décidé que tout pouvait être décrit sous la forme d'une hiérarchie, c'est-à-dire que vous avez un ballon (abstrait), vous en héritez un ballon de football, un ballon de volley-ball, un autre ballon abstrait. . Il était alors à la mode que "nous écrivons maintenant tout sous la forme d'une sorte de hiérarchie, et tout ira bien, la vie s'améliorera, tout ira bien et c'est tout". C++, dans un sens, a mis en œuvre cette approche basée sur les objets - ce n'était pas le premier langage de programmation orienté objet, mais il est devenu très populaire et toutes sortes de fonctionnalités ont commencé à y apparaître. Dans le même temps, C++ conservait une compatibilité presque totale (à l'époque) avec le langage C ; un programme écrit en C était compilé avec succès en C++ dans 99 % des cas et fonctionnait même de la même manière. Cela visait à faciliter le passage du C au C++.

En plus de l’approche objet (en C++), une bibliothèque de modèles standards (STL) est rapidement apparue. Je pense qu'à l'école, ceux qui apprenaient encore Pascal ont découvert que, premièrement, vous n'avez pas de tri intégré (dans l'ancien Borland Pascal bleu, maintenant il est déjà dans les versions modernes) - il y a un exemple (source code) tri, il peut être copié et collé. Mais si vous voulez trier des entiers ici, des nombres réels ici et des chaînes ici qui peuvent être comparées les unes aux autres, vous deviez écrire trois tris différents qui font exactement la même chose, ils ont juste des types de données différents. Ce n'est pas très bon, et les modèles qui n'apparaissaient pas immédiatement en C++ ont grandement atténué ce problème. Autrement dit, vous aviez un programme abstrait qui a réussi à trier quelque chose qui pouvait être comparé les uns aux autres.

Langages de script des années 90

Mais le temps ne s'est pas arrêté : dans les années 80, beaucoup de choses intéressantes se sont produites. Mais au tournant des années 80 et 90, les ordinateurs sont devenus si performants qu’il était possible de faire des choses très étranges et très inefficaces. Il s'agissait notamment de langages de script qui n'étaient pas compilés en code machine, mais plutôt interprétés. BASIC a également été interprété à un moment donné, mais ces langages de script étaient principalement destinés au traitement de texte - ce sont par exemple Perl, Python (ce n'était pas très connu à l'époque), PHP, Ruby - ce sont les langages de script que dans l'un ou l'autre, à des degrés divers, ils vivent encore (ils ont tous réussi à apparaître avant 2000, voire bien plus tôt).

Passons-les un peu en revue, car ce sont des choses spécifiques et sont désormais utilisées dans de nombreux endroits. Quelle est l'idée ? Si nous ne compilons pas, nous pouvons en autoriser beaucoup plus. Par exemple, un programme peut consulter son code et l'utiliser d'une manière ou d'une autre ; elle sait ce qui se passe en elle et grâce à cela, elle peut faire beaucoup de choses intéressantes.

Perl était destiné au traitement de texte - à cette époque, il y avait tellement de mémoire dans les ordinateurs qu'on pouvait y insérer du texte et faire quelque chose d'utile avec ce texte (par exemple, compter des mots, effectuer une sorte de recherche). Mais, à mon avis, il a été conçu par des gens un peu fous, car il y a une blague à ce sujet : « Tout jeu de caractères écrit est un programme Perl valide. » À mon avis, on ne peut qu’écrire dessus, on ne peut pas le lire. Quand je regarde le code Perl et que j'essaie de comprendre quelque chose, je ne comprends rien. Peut-être que si je le connaissais mieux, je comprendrais quelque chose, mais comme je l'ai entendu de la part de ceux qui savent encore le faire, ils disent qu'il est plus facile de le réécrire. Autrement dit, les programmes s'avèrent courts et il est vraiment plus facile de les réécrire à partir de zéro que de comprendre ce qu'il y a là et de le réparer.

À cette époque, au milieu des années 90, Internet est apparu. Au début, c'était du courrier, des sites Web avec du HTML statique, mais les gens voulaient y ajouter une sorte de dynamique, pour que tout se passe de manière dynamique, que certains formulaires puissent être remplis, que des livres d'or puissent être créés et autre chose. En conséquence, cela nécessitait une sorte d'interaction, ils ont élaboré un protocole, comment il interagit et, plus important encore, la génération de ces pages statiques (conditionnellement) qui seront « recrachées » à l'utilisateur en réponse à sa demande.

En général, rien d'autre que Pearl ne convenait à cette époque. Écrire un gestionnaire en C ou C++ pur était une mauvaise idée. Et faute de mieux, à cette époque (et pendant assez longtemps) Pearl était le langage populaire pour le développement web. Bien entendu, l’ampleur ne peut être comparée à ce qui se passe actuellement.

PHP est apparu comme... par accident. Une personne a arrêté de le faire assez rapidement - il a créé sa propre page, il avait une sorte de livre d'or, autre chose, autre chose. Et il a écrit un ensemble de macros pour Perl qui étaient similaires au C, parce qu'il savait utiliser C, simplement parce que cela lui convenait très bien. Et je l'ai appelé Page d'accueil personnelle. Il l'a partagé et a déclaré : « Les gens, regardez ce que j'ai écrit, tout ici est beaucoup plus clair qu'en Perl et vous pouvez le modifier. » Et les gens ont aimé.

Puis il a abandonné cette affaire. En général, ce PHP a commencé à vivre et est devenu au fil du temps beaucoup plus populaire que Perl. Mais son «traumatisme de naissance» (conçu comme un ensemble de macros pour Pearl) lui a joué une blague assez cruelle. Le langage s'est avéré étrange. Autrement dit, il s'est développé tout seul, personne ne l'a conçu, personne n'a administré le processus de développement (ni une entreprise ni aucune personne), mais il y avait de nombreux groupes, chacun sciant ce qu'il voulait. Du coup, les fonctions sont nommées différemment, il n'y a même pas de style, tout est souligné, essentiellement aléatoire, les réglages sont ici et là, et comment tout cela va fonctionner n'est pas très clair. Mais vous pouvez vous asseoir et écrire en PHP en deux heures, car c’est comme ça que c’était prévu.

Python et Ruby : Ruby est moins populaire maintenant, Python est en quelque sorte mieux « planifié », nous en reparlerons plus tard. Il est clair qu'à cette époque il s'agissait (le conférencier souligne Perl, Python, Ruby, PHP) de langages hautement spécialisés destinés à des fins hautement spécialisées. En général, personne n'a écrit de programmation système, aucune logique métier à l'époque et maintenant, cela ne fait pas grand-chose.

Langues compilées des années 90

Nous ferons le tour aux mêmes horaires, mais dans l'autre sens. À cette époque, nous utilisions le C++ pour presque tout ce qui devait être écrit, non pas pour le Web, ni pour le traitement de texte, mais uniquement pour les applications, les systèmes d'exploitation, les jouets - en général, pour tout. Mais le C++ est en réalité un langage épouvantable. Pourquoi? Parce que, premièrement, il a hérité de tous les problèmes du C dus à la rétrocompatibilité. Là, vous pourriez encore vous suicider d'un million de façons différentes, les mêmes qu'en C (naturellement, de nouvelles façons ont été ajoutées en C++). En même temps, si vous écrivez tout correctement et correctement, comme le voulaient les auteurs du C++, alors, bien sûr, il n'était plus possible de se suicider en utilisant les anciennes méthodes du code C, et il semble qu'il y en ait moins. eux. Cependant, il avait un modèle objet très étrange et particulier. Le fractionnement d'un programme en modules, en morceaux, venait généralement du C (si vous savez écrire include en C ou C++ - en fait, il s'agissait d'un moyen d'insérer simplement le texte de la bibliothèque dans votre programme, dans le à la fin, quand vous écrivez un tas d'includes, vous avez tout - si c'est "primitif", comme c'était le cas au tout début - tout est inséré dans un seul fichier et ensuite tout cela prend terriblement longtemps à compiler, car tout tourne autour plusieurs fois. Le même Pascal, Virtovsky, était beaucoup plus réfléchi à cet égard, les versions ultérieures sont devenues encore meilleures.

En général, le C++ présente de nombreux inconvénients. Le programmeur devait être hautement qualifié pour écrire en C++, et ces programmeurs étaient chers (et la formation, et autre chose, c'est-à-dire qu'il est difficile de trouver des programmeurs sur le marché, ils doivent être payés cher, et en général c'est ce n'est pas la question... ). Et nos ordinateurs comptent de plus en plus vite, ils deviennent moins chers, les gens achètent de nouveaux ordinateurs et veulent plus d'applications, plus de jouets pour leurs téléphones, en général - plus de joie.

C'est ainsi qu'est apparu Java. Il y a aussi une histoire plutôt amusante sur la façon dont cette langue tire son nom. Il y a des programmeurs là-bas, ils boivent du café tout le temps et à cette époque il était à la mode de boire du café, qui poussait sur l'île de Java. Le langage a été conçu comme un langage pour les appareils intégrés, notamment pour une machine à café. C'est ainsi qu'est né le nom...
Qu’est-ce qui a commencé avec elle, qu’est-ce qui était bon chez elle et pourquoi a-t-elle gagné en popularité ? Premièrement, ils se sont complètement débarrassés de l’héritage de Sishnoi. Il n'y a aucun signe, et encore moins de façons de tirer sur une partie de votre corps et de tout casser. Deuxièmement, ils ont introduit des idées beaucoup plus récentes en termes de modèle objet - c'est-à-dire que C++ est apparu beaucoup plus tôt que Java et a utilisé un modèle objet plus archaïque et « sauvage ». Eh bien, ici (le conférencier montre Java), c'était déjà plus réfléchi à l'époque, et en théorie, les gens pensaient, et en pratique, ils appliquaient et rendaient tout beaucoup plus cool.

Et enfin, troisième. Nos programmes Java n'ont pas été compilés en code machine, mais en code pour une machine virtuelle. Autrement dit, vous aviez une machine virtuelle (VM) JVM – Java. Vos programmes ont été assemblés dans une sorte de représentation intermédiaire puis, avec l'aide de cette machine, ils ont déjà été exécutés. Qu'est-ce que ça a donné ? Premièrement, il ralentissait, deuxièmement, il consommait de la mémoire avec une force terrible, troisièmement, il était portable n'importe où (théoriquement) - même sur une cafetière, même sur un moulin à café, même sur un ordinateur, même sur un téléphone portable. D'une part, c'est bien, c'est-à-dire que vous venez d'écrire une implémentation d'une machine virtuelle, puis vous exécutez vos programmes Java partout. Mais, d’un autre côté, il est dommage que le même téléphone ait alors peu de mémoire, de faibles performances, et tout cela a également commencé à ralentir et à ralentir.

Mais ce n’est même pas la raison principale pour laquelle le langage a été inventé. Le langage Java a été inventé pour réduire les exigences de qualification des programmeurs. Autrement dit, les pires programmeurs peuvent écrire de bons programmes en Java, car cela ne vous permet pas d'écrire de mauvais programmes - il n'y a aucun moyen d'écrire de mauvais programmes. Là, vous ne pouvez écrire que de bons programmes. Eh bien, dans la compréhension des créateurs du langage.

Autrement dit, si en C, en C++, en Python, dans n'importe quoi, nous pouvons créer une sorte de terrible dépotoir à partir de notre projet, où nous avons tout mélangé, assemblé pendant des heures et autre chose. En Java, vous pouvez également créer un garbage dump, mais pour cela, vous devez faire des efforts. C'est-à-dire que, par défaut, ce n'est pas une "décharge", d'autres problèmes surviennent, que quelque chose a été hérité et hérité - en général, pour une ligne significative, il y en a dix qui ne sont pas très significatives. Mais un programmeur aussi moyennement qualifié peut écrire du code d’assez bonne qualité.
Nous sommes presque à la fin. Pour nous, la prochaine chose qui est apparue était .Net (dotnet), et en particulier nous nous intéressons au C# (presque la même chose [le conférencier montre Java], c'est-à-dire qu'il y a des différences dans les détails, si vous choisissez entre eux , regardez où ils paient plus d'argent).

Et encore une chose : JavaScript. Cela n'a rien à voir avec le langage Java, apparu la même année - le mot était à la mode, ils ont autorisé la marque à l'utiliser.

Quelle est la principale chose à laquelle vous devez prêter attention ? (Le conférencier dessine des flèches du C++ vers Java, .Net, C#, JavaScript et PHP). Pour écrire un programme simple dans l'un de ces langages, et dans beaucoup d'autres - si vous connaissez le C++, vous n'avez généralement pas besoin de connaître autre chose - vous écrivez en C++, puis ajoutez des dollars au début, quelque chose d'autre fait de petites choses et il commence à travailler sur n'importe quoi (le conférencier montre les langages auxquels les flèches du C++ ont été attribuées). Autrement dit, ils sont extrêmement similaires sur certaines choses simples. Si vous résolvez des problèmes scolaires, des problèmes éducatifs ou autre chose (vous ne concevez pas un grand projet - vous avez un fichier qui lit les nombres, affiche les nombres dans la console et fait autre chose), alors il n'y a presque aucune différence entre ces langues. Force est de constater que JavaScript et PHP sont spécialisés, tout est un peu différent pour eux. Mais ici (le conférencier pointe du doigt Java et C#), il y a très peu de différence.

Depuis lors, toutes sortes d'autres choses intéressantes sont apparues, mais il n'est pas clair si elles vivront ou mourront avec succès. Qu’utilisent-ils maintenant, à quelles fins ?

Sélection d'une langue en fonction de la tâche

Disons que vous êtes confronté à la tâche d'écrire un pilote pour une carte vidéo. Quelle langue utiliserez-vous aujourd’hui ? (Cri du public : Java !) Pourquoi... Java est génial, mais pourquoi pas Ruby ou PHP ? (Le conférencier parle sarcastiquement.)

Programmation de bas niveau

Si vous écrivez quelque chose de bas niveau, alors le meilleur choix est le C, mais en réalité j'ai entendu (mais pas vu) que le C++ est utilisé pour cela. Mais j'ai peu confiance en cela, car en C, vous pouvez clairement contrôler - puisque vous avez donné autant d'octets de mémoire, cela signifie qu'il y en aura tellement. Et en C++ (STL), comment une chaîne est-elle implémentée ? Eh bien, d’une manière ou d’une autre, cela a été mis en œuvre. Et en fin de compte, nous ne savons pas comment et ce qui se passe là-bas ; peut-être que nous manquerons de mémoire sur notre carte vidéo ou que quelque chose d'autre se produira. Par conséquent, C vit toujours et ne meurt pas, de telles tâches de programmation système existent toujours - écrire un système d'exploitation, écrire des pilotes, écrire autre chose - C est idéal pour cela. De plus, maintenant apparaissent toutes sortes d'appareils (l'Internet des objets est promis d'arriver bientôt) qui fonctionnent sur piles (et, bien sûr, il y en aura des millions, tout sera couvert par cet Internet des objets), ils devraient être très bon marché et consommer très peu d’électricité. En conséquence, il y aura 2 Ko de mémoire, un processeur de 5 kHz, et il est clair qu'il ne sera pas possible d'installer une sorte de machine virtuelle ou un langage de script dans un avenir proche - ce qui signifie que vous devrez écrire quelque chose en C. Et même maintenant, par exemple, en informatique sur une carte vidéo (OpenCL ou une autre technologie) - ils ne proposent pas de nouveau langage pour écrire des programmes pour eux - ils font du C avec de grosses restrictions. Juste parce que les gens savent déjà comment faire, pourquoi apprendre quelque chose de nouveau ? Formellement, il s’agit probablement aussi, dans un sens, de C.

programmation web

Disons que vous souhaitez écrire un nouveau Facebook (réseau social). Sur quoi vas-tu écrire ça ? (Les gens du public parlent de HTML et CSS.) HTML et CSS sont du design, et nous voulons qu'il soit possible d'y ajouter des photos, des amis et d'y laisser des commentaires.

Pour la partie scripting - c'est-à-dire ce qui se passera côté client - il s'agit de JavaScript. De plus, parfois JavaScript est généré dans un autre langage et envoyé (il arrive que le script soit généré... car il est parfois plus facile de traiter certains changements dans la logique).

Étonnamment, il est écrit en PHP, sur Facebook et dans de nombreux autres grands projets. Bien sûr, ils ont dû écrire certaines de leurs propres choses pour que cela fonctionne toujours normalement, et non de manière « maladroite », mais ils l'ont fait. En principe, ce que vous écrivez n’a plus ou moins d’importance, mais je ne recommande pas Perl. Ici et maintenant, bien sûr, personne n’écrit rien pour le Web à partir de zéro. Tout le monde écrit une sorte de cadre ou autre chose. Boutique en ligne? Nous avons téléchargé un framework pour une boutique en ligne - et c'est tout, nous avons écrit une boutique en ligne.

Programmation pour les entreprises

Ensuite, vous voulez rédiger une candidature ennuyeuse pour une banque. Ou, par exemple, avez-vous quelqu'un qui vend des cartes SIM ? Peut-être avez-vous déjà acheté un téléphone ou autre chose et on vous a dit : « Le système est bloqué, nous ne pouvons rien faire ». Qu’utiliserez-vous pour écrire une telle application ? (Cri du public à propos de Python) Vous ne pouvez pas écrire ça en Python, qu'est-ce que vous dites ?! Il n’est pas nécessaire d’écrire quoi que ce soit pour les entreprises en Python. Pourquoi? Car lorsque l’on écrit quelque chose en Python, il est impossible de détecter un nombre important de bugs lors du processus d’écriture. Python est typé dynamiquement de toutes les manières possibles, et en général, vous pouvez masquer un bug de telle manière qu'il apparaît dans une situation telle que vous ne pourrez même pas comprendre ce que ces utilisateurs véreux ont fait là-bas, que tout est brisé pour toi. Autrement dit, en Python, il est préférable d'écrire de petits scripts pour vous-même - vous comprenez ce qui s'y passe et ce qui se fait. Eh bien, ou quelque chose que vous n'avez pas peur de jeter : vous voulez déployer quelque chose avant vos concurrents, et si cela tombe en panne de temps en temps. Vous avez écrit en Python et c'est tout : vous avez conquis le marché. Et si vous écrivez quelque chose depuis longtemps, par exemple une sorte d'application bancaire (pour qu'elle approuve les prêts, autre chose) - vous l'écrivez en Java. Parce que c'est une affaire sérieuse, des papiers, de l'argent, des documents, autre chose, mais on ne peut pas tout gâcher au point que tout se brise, sinon les gens seront offensés - leur argent est parti et n'est arrivé nulle part, parce que d'une manière ou d'une autre à partir du moment où la chaîne s'est transformée en nombre ou vice versa. Donc, cela signifie que vous le prenez méthodiquement en Java et écrivez, écrivez... Eh bien, ou sur .Net, de telles situations, en principe, se produisent également. Là, bien sûr, vous pouvez également rencontrer des problèmes, mais la probabilité que cela se produise est néanmoins un peu plus faible.

Programmation pour l'armée, l'industrie aérospatiale

Imaginez maintenant qu’ils décident de vous envoyer sur la Lune à bord d’une fusée. Que préféreriez-vous utiliser pour écrire le code qui contrôle les moteurs de fusée ? Jetons un coup d'oeil. Ceci, probablement (le conférencier montre Perl, Python, PHP, Ruby), n'en vaut pas la peine - cela ralentit, quelque chose d'autre se passe, et en général, je n'accepterais pas de voler sur une telle fusée. En C++ ? Pour être honnête, je ne lui ferais pas confiance non plus, car en C++, il y a trop de façons de se suicider. Quand vous êtes quelque part dans l’espace, ce n’est pas très bon.

Peut-être en Java ? Il semble que tout y soit assez fiable et que l'architecture soit bonne, pas de types sauvages, pas de déplacements inutiles au-delà des limites de la mémoire. Disons que le moment le plus crucial est arrivé et que notre Java a décidé de ramasser les ordures pour nous. Nous devons atterrir, ralentir, et elle dit : « Non, les ordures s’en vont. » En général, pas très bon non plus.

Honnêtement, je préférerais que ce programme soit écrit en Pascal. Bien sûr, je n’aime pas vraiment Pascal, mais d’une manière ou d’une autre, ce serait très cool dans de tels domaines.

Utiliser plusieurs langages pour le développement de logiciels

Eh bien, que faut-il dire en général des langues modernes. De nos jours, de nombreux projets ne sont pas rédigés dans une seule langue, c'est-à-dire que certains d'entre eux sont rédigés dans une langue, d'autres dans une autre et d'autres encore dans une troisième. Par exemple, si vous disposez d'une sorte d'application Web qui traite d'énormes quantités d'informations, les appels aux disques (pas même aux bases de données, ils sont si énormes que même une base de données ne peut en gérer aucune déjà écrite) sont probablement écrits dans une sorte de puis du C de bas niveau, pour écrire très rapidement sur le disque et tout ça. Naturellement, cela ne vaut pas la peine d’écrire l’intégralité du projet en C. Il existe peut-être une sorte de logique intermédiaire écrite en Java qui appelle les fonctions C pour des appels rapides. Eh bien, le frontend (ce que l'utilisateur regarde), bien sûr, est déjà écrit dans quelque chose, dans certains scripts, dans quelque chose qui est directement exécuté par le navigateur (JavaScript). Et tout cela vit ensemble et interagit avec succès.

Lors du développement de certaines applications, même les plus volumineuses, que font parfois les gens ? Ils le prennent et écrivent un prototype en Python (comment tout cela fonctionnera), l'esquissent, réfléchissent à une sorte d'architecture. Écrire dessus est vraiment très rapide - ils ont créé un prototype, l'ont expérimenté et ont dit : « Wow ! Ce est tellement cool!" Et ils l'ont complètement réécrit. Il semblerait qu'ils aient fait le travail deux fois, ce qui a pris deux fois plus de temps (enfin, un et demi). Mais non! Il s'avère souvent que cette méthode n'est pas mauvaise, car si vous écrivez quelque chose tout de suite, par exemple en Java, et que vous décidez ensuite : « Non, refactorisons, changeons complètement l'architecture et tout ça », alors vous dépenserez 10 fois plus temps . De telles choses existent et vivent aussi.

Conditions du succès de tout langage de programmation

Parlons maintenant des raisons pour lesquelles certaines belles langues n'ont pas survécu ou vivent dans un espace très limité. Lorsque Wirth a vu ce que les mauvaises entreprises Apple, Borland et tout cela ont fait à son Pascal, il a proposé un langage encore meilleur : Oberon. C'était tout simplement extrêmement minimaliste - c'est-à-dire qu'il y avait très peu de commandes (des chaînes ? Pourquoi avons-nous besoin de chaînes ? Nous allons créer un tableau de caractères !). Eh bien, quelque chose n’a pas fonctionné pour lui, dans la mesure où cela aurait pu fonctionner.

Encore une chose. L’armée américaine leur a demandé de développer un langage sympa dans lequel tout fonctionne et tout peut être écrit. Le résultat fut un langage Ada plutôt monstrueux, dans lequel, cependant, ils écrivent toujours quelque chose, mais encore une fois, uniquement pour les militaires.

Quel est le problème? Pourquoi certains langages comme Python, qu'aucune entreprise ne prenait en charge au début, ont conquis le marché. PHP, qui est également mal conçu, a également pris le contrôle du marché (en grande partie) à lui seul. Et toutes sortes de milliards de dollars ont été investis (le conférencier montre Ada) et ne sont allés nulle part, rien ne s'est passé. A quoi est-ce lié ? Cela est dû au fait qu’il n’existe aucune infrastructure autour de ces langues. Autrement dit, le langage peut être excellent, mais tant qu'il n'y a pas de documentation, tant qu'il n'y a pas de communauté capable de répondre aux questions (sur Stack Overflow) et, enfin, surtout, tant qu'il n'y en a pas un grand nombre des bibliothèques, le langage ne décolle pas. Autrement dit, vous souhaitiez rédiger un site Web sur Oberon. Qu'est-ce que c'est, pourquoi pas ? Et les tracas commencent... Vous ne pouvez pas configurer votre propre serveur Web sur Oberon pour le tester à la légère, vous ne pouvez connecter aucune bibliothèque, car Oberon n'en a pas. Et tout cela se fait avec quelques béquilles, la force s'en va, et en général vous abandonnez et écrivez votre site en C pur au lieu d'Oberon. Et ces langues qui vivent bien sont celles qui savent utiliser les bibliothèques d'autres langues. Le même Python dans les endroits où il ralentit. Eh bien, en général, toutes sortes de choses standard comme le tri et autre chose sont écrites en C, et il (Python) peut interagir avec elles.

Java dispose également d'une interface native Java. Il s'agit essentiellement de C, c'est-à-dire que là (à mon avis, ils veulent toujours l'interdire, mais il semble qu'ils ne l'aient pas encore interdit) ces langages peuvent interagir avec des bibliothèques déjà existantes (principalement C). Et à cause de cela, ils le prennent et travaillent. L’idée que j’essaie de vous transmettre est claire, non ? N'écrivez pas dans des langages qui ne prennent pas en charge la bibliothèque C. Eh bien, si vous voulez utiliser quelque chose de cool. Eh bien, progressivement, elles (les langues) acquièrent leur propre infrastructure. Et ils vivent bien.

Langage de programmation et orientation professionnelle

Parlons maintenant de la façon de comprendre ce que vous voulez dans la vie. Quelles sont les choses les plus cool ? Vous pouvez faire de la programmation système, n'est-ce pas ? C'est génial pour vous de compter ces bits, vous voulez lancer des quadricoptères, des sortes de caméras et faire autre chose. Alors, probablement, C est votre choix.

Si vous voulez écrire, ce n'est peut-être pas les applications les plus intéressantes de la vie, mais c'est cool pour vous de les concevoir, de penser à tout et de gagner beaucoup d'argent en restant assis et en vous ennuyant la plupart du temps (vous devez payer pour cela si vous êtes doué), les voici - Java, .Net. Tu vas travailler dans une banque, tu écris, tu vas travailler à neuf heures en chemise blanche, tu as un bon salaire et tu écris selon les recommandations des meilleurs développeurs Java, des moutons .Net et tout ça...

Si vous souhaitez écrire des applications, une sorte de navigateur, une sorte de jouet ou autre chose, alors le C++ est génial. Si vous souhaitez écrire des sites Web, alors les voici, langages de votre choix (le conférencier montre Perl, Python, PHP, Ruby), il n'y a pas beaucoup de différence. La seule chose est que PHP mourra avant Python, donc si vous êtes paresseux pour apprendre de nouvelles choses, apprenez Python. Vous ne remarquerez pas beaucoup de différence, mais vous durerez plus longtemps.

Ce qui se passe avec Ruby n'est pas non plus clair. Eh bien, vous pouvez faire du PHP si vous l’avez déjà appris, heureusement c’est si simple qu’il ne faut pas si longtemps pour réapprendre.

Et enfin, il existe un autre domaine d'application des langages de programmation : c'est lorsqu'un non-programmeur les utilise. Disons que vous êtes mathématicien, physicien, chimiste, analyste, n'importe qui, et que vous avez besoin de calculer rapidement quelque chose, d'analyser certaines données (pour les biologistes, par exemple, combien de renards arctiques vivent sur les îles du Commandeur). Vous pouvez mettre tout cela dans un tableau dans Excel ou l'analyser avec quelque chose. Python est également bon pour cela, il peut fonctionner avec du texte et il existe de nombreuses bibliothèques, statistiques et tout ça. Si vous souhaitez faire une sorte d'apprentissage automatique, traiter certaines données, faire des prédictions, cela se fait également en Python de la manière la plus rapide actuellement. Certes, il convient de noter que les tâches sont très différentes. Par exemple, si vous souhaitez négocier instantanément en bourse dans des conditions où les cotations changent tout le temps, peu importe à quel point vous écrivez du Machine Learning en Python, les personnes qui l'ont écrit dans quelque chose de plus rapide auront le temps de tout acheter avant tout. seront comptés pour vous, même si leurs algorithmes sont pires. Par conséquent, même ces tâches d'apprentissage automatique (certaines d'entre elles) nécessitent des performances élevées (et extrêmement élevées) et, par conséquent, d'autres langages.

La seule façon de comprendre ce que vous voulez est de tout essayer. Maintenant, je vais le dire comme l’une des visions de la façon dont vous pouvez tout essayer. Comment devenir programmeur et heureux ? Donc. Commençons par une table rase. Ici, vous étudiez les mathématiques, la langue russe et d'autres matières obligatoires et facultatives à l'école, et vos connaissances dans le domaine de la programmation se reflètent actuellement au tableau (le conférencier montre un tableau vide). Et vous voulez devenir une personne heureuse, faire ce que vous aimez, gagner beaucoup d'argent et ne rien vous priver et être heureux.

Une façon d’y parvenir. Il existe bien sûr toutes sortes d’histoires inspirantes sur des personnes qui ne sont pas allées à l’université du tout, ou qui ont abandonné leurs études et sont devenues milliardaires, propriétaires d’entreprises, etc. Mais il convient de noter que la plupart des gens qui ne sont peut-être pas devenus milliardaires, mais qui vivent aussi bien, obtiennent néanmoins un diplôme universitaire à un moment donné.

Quelle est la situation avec l'admission à l'université (étudiez-vous actuellement à l'école) ? Pendant que vous êtes à l’école, vous devez comprendre que la prochaine étape consiste à vous inscrire et à vous en occuper. Réussissez l'examen d'État unifié ou remportez l'Olympiade. Lors de l'examen d'État unifié, vous pouvez utiliser Pascal, C++ (y compris le C pur), Python (je ne les mentionnerai pas davantage). A l'Olympiade, il y a le même Pascal, le même C++, le même Python (nous allons maintenant parler de ses problèmes) et, le plus souvent, il y a Java. Il y a d’autres choses qui se produisent en fonction des Jeux olympiques, mais ce n’est pas le sujet.

À quoi ressemble le graphique de la répartition des langues à l'Olympiade panrusse d'informatique ? Les gens qui participent aux Jeux olympiques panrusses, les plus cool, qu'écrivent-ils ? Cela ressemble à ceci (ici cela signifie Pascal, et ici c'est environ 2000, et ici c'est environ zéro, ici c'est C++, et ici c'est 2015).

En 2000, presque personne n’écrivait du C++. 15 ans ont passé, et presque personne n'écrit en Pascal, malgré le fait que Pascal soit moderne. C’est un langage qui peut presque tout faire de la même manière. C'est juste que tout le monde est devenu trop paresseux pour apprendre cela, chaque nouvelle tendance, et ils continuent à tout écrire en Borland Pascal, ce qui bien sûr ne peut rien faire. En C++, les gens écrivent des algorithmes (STL) pour trier - super, ils ont écrit sort() et c'est tout. Sur Pascal, sur Regular, sur l'ancien - c'est un problème. Nous avons écrit une sorte d'ensemble (c'était nécessaire) - super, nous l'avons écrit en C++, mais en Pascal, c'était encore une fois une véritable galère. Bien sûr, vous pouvez le faire avec de nouveaux Pascal, mais ils coûtent généralement de l'argent. Vous ne l’avez peut-être pas remarqué, mais c’est vrai.

Il existe aussi Java, mais Java a beaucoup de lettres. C'est pour les grands projets, mais pour les petits programmes ponctuels, cela s'avère très mauvais, car il y a beaucoup de lettres supplémentaires. Mais certaines personnes écrivent aussi, on peut apprendre à écrire dessus. Mais cela ne figure pas à l’examen d’État unifié et la majorité devra quand même passer l’examen d’État unifié.

Qu'est-ce qui est le mieux pour l'examen d'État unifié ? Pour l'examen d'État unifié, il est préférable (si vous ne savez rien et qu'on ne vous apprend rien à l'école) d'apprendre Python. Certains problèmes d'examen peuvent être parfaitement résolus. Aux Olympiades, en général, il s'avère que C++ est utilisé, car Python est très lent, tout n'y est pas résolu.

Ainsi, vous avez étudié un petit sous-ensemble du langage et quelques algorithmes (éventuellement) et résolu de nombreux problèmes afin de recevoir un diplôme de votre Olympiade et d'entrer à l'université pour recevoir un enseignement supérieur.

Je vais maintenant parler de la façon dont nous structurons le cours au HSE, dans quel ordre les langues sont enseignées, comment elles sont étudiées en mathématiques appliquées et en informatique à la Faculté des sciences appliquées, ce que nous faisons avec Yandex. Au premier semestre - Python (pas dans son intégralité, à peu près comme vous devriez l'apprendre à l'école) et C++ (déjà plus large, beaucoup plus large que ce qui est habituellement enseigné dans les écoles). Laissez-moi vous le dire tout de suite pour que vous n'ayez pas peur, si d'un coup vous avez envie de vous inscrire, vous direz : « Quoi, je sais déjà tout ça, pourquoi devrais-je aller étudier quelque part ? Je préfère aller ailleurs. Pour ceux qui savent déjà bien programmer, il existe la possibilité de passer immédiatement à l'étude des algorithmes, et dans le cadre d'une préparation assez théorique. Nous ne les regardons pas maintenant, ceci (montre le tableau) est pour ceux qui sont des programmeurs intermédiaires ou pas du tout.

Au premier semestre, les bases de Python sont enseignées, histoire que les gens apprennent à programmer et que personne ne soit trop offensé. Python est rarement enseigné dans les écoles ; la plupart des gens ont des connaissances en Pascal ou en C++. Surtout même Pascal, s'il s'agit d'une école de masse. Eh bien, pour que personne ne soit offensé, tout le monde apprend une nouvelle langue (comme s'ils étaient dans des conditions égales). Et C++ tout simplement parce qu’à partir de C++, vous pouvez aller n’importe où.

Vient ensuite le cours Algorithmes et un projet de cours distinct. Algorithmes classiques avec implémentation. Ce n’est pas que nous ayons pris quelque chose en théorie et calculé sa complexité. Lors du cours, nous l'avons suivi, calculé la complexité, lors du séminaire, nous l'avons suivi et implémenté l'algorithme. Un projet est l'endroit où les étudiants réalisent quelque chose de complet. Par exemple, l'un des projets était : compter... Disons que vous avez beaucoup d'appartements à Moscou et que vous comprenez : « Oh, j'ai beaucoup de choses en trop, je vais en louer. Et ils fixent un certain prix, et pour une raison quelconque, personne ne veut vous louer un appartement - c'est probablement trop cher. Ou ils ont fixé un prix, ils vous l'ont immédiatement pris et vous pensez : « Oh, je l'ai probablement vendu à bas prix » - et vous êtes également contrarié. C'est-à-dire qu'il fallait calculer combien coûte la location d'un appartement ? Vous entrez les données - cela crée une estimation pour vous. Un tel site, qui consistait en plusieurs choses : prendre des phrases, les analyser, appliquer une sorte d'algorithme d'apprentissage automatique (probablement) simple et créer une belle interface Web dans laquelle vous pouvez sélectionner quelque chose, saisir quelque chose, quelques mètres, un certain nombre de pièces , nombre de saunas, nombre de jacuzzi dans votre appartement et estimez grossièrement le coût. C'est-à-dire une sorte de chose finie et pas très compliquée. Ici, cela signifie (le professeur montre le cours sur les algorithmes) un tel noyau C++, avec des entrées-sorties de console. Eh bien, ici (le conférencier montre l'inscription « projet ») quelque chose sous la direction d'un mentor, peut-être avec des bases de données, peut-être avec une analyse de texte et autre chose.
Ensuite, il y a le troisième semestre - il s'agit d'un cours intitulé « Systèmes informatiques ». Il y a pas mal de langage assembleur à comprendre (très peu) et puis quelque chose de similaire au C pur et à l'interaction avec les systèmes d'exploitation, la programmation système en substance. Et le projet du séminaire porte aussi sur le thème de toutes sortes d'interactions réseau, d'assez bas niveau : développer une sorte d'utilitaire, par exemple rsync (la synchronisation, vous savez peut-être. En C pur, plus ou moins, écrivez un analogue de rsync, que vous aurez sur le réseau pour synchroniser les dossiers avec tous les accès aux fichiers, etc.).

Et enfin, le quatrième. Je ne sais même pas comment l’appeler, c’est une telle vinaigrette de technologies nécessaires au vrai développement, par exemple le développement web. C'est-à-dire qu'il s'agit d'une application pratique des bases de données, encore une fois quelque chose de similaire à ce qui a été fait dans le projet (le professeur montre le projet de 2ème année) mais plus approfondi. Autrement dit, ce sont des choses plus ou moins spécifiques, une programmation pratique. Parallèlement à cela, il y a toutes les théories, et ici ils font aussi de la science.

Et après deux cours, les gens partent faire ce qui les intéresse, car cela couvre assez largement les bases de la programmation et à ce moment-là, les gens comprennent déjà qu'ils ne veulent en aucun cas travailler avec des systèmes informatiques (ils ne l'ont pas fait). comme la programmation système, par exemple), mais ils veulent travailler sur des algorithmes théoriques, calculer des complexités, proposer de nouvelles choses, distribuées ou autre. Ou au contraire, ils pensent qu’ils n’ont pas grand-chose ici ( le professeur pointe la ligne du premier cours avec Python et C++) est parti, puis ( le conférencier pointe vers la troisième ligne de cours, avec la programmation système) - Je n'aime pas compter les octets et définir toutes sortes de restrictions sur la lecture et l'écriture, créer des flux, des threads et autre chose. Et conformément à cela, les gens choisissent une direction et étudient. C'est, en principe, pour que vous ne développiez pas le « syndrome du caneton » - vous avez été le premier à voir votre Pascal et vous dites maintenant « Pascal, c'est le pouvoir » ; ou plus avancé - vous avez vu le C++ et avez commencé à dire à tout le monde que le C++ est fort, mais que tout le reste n'est pas très bon.

Il faut maintenant voir cela plus largement (le professeur montre la liste des cours au tableau) - c'est une des méthodes qui a été choisie, notamment à HSE (elle est apparue récemment, donc elle est assez moderne). Il existe d'autres moyens de faire connaissance. Dans d’autres bonnes universités, l’ordre est un peu différent et d’autres accents sont mis. Mais ils essaient aussi de faire découvrir aux gens tout ce qu’ils ont.

Comment chercher un emploi en tant que programmeur

Tu es ( le professeur montre la liste des cours) a tout fait, étudié à l'université, fait autre chose pendant deux ans de manière plus productive et il faut aller travailler. Comment choisir quelque chose pour le travail ? Premièrement, vous vous êtes familiarisé avec tout, vous êtes allé plus loin quelque part et vous savez déjà ce que vous aimez. Vous devez choisir ce que vous aimez, naturellement. Parce que si vous aimez, vous faites des efforts, vous aurez de la motivation et en général tout ira bien. Parce qu’il ne s’agit pas seulement d’argent, il s’agit de le rendre intéressant et agréable pour vous. Eh bien, vous voulez entrer dans une entreprise sympa et trouver un emploi. Quel genre de personne aimerais-je voir personnellement ? Disons qu'une centaine d'étudiants viennent me voir - dois-je en embaucher deux ou un. Pourquoi viennent-ils, je ne comprends pas du tout, qui ils sont, ce qu’ils sont, comment ils sont ? Au mieux, ils me montreront le diplôme qu'ils ont obtenu à l'université, et je dirai : « Wow ! C'est un diplôme sympa, mais celui-ci n'est pas si cool ! Et je peux me tromper, d'ailleurs. Peut-être que la personne avait beaucoup de temps libre et qu’elle avait beaucoup mieux appris.

Qu'est-ce qui serait génial ? Tout d’abord, un projet open source que vous avez écrit du début à la fin. De préférence, si je crée une sorte d’infrastructure permettant de lire rapidement les données, ou autre chose, alors, bien sûr, je serais intéressé à ce que quelque chose d’open source soit écrit pour moi. Ils n’ont pas fait de site internet, mais quelque chose sur le sujet. Pourquoi est-ce que ça m'intéresse ? Je peux regarder votre code, je peux voir à quelle fréquence vous vous êtes engagé, je peux voir comment vous avez réagi aux bugs des utilisateurs, aux bugs des développeurs qui l'utilisent - tout est enregistré, je regarde tout et je pense : « Wow, ce bug n'a pas été résolu. "Je n'y suis plus depuis deux ans maintenant." Fermé, ici vous avez répondu impoliment à l'utilisateur, voici autre chose - je ne l'accepterai pas. Autrement dit, c'est votre projet personnel.

Ensuite, quoi d'autre serait cool ? J'aimerais voir comment vous avez fait le travail d'équipe. C'est-à-dire que vous venez me voir pour un entretien et me dites : « Les gars de l'université et moi avons fait une bonne candidature. Je créais une base de données là-bas, ils y créaient une sorte d'application mobile, et nous avions aussi un gars qui travaillait là-bas, une fille designer, un garçon sur le support technique. Nous étions cinq et nous avons réalisé un projet sympa. Bon, je vois que c'est bien ton projet, je dis : "C'est quoi le tien ?" Je regarde à nouveau le code et je comprends que vous savez travailler en équipe avec des gens.

Un programmeur n’est pas quelqu’un qui s’assoit seul (indépendant) dans un garage, quelque part avec les lumières éteintes, qui ne parle à personne, se laisse pousser la barbe et écrit. Il y a encore une certaine interaction avec les gens. Avec un patron par exemple qui peut parfois vous injurier (les patrons, ils sont comme ça, ne sont pas toujours gentils). Et je vois que vous savez travailler avec les gens et cela me rend heureux si vous avez une sorte de bonne équipe. Même si ce n’est pas bon, c’est mieux que de ne pas en avoir.

Qu’est-ce que j’aimerais personnellement d’autre ? Si vous avez fait vos preuves dans de grands projets. Par exemple, vous avez commis quelque chose dans le noyau Linux, si vous êtes dans la programmation système, et avez corrigé un bug. Autrement dit, ils ont montré que vous savez lire le code de quelqu’un d’autre et comment y apporter des modifications. Je regarde : « Oh, vraiment, tu as compris quelque chose de compliqué et tu as corrigé quelques bugs ! Et je commence à en être très heureux. Parce que j'ai... eh bien, je ne sais pas... mon programmeur a démissionné parce que ses concurrents lui proposaient un salaire plus élevé, et j'ai besoin de toute urgence de quelqu'un pour le remplacer - avec vous. Je vois que vous n'avez écrit qu'à partir de zéro, mais vous ne savez pas comment lire et modifier le code de quelqu'un d'autre, et je suis contrarié.

Et enfin, selon le poste spécifique, il y a diverses autres choses. Si vous obtenez un emploi d'analyste, j'aimerais que vous résolviez des problèmes d'analyse de données sur Kaggle. Si vous postulez pour des tâches algorithmiques, j'aimerais que vous fassiez quelques algorithmes dans la programmation sportive. Et enfin, si vous avez réfléchi au métier, lu comment se déroulent les entretiens, vous avez vu que certaines personnes expriment un grand mécontentement : « Je suis venu et ils m'ont demandé quel était mon passe-temps. Je m’assois comme un hibou et je ne réponds pas parce que je n’ai pas de passe-temps », et ils pensent que ce sont les RH qui font ça. En fait, ils essaient de comprendre à quel point vous êtes amical et adéquat. Si vous êtes hostile et inadéquat, peu importe à quel point vous êtes un génie et un bourreau de travail, un spécialiste coriace doté de grandes connaissances, il sera difficile pour l'équipe de travailler avec vous et vous ne pourrez pas mener à bien le projet seul. De plus, même si vous le retirez, vous pouvez imaginer quel est le fardeau pour l'entreprise. Et si tu venais demain et disais : « Augmente mon salaire 10 fois, sinon je te quitte. » Il est clair que les entreprises ne souhaitent pas se retrouver dans une telle situation. Par conséquent, cultiver l'adéquation et la bonne volonté en soi est aussi important (au minimum) que de développer certaines compétences professionnelles.

Pour résumer, que dire ? Quelles langues sont bonnes et lesquelles sont mauvaises ? Eh bien, au sein d'un certain groupe de langages, par exemple entre Ruby, Python et PHP, que choisir ? Bien sûr, la bonne réponse est Python, mais en fait la différence entre eux réside dans le nombre de bugs autorisés, dans le nombre d'autre chose - 5 %, enfin, peut-être 10 %. Autrement dit, si vous avez déjà un projet prêt à l'emploi écrit en PHP, personne sensé ne dirait : « Réécrivons tout en Python ». Ils diront : « Embauchons plus de développeurs PHP et continuons à écrire en PHP. » Super, c'est un bon choix. Il est clair que si vous décidez soudainement d’écrire un projet, il serait peut-être judicieux de choisir Python maintenant. Mais cela dépend aussi. Peut-être avez-vous beaucoup de développeurs PHP bon marché sur le marché, et ceux en Python sont chers, et vous pensez : « Oui, la technologie est plus cool, mais j'économiserai de l'argent sur les développeurs prêts à l'emploi. Et tout va bien, vous venez déjà y travailler.
Comment choisir entre Java et C++ ? Oui, il se passe à peu près la même chose. Je pense qu'au moment où vous déciderez dans quelle langue démarrer un nouveau grand projet, vous aurez acquis des connaissances dans votre domaine professionnel et serez en mesure de faire le bon choix. Maintenant, vous n'êtes pas encore obligé de faire ce choix, je vous conseille donc de faire ce que vous aimez.

Les bases, comme je l'ai déjà dit, les bases mêmes de la programmation (qu'est-ce qu'une fonction, que sont les if'ics, les for'ics, les tableaux, autre chose) peuvent être apprises dans plus ou moins n'importe quel langage. Par exemple, en C++, car il y a beaucoup de similitudes, et il y a le moins de détails (à ce niveau), et il y a le moins de lettres supplémentaires à écrire. Eh bien, lorsque vous apprendrez des choses architecturales complexes, vous apprendrez et vous n’aurez pas à trop vous en soucier. Autrement dit, l'essentiel est d'essayer, de chercher ce que vous aimez, et quand vous réalisez qu'il est déjà 4 heures du matin et que vous êtes assis et écrivez pour vous amuser, parce que vous aimez ça - probablement à ce moment-là il est clair que vous avez trouvé le vôtre.

Cet article porte sur l'extension et son importance pour les systèmes informatiques. Alors, semble-t-il, qu'y a-t-il de si spécial dans l'extension d'un fichier programme ? Nous espérons néanmoins que les lecteurs pourront obtenir par eux-mêmes des informations importantes et intéressantes. La capacité de comprendre les extensions sera utile, comme nous le verrons ci-dessous.

Quelle extension a C plus plus ?

Ce langage de programmation a sa propre notation de fichier. La notation cpp est une extension spéciale utilisée pour les fichiers contenant du code C++. Ils contiennent du code qui n'est pas encore prêt à l'emploi (non compilé), qui peut être édité et modifié sans coûts importants ni perturbations dans le fonctionnement du programme. Grâce à cette extension, vous pouvez savoir quel fichier contient du texte en C (un langage de programmation très populaire actuellement).

L'extension et son importance dans la programmation

Pourquoi avez-vous même besoin d’une extension de nom de fichier utilisée par votre ordinateur ? Le fait est qu'un ordinateur peut traiter de nombreux types de fichiers différents, à la fois au sein du système d'exploitation installé et à l'aide de logiciels supplémentaires. Un exemple d'un tel logiciel pourrait être les plugins installés dans les navigateurs ou les interprètes de divers langages de programmation capables de traiter les programmes en cours d'exécution. Il s'agit de reconnaître quel interprète l'ordinateur doit utiliser, quel code machine utiliser pour lire le fichier et les extensions sont nécessaires. reconnaît le type de fichier, cette information lui sera fournie par les détails disponibles. Ainsi, l'extension cpp est un fichier contenant un document C++. Après reconnaissance, l'interprète pourra l'ouvrir et l'utilisateur pourra travailler avec le document.

De toute façon, qu’est-ce qu’une extension de nom de fichier ?

Mais parlons des extensions de nom de fichier d’un point de vue informatique. Son objectif a déjà été déterminé - il est nécessaire d'identifier le format ou le type de fichier. L'extension est séparée du nom du fichier par un point. Avant 1995, Windows limitait le nombre de caractères dans une extension : il ne pouvait pas y en avoir plus de trois. Dans les systèmes modernes, une telle limitation n’existe pas. De plus, dans les systèmes de fichiers modernes, il peut y avoir des fichiers comportant plusieurs types d'extensions. Ils suivent tous ce point. Cependant, cela ne s'applique pas à des choses comme le RPC.

Les fraudeurs profitent souvent de ce cadeau des développeurs. Les criminels déguisent souvent les fichiers malveillants qu’ils déposent sur les ordinateurs des utilisateurs en les faisant passer pour d’autres programmes et cachent l’extension principale du fichier (pour les virus et divers chevaux de Troie, elle diffère des programmes classiques). Il peut même arriver que tous les vrais fichiers soient masqués ou supprimés et que des fichiers complètement différents soient remplacés. Et il s'avère que cpp n'est pas du tout cpp, mais un virus informatique. Une bonne défense contre ce type d’arnaqueur est la commande permettant d’afficher tous les types d’extensions. Vous pouvez activer cette fonction dans le « Panneau de configuration » ; recherchez simplement l’élément requis. Et puis, vous pouvez être calme à propos de vos fichiers C plus plus et être sûr que vous n’exécuterez pas de programme nuisible à leur place. Bien qu'ici, vous devez toujours regarder l'extension des fichiers exécutables.

Exactitude des informations fournies dans l'extension

Parfois, l'extension n'indique pas avec précision le type de fichier et ne résout pas tous les problèmes possibles pouvant survenir lors de l'utilisation de divers programmes. Ainsi, l'extension .txt, familière à beaucoup, ne fournit pas d'informations à l'ordinateur sur le codage du fichier. Par conséquent, lors de l'ouverture de fichiers texte, vous pouvez souvent voir des feuilles de caractères incompréhensibles. Il est particulièrement triste de voir un tel état d'un document s'il était utilisé pour écrire du code de programme. Dans de tels cas, les codages de fichiers doivent être modifiés jusqu'à ce que l'ordinateur puisse fournir le texte adéquat. Vous pouvez essayer de calculer l'encodage requis sur la base de caractères incorrects, mais vous devez savoir quel encodage mène à quoi par rapport à quoi. Pour les fichiers Word, la même extension est également utilisée, ce qui ne précise pas de quel fichier il s'agit : un type normal ou un formaté. L'extension n'indique pas non plus quelle version est utilisée, ce qui est utile lorsque l'on tente d'ouvrir des versions de documents antérieurs dans des environnements de traitement ultérieurs, comme c'est le cas avec Microsoft Office.

Autres moyens et options pour spécifier le format

Il existe d'autres options à spécifier pour le système de fichiers. Mais ils ne sont pas courants et vous n’en avez probablement jamais entendu parler :

  • Enregistrement des informations sur le format de fichier dans le système d'exploitation lui-même. Des inconvénients surviennent lorsque vous souhaitez passer à un autre ordinateur et travailler avec le même fichier.
  • Application de la méthode dite du « nombre magique ». C'est à ce moment qu'une certaine séquence d'octets est cryptée dans le fichier lui-même, ce qui indique toutes les informations nécessaires au fonctionnement du fichier. Cela a un certain potentiel, mais cela nécessite une coopération entre les éditeurs de logiciels.
  • Pour certains systèmes Unix, une fonction a été développée qui laisse des marques spéciales au début du fichier, destinées à l'interprète.
mob_info