Par Jean Vaucher, professeur titulaire, DIRO
Dans un article "humoristique" paru dans l'Interactif de février dernier, Mathieu Blanchette se questionnait sur le langage utilisé au DIRO pour l'apprentissage de la programmation. Plus précisément, il se demandait pourquoi nous résistions toujours à l'introduction de langages modernes comme Turbo-Pascal, Fortran ou C++ en faveur d'un langage 'préhistorique' qui a survécu jusqu'à notre époque sans aucune amélioration.
De fait, en matière des langages enseignés, le DIRO a plutôt été (et reste) à l'avant-garde des universités nord-américaines. Durant les 25 et quelques années du Département, nous avons changé plusieurs fois de langage de base. Simula, loin d'être un vieux choix, n'est utilisé que depuis 1991. Pour montrer pourquoi nous l'avons choisi, nous allons présenter un résumé historique des langages enseignés au DIRO; mais, d'abord, quelques remarques s'imposent.
Premièrement, le choix d'un langage dépend fortement du contexte dans lequel il sera utilisé: présentement, 'C' est un excellent choix pour l'écriture de logiciels de télécommunications; par contre, une compagnie d'assurances pourrait préférer COBOL. Dans notre cas, c'est l'enseignement de l'informatique qui prime. Pour cela, il nous faut un langage de haut niveau qui facilite l'expression d'algorithmes. Le langage devrait être représentatif des langages modernes, mais on préférera un langage simple avec une définition rigoureuse à un langage encyclopédique bourré de "features". Il faut aussi tenir compte de l'efficacité des implantations et du support à la mise au point. La disponibilité de livres sur le langage et de versions étudiantes compatibles sont aussi des facteurs.
Avec tous les progrès réalisés en informatique, on penserait qu'il serait facile de trouver un langage qui répond à ces critères; mais ce n'est pas le cas. L'évolution de la pratique dans le domaine du logiciel ne reflète pas nécessairement les progrès de la science. À l'image de la société actuelle (et de la bourse), l'évolution dépend en plus large mesure de stratégies commerciales, de tapage médiatique et du hasard. Souvent des produits nouveaux sont nettement rétrogrades à certains égards.
Les premiers langages informatiques à grande diffusion, Fortran et Cobol, ont été conçus durant les années 50 en fonction des domaines d'application: Fortran pour le calcul scientifique et Cobol pour la gestion. En 1960, un comité international conçut ALGOL (pour ALGOrithmic Language), le pionnier des langages modernes de l'informatique. Parmi les innovations d'Algol, notons: l'emploi d'une syntaxe formelle avec un format libre (indépendant des coupures de lignes), la localité des noms avec une structure de bloc, la récursivité et la gestion de la mémoire avec une pile. Le langage machine restait le choix universel pour la programmation de systèmes (systèmes d'exploitation, E/S et utilitaires).
Le DIRO fut créé dans les années 60 par des mathématiciens appliqués et le premier langage utilisé fut le FORTRAN; mais, plusieurs des premiers professeurs du DIRO étaient des coopérants français formés à Grenoble et pour l'enseignement de la compilation, ils utilisaient Algol. À l'époque, comme aujourd'hui, COBOL était le langage de l'industrie et nous avons donné des cours de COBOL (mais jamais avec grand enthousiasme). Le premier cours que l'auteur a donné au DIRO (en 1970) fut un cours de simulation avec GASP, un ensemble de sous-routines Fortran pour la gestion de listes, la génération de valeurs aléatoires et les statistiques. Un an plus tard, Alain Colmerauer, un coopérant qui plus tard allait inventer Prolog, souligna l'existence d'un nouveau langage de simulation fourni gratuitement sur l'ordinateur Control Data des Services informatiques. Il expliqua que c'était un Algol standard extensible (Algol++ ??) avec l'allocation dynamique d'objets et des coroutines qui avait toutes les possibilités pour faire de la simulation. Le langage avait été conçu par des scandinaves et s'appelait SIMULA67. Le compilateur avait été fait par des collègues de Colmerauer chez CDC-France pour satisfaire aux conditions du CERN, le Centre Européen de Recherche Nucléaire, pour l'achat d'un super-ordinateur.
Simula67 était à peu de choses près identique au Simula d'aujourd'hui - le standard a été mis à jour en 1987 - et c'était le premier langage orienté-objet. Conçu pour décrire (et programmer) des systèmes complexes comportant des activités parallèles, Simula67 est basé sur le concept de Class (type abstrait) décrivant les attributs et méthodes d'un ensemble d'objets. L'héritage simple entre classes est exprimé en préfixant la définition d'une sous-classe par le nom de sa sur-classe, par exemple, la classe suivante:
MAMMIFÈRE class CHIEN; <attributs et méthodes pour 'chien'>;
décrit le concept de CHIEN comme étant une spécialisation de MAMMIFÈRE avec l'effet que CHIEN obtient automatiquement toutes les caractéristiques définies pour MAMMIFÈRE. Le vocabulaire actuel de la POO (Programmation Orientée-Objet) n'ayant pas encore été inventé (pour cela il faudra attendre Smalltalk), la définition du langage parle beaucoup de CLASSE et peu d'OBJET. Elle parle aussi d'attribut fonctionnel au lieu de méthodes, et de préfixation au lieu d'héritage. Les concepts généraux de la POO sont maintenant bien connus. Par contre, Simula avait déjà implanté (en 1967) des possibilités qui n'existent toujours pas dans la majorité des langages dits 'modernes': faire des objets des acteurs indépendants et parallèles, permettre l'imbrication de classes dans d'autres classes pour encapsuler des sous-systèmes indépendants, l'utilisation d'un "garbage-collector" pour la destruction d'objets afin de garantir l'intégrité de tous les pointeurs et l'usage de VIRTUAL pour contrôler quels attributs peuvent être redéfinis dans des sous-classes et lesquels sont figés afin de garantir des comportements critiques. Des compilateurs Simula(67) ont été réalisés pour la majorité des gros "mainframes" de l'époque: CDC, IBM, UNIVAC, DEC-10 et VAX, BULL.
Les concepts de Simula semblaient tellement utiles et naturels que nous nous attendions à les voir se répandre rapidement dans d'autres langages de haut niveau. Cependant, ce ne fut pas le cas. Suite aux déboires dans la réalisation des premiers gros systèmes programmés et la parution de l'article "GOTO declared harmful" de E. Dijkstra, l'enseignement de l'informatique se mit à la mode de la programmation structurée. Idée bonne en soi mais qui s'est concentrée sur la microstructure du code au détriment de la macrostructure des applications telle que préconisée par la programmation-objet.
Le langage PASCAL, inventé par Niklaus Wirth de l'École Polytechnique de Zurich, est l'exemple par excellence d'un langage pour la programmation structurée. Des énoncés de contrôle structurés, IF et CASE pour la décision et WHILE, REPEAT et FOR pour les boucles, remplacent avantageusement le GOTO calculé de Fortran, le Switch d'Algol et C et les boucles bâties avec des IF, GOTO et étiquettes. Pascal va aussi très loin dans l'utilisation de types afin de dépister dès la compilation certaines erreurs sémantiques. Il a introduit les notions de types énumérés, de types intervalles, l'utilisation de types scalaires comme index de tableaux et le concept d'ensemble pour représenter les opérations sur des suites de bits. Pascal se voulait aussi un langage efficace pour la programmation de systèmes et tous les concepts de Pascal s'implantent de façon directe avec quelques instructions en langage machine.
Olivier Lecarme, un apôtre de Pascal arrivé au Diro durant les années 70, nous convainquit de l'intérêt de Pascal comme premier langage d'enseignement. Sur le plan de la micro-structuration, Simula-67 basé sur ALGOL - vieux de 10 ans - était nettement inférieur à Pascal. D'autre part, les aspects de POO de Simula semblaient tellement "flyés" qu'encore une fois Pascal semblait un meilleur choix comme langage représentatif de la réalité industrielle. Le DIRO fut le premier département d'informatique au monde (après Zurich) à baser son enseignement sur Pascal. Quelques années plus tard, le prof. Daniel Thalmann concevait le langage MIRA, un Pascal "graphique", et l'utilisait pour réaliser des films qui ont ajouté à la renommée internationale du DIRO. Pascal était donc bien entré dans nos moeurs et les notes de cours du IFT1010 de l'époque furent publiées chez un éditeur québécois et vendues à plusieurs milliers d'exemplaires à travers la francophonie. (1)
Durant cette période, Simula était utilisé pour l'enseignement de la simulation et, grâce à son parallélisme, pour les TPs en systèmes d'exploitation. D'autre part, SIMDBM, une base de données écrite en Simula, fut le support du premier système d'information du DIRO.
Durant les années 80, Simula fut négligé. Le compilateur sur les VAX de DEC qui remplacèrent nos CDC était lent et buggé. De plus, d'autres langages et applications exotiques attiraient l'intérêt des professeurs. Nous avons subi l'influence de la vague d'intelligence artificielle (IA) et, suite à nos liens privilégiés avec Alain Colmerauer, nous avons été parmi les premières universités à utiliser Prolog (mais juste pour l'IA, pas pour l'introduction à la programmation). Dans IFT1020, Simula a été utilisé une fois en 1983 (2), avant d'être remplacé par ADA puis par des langages de programmation fonctionnelle comme Miranda.
Vers 1985, les notions de programmation-objet ont commencé à s'infiltrer dans l'industrie. D'une part, des langages d'IA intégraient des concepts-objets pour la représentation des connaissances et pour modéliser des hiérarchies de concepts. D'autre part, des systèmes comme Smalltalk et Flavors ont démontré la nécessité d'une organisation à objet pour maîtriser la complexité des interfaces graphiques multi-fenêtres. De plus, l'approche-objet faisait ses preuves pour la modélisation, étape préalable à la conception de systèmes complexes. Entre-temps, le comité de standardisation de Simula a modernisé la syntaxe du langage (Simula87): ajout du WHILE, définition de constantes, compilation séparée, opérateur de concaténation de chaînes. Du coté POO, il n'y avait presque rien à ajouter; le comité en a profité pour nettoyer la définition des opérateurs de contrôle de coroutines (detach, resume et call). En terme d'implantations, LUND Software en Suède a commencé à sortir toute une série d'excellents compilateurs sur systèmes UNIX (Sun, Apollo, HP, DG,...) et aussi une version shareware pour Macintosh.
Pendant ce temps, les Services informatiques ont décidé de changer de fournisseur et de passer des ordinateurs Vax de DEC à un réseau de stations de travail Apollo (maintenant HP). En parallèle, les chercheurs du Diro migraient vers UNIX avec des stations Sun. Après une période d'euphorie générale, nous nous sommes aperçu que la qualité des logiciels UNIX laissait souvent à désirer. En particulier, les compilateurs disponibles pour Pascal étaient nettement inférieurs à ceux auxquels nous avions été habitués. Dans le cas d'Apollo, le langage était un dialecte maison conçu pour la programmation-système. Sous une syntaxe pascalienne, le langage s'apparentait plus à "C" qu'à autre chose et les éléments qui faisaient la force de Pascal (la cohérence, la simplicité et la rigueur) avaient disparu. D'abord, des trous béants dans la vérification de types et un support presque inexistant pour la vérification à l'exécution: pas d'options pour vérifier le débordement de valeurs entières, d'intervalles ou d'indexation dans les tableaux et aucun message d'erreur sauf le fameux 'segmentation fault'. Les extensions du dernier standard ANSI n'étaient pas implantées. Dans IFT1010, nous avions donc constamment à expliquer et à justifier les différences entre le Pascal des livres, le Pascal d'Apollo et le Turbo-Pascal sur les PC de nos étudiants.
En 1991, ayant identifié le problème, nous avons examiné plusieurs possibilités pour un remplacement. Dans un rapport, après avoir énuméré les critères d'un "bon" langage, nous disions:
«...La majorité des implantations Pascal (et en particulier celles sur micro) répondent a ces critères, mais....pas sur Apollo. Notre environnement exclut aussi des langages pédagogiques intéressants conçus pour mainframes (Watfor, PLC,...). C et C++ sont trop "rapiécés" pour servir de modèles. COBOL est trop archaïque. Basic n'a pas de structure. Pour raison de complexité ou d'exotisme, on pourra écarter Prolog, Smalltalk, ADA, Lisp et Miranda. FORTRAN semble un peu limité.
C'est après avoir songé à toutes ces alternatives que nous avons pensé à SIMULA, un langage vieux de 20 ans qui reste d'actualité. Loin d'être un langage exotique, SIMULA est un langage on-ne-peut-plus traditionnel: le noyau est simple (parfaitement compatible avec ALGOL-60 et certains énoncés sont identiques à ceux de Pascal)....
SIMULA est un langage moderne complet. Il pourrait donc servir à tous les travaux de programmation du programme. Les aspects avancés de SIMULA, comme la structuration objet et la simulation, débordent la matière d'un premier cours ... mais pourraient être utiles pour des cours plus avancés.
Il est vrai que SIMULA est moins connu que Pascal en industrie. Si pour assurer la pertinence professionnelle de nos diplômes, il est utile d'assurer la connaissance de langages "industriels", il faudrait réserver des crédits à cet effet dans le programme et balancer la formation industrielle avec la formation théorique.»
Notre expérience avec Simula durant les 3 dernières années a été très positive: la programmation est plus facile à enseigner avec Simula qu'avec Pascal. Par contre, l'enchaînement des cours avec un IFT1020 en Miranda n'a pas permis d'exploiter la vraie force du langage (au niveau programmation-objet) pour structurer de plus gros programmes. La situation actuelle, IFT1020 avec Simula, devrait corriger cette situation. Cependant, nous restons à l'affût d'un remplacement éventuel. Parmi les candidats récents qui ont été proposés, on peut citer C, C++, Modula, Eiffel, Beta et Turing.
C est un assembleur de haut niveau qui a supplanté le langage machine pour l'implantation de logiciels de taille moyenne où la taille du code produit et la rapidité d'exécution sont critiques. Mais le langage est de trop bas niveau pour faire ressortir les concepts abstraits qui sont à la base de l'enseignement de l'informatique moderne. Voir, par exemple, la confusion entre les tableaux et les listes, les mélanges possibles entre Booléen, entier et caractères, le recours à un package de sous-routines pour le traitement de chaînes et le manque de vérification de types dans les entrées-sorties (pe. printf).
C++ est très en vogue actuellement. Il existe une grande communauté d'usagers et beaucoup de logiciels et de programmathèques sont développés avec C++. Cependant, C++ reste un langage de bas niveau avec les mêmes défauts que C. Le mérite principal du langage est d'avoir été le cobaye pour les améliorations ANSI de C (p.e. vérification des paramètres avec les prototypes) et il est probable que la majorité des utilisateurs de C++ ne font qu'utiliser ANSI C. Dans ce contexte, l'ajout des possibilités objets n'a pas réussi à simplifier le code ou à réduire les possibilités d'erreurs. À la dernière conférence OOPSLA sur la programmation-objet, les industriels témoignaient d'un certain désenchantement à l'égard de C++. Il est ironique de se faire suggérer de remplacer Simula par C++ quand les initiés savent que Bjarne Stroustrup a développé C++ comme un préprocesseur lui permettant de programmer à la Simula dans l'environnement C de Bell Labs. Par contre, l'apprentissage de Simula demeure une excellente préparation à la programmation objet en C++.
Modula a été suggéré plusieurs fois mais ce langage apporte guère plus que Pascal et les problèmes que nous avons eus dans le passé avec les entrées/sorties et l'implantation buggées des processus a quelque peu refroidi notre ardeur.
Turing (3) est un langage conçu par R. Holt de l'Université de Toronto pour l'enseignement et pour l'implantation de systèmes. C'est un Pascal simplifié et étendu pour le parallélisme et la programmation-objet. Il est utilisé dans la majorité des écoles secondaires d'Ontario et dans 5 départements d'informatique au Canada.
Eiffel, un langage conçu pour la construction orientée-objet de gros logiciels, a été décrit dans un excellent livre de Bertand Meyer.(4) C'est un langage bien pensé qui a déjà été utilisé à plusieurs endroits, surtout en Europe, pour l'enseignement de la programmation et du génie logiciel. Cependant les implantations que nous avons pu tester étaient fragiles et lentes.
Dernièrement, le camp Simula a fait des progrès intéressants. D'une part, le Département d'informatique de l'Université d'Oslo a sorti une version publique et portable de Simula en C (CIM) sous licence GNU. C'est ce que nous utilisons sur les Silicon Graphics; mais ça peut aussi fonctionner sur PC avec Linux. Un système industriel avec un compilateur rapide et un meilleur support à la mise au point (comme nous avions sur Apollo et Sun) reste une nécessité; mais, Lund va sortir sous peu son système (compilateur natif et debugger) sous SGI. Une version shareware pour MSDOS existerait aussi. Finalement, nous avons reçu une librairie intéressante pour programmer facilement en X à partir de Simula. Ceci nous permettrait de donner des exemples graphiques même dans IFT1010. Pour d'autres informations sur Simula, voir ~vaucher/Simula sur JSP et pour un aperçu sociologique sur l'éclosion du langage, voir l'article de Holmevik.(5)
Loin de rester inactifs et revêches à tout progrès, nous continuons à évaluer les langages et leurs implantations afin de rester à l'avant-garde; mais nous nous refusons de changer juste pour suivre la mode du jour.