Les langages de programmation les plus populaires sont des langages de haut niveau. Par exemple, Java, Python ou C #. Bien sûr, vous pouvez les programmer et imaginer mal comment les différents niveaux d'abstraction fonctionnent réellement. Mais pour un bon spécialiste informatique, il est important de comprendre comment la plate-forme avec laquelle il interagit est construite, comment l'environnement de développement, le compilateur et la fonction de débogage. Cela nous amène à parler de programmation de bas niveau.
LLP (programmation de bas niveau) est un moyen pratique de comprendre comment écrire des programmes fiables, rapides, compacts et efficaces. Nos étudiants apprennent l'assembleur et le C principalement pour mieux comprendre le fonctionnement du logiciel.
Photo Pablo BD CC BY-SAPourquoi avez-vous besoin de savoir
L'industrie informatique se développe rapidement et est soumise à une mode pour la technologie et les langues. Les concepts fondamentaux - par exemple, les modèles de calcul, la mémoire virtuelle, la compilation et l'assemblage de programmes - changent beaucoup moins fréquemment. Comprendre comment les principes de base de ces concepts se manifestent dans un langage de programmation vous aidera à apprendre rapidement un langage similaire si vous en avez besoin pour fonctionner. Dans ce cas, LLP indique clairement comment le programme à partir du texte source devient un ensemble d'instructions machine et comment elles sont exécutées sur l'ordinateur. À son tour, la familiarité avec les mécanismes de gestion de la mémoire et les principes du compilateur vous aidera à écrire du code moins exigeant en ressources informatiques.
Clarification: Nous devons souvent tomber sur la thèse selon laquelle LLP ne programme que du fer et des tâches similaires. Ce n'est pas le cas.
Où puis-je trouver LLP dans la pratique:
- Trading Le trading en bourse crée des programmes avec des exigences incroyablement élevées pour le temps de réaction aux fluctuations du marché. En raison de «l'éloignement» des langues de haut niveau du «fer», il est très difficile de prédire le temps de réponse d'un programme à un événement externe. Par conséquent, LLP est impliqué ici pour fournir un contrôle sur la vitesse des transactions.
- Robotique . Les ressources informatiques sont limitées ici, donc les exigences de qualité logicielle et de compacité du code sont élevées. Les approches généralement acceptées pour créer des logiciels ici ne fonctionnent pas toujours, et souvent le développement peut se faire en C ou dans un autre langage système.
- Logiciel système . Il s'agit des OS, des compilateurs (JIT, AOT), des navigateurs (aujourd'hui ils sont devenus une plateforme pour créer des applications complexes). Son travail n'est pas toujours perceptible par le profane, mais crée une infrastructure pour les logiciels d'application.
Comment nous préparons-nous à cela?
Nos étudiants des directions 09.03.01 "Informatique et génie informatique" et 09.03.04 "Génie logiciel" étudient un certain nombre de disciplines liées à la programmation de bas niveau. Il s'agit des systèmes d'exploitation, des logiciels système (y compris sous Unix), du développement de compilateurs, des technologies de virtualisation, etc.
Point de départ - cours "Programmation de bas niveau". Ici, les étudiants attendent de travailler avec l'assembleur et C. En parallèle - ils étudient le processus de compilation et d'exécution des programmes. Le cours est au format "de la définition de la tâche au programme terminé". L'objectif principal du cours est de se faire une idée de l'évolution de la présentation du programme lors des transitions entre:
- écrire du code;
- prétraitement et compilation;
- relier
- exécution et débogage.
Photo hackNY.org CC BY-SADe la part des étudiants qui viennent au cours, nous nous attendons à une expérience de programmation minimale dans des langages de haut niveau (par exemple, Java ou C #). Nous recommandons les cours en ligne suivants:
Le cours "Programmation de bas niveau" est enseigné principalement à partir d'un
livre écrit spécialement pour nos étudiants. Le livre est publié en anglais et traduit en japonais et portugais. Nous travaillons également souvent avec le manuel du développeur de logiciels Intel64 et System V AMD64 ABI.
Contenu du cours
En termes simples, ce cours peut être détaillé comme suit (en ce qui concerne les sujets identifiés ci-dessus):
- Code d'orthographe . Supposons un langage d'assemblage gratuit pour Intel 64 (NASM, Linux) et C11. Ici, nous étudions les modèles de calcul, donnons des recommandations avancées sur le style d'écriture du code.
- Prétraitement et compilation . Les préprocesseurs NASM et C sont étudiés, les grammaires formelles, les optimisations de code communes par le compilateur et la mécanique d'une implémentation typique des constructions du langage C au niveau assembleur (en d'autres termes, une démonstration de l'idée de "C est un assembleur de haut niveau") sont discutées.
- Liaison (liaison) . Statique et dynamique. En pratique, le format ELF est à l'étude - les étudiants explorent ce que font l'éditeur de liens et le chargeur dynamique. Soit dit en passant, un mini-cours distinct a été consacré à cela.
- Exécution et débogage d'un programme . Nous comprenons ici comment ces tâches sont liées à l'architecture de l'ordinateur, au périphérique de mémoire virtuelle et au mode privilégié, aux interruptions et au mécanisme d'appel système. De plus, nous considérons comment gdb est utilisé (un débogueur puissant qui vous permet de "regarder sous le capot" de n'importe quel programme).
Nuances organisationnelles importantes
Nous interrompons les cours en co-écrivant du code et en étudiant les fichiers compilés à l'aide d'outils de binutils (objdump, readelf) ou gdb. Pendant la conférence (et pas seulement), les étudiants posent des questions à la fois verbalement et dans le canal du cours dans un messager bien connu, et les enseignants y répondent dès que possible.
En tant que leçon pratique, les étudiants effectuent des travaux de laboratoire. Parfois, les étudiants dans le processus d'apprentissage veulent développer quelque chose qui leur soit personnellement intéressant (un jeu, un programme pour contrôler un robot, un compilateur, etc.).
Par conséquent, en tant que substitut à l'examen, les étudiants peuvent réaliser un projet individuel sur un sujet convenu avec l'enseignant. Après avoir passé en revue le code et posté sur GitHub, ils enregistrent une
vidéo démontrant le projet (cette chaîne contient des projets mis en œuvre depuis 2014, des liens vers GitHub sont dans la description).
Un exemple du travail d'un étudiant: le lévitron analogique (une histoire détaillée du projet sur Habr )Quelques autres projets terminés à la fin du cours:
À propos de l'enseignant
Au cours, toute une équipe d'enseignants interagit avec des étudiants qui donnent des cours, effectuent des travaux de laboratoire et conseillent les étudiants. Les étudiants seniors participent aux discussions et aident les étudiants du cours actuel à comprendre les subtilités de la programmation de bas niveau.
Le travail principal sur la préparation du matériel pour le cours a été effectué par Igor Zhirkov, l'auteur d'un manuel à ce sujet. Igor a étudié à l'ITMO University et Academic University, a obtenu une maîtrise en ITMO en 2016. Son domaine d'intérêt est la théorie des types, la logique mathématique, les langages de programmation et la programmation de bas niveau. Son principal projet actuel est lié à la vérification formelle du refactoring du langage C à l'aide de Coq et du compilateur CompCert vérifié pour C.
Ce cours vous aide à apprendre à regarder un problème à partir d'un niveau d'abstraction adéquat et, par exemple, conditionnellement, à ne pas essayer «d'écrire des applications Web dans l'assembleur». Nous essayons d'approcher l'étude du C et de l'assembleur en termes de compréhension des concepts associés à ces «outils» et à leur environnement - systèmes d'exploitation et CPU.
À propos, vous trouverez ici un livre dont l'écriture a été inspirée par l'enseignement de ce cours (il a été publié en anglais, japonais et portugais).