Modula-2
| Modula-2 | |
|---|---|
| Paradigmes : | impératif , structuré , modulaire |
| Année d'édition: | 1978 |
| Designer: | Niklaus Wirth |
| Développeur: | Niklaus Wirth |
| Influencé par: | Pascal |
| Affecté: | Lua , Oberon , Seed7 , Modula-2 + , Modula-3 |
Modula-2 est un développement ultérieur du langage de programmation Pascal en 1978 et, comme celui-ci, a été développé par Niklaus Wirth . Les principales caractéristiques de Modula-2 sont les fonctionnalités du langage pour la modularisation des programmes. Modula-2 lui-même a ensuite servi de modèle pour le langage de programmation Oberon .
Émergence
En 1977/78, Wirth a découvert l'architecture pionnière des postes de travail Alto du Xerox Palo Alto Research Institute , qui disposait déjà d'une souris, d'un écran graphique et d'une technologie de fenêtre. L'Alto a été programmé dans le langage de programmation de type Pascal Mesa . Après son retour à l' ETH Zurich , Wirth et son groupe ont commencé à développer leur propre poste de travail, plus tard appelé Lilith , où le matériel et les logiciels ont été développés conjointement.
Standard Pascal, qui a été développé comme langage de programmation pour les leçons, ne convenait pas à la programmation d'un système d'exploitation pour le Lilith, pour deux raisons principales:
- il n'y a pas d'appareils pour la programmation simultanée
- la division d'un grand programme en de nombreux modules avec des interfaces clairement définies selon les enseignements de la technologie logicielle n'est pas possible.
Le nouveau langage, qui a reçu le nom de «Modula», contenait donc deux nouveaux concepts par rapport à Pascal (en plus de plusieurs changements de syntaxe ):
- Procédures
NEWPROCESS,TRANSFERetIOTRANSFERpour gérer les processus concurrents ( threads ) en termes de multitâche coopératif et - cela en
MODULEtant qu'unité pour la traduction séparée des parties de programme.
Modula n'est devenu connu qu'en dehors de l' ETHZ dans la version Modula-2. La séparation claire de la définition et de la mise en œuvre dans des fichiers séparés (généralement avec l' extension DEF ou MOD) était à l'origine de la tendance et a été copiée par les langages de programmation ultérieurs, mais sa clarté n'a pas été atteinte. Modula-2 a eu plus tard des successeurs indépendants de Wirth, tels que Modula-2 plus et Modula-3 . Depuis 1996, il existe une norme internationale ISO / CEI 10514-1 pour Modula-2.
Propriétés
Puisque Modula-2 est un développement ultérieur de Pascal , il suffit d'entrer dans les principales différences de ce langage.
Modules
L'innovation la plus importante dans Modula-2 sont les modules en tant que dispositifs pour la programmation modulaire selon les idées de la technologie logicielle , mentionnées pour la première fois par David Parnas . Le programme principal est donc également appelé MODULEau lieu de PROGRAMcomme en Pascal. Toutes les parties compilées séparément du programme principal doivent être divisées en deux fichiers: L' DEFINITION MODULEun contient uniquement la description de l' interface du module, c'est-à-dire: il répertorie les constantes, types, variables et procédures qui sont mis à disposition ("exportés") pour d'autres modules devraient l'être. Un autre IMPLEMENTATION MODULEindique alors l'implémentation.
En termes de modularisation stricte , il est logique que des concepts tels que les entrées / sorties et les fonctions mathématiques, qui faisaient partie du langage normal de Pascal, ne soient pas inclus dans le langage Modula-2. Si nécessaire, ils doivent être importés à partir des modules prévus à cet effet (généralement InOutpour les entrées / sorties et MathLibpour les fonctions mathématiques).
Types de données
Le Lilith doit avoir une longueur de mot de 16 bits. Les nombres entiers auraient donc eu une plage de -32 768 à + 32 767, ce que Wirth a trouvé être une trop grande limitation. En plus du type de données INTEGER, Modula-2 a reçu un type de données CARDINALpour les nombres non négatifs compris entre 0 et 65 535. Les expressions mixtes contenant des expressions à la fois INTEGER- et - CARDINALpartielles sont interdites. Par conséquent, il existe des moyens généraux de transformer les types:
- Type de conversion fonctions
VAL(Type , Expression)convertir une expression de sorte qu'il appartient au nouveau type, alors que - Les fonctions de transfert de type (" type casts ", chez Wirth: " type cheats ") de l' expression de type de formulaire laissent un modèle de bits inchangé et ne modifient que le type de données pour le compilateur.
()
Par exemple, VAL(CARDINAL,-1)un message d'erreur se produit pendant que CARDINAL(-1) = 65.535s'applique.
Une autre innovation par rapport à Pascal est le type de données PROCEDURE, avec lequel il fallait remédier à une faiblesse de Pascal: en Pascal, il était possible de passer une fonction à une procédure comme argument, identifié par le mot-clé . Cependant, il n'a pas été possible de vérifier si le nombre et le type des paramètres effectivement transférés ultérieurement étaient réellement adaptés. Cependant, si vous déclarez dans Modula-2 par exemple
FUNCTION
TYPE myFunction = PROCEDURE (INTEGER): REAL;
donc lors de l'appel d'une procédure (le mot clé FUNCTIONn'existe pas dans Modula-2)
PROCEDURE myProcedure (f: myFunction; n: INTEGER): REAL;
le compilateur déterminera à chaque appel myProceduresi la ffonction actuellement transférée a le type correct. Puisque les procédures sont des types de données tout à fait normaux, il est également possible de les incorporer dans d'autres structures de données telles que ARRAYs et RECORDs.
Structures de contrôle
Pour éviter de nombreux BEGIN- ENDsupports en Modula-2, IFet les WHILEinstructions sont chacun terminé par un connecteur END. Le familier de Pascal GOTOn'existe pas, mais il y a une construction LOOP- EXIT.
Le pseudo module SYSTEM
En tant que langage de programmation du système d'exploitation, Modula-2 devait disposer de fonctionnalités pour accéder aux détails de la machine sous-jacente. Il y avait un module séparé pour cela SYSTEM, à partir duquel les types de données WORDpour un mot mémoire non spécifique et ADDRESSpour une adresse mémoire pouvaient être importés, ainsi qu'une fonction ADRpour déterminer l'adresse mémoire d'une construction et TSIZEpour déterminer la taille de la mémoire pour un certains types de données. En outre, il existe les fonctions déjà mentionnées pour la programmation simultanée.
SYSTEM est appelé un pseudo module car il n'y a ni définition ni partie d'implémentation, mais toutes les connaissances sur ce module sont intégrées directement dans le compilateur.
développement
Il existe deux dialectes de Modula-2. D'une part PIM , les variantes développées par Niklaus Wirth et définies dans l'ouvrage standard "Programmation en Modula-2". Selon les éditions du livre, il existe les deuxième, troisième et quatrième variantes de PIM. La langue a été légèrement modifiée à chaque édition. Le deuxième dialecte est ISO , la variante développée par un comité international (sous l'égide de l' Organisation internationale de normalisation ).
- PIM2 (1983): EXPORT explicite dans les modules de définition.
- PIM3 (1985): l'exportation explicite dans les modules de définition n'est plus nécessaire.
- PIM4 (1989): Spécification du comportement de l' opérateur MOD lorsque les opérandes sont négatifs.
- ISO (1996): L'objectif lors du développement d'ISO Modula-2 était de résoudre les ambiguïtés de PIM Modula-2. De plus, les types de données COMPLEX et LONGCOMPLEX , les exceptions, la terminaison du module ( clause FINALLY ) et une bibliothèque standard étendue pour l'entrée et la sortie ont été ajoutés au langage - avec un certain nombre de modifications mineures.
Implémentations
Modula-2 a atteint une popularité relativement grande à la fin des années 1980 , en particulier dans la version de Jensen and Partners International (JPI) qui avait un éditeur 10 fenêtres dans son environnement de développement pour MS-DOS et un compilateur très rapide avec un code objet bien optimisé mis sur le marché. Les versions ultérieures de celui-ci s'appelaient TopSpeed Modula-2 ; C et C ++ ont également été inclus dans l'environnement de développement .
Compilateurs Modula-2 actuels:
- Megamax Modula-2 - ATARI ST (e) ( M68K )
- Hänisch Modula-2 - ATARI ST / TT (M68K)
- Aglet Modula-2 - AmigaOS ( PPC )
- GNU Modula-2 - Collection de compilateurs GNU (GCC)
- Objectif Modula-2 - Prise en charge de Cocoa et GNUstep
- Système de compilation MOCKA Modula-2 - BSD et Linux pour x86
- XDS Modula-2 - Windows et Linux
critique
Wirth lui-même énumère les problèmes suivants avec Modula-2 en relation avec le développement d'Oberon:
Importations éligibles
La méthode recommandée pour utiliser des composants d'autres modules est
IMPORT M;
Cela supprime tous Mles identificateurs exportés par ce qu'on appelle des identificateurs qualifiés , tels que M.A, M.Bdisponible. Alternativement, Modula-2 connaît l' importation admissible
FROM M IMPORT A,B;
Avec cette importation, les identifiants sont alors simplement disponibles sous la forme Aou B; l'origine du module Mn'est alors plus directement visible au point d'utilisation. Cela permet aux programmeurs de faire des erreurs. Les importations éligibles ne sont donc plus disponibles à Oberon.
Exportation des types d'énumération
Si un module contient le type exporté
TYPE Ampel = (rot, gelb, gruen);
selon la logique du langage, une importation de ce type se réfère uniquement au type nom ( Ampel), mais en réalité aux noms rot, gelbet sont également gruenimportées, ce qui peut dérouter le programmeur en cas de conflits d'identifiants au point d'utilisation. Dans Oberon, il n'y a plus de types d'énumération car sinon il ne serait pas possible d'empêcher leur exportation.
Type de données CARDINAL
L'arithmétique non signée fonctionne très différemment de l'arithmétique signée; par conséquent, les expressions dans lesquelles des valeurs non signées et signées apparaissent simultanément sont problématiques. Modula-2 a donc interdit en principe de tels mélanges, ce qui a suscité des protestations de la part des programmeurs car les programmes étaient inutilement compliqués par l'utilisation de fonctions de conversion de type. De plus, des asymétries apparaissent dans le traitement de certaines structures de programme et dans la fonction mathématique modulo ( MOD).
Fonctions de transfert de type et autres appareils de bas niveau
Les fonctions de transfert de types ( castes de types ) permettent de découvrir des propriétés de la machine sous-jacente qui devraient en fait rester cachées au programmeur d'un langage de programmation de haut niveau, comme l' endianness , c'est -à- dire la question de l'ordre dans lequel les bits individuels de un mot machine est stocké. En fonction de cela,
BITSET(65520) = {4 .. 15}
ou
BITSET(65520) = {0 .. 11}
pour une architecture 16 bits.
Littérature
- Niklaus Wirth : Programmation dans Modula-2. 4e édition. Springer, Berlin et coll. 1988, ISBN 0-387-50150-9 .