Les objectifs du cours sont d'acquérir les concepts des langages de programmation (impératifs, fonctionnels, à objets) sans se focaliser en cours sur un langage de programmation. Pour cela des exemples seront donnés dans plusieurs langages (Java, C++, Caml). Par ailleurs les élèves devront mettre en pratique leurs connaissances en programmant dans un ou deux langages.
Architecture des machines: représentation des données CPU, registres, bus, cycles d'exécution, mémoire, cache niveaux d'abstraction: circuit, langage machine, langage d'assemblage,... Concepts fondamentaux de la programmation: déclarations, environnement, mémoire expressions, l'affectation, les différents modes d'évaluation structures de contrôle types de base, constructions simples (produits, sommes, tableaux) fonctions et procédures, variables locales, passage de paramètres récursion exceptions étiquetage pointeurs types de données récursifs définitions par motifs et filtrage polymorphisme inférence de type types abstraits objets, attributs, héritage modularité, interfaces, compilation séparée threads Eléments de preuve de programme terminaison assertions, pre et post-conditions, invariants preuves de fonctions récursives Compilation arbres abstraits, calculs d'attributs sémantiques analyse statique appels de procédures, passages de paramètres machines abstraites, exemple de la machine virtuelle Java génération de code et optimisations gestion mémoire