Modula-2 es un lenguaje de programación procedimental estructurado desarrollado entre 1977 y 1985/8 por Niklaus Wirth en la ETH de Zúrich . Fue creado como lenguaje para el sistema operativo y el software de aplicación de la estación de trabajo personal Lilith . [1] Posteriormente se utilizó para la programación fuera del contexto de Lilith.
Wirth consideró a Modula-2 como un sucesor de sus lenguajes de programación anteriores Pascal y Modula . [2] [3] Los conceptos principales son:
El diseño del lenguaje estuvo influenciado por el lenguaje Mesa y el Xerox Alto , ambos de Xerox PARC , que Wirth vio durante su año sabático allí en 1976. [4] La revista informática Byte dedicó el número de agosto de 1984 al lenguaje y su entorno. [5]
Wirth creó la serie de lenguajes Oberon como sucesor de Modula-2, mientras que otros (particularmente en Digital Equipment Corporation y Acorn Computers , más tarde Olivetti ) desarrollaron Modula-2 en Modula-2+ y más tarde Modula-3 .
Modula-2 es un lenguaje procedimental de propósito general adecuado tanto para la programación de sistemas como para la programación de aplicaciones. La sintaxis se basa en el lenguaje anterior de Wirth, Pascal , con algunos elementos y ambigüedades sintácticas eliminadas. Se agregó el concepto de módulo , diseñado para admitir la compilación y la abstracción de datos por separado, y el soporte directo del lenguaje para la multiprogramación .
El lenguaje permite el uso de compiladores de una sola pasada . Un compilador de este tipo , creado por Gutknecht y Wirth, era aproximadamente cuatro veces más rápido que los compiladores de múltiples pasadas anteriores . [6]
A continuación se muestra un ejemplo del código fuente del programa "Hola mundo":
MÓDULO Hola ; DESDE STextIO IMPORTAR WriteString ; COMIENZO WriteString ( "¡Hola mundo!" ) FIN Hola .
Un módulo Modula-2 se puede utilizar para encapsular un conjunto de subprogramas y estructuras de datos relacionados, y restringir su visibilidad desde otras partes del programa. [7] Los programas Modula-2 se componen de módulos, cada uno de los cuales se compone de dos partes: un módulo de definición , la parte de interfaz, que contiene solo aquellas partes del subsistema que se exportan (visibles para otros módulos), y un módulo de implementación , que contiene el código de trabajo que es interno al módulo.
El lenguaje tiene un control estricto del alcance . A excepción de los identificadores estándar, ningún objeto externo es visible dentro de un módulo a menos que se importe explícitamente; ningún objeto interno del módulo es visible desde el exterior a menos que se exporte explícitamente.
Supongamos que el módulo M1 exporta los objetos a, b, c y P enumerando sus identificadores en una lista de exportación explícita
DEFINICIÓN MÓDULO M1 ; EXPORTACIÓN CALIFICADA a , b , c , P ; ...
A continuación, los objetos a, b, c y P del módulo M1 se conocen fuera del módulo M1 como M1.a, M1.b, M1.c y M1.P. Se exportan de forma cualificada al exterior (suponiendo que el módulo M1 es global). El nombre del módulo exportador, es decir, M1, se utiliza como calificador seguido del nombre del objeto.
Supongamos que el módulo M2 contiene la siguiente declaración IMPORT
MÓDULO M2 ; IMPORTAR M1 ; ...
Esto significa que los objetos exportados por el módulo M1 hacia el exterior de su programa de inclusión pueden ahora utilizarse dentro del módulo M2. Se hace referencia a ellos de forma calificada : M1.a, M1.b, M1.c y M1.P. Ejemplo:
... M1 . a := 0 ; M1 . c := M1 . P ( M1 . a + M1 . b ); ...
La exportación cualificada evita conflictos de nombres. Por ejemplo, si otro módulo M3 exporta un objeto llamado P, entonces los dos objetos se pueden distinguir ya que M1.P es diferente de M3.P. No importa que ambos objetos se llamen P dentro de sus módulos de exportación M1 y M3.
Existe un método alternativo. Supongamos que el módulo M4 se formula de la siguiente manera:
MÓDULO M4 ; DESDE M1 IMPORTAR a , b , c , P ;
Esto significa que los objetos exportados por el módulo M1 al exterior pueden volver a utilizarse dentro del módulo M4, pero ahora mediante meras referencias a los identificadores exportados de manera no calificada como: a, b, c y P. Ejemplo:
... a := 0 ; c := P ( a + b ); ...
Este método de importación se puede utilizar si no hay conflictos de nombres. Permite que las variables y otros objetos se utilicen fuera de su módulo de exportación de la misma manera que dentro del módulo de exportación.
Las reglas de exportación e importación no solo protegen los objetos contra accesos no deseados, sino que también permiten crear una referencia cruzada de la definición de cada identificador en un programa. Esta propiedad ayuda con el mantenimiento de programas grandes que contienen muchos módulos.
El lenguaje permite la concurrencia de un solo procesador ( monitores , corrutinas y transferencia explícita de control) y el acceso al hardware (direcciones absolutas, manipulación de bits e interrupciones ). Utiliza un sistema de tipos nominales .
Existen dos dialectos principales de Modula-2. El primero es PIM , llamado así por el libro Programación en Modula-2 de Niklaus Wirth. [4] Hubo tres ediciones principales de PIM: la segunda, la tercera (corregida) y la cuarta. Cada una describe ligeras variantes del lenguaje. El segundo dialecto principal es ISO , llamado así por el esfuerzo de estandarización de la Organización Internacional de Normalización . A continuación se presentan algunas de las diferencias entre ellos.
EXPORT
en los módulos de definición.SIZE
debe importarse desde el móduloSYSTEM
EXPORT
cláusula de los módulos de definición luego de la observación de que todo dentro de un módulo de definición define la interfaz con ese módulo, por lo tanto, la EXPORT
cláusula era redundante.SIZE
es omnipresente (visible en cualquier ámbito sin importación)MOD
operador cuando los operandos son negativos.ARRAY OF CHAR
las cadenas terminen con ASCII NUL, incluso si la cadena encaja exactamente en su matriz.COMPLEX
y LONGCOMPLEX
, excepciones, terminación de módulo ( FINALLY
cláusula) y una biblioteca completa de entrada/salida (E/S) estándar . Hay muchas diferencias y aclaraciones menores. [8]Hay varios superconjuntos de Modula-2 con extensiones de lenguaje para dominios de aplicación específicos:
Existen varios lenguajes derivados que se parecen mucho a Modula-2, pero que son lenguajes nuevos por derecho propio. La mayoría son lenguajes diferentes con propósitos diferentes y con sus propias fortalezas y debilidades:
Muchos otros lenguajes de programación actuales han adoptado características de Modula-2.
PIM [2,3,4] define 40 palabras reservadas :
Y ELSIF REPITE EL BUCLEFIN DE LA MATRIZ MOD RETORNOCOMIENZO SALIDA MÓDULO CONJUNTOPOR EXPORTACIÓN NO ENTONCESCASO PARA DE PARACONST DE O TIPODEFINICIÓN SI PUNTERO HASTAPROCEDIMIENTO DE IMPLEMENTACIÓN DIV VARHAGA LA IMPORTACIÓN CALIFICADA MIENTRASDEMÁS EN REGISTRO CON
PIM [3,4] define 29 identificadores integrados :
ABS EXCL INT LARGO REALBITSET FALSO TAMAÑO LARGO REALFLOTANTE BOOLEANO MÁXIMO VERDADEROCAP HALT MIN TRUNCCARDENAL ALTO NIL VALCHAR INC IMPARCRISTO INCLUYE ORDENPROCEDIMIENTO ENTERO DEC
Modula-2 se utiliza para programar muchos sistemas integrados .
Cambridge Modula-2 de Cambridge Microprocessor Systems se basa en un subconjunto de PIM4 con extensiones de lenguaje para desarrollo integrado. El compilador se ejecuta en DOS y genera código para microcontroladores integrados basados en la serie Motorola 68000 (M68k) que ejecutan un sistema operativo MINOS.
Mod51 de Mandeno Granville Electronics se basa en ISO Modula-2 con extensiones de lenguaje para desarrollo integrado según IEC 1131 , un estándar industrial para controladores lógicos programables (PLC) estrechamente relacionado con Modula-2. El compilador Mod51 genera código independiente para microcontroladores basados en 80C51.
Delco Electronics , entonces subsidiaria de GM Hughes Electronics , desarrolló una versión de Modula-2 para sistemas de control integrados a partir de 1985. Delco lo llamó Modula-GM. Fue el primer lenguaje de programación de alto nivel utilizado para reemplazar el código de máquina (lenguaje) para sistemas integrados en las unidades de control de motor (ECU) de Delco. Esto fue significativo porque Delco estaba produciendo más de 28.000 ECU por día en 1988 para GM. Este era entonces el mayor productor de ECU del mundo. [19] El primer uso experimental de Modula-GM en un controlador integrado fue en el controlador del sistema de frenos antibloqueo de 1985 que se basó en el microprocesador Motorola 68xxx, y en 1993 en la ECU Gen-4 utilizada por los equipos de carreras de autos del campeonato Champ Car World Series (CART) y los equipos de la Indy Racing League (IRL). [20] El primer uso de producción de Modula-GM fue en camiones GM a partir del módulo de control del vehículo (VCM) del año modelo 1990 utilizado para gestionar los motores Vortec de GM Powertrain . Modula-GM también se utilizó en todas las ECU de la familia de motores Buick V6 de 90° de GM, la Serie 3800 II, utilizada en el Buick Park Avenue del año modelo 1997-2005 . Delco obtuvo los compiladores de Modula-GM y las herramientas de gestión de software asociadas de Intermetrics .
En 1986, Delco seleccionó Modula-2 como la base del lenguaje de alto nivel debido a sus muchas ventajas sobre otras opciones de lenguaje alternativas. Después de que Delco Electronics se separara de GM (con otras divisiones de componentes) para formar Delphi Automotive Systems en 1995, la contratación global requirió que se utilizara un lenguaje de software de alto nivel no propietario. El software integrado de la ECU que ahora se desarrolla en Delphi se compila con compiladores comerciales para el lenguaje C.
Los satélites del sistema ruso de radionavegación por satélite GLONASS , similar al Sistema de Posicionamiento Global (GPS) de los Estados Unidos, están programados en Modula-2. [21]
Turbo Modula-2 fue un compilador y un entorno de desarrollo integrado para MS-DOS desarrollado, pero no publicado, por Borland . Jensen and Partners, que incluía al cofundador de Borland Niels Jensen, compró el código base no publicado y lo convirtió en TopSpeed Modula-2. Finalmente se vendió a Clarion, ahora SoftVelocity, que luego ofreció el compilador Modula-2 como parte de su línea de productos Clarion en ese momento. [44]
Echelon comercializó brevemente una versión Zilog Z80 CP/M de Turbo Modula-2 bajo licencia de Borland. Micromint vendió una versión complementaria para Hitachi HD64180 como herramienta de desarrollo para su computadora de placa única SB-180. [45]
IBM tenía un compilador Modula-2 para uso interno que funcionaba tanto en OS/2 como en AIX , y tenía soporte de primera clase en el editor E2 de IBM . [46] IBM Modula-2 se utilizó para partes del Código Interno Licenciado Vertical de OS/400 (efectivamente el núcleo de OS/400). [47] Este código fue reemplazado en su mayor parte por C++ cuando OS/400 fue portado a la familia de procesadores IBM RS64 , aunque algo permanece en versiones modernas del sistema operativo. [48] [49] También existía un backend Motorola 68000 , que puede haber sido utilizado en productos de sistemas integrados. [46]
Modula-2 se utiliza para programar algunos sistemas operativos (SO). La estructura y el soporte de módulos de Modula-2 se utilizan directamente en dos SO relacionados.
El sistema operativo denominado Medos-2 , para la estación de trabajo Lilith, fue desarrollado en la ETH de Zúrich por Svend Erik Knudsen con el asesoramiento de Wirth. Es un sistema operativo orientado a objetos para un solo usuario, construido a partir de módulos Modula-2. [50] [51] [52]
El sistema operativo denominado Excelsior , para la estación de trabajo Kronos , fue desarrollado por la Academia de Ciencias de la Unión Soviética , sucursal siberiana, Centro de Computación de Novosibirsk , proyecto de Sistemas Desarrollables Modulares Asíncronos (MARS), Grupo de Investigación Kronos (KRG). Es un sistema de usuario único basado en módulos Modula-2. [53]
Foto del disquete