# Modula-3

Modula-3 es un lenguaje de programación imperativo, estructurado y modular, concebido como el sucesor de Modula-2.
Las principales características del lenguaje son su simplicidad y la seguridad, además de conservar la potencia de los lenguajes de programación de sistemas.

## Historia

Modula-3 fue diseñado por Luca Cardelli, Jim Donahue, Mick Jordan, Bill Kalsow y Greg Nelson en el DEC Systems Research Center (DEC SRC) y en Olivetti a finales de los 80. Su diseño estuvo muy influido por el lenguaje Modula-2+, que se usaba en el DECSRC en aquel momento, y era el lenguaje en el que estaban escritos los Sistemas Operativos para la máquina VAX DEC Firefly.
El proyecto de Modula-3 comenzó en noviembre del 86, cuando Maurice Wilkes escribió a Niklaus Wirth con ideas para una nueva versión de Modula. Wilkes había estado trabajando para DEC justo antes de ello, y había vuelto a Inglaterra para unirse al Olivetti Research Strategy Board. Wirth ya había comenzado a trabajar con Oberon , pero no tuvo problemas con que el equipo de Wilkes continuara desarrollando usando el nombre de "Modula".
Modula-3 pretendía continuar con la tradición de PASCAL, además de añadir nuevas construcciones para conseguir una programación práctica para el mundo real. En particular, añadía soporte para programación genérica (parecido a las plantillas), multiprogramación, manejo de excepciones, recolección de basura, programación orientada a objetos, principio de ocultación y encapsulamiento de código. El mayor objetivo en el diseño de Modula-3 era crear un lenguaje que implementara las características más importantes de los modernos lenguajes imperativos de un modo simple. Por ello, se omitieron característica complicadas y "peligrosas" como la herencia múltiple y la sobrecarga de operadores.
La definición del lenguaje se completó en agosto del 88, y una versión actualizada salió en enero del 89. Los compiladores de DEC y Olivetti le siguieron enseguida, al igual que las implementaciones de terceros.
Durante los 90, Modula-3 se difundió considerablemente como lenguaje docente, pero nunca fue ampliamente adoptado para usos industriales. También pudo haber contribuido en esto la desaparición de DEC, un partidario clave para Modula-3. En cualquier caso, a pesar de la simplicidad y potencia del lenguaje, parece que hay poca demanda para un lenguaje compilado altamente estructurado e implementado como un lenguaje orientado a objetos restringido. Durante algún tiempo, un compilador de código cerrado (llamado CM3) y un entorno de desarrollo integrado (llamado Reactor) y también una Máquina Virtual de Java eran ofrecidos por Critical Mass Inc., pero dicha compañía cerró en el año 2000.
Actualmente, la única empresa que mantiene a Modula-3 es Elego Software Solutions GmBH, que heredó todo el código de CM3 y Reactor de Critical Mass. Reactor, sin embargo, no había podido ser relanzando debido a problemas con los términos del contrato de licencia. Actualmente Reactor se encuentra disponible al público y junto con CM3 en proceso de producción, en http://www.opencm3.net/releng están disponibles los candidatos de lanzamiento (a enero de 2010) de una nueva versión con Reactor ahora como CM3IDE. En marzo de 2002, Elego adquirió los repositorios de la última distribución activa de Modula-3, PM3, que hasta entonces estaba siendo mantenida por la École Polytechnique de Montréal.

## Características del lenguaje

El manejo de excepciones está basado en un sistema de bloques TRY...EXCEPT bastante común. Una característica que no se ha adoptado en otros lenguajes (a excepción de Python y Scala) es la construcción del EXCEPT definido como un pseudo-CASE, en el que cada posible excepción es un caso en una cláusula EXCEPT. Modula-3 también incluye la construcción LOOP...EXIT...END, en la que el bucle se repite hasta que se encuentra un EXIT (esta estructura es equivalente a un bucle simple dentro de un TRY...EXCEPT)
El empleo de objetos se mantiene intencionadamente en su vertiente más simple. Un tipo de objeto (clase) se crea con la declaración OBJECT. Esta tiene básicamente la misma sintaxis que una declaración RECORD, aunque un objeto así declarado es un tipo de referencia mientras que RECORD no lo es.
Por ejemplo: A = OBJECT a: INTEGER; METHODS p := AP; END; declara un nuevo tipo de objeto "A", que contiene un único campo "a" y un método "p". El procedimiento "AP" que implementa a "p" debe ser declarado en otro lugar: PROCEDURE AP(self: A) = BEGIN ... END; Las llamadas a los métodos se realizan con "o.p;", donde "o" es una variable de tipo "A".
La construcción REVEAL de Modula-3 proporciona un mecanismo conceptualmente simple y muy potente para ocultar los detalles de implementación a los clientes, con distintos niveles de "amistad".
En resumen, las características del lenguaje son:
* Modularidad e interfaces
* Resaltado explícito de código inseguro
* Recogida automática de basura
* Tipo de dato fuerte, equivalencia estructural de tipos
* Objetos
* Excepciones
* Hilos
* Plantillas
Modula-3 es uno de los pocos lenguajes en los que la evolución de sus características está documentada. En System Programming with Modula-3, se tratan cuatro puntos esenciales del diseño del lenguaje. Estos temas son Estructural vs. Equivalencia Semántica, reglas para los subtipos, módulos genéricos y tipos de parámetros (como READONLY)

## Sintaxis

Un ejemplo típico de la sintaxis de un lenguaje de programación es el Hola Mundo:

## Implementaciones

Existen bastantes compiladores disponibles, y la mayoría de ellos son de código abierto.
* DEC-SRC M3. Es un compilador desarrollado en DEC para Unix, Windows NT y Windows 95. Para instalarlo en Windows hay que tener Microsoft Visual C++ 4.0 o superior.
* Critical Mass CM3. Es un completo sistema Modula-3, fácil de usar y de instalar y con considerables mejoras sobre su antecesor, DEC-SRC M3. Funciona en varias plataformas, incluyendo Linux y Win32.
* Polytechnique Montreal Modula-3 PM3. Es un compilador de código abierto basado en SRC, extendido y mejorado por un gran número de personas y organizaciones. Actualmente se está fusionando con CM3
* Persistent Modula 3. Es una extensión de Modula-3 basada en PM3. Es el resultado de un trabajo de investigación en estado beta. Sólo se ha instalado en Linux, Solaris y Alpha/OSF.
* EzM3, una implementación liviana y fácilmente portable, desarrollada junto a CVSup.
* HM3, un sucesor del PM3 versión 1.1.15 con el uso de hilos NPTL probado sólo en Linux
Puesto que el único aspecto de las estructuras de datos en C que se pierde en Modula-3 es el tipo unión, todas las implementaciones de Modula-3 dan buena compatibilidad binaria con las declaraciones de tipos de vectores y structs de C.

## Bibliografía

* Greg Nelson, ed. Systems Programming with Modula-3. Contiene interesantes artículos sobre construcción de software basados en systemas orientados a objetos, y documentación sobre las proposiciones que llevaron a las características finales del lenguaje.
* Samuel P. Harbison, Modula-3. Libro de texto, simple y fácil de usar.
* Robert Sedgewick, Algorithms in Modula-3
* Laszlo Boszormenyi y Carsten Weich, Programming in Modula-3: An Introduction in Programming with Style