Descriptif
Comment les ordinateurs calculent ? Comment un processeur fonctionne ? Comment une machine composée de simples portes peut-elles exécuter des programmes écrits dans des langages de haut niveau (tels Python ou OCaml) ?
Ce cours présentera les différentes abstractions qui permettent de construire une machine exécutant des programmes dans des langages de haut-niveau à partir de porte logique. En particulier, nous nous intéresserons à la création d'un petit CPU fait de portes logiques (nand et registres), au langage assembleur x86-64 et à la compilation d'un langage vers cet assembleur.
Objectifs pédagogiques
Acquis d'apprentissageÀ l'issue de l'UE, l'élève sera capable de:
- Énumérer les principaux composants d’un CPU
- Décrire les principales étapes de la compilation d’un programme (analyse lexicale, syntaxique, typage, production et les diverses optimisations de code, édition de liens, assembleur)
- Utiliser des outils pour générer des analyseurs lexical et syntaxique
- Produire un compilateur pour un langage « jouet »
Compétences de rattachement (et justification)
- BC1.5 – Réaliser un système complexe en mettant en œuvre les solutions technologiques nécessaires, en s’appuyant sur les ressources humaines, techniques, matérielles disponibles en faisant preuve de rigueur, d’esprit critique et d’adaptabilité; Justification : L'essentiel du travail du cours portera sur quelques gros projets qui nécessiteront de la planification, de l'étude des outils existants, du travail en groupe, des choix d'ingénierie logiciel (éventuellement à remettre en question)
- BC3.2 – Mettre en place une gestion collaborative du projet et s’assurer des conditions favorables à son bon déroulement : animer des réunions d’équipe, adopter une attitude réflexive commune quant au fonctionnement de groupe (...); Justification : Travail en groupe
- BC10.2 – Analyser et résoudre des problèmes mathématiques et algorithmiques nécessaires dans des étapes de réalisation d’un projet en s’appuyant, si besoin est, sur des simulations et dans l’objectif d’implémenter des solutions compétitives; Justification : Les différents projets feront appel à de l'algorithmique et le code produit par le compilateur sera testé dans sa correction et son efficacité.
- BC8.4 – Déterminer les phases et procédures de tests techniques et fonctionnels des composants matériels et logiciels pour assurer la fiabilité, la sécurité et/ou la sûreté de fonctionnement des systèmes; Justification : Tester les logiciels produits sera une composante importante du cours.
effectifs minimal / maximal:
2/Diplôme(s) concerné(s)
UE de rattachement
- MDC_3UE02_TP : Sciences et technologies de l'ingénieur (I)
Format des notes
Numérique sur 20Pour les étudiants du diplôme Diplôme d'ingénieur
Vos modalités d'acquisition :
Plusieurs projets notés sur le code rendu et, pour le projet final, sur la présentation et réponse aux questions. Il y aura au total 3 petits projets (mini-compilateur, CPU, interprétateur) et un gros projet (compilateur) qui fera l'objet d'un rendu et d'une présentation. La note sera composée de 1/6 pour chaque petit projet, 1/4 pour le compilateur et 1/4 pour la présentation.
Le rattrapage est autorisé (Note de rattrapage conservée)- le rattrapage est obligatoire si :
- Note initiale < 10
Le coefficient de l'UE est : 0.3
L'UE est évaluée par les étudiants.
Programme détaillé
Introduction
- Présentation des objectifs du cours, la notation, les TP à rendre
- Brève histoire de l'informatique, orientée matériel et langages
- Vue d'ensemble des sujets étudiés dans le cours
Assembleur x86-64
- Fonctionnnement général du processeur (RAM, registres, instructions, etc.)
- Organisation de la mémoire
- Jeu d'instruction et pseudo-instructions
- Appels systèmes et interruptions
- Conventions d'écritures
- Assemblage
- Exercices
Construction d'un CPU à partir de portes logiques
- Rappels sur les portes logiques (nand et bascules synchrones)
- Construction de petits circuits logique (et, ou, xor, mux, neg) à partir de nand
- Construction de circuits arithmétiques (half-adder, full-adder, +, -, mux_n)
- Construction de mémoires (RAM / ROM / registres)
- Construction d'une ALU voire d'un CPU
Syntaxe, Sémantique et interprétation
- Lexing en OCaml avec OCamllex
- Parsing avec Menhir
- Notion de syntaxe vs sémantique
- Analyse de la sémantique
- Interprétation d'un langage à la python
Production de code x86-64 pour un langage procédural simple
- Production récursive de code
- Gestion de la mémoire avec des variables globales et locales (tas et pile)
- Gestion des fonctions
Production de code x86-64 pour un langage objet