Articulo de referencia

Módulo-3

[[Olivetti]] {{Not a typo|elego}} Software Solutions GmbH"},"released":{"wt":"{{Start date and age|1988}}"},"latest release version":{"wt":"5.8.6"},"latest release date":{"wt":"...

Modula-3 es un lenguaje de programación concebido como sucesor de una versión mejorada de Modula-2, conocida como Modula-2+ . Ha tenido gran influencia en los círculos de investigación (influyendo en el diseño de lenguajes como Java , C# , Python [ 7 ] y Nim ), pero no ha sido ampliamente adoptado en la industria. Fue diseñado por Luca Cardelli , James Donahue, Lucille Glassman, Mick Jordan (anteriormente en el Laboratorio de Tecnología de Software de Olivetti ), Bill Kalsow y Greg Nelson en el Centro de Investigación de Sistemas (SRC) de Digital Equipment Corporation (DEC) y el Centro de Investigación de Olivetti (ORC) a finales de la década de 1980.

Las principales características de Modula-3 son la modularidad , la simplicidad y la seguridad, conservando al mismo tiempo la potencia de un lenguaje de programación de sistemas. Modula-3 buscaba continuar la tradición de seguridad de tipos de Pascal , introduciendo nuevas construcciones para la programación práctica en el mundo real. En particular, Modula-3 añadió soporte para programación genérica (similar a las plantillas ), multihilo , manejo de excepciones , recolección de basura , programación orientada a objetos , revelación parcial y marcado explícito de código inseguro. El objetivo de diseño de Modula-3 era un lenguaje que implementara las características más importantes de los lenguajes de programación imperativos modernos de forma bastante básica. Por lo tanto, se omitieron características supuestamente peligrosas y complejas como la herencia múltiple y la sobrecarga de operadores .

Desarrollo histórico

El proyecto Modula-3 comenzó en noviembre de 1986, cuando Maurice Wilkes escribió a Niklaus Wirth con algunas ideas para una nueva versión de Modula. Wilkes había estado trabajando en DEC justo antes de esto, y había regresado a Inglaterra para unirse al Consejo de Estrategia de Investigación de Olivetti. Wirth ya se había incorporado a Oberon , pero no tuvo inconveniente en que el equipo de Wilkes continuara el desarrollo bajo el nombre de Modula. La definición del lenguaje se completó en agosto de 1988, y una versión actualizada en enero de 1989. Pronto le siguieron compiladores de DEC y Olivetti, y posteriormente implementaciones de terceros.

Su diseño estuvo fuertemente influenciado por el trabajo realizado en el lenguaje Modula-2+ en uso en SRC y en el Centro de Investigación de Computadoras Acorn (ARC, posteriormente ORC cuando Olivetti adquirió Acorn) en ese momento, que era el lenguaje en el que se escribió el sistema operativo para la estación de trabajo multiprocesador VAX de DEC Firefly y en el que se escribió el compilador Acorn para Acorn C y la biblioteca de ejecución Modula (CAMEL) en ARC para el proyecto del sistema operativo ARX de la gama de computadoras Acorn Archimedes basadas en ARM . Como indica el Informe Modula-3 revisado, el lenguaje estuvo influenciado por otros lenguajes como Mesa , Cedar , Object Pascal , Oberon y Euclid . [ 8 ]

Durante la década de 1990, Modula-3 ganó considerable popularidad como lenguaje de enseñanza, pero nunca se adoptó ampliamente para uso industrial. Esto pudo deberse, en parte, a la desaparición de DEC, un importante defensor de Modula-3 (especialmente cuando dejó de mantenerlo eficazmente antes de ser vendido a Compaq en 1998). En cualquier caso, a pesar de la simplicidad y potencia de Modula-3, parece que había poca demanda de un lenguaje compilado procedimental con una implementación restringida de programación orientada a objetos . Durante un tiempo, Critical Mass, Inc. ofreció un compilador comercial llamado CM3, mantenido por uno de los principales desarrolladores que anteriormente trabajó en DEC SRC y que fue contratado antes de la venta de DEC a Compaq ; un entorno de desarrollo integrado (IDE) llamado Reactor; y una máquina virtual Java extensible (con licencia en formatos de código binario y código fuente , y compilable con Reactor). Sin embargo, esta empresa cesó sus operaciones en el año 2000 y cedió parte del código fuente de sus productos a elego Software Solutions GmbH. Modula-3 se enseña actualmente en universidades, principalmente en cursos de lenguajes de programación comparada, y sus libros de texto están agotados. Prácticamente el único patrocinador corporativo de Modula-3 es elego , que heredó el código fuente de Critical Mass y desde entonces ha publicado varias versiones del sistema CM3 en código fuente y binario. El IDE Reactor se publicó como código abierto después de varios años sin estarlo, con el nuevo nombre CM3-IDE. En marzo de 2002, elego también se hizo cargo del repositorio de otra distribución activa de Modula-3, PM3, mantenida hasta entonces en la École Polytechnique de Montréal, pero que posteriormente continuó con el trabajo en HM3, que mejoró con los años hasta quedar obsoleta.

Sintaxis

Un ejemplo común de la sintaxis de un lenguaje es el programa "¡Hola, mundo!" .

MÓDULO Principal ; IMPORTAR IO ; INICIO IO.Put ( " Hola Mundo\n " ) FIN Principal .

Todos los programas en Modula-3 tienen al menos un archivo de módulo, mientras que la mayoría también incluye un archivo de interfaz que los clientes utilizan para acceder a los datos del módulo . Al igual que en otros lenguajes, un programa Modula-3 debe exportar un módulo principal, que puede ser un archivo llamado Main.m3, o bien un archivo que realice una llamada EXPORTpara exportar el módulo principal.

MÓDULO Foo EXPORTS Principal

Se recomienda que los nombres de los archivos de módulo coincidan con los del código fuente. Si difieren, el compilador solo emitirá una advertencia.

Otras convenciones en la sintaxis incluyen nombrar el tipo exportado de una interfaz T, ya que los tipos generalmente se califican con sus nombres completos, por lo que un tipo Tdentro de un módulo llamado Foo se denominará Foo.T. Esto facilita la legibilidad. Otra convención similar es nombrar un objeto público Publiccomo en los ejemplos de POO que se muestran a continuación.

Características del idioma

Modularidad

En primer lugar, todas las unidades compiladas son INTERFACEo implementaciones MODULE, de un tipo u otro. Una unidad compilada de interfaz, que comienza con la palabra clave INTERFACE, define constantes, tipos, variables, excepciones y procedimientos. El módulo de implementación, que comienza con la palabra clave MODULE, proporciona el código y cualquier otra constante, tipo o variable necesaria para implementar la interfaz. Por defecto, un módulo de implementación implementará la interfaz del mismo nombre, pero un módulo puede explícitamente hacer referencia EXPORTa un módulo que no tenga el mismo nombre. Por ejemplo, el programa principal exporta un módulo de implementación para la interfaz Main.

MÓDULO HelloWorld EXPORTS Main ; IMPORT IO ; BEGIN IO . Put ( "Hello World\n" ) END HelloWorld .

Cualquier unidad compilada puede tener IMPORTotras interfaces, aunque las importaciones circulares están prohibidas. Esto se puede solucionar realizando la importación desde el MÓDULO de implementación. Las entidades dentro del módulo importado pueden importarse, en lugar de solo el nombre del módulo, utilizando la siguiente FROM Module IMPORT Item [, Item]*sintaxis:

MÓDULO HelloWorld EXPORTS Main ; FROM IO IMPORT Put ; BEGIN Put ( "Hello World\n" ) END HelloWorld .

Normalmente, solo se importa la interfaz y se utiliza la notación de punto para acceder a los elementos dentro de la interfaz (similar a acceder a los campos dentro de un registro). Un uso típico es definir una estructura de datos (registro u objeto) por interfaz junto con cualquier procedimiento de soporte. Aquí, el tipo principal recibirá el nombre 'T', y se usa como en MyModule.T.

En caso de colisión de nombres entre un módulo importado y otra entidad dentro del módulo, ASse puede utilizar la palabra reservada como enIMPORT CollidingModule AS X;

Seguro versus inseguro

Algunas funcionalidades se consideran inseguras, ya que el compilador no puede garantizar la consistencia de los resultados; por ejemplo, al interactuar con el lenguaje C.UNSAFE La palabra clave que precede a INTERFACE`or` MODULEpuede utilizarse para indicar al compilador que habilite ciertas características de bajo nivel del lenguaje. Por ejemplo, una operación insegura consiste en eludir el sistema de tipos utilizando ` LOOPHOLEcopy` para copiar los bits de un entero a un número de punto flotante REAL.

Una interfaz que importa un módulo no seguro también debe ser no segura. Una interfaz segura puede ser exportada por un módulo de implementación no seguro. Este es el uso típico al interactuar con bibliotecas externas , donde se crean dos interfaces: una no segura y otra segura.

Medicamentos genéricos

Una interfaz genérica y su módulo genérico correspondiente anteponen la palabra clave INTERFACE`or` MODULEcon GENERIC`<interface>`, y toman como argumentos formales otras interfaces. De este modo (al igual que las plantillas de C++ ), se pueden definir y usar fácilmente tipos de datos abstractos, pero a diferencia de C++ , la granularidad se encuentra a nivel de módulo. Una interfaz se pasa a los módulos de interfaz e implementación genéricos como argumentos, y el compilador generará módulos concretos.

Por ejemplo, se podría definir un GenericStack y luego instanciarlo con interfaces como IntegerElem, o RealElem, o incluso interfaces a Objects, siempre que cada una de esas interfaces defina las propiedades necesarias para los módulos genéricos.

Los tipos simples INTEGERno REALse pueden usar porque no son módulos, y el sistema de genéricos se basa en usar módulos como argumentos. En comparación, en una plantilla de C++, se usaría un tipo simple.

ARCHIVO: IntegerElem.i3

INTERFACE IntegerElem ; CONST Name = "Integer" ; TYPE T = INTEGER ; PROCEDURE Format ( x : T ): TEXT ; PROCEDURE Scan ( txt : TEXT ; VAR x : T ): BOOLEAN ; END IntegerElem .

ARCHIVO: GenericStack.ig

INTERFAZ GENÉRICA GenericStack ( Element ); (* Aquí Element.T es el tipo que se almacenará en la pila genérica. *) TIPO T = Public OBJECT ; Public = OBJECT MÉTODOS init (): TStack ; format (): TEXT ; isEmpty (): BOOLEAN ; count (): INTEGER ; push ( elm : Element . T ); pop ( VAR elem : Element . T ): BOOLEAN ; END ; END GenericStack .

ARCHIVO: GenericStack.mg

MÓDULO GENÉRICO GenericStack ( Element ); < ... detalles de implementación genérica ... > PROCEDIMIENTO Format ( self : T ): TEXT = VAR str : TEXT ; BEGIN str := Element . Name & "Stack{" ; FOR k := 0 TO self . n - 1 DO IF k > 0 THEN str := str & ", " ; END ; str := str & Element . Format ( self . arr [ k ]); END ; str := str & "};" ; RETURN str ; END Format ; < ... más detalles de implementación genérica ... > END GenericStack .

ARCHIVO: IntegerStack.i3

INTERFACE IntegerStack = GenericStack ( IntegerElem ) END IntegerStack .

ARCHIVO: IntegerStack.m3

MÓDULO PilaEntero = PilaGenérica ( ElementoEntero ) FIN PilaEntero .

Trazabilidad

Cualquier identificador puede rastrearse hasta su origen, a diferencia de la función de inclusión de otros lenguajes. Una unidad compilada debe importar identificadores de otras unidades compiladas mediante una IMPORTinstrucción. Incluso las enumeraciones utilizan la misma notación de punto que se usa para acceder a un campo de un registro.

INTERFAZ A ; TIPO Color = { Negro , Marrón , Rojo , Naranja , Amarillo , Verde , Azul , Violeta , Gris , Blanco };FIN A ;
MÓDULO B ;IMPORTAR A ; DESDE A IMPORTAR Color ;VAR aColor : A . Color ; (* Usa el nombre del módulo como prefijo *) theColor : Color ; (* No tiene el nombre del módulo como prefijo *) anotherColor : A . Color ;BEGIN aColor := A . Color . Brown ; theColor := Color . Red ; anotherColor := Color . Orange ; (* No se puede usar simplemente Orange *) END B .

Asignación dinámica

Modula-3 admite la asignación de datos en tiempo de ejecución . Hay dos tipos de memoria que se pueden asignar, TRACEDy UNTRACED, la diferencia radica en si el recolector de basura puede verla o no. NEW()se utiliza para asignar datos de cualquiera de estas clases de memoria. En un UNSAFEmódulo, DISPOSEestá disponible para liberar memoria no rastreada.

Orientado a objetos

En Modula-3 se pueden utilizar técnicas de programación orientada a objetos, pero su uso no es obligatorio. Muchas de las demás características que ofrece Modula-3 (módulos, genéricos) suelen sustituir a la programación orientada a objetos.

La compatibilidad con objetos se mantiene intencionadamente en su forma más simple. Un tipo de objeto (denominado "clase" en otros lenguajes orientados a objetos) se introduce con la OBJECTdeclaración, que tiene esencialmente la misma sintaxis que una RECORDdeclaración, aunque un tipo de objeto es un tipo de referencia, mientras que los RECORDS en Modula-3 no lo son (similar a las estructuras en C). Los tipos exportados suelen denominarse T por convención y crean un tipo "Public" separado para exponer los métodos y los datos. Por ejemplo:

INTERFAZ Persona ; TIPO T < : Público ; Público = OBJETO MÉTODOS obtenerEdad (): ENTERO ; inicializar ( nombre : TEXTO ; edad : ENTERO ): T ; FIN ;FIN Persona .

Esto define una interfaz Personcon dos tipos, Ty Public, que se define como un objeto con dos métodos, getAge()y init(). Tse define como un subtipo de Publicmediante el uso del <:operador.

Para crear un nuevo Person.Tobjeto, utilice el procedimiento integrado NEWcon el método init()como

VAR jim := NEW ( Person . T ). init ( "Jim" , 25 );

Revelación

La estructura de Modula-3 REVEALproporciona un mecanismo conceptualmente simple y limpio, pero muy potente, para ocultar detalles de implementación a los clientes, con múltiples niveles de facilidad de uso . Una revelación completa de la forma REVEAL T = Vpuede utilizarse para mostrar la implementación completa de la Personinterfaz desde arriba. Una revelación parcial de la forma REVEAL T <: Vsimplemente revela que T es un supertipo de V sin revelar información adicional sobre T. [ 9 ]

MÓDULO Persona ;REVELAR T = Público OBJETO DE MARCA nombre : TEXTO ; (* Estas dos variables *) edad : ENTERO ; (* son privadas. *) SOBREESCRITURA obtenerEdad := Edad ; inicializar := Inicializar ; FIN ;PROCEDIMIENTO Edad ( self : T ): ENTERO = INICIO DEVOLVER self . edad ; FIN Edad ;PROCEDIMIENTO Init ( self : T ; nombre : TEXTO ; edad : ENTERO ): T = BEGIN self . nombre := nombre ; self . edad := edad ; RETURN self ; END Init ;COMIENZO FIN Persona .

Nótese el uso de la BRANDEDpalabra clave, que "marca" los objetos para hacerlos únicos y evitar la equivalencia estructural. BRANDEDTambién puede aceptar una cadena como argumento, pero si se omite, se genera una cadena única automáticamente.

Modula-3 es uno de los pocos lenguajes de programación que requiere que las referencias externas de un módulo estén estrictamente calificadas. Es decir, una referencia en un módulo Aal objeto xexportado desde otro módulo Bdebe tener el formato B.x. En Modula-3, es imposible importar todos los nombres exportados desde un módulo.

Debido a los requisitos del lenguaje en cuanto a la calificación de nombres y la sobreescritura de métodos , es imposible dañar un programa que funciona correctamente simplemente añadiendo nuevas declaraciones a una interfaz (cualquiera que sea). Esto permite que varios programadores editen programas grandes simultáneamente sin preocuparse por conflictos de nombres; y también permite editar las bibliotecas principales del lenguaje con la certeza de que ningún programa existente se verá afectado durante el proceso.

Excepciones

El manejo de excepciones se basa en un sistema de bloques TRY... , que desde entonces se ha vuelto común. Una característica que no ha sido adoptada en otros lenguajes , con las notables excepciones de Delphi y Python.EXCEPT, Scalay Visual Basic.NET , es que la EXCEPTconstrucción define una forma de instrucción switch con cada posible excepción como un caso en su propia cláusula EXCEPT. Modula-3 también admite una LOOP... EXIT... ENDconstrucción que se repite hasta que EXITocurre una ..., una estructura equivalente a un bucle simple dentro de una cláusula TRY....EXCEPT

Multihilo

El lenguaje admite el uso de multihilo y la sincronización entre hilos. La biblioteca de tiempo de ejecución ( m3core ) incluye un módulo estándar llamado Thread, que admite el uso de aplicaciones multihilo. El entorno de ejecución Modula-3 puede utilizar un hilo independiente para tareas internas como la recolección de basura.

MUTEXSe utiliza una estructura de datos integrada para sincronizar múltiples hilos y proteger las estructuras de datos del acceso simultáneo, evitando así posibles errores o condiciones de carrera. La LOCKinstrucción introduce un bloque en el que se bloquea el mutex. El desbloqueo MUTEXse produce implícitamente cuando el código sale del bloque. El MUTEXmutex es un objeto y, como tal, se pueden derivar otros objetos de él.

Por ejemplo, en la sección de entrada/salida (E/S) de la biblioteca libm3 , los lectores y escritores (Rd.T y Wr.T) derivan de MUTEX y se bloquean antes de acceder o modificar cualquier dato interno, como los búferes.

Resumen

En resumen, las características del idioma son:

En Programación de sistemas con Modula-3 , se discuten intensamente cuatro puntos esenciales del diseño del lenguaje. Estos temas son: equivalencia estructural frente a equivalencia de nombres, reglas de subtipado, módulos genéricos y modos de parámetros como READONLY.

Características estándar de la biblioteca

Siguiendo una tendencia iniciada con el lenguaje C , muchas de las características necesarias para escribir programas reales se omitieron de la definición del lenguaje y, en su lugar, se proporcionaron a través de un conjunto de bibliotecas estándar . La mayoría de las interfaces que se muestran a continuación se describen en detalle en [ 10 ].

Bibliotecas estándar que proporcionan las siguientes características. Estas se denominan interfaces estándar y son obligatorias (deben proporcionarse) en el lenguaje.

  • Texto: Operaciones sobre referencias de cadena inmutables, llamadas TEXTs
  • Hilo: Operaciones relacionadas con la programación multihilo, incluyendo MUTEXvariables de condición y pausa de hilos. La biblioteca de programación multihilo proporciona conmutación de hilos con prioridad.
  • Palabra: Operaciones bit a bit en enteros sin signo (o palabras de máquina). Normalmente implementadas directamente por el compilador.
  • Interfaces de punto flotante

Algunas interfaces recomendadas están implementadas en las implementaciones disponibles, pero no son obligatorias.

  • Lex: Para analizar números y otros datos
  • Fmt: Formateo de varios tipos de datos para impresión
  • Pkl (o Pickle): Serialización de objetos de cualquier tipo de referencia accesible por el recolector de basura.
  • Tabla: Módulos genéricos para mapas

Al igual que en C, la E/S también se proporciona a través de bibliotecas, en Modula-3 llamadas Rdy Wr. El diseño orientado a objetos de las bibliotecas Rd (lectores) y Wr (escritores) se trata en detalle en el libro de Greg Nelson. Un aspecto interesante de Modula-3 es que es uno de los pocos lenguajes de programación cuyas bibliotecas estándar han sido verificadas formalmente para no contener varios tipos de errores, incluidos errores de bloqueo. Esto se hizo bajo los auspicios de los proyectos Larch/Modula-3 (ver familia Larch ) [ 11 ] y Extended static checking [ 12 ] en el DEC Systems Research Center .

Implementaciones

Existen varios compiladores disponibles, la mayoría de ellos de código abierto .

  • DEC-SRC M3, el original. [ 13 ]
  • El kit de herramientas Modula-3 del Olivetti Research Center (ORC), originalmente un compilador, ahora está disponible como una biblioteca para el análisis sintáctico, léxico y semántico de programas Modula-3. [ 14 ]
  • Critical Mass CM3, un sucesor diferente de DEC-SRC M3
  • Polytechnique Montreal Modula-3 PM3, sucesor de DEC-SRC M3, actualmente en proceso de fusión con CM3.
  • EzM3, una implementación independiente, ligera y fácilmente portátil, desarrollada en colaboración con CVSup.
  • HM3, sucesor de la versión pm3-1.1.15 de PM3, con soporte para subprocesos nativos mediante NPTL.
  • CM3, [ 15 ] [ 16 ] el sucesor de Critical Mass CM3. Basado en una versión antigua de GCC , PM3 y CAM3 derivan de SRC M3. Esta es la única implementación actualizada, mantenida y desarrollada.

Dado que el único aspecto de las estructuras de datos de C que falta en Modula-3 es el tipo de unión, todas las implementaciones existentes de Modula-3 pueden proporcionar una buena compatibilidad de código binario con las declaraciones de tipo del lenguaje C de matrices y estructuras .

Libros

Ninguno de estos libros se sigue imprimiendo, aunque se pueden conseguir ejemplares de segunda mano y algunos están digitalizados parcial o totalmente, y algunos capítulos de uno de ellos tienen versiones anteriores o posteriores que se pueden obtener en la web como informes de investigación.

  • Greg Nelson, ed., Programación de sistemas con Modula-3 La referencia definitiva sobre el lenguaje Modula-3 con artículos interesantes sobre la construcción de software de sistemas orientado a objetos y una documentación de la discusión que condujo a las características finales del lenguaje. Hay algunas versiones anteriores (ver [ 8 ] para el capítulo dos, [ 17 ] para el capítulo cuatro, [ 18 ] para el capítulo cinco, [ 19 ] para el capítulo seis) y algunas posteriores (ver [ 20 ] para el capítulo uno y dos más actualizados, por lo tanto de ambas versiones anteriores de la definición del lenguaje [ 8 ] y, [ 10 ] para el capítulo tres y [ 21 ] para el capítulo siete) de las versiones de publicación de la mayoría de sus ocho capítulos disponibles individualmente desde el Centro de Investigación de Sistemas (SRC) de DEC anterior como informes de investigación para descargar.
  • Samuel P. Harbison, Modula-3. Libro de texto de clase fácil de usar.
  • Robert Sedgewick , Algoritmos en Modula-3
  • Laszlo Boszormenyi y Carsten Weich, Programación en Modula-3: una introducción a la programación con estilo
  • Renzo Orsini, Agostino Cortesi Programmare in Modula-3: introduzione alla programmazione imperativa ea oggetti un libro italiano sobre el idioma que explica sus principales características.

Proyectos que utilizan Modula-3

El software programado con Modula-3 incluye:

  • El sistema operativo SPIN
  • El programa de sincronización del repositorio de software CVSup
  • El lenguaje Obliq , que utiliza la capacidad de los objetos de red de Modula-3 para migrar objetos a través de redes locales de forma transparente, permite una funcionalidad distribuida dentro del paradigma de programación orientada a objetos de Modula-3. Se ha utilizado para crear aplicaciones distribuidas, animaciones por ordenador y aplicaciones de programación web como extensión de scripting para Modula-3.

Influencias en otros lenguajes de programación

Aunque Modula-3 no alcanzó un estatus generalizado, varias partes de la distribución DEC-SRC M3 sí lo hicieron. Probablemente la parte más influyente fue la biblioteca Network Objects, que formó la base para la primera implementación de Invocación de Método Remoto (RMI) de Java, incluyendo el protocolo de red. Solo cuando Sun pasó del estándar Common Object Request Broker Architecture (CORBA) al protocolo basado en IIOP se abandonó. La documentación de Java sobre la recolección de basura de objetos remotos todavía hace referencia al trabajo pionero realizado para Modula-3 Network Objects. [ 22 ] La implementación de clases de Python también se inspiró en el mecanismo de clases que se encuentra en C++ y Modula-3. [ 23 ] Además, el lenguaje Nim utiliza algunos aspectos de Modula-3, como los punteros rastreados frente a los no rastreados .

Referencias

  1. "Critical Mass Modula-3 (CM3)" . Critical Mass Modula-3 . elego Software Solutions GmbH . Consultado el 21 de marzo de 2020 .
  2. «Polytechnique Montréal Modula-3 (PM3): Qué es» . Módulo-3 del Politécnico de Montreal . elego Software Solutions GmbH . Consultado el 21 de marzo de 2020 .
  3. Polstra, John D. (9 de noviembre de 2006). "Ezm3: Una distribución más sencilla de Modula-3" . CVSup.org . Archivado del original el 10 de abril de 2013. Consultado el 21 de marzo de 2020 .
  4. Weich, Carsten. "M3/PC Klagenfurt 96: un entorno Modula-3 para MS-DOS" . Departamento de Informática . Universidad de Klagenfurt. Archivado del original el 20 de mayo de 2000. Consultado el 21 de marzo de 2020 .
  5. Picheta, Dominik; Locurcio, Hugo. "Preguntas frecuentes" . Consultado el 21 de marzo de 2020 .
  6. van Rossum, Guido (mayo de 1996). "Programación en Python: Prólogo (1.ª ed.)" . Python.org . Consultado el 21 de marzo de 2020 .
  7. "Preguntas frecuentes sobre diseño e historia: ¿Por qué debe usarse 'self' explícitamente en las definiciones y llamadas de métodos?" . Python.org . 21 de marzo de 2020 . Consultado el 21 de marzo de 2020 .
  8. 1 2 3 Informe Modula-3 (revisado) Luca Cardelli, James Donahue, Lucille Glassman, Mick Jordan, Bill Kalsow, Greg Nelson.Informe de investigación 52 del Centro de Investigación de Sistemas (SRC) del DEC (noviembre de 1989)
  9. Cardelli, Luca; Donahue, James; Glassman, Lucille; Jordan, Mick; Kalsow, Bill; Nelson, Greg (agosto de 1992). "Definición del lenguaje Modula-3" . ACM SIGPLAN Notices . 27 (8): 15– 42. doi : 10.1145/142137.142141 . ISSN 0362-1340 . 
  10. 1 2 Algunas interfaces útiles de Modula-3 Archivado el 4 de marzo de 2016 en Wayback Machine Jim Horning, Bill Kalsow, Paul McJones, Greg Nelson. Informe de investigación 113 del Centro de Investigación de Sistemas (SRC) de DEC (diciembre de 1993)
  11. LM3 Archivado el 3 de marzo de 2016 en Wayback Machine Kevin D. Jones.Informe de investigación 72 del Centro de Investigación de Sistemas (SRC) de DEC (junio de 1991)
  12. Verificación estática extendida Archivado el 5 de julio de 2017 en Wayback Machine David L. Detlefs, K. Rustan M. Leino, Greg Nelson, James B. Saxe . Informe de investigación Compaq SRC 159 (diciembre de 1998)
  13. SRC Módulo-3 3.3Bill Kalsow y Eric Muller. Digital Equipment Corporation (enero de 1995)
  14. Jordan, Mick (1990). "Un entorno de programación extensible para Modula-3" . SIGSOFT Softw. Eng. Notes . 15 (6): 66– 76. doi : 10.1145/99278.99285 .
  15. Módulo de masa crítica-3 Web
  16. Repositorio CM3
  17. Introducción a la programación con hilos. Archivado el 5 de julio de 2017 en Wayback Machine. Andrew D. Birrell.Informe de investigación 35 del Centro de Investigación de Sistemas (SRC) del DEC (enero de 1989).
  18. Primitivas de sincronización para un multiprocesador: una especificación formal. Archivado el 4 de marzo de 2016 en Wayback Machine. AD Birrell, JV Guttag, JJ Horning, R. Levin. Informe de investigación 20 del Centro de Investigación de Sistemas (SRC) de DEC (agosto de 1987).
  19. Flujos de E/S: Tipos abstractos, programas reales. Archivado el 3 de marzo de 2016 en Wayback Machine. Mark R. Brown y Greg Nelson. Informe de investigación 53 del Centro de Investigación de Sistemas (SRC) del DEC (noviembre de 1989).
  20. Manual de referencia de Modula-3. Luca Cardelli, James Donahue, Lucille Glassman, Mick Jordan, Bill Kalsow, Greg Nelson. Centro de Investigación de Sistemas DEC (SRC) (febrero de 1995).
  21. Tutorial de Trestle archivado el 3 de marzo de 2016 en Wayback Machine. Mark S. Manasse y Greg Nelson.Informe de investigación 69 del Centro de Investigación de Sistemas (SRC) de DEC (mayo de 1992).
  22. Recolección de basura de objetos remotos , documentación de invocación de métodos remotos de Java para Java SE 8.
  23. Clases , Documentación oficial de Python.
  • Sitio web oficial
  • Modula3 en GitHub
  • Sitio web de implementación de CM3
  • Página principal de Modula-3 (actualmente inactiva, espejo )
  • Módulo-3: Definición de idioma
  • elego Software Solutions
  • Grupo de noticias Modula-3 , mayormente desierto
  • Lista de correo de desarrollo de Modula-3 , activa
  • Apuntes de la clase CS2 de Caltech, impartida en Modula-3 en 2002 y 2003.
  • Clase CS3 de Caltech de 2009 en Wayback Machine (archivada el 23 de mayo de 2013)
  • Programación en Modula-3 : ejemplos de programas
  • Creación de aplicaciones orientadas a objetos distribuidas: Los objetos de Modula-3 en acción . Michel R. Dagenais. Versión preliminar (enero de 1997).
  • Modula-3: Lenguaje, bibliotecas y herramientas . Presentación sobre Modula-3 (más de 120 diapositivas). Michael R. Dagenais, muerto
  • Abstracción de datos orientada a objetos en Modula-3 . Joseph Bergin (1997)
  • Entrevista de Computerworld con Luca Cardelli sobre Modula-3