Page Moodle du cours pour E2018.
Description
Ce cours présente les différents concepts à la base des langages de programmation. Le cours vise à aider les étudiant(e)s à mieux connaître les outils qu'ils utiliseront dans le reste de leur carrière, et à les familiariser avec des méthodes et styles de programmation avancés Plusieurs styles de programmation seront vus, tels la programmation fonctionnelle, la programmation impérative, la programmation logique.
Des langages de programmation représentatifs seront étudiés à tour de rôle pour explorer chaque style de programmation et, lorsque nécessaire pour expliquer certains concepts, des exemples seront tirés d'autres langages. Nous ne cherchons pas à former des spécialistes d'aucun des langages étudiés, mais plutôt à donner une solide formation de base qui permettra à l'étudiant(e) de maîtriser en peu de temps n'importe quel nouveau langage.
Des travaux de programmation permettrons aux étudiant(e)s de confronter dans la pratique les concepts présentés dans le cours. Le cours n'est cependant pas un cours de programmation et il n'entend pas non plus enseigner certains langages: il se concentre sur les concepts théoriques sous-jacents.
Sujets traités
Syntaxe, sémantique, types, interprétation et compilation, structures de contrôle, représentations des données, portée, passage d'arguments, gestion mémoire, procédures, traitement de listes, fonctions d'ordre supérieur, macros, variables et environnements, ...
Manuels recommandés
David A. Watt, Programming Language Design Concepts, John Wiley & Sons.
Ravi Sethi, Programming Languages -- Concepts and Constructs, Addison-Wesley.
Autres manuels suggérés
- Graham Hutton, Programming in Haskell, Cambridge University Press.
- Benjamin C. Pierce, Types and Programming Languages, MIT Press.
- Simon Thompson, Haskell: The Craft of Functional Programming, Addison-Wesley.
- Paul Hudak, The Haskell School of Expression, Cambridge University Press.
Horaire
Premier cours: mardi 1 mai 2016, 9:00
(Ce cours débordera sur la démo qui devrait suivre)
Dernier cours: mardi 19 juin 2018.
| Jour | Heure | Lieu | Type |
|---|---|---|---|
| Lundi | 15h30-17h30 | Z-350 | Cours |
| Mardi | 9h00-11h00 | Z-300 | Cours |
| Vendredi | 9h00-11h00 | Z-350 | Cours |
| Mardi | 11h00-13h00 | Z-300 | Démonstration |
| Vendredi | 11h00-13h00 | Z-350 | Démonstration |
| 22 Mai | 9h00-11h00 | P-310 | Intra |
| 22 Juin | 9h00-11h45 | Z-310 | Final |
Le choix des salles n'est pas sous mon contrôle et est parfois changé
sans préavis,
donc dans le doute, faites plutôt confiance au formulaire
insupportable de Synchro
Démonstrateurs
Irvine Potok<potokirv@iro.umontreal.ca> Disponibilité: Jeudi 8h00 à 10h00 local AA-2211.
Évaluation
Il y aura 2 travaux pratiques (total 45 points) et deux examens de 25 points chacun, plus 5 points sur les exercices hebdomadaires. La note finale sur 100 sera convertie en note litérale à la fin du cours seulement, selon un barème qui dépendra de la moyenne du groupe et de la répartition des notes des étudiants. Un total aux deux examens inférieur à 25 points (i.e. la moitié des points) est éliminatoire.
Les travaux pratiques sont à faire en groupe de 2 (jamais plus, et très rarement moins). Les exercices sont à faire seuls. Et les examens se font à livre fermé: vous n'avez droit qu'à une page de notes (recto) écrite à la main, pas de livre ni de calculatrice autorisés.
Rappel
Le plagiat et la copie sont des fautes graves passibles de sanctions disciplinaires. Dans ce cours, nous prendrons toutes les mesures que nous jugeons nécessaires pour dépister et contrer ce genre d'activités.
Notes de cours
Ces notes furent inspirées de celles de Marc Feeley, sauf les erreurs bien sûr.
Intro et syntaxeProgrammation fonctionnelle
Macros
Programmation logique
Programmation impérative
Gestion mémoire
Programmation orientée objets
Programmation concurrente
Types dépendents
Démonstrations
Les données de chaque démonstration seront placées ici.
Les exercices sont à faire individuellement, pas en groupe, et ne sont pas notés, sauf ceux labellés "½" et qui sont à rendre en début de démo, qui comptent chacun pour 1% de la note.
Exercices 0½, à rendre au début de la démo du 4 mai.Exercices 1, à faire à la démo du 4 mai.
Exercices 2, à faire à la démo du 8 mai.
Exercices 2½, à rendre au début de la démo du 11 mai.
Exercices 3, à faire à la démo du 11 mai.
Exercices 3½, à rendre au début de la démo du 15 mai.
Exercices 4, à faire à la démo du 15 mai.
Révision d'intra, à faire à la démo du 18 mai.
Exercices 5, à faire à la démo du 25 mai.
Exercices 6, à faire à la démo du 29 mai.
Exercices 6½, à rendre au début de la démo du 1 juin.
Exercices 7, à faire à la démo du 1 juin.
Exercices 8, à faire à la démo du 5 juin.
Exercices 8½, à rendre au début de la démo du 8 juin.
Exercices 9, à faire à la démo du 8 juin.
Exercices 10, à faire à la démo du 12 juin.
Exercices 11, à faire à la démo du 15 juin.
Révision de final, à faire à la démo du 19 juin.
Révision d'intra, à faire entre amis.
Révision de final, à faire sur la terrasse, avec un sorbet.
Travaux Pratiques
Les données de chaque travail pratique seront placées ici.
Les travaux pratiques sont à faire en groupe de 2.
TP #1
La donnée du travail.
Le code source correspondant.
Ce TP compte pour 23% de la note finale.
Voici un fichier d'exemple de code Slip,
que vous pouvez passer à la fonction run.
Le code fourni utilise la librairie Parsec qui n'est pas
forcément installée avec GHC. Sous Debian GNU/Linux, par exemple, j'ai dû
utiliser la commande aptitude install libghc-parsec3-dev.
Vous pouvez aussi utiliser Cabal
pour l'installer, avec la commande cabal install parsec3.
TP #2
La donnée du travail. Le code source correspondant.
La version de re.prolog envoyée à l'origine avait
plusieurs erreurs. La version actuelle les a corrigées, en appliquant le
patch suivant: re.prolog
errata
Liens utiles pour les langages abordés
Liens pour Emacs
GNU Emacs est l'éditeur recommandé dans ce cours pour écrire du code. Parmi les bonnes ressources pour ce qui a trait à Emacs, nous trouvons le manuel online disponible dans le menu Help, la commande 'i' dans ce manuel, le groupe de discussion gnu.emacs.help, le Wiki, et la "refcard" qui est distribuée avec Emacs, dans un fichier nommé quelque chose comme/usr/share/emacs/24.5/etc/refcard.ps.
Liens pour Haskell
- La définition officielle de Haskell
- A history of Haskell.
- Liens vers divers livres et tutoriels.
- Une foule d'autres renseignements sont disponibles sur http://www.haskell.org/.
L'implantation de Haskell utilisée pour ce cours est GHC.
Sur les machines GNU/Linux du DIRO, GHC (et plus particulièrement sa boucle interactive ghci) est installé dans
~dift2035/bin/ghci. Pour l'utiliser, le plus simple est d'ajouter~dift2035/bindans votre PATH. Bien sûr vous pouvez aussi l'installer chez vous.Vous pouvez cependant aussi utiliser Hugs. Qui est installé dans
~dift2030/bin/hugs. Il est beaucoup plus léger mais n'est plus maintenu depuis pas mal de temps, et renvoie parfois des messages d'erreurs souvent moins descriptifs.Pour éditer Haskell confortablement dans Emacs (avec highlighting et indentation automatique), vous pouvez utiliser haskell-mode ou Intero.
Sur les machines GNU/Linux du DIRO, une ancienne version de haskell-mode est installée dans
~dift2030/pkg/haskell-mode. Le plus simple pour l'utiliser est d'ajouter(load "~dift2030/etc/emacs.el")dans votre fichier~/.emacs.Depuis un buffer Haskell dans Emacs, vous pouvez envoyez le fichier à GHCi/Hugs avec
C-c C-l. Vous pouvez aussi faireC-c C-bpour sauter au prompt interactif de GHCi/Hugs.
Liens pour C
Il y a pléthore de livres sur C. Il y a aussi divers tutoriels sur le web. Une bonne source d'information détaillée est la FAQ de comp.lang.c.
Pour les projets en C, je recommande aussi d'utiliser la documentation en
ligne de de make, gdb, et glibc. Elle est accessible depuis Emacs
avec M-x info (aussi dans le menu Help =>
Manuals => Browse Manuals with Info).
Pour débugger des problèmes de gestion mémoire, il peut être utile de
faire un export MALLOC_CHECK_=2 pour attraper le problème
plus tôt. La documentation en ligne de glibc explique quelles autres
valeurs peuvent être utilisées.
Liens pour Prolog
- GNU Prolog.
- SWI Prolog.
- GNU Prolog online documentation
- SWI Prolog online documentation
- ISO Prolog documentation.
- Au DIRO, GNU prolog est disponible
dans
~dift2030/bin/gprolog. Il faut ajouter cela dans votrePATHplutôt que l'appeler directement car il utilise d'autres programmes de manière interne. - Pour utiliser GNU Prolog avec l'interface Prolog d'Emacs, vous pouvez
faire
M-x run-prolog RETpour démarrer Prolog ouC-c C-lpour passer le fichier courant au système Prolog. - Pour charger un fichier dans le système GNU Prolog, donner la
commande
['monnomdefichier'].qui se termine par un point.