# Modula-2

Modula-2 é uma linguagem de programação projetada e criada por Niklaus Wirth no Instituto Federal de Tecnologia de Zurique (ETH), em torno de 1978.

## Descrição

Modula-2 é uma linguagem de programação projetada e criada por Niklaus Wirth no Instituto Federal de Tecnologia de Zurique (ETH), em torno de 1978, e surgiu a partir da necessidade de criar uma linguagem prática, eficiente e essencialmente independente do hardware sobre o qual fosse executada. É descendente, principalmente, de duas outras linguagens: o Modula e o Pascal. Da primeira herdou o nome e o conceito de módulos, além da sintaxe sistemática e moderna, dentre outras características, do Pascal. Assim como seus precursores, o Modula-2 classifica-se dentre as linguagens do Paradigma Imperativo.
Sua história é intrínseca a do Projeto de Lilith, cujo objetivo explícito era usar uma mesma linguagem para todos seus softwares, alinhado à necessidade de utilizar uma linguagem de programação estruturada e simples para que, além da construção de sistemas grandes e complexos, também fosse capaz de expressar toda a gama de programas necessários para tornar Lilith em uma poderosa ferramenta de desenvolvimento de software. A solução para tal necessidade foi à concepção de uma linguagem que viabiliza a criação de módulos que podem ser compilados separadamente e que possuem checagem completa de tipos, além de suporte à programação concorrente.

### Vertentes

O Modula-2 possui duas principais vertentes. Seguem algumas das variantes entre as elas:

   #### PIM

       Denominada com o nome do livro "Programming in Modula-2" de Niklaus Wirth, que por sua vez teve três edições principais, cada uma descrevendo as ligeiras variantes da mesma;
      * PIM2 (1983): A cláusula “EXPORT” deve ser explicitamente declarada na criação de “DEFINITION MODULE”;
      * PIM3 (1985): A cláusula “EXPORT” foi suprimida nos módulos de definição, pois tudo que se encontra dentro de um “DEFINITION MODULE” define a interface para esse módulo, removendo assim a redundância;
      * PIM4 (1989): Especificado o comportamento do operador “MOD” quando os operandos são negativos e do tipo "ARRAY OF CHAR" para sempre serem encerrados com “ASCII-NUL”;

   #### ISO

       Foi concebida a partir do esforço de sua padronização pela Organização Internacional de Normalização.
      * ISO (1996): O ISO Modula-2 resolveu a maioria das ambigüidades existentes no PIM Modula-2. Acrescentaram os tipos de dados “COMPLEX” e “LONGCOMPLEX”, tratamento de exceções, a criação da cláusula “FINALLY” e uma completa e padronizada biblioteca de Entrada/Saída (do inglês I/O, Input/Output), além do outras inúmeras variantes menores.

### Boa prática

O conceito de módulo pode ser usado para encapsular um conjunto de subprogramas e estruturas de dados, sendo importante tanto para a reusabilidade de código-fonte, quanto à restrição de visibilidade desnecessária de determinadas partes do programa, pois, exceto para identificadores padrão, nenhum objeto de escopos externos são visíveis dentro de um módulo a menos que explicitamente importados, ou então, nenhum objeto interno do módulo é visível de um escopo exterior, a menos que explicitamente exportados. Sua implementação é composta de duas partes:
   * Módulo de definição (do inglês DEFINITION MODULE): Contém apenas a interface, ou seja, os protótipos de “PROCEDURE” que serão exportados (visível para outros módulos).
   * Módulo de execução (do inglês IMPLEMENTATION MODULE): Contém o código de trabalho que é interno ao módulo, ou seja, a codificação de cada “PROCEDURE”.

### Soluções Desenvolvidas

Além dos softwares criados para o Lilith, é possível encontrar diversos módulos gratuitos e disponíveis para download, como por exemplo, módulos para expressões regulares, interface com banco de dados MySQL, leitura de arquivos XML, criação de arquivos Excel, compactação e descompactação de arquivos, dentre outros.

## Sintaxe

A sintaxe básica do Modula-2 será apresentada a seguir com alguns exemplos:

   ### Palavras Reservadas

       São palavras chaves que ajudam o compilador a reconhecer a construção da linguagem, portanto não podem ser utilizadas pelo programador como identificadores.

   ### Identificadores

       São os nomes definidos pelo programador para representar constantes, variáveis, procedures, etc. Um identificador não é válido quando inicia com um número ou possui caracteres que não são letras ou números.
       Exemplos:
      * Declaração correta
      * Declaração incorreta

   ### Identificadores Padrão

       Não precisam ser declarados.

   ### Operadores
   ### Operadores relacionais
   ### Delimitadores
   ### Forma de pares
   ### Estruturas de Atribuição/Controle

       Permite que dentro de um bloco de comandos, exista uma tomada de decisão quanto a instrução a ser executada ou então a repetição de um determinado bloco de instruções.

## Exemplos
### Manipulação de Vetor com FOR

    Através do exemplo acima, podem ser feitas as seguintes observações sobre a sintaxe:
   * Um programa em Modula-2 deve ser iniciado com a palavra “MODULE” seguido do nome do programa (“Vetores” no exemplo acima) e um símbolo “;”. O término do mesmo deve ser feito utilizando a palavra “END” seguido do nome do módulo novamente e de um símbolo “.”
   * A “Lista de Importações” determina as entidades a serem importadas. A palavra reservada “FROM” pode ser omitida caso após a palavra “IMPORT” contenha o nome do módulo.
       Ex: A lista de importações pode ser feita das seguintes maneiras:
   * A declaração das variáveis a serem utilizadas dentro do bloco de comandos devem ser feitas após a palavra “VAR”, seguidos do nome da variável, do símbolo “:”, o tipo da variável e o símbolo “;”
   * Os blocos contendo os comandos devem ser escritas entre as palavras “BEGIN ... END;”. Após o final de cada comando deve conter o símbolo “;”

### Cálculo dos Números Perfeitos
## Compiladores

* ACK Modula-2 para Minix 2.0 (freeware)
* Aglet Modula-2 para Amiga OS 4.0/PPC (freeware)
* Cambridge Modula-2 para varios micro controladores e Sistemas Operacionais Embarcados MINOS(commercial + proprietary software)
* Canterbury Modula-2 gerador de código-fonte Java
* DEC Modula-2 para BSD e Ultrix, ambos VAX and MIPS (freeware)
* FST ferramentas de Modula-2 para MS-DOS (freeware)
* Gardens Point Modula-2 para BSD, Linux, OS/2, Solaris e .NET - Conforme ISO (freeware)
* GNU Modula-2 compiler para plataformas GCC - Conforme PIM(free software, GPLed)
* M2Amiga para Amiga (free software)
* M2M de N. Wirth e colaboradores do ETH Zurich, independente de platforma, gera M-code para máquina virtual(freeware)
* MacMETH de N. Wirth e colaboradores do ETH Zurich para Macintosh(freeware)
* Mod51 para Intel família 80x51 de micro controladores(commercial + proprietary)
* ModulaWare para OpenVMS, ambos VAX and Alpha - Conforme ISO(commercial + proprietary)
* MTC tradutor de Modula-2 para C(free software)
* Native XDS-x86 para Windows and Linux. Compilador nativo de Modula-2 and Oberon-2 - Conforme ISO(freeware)
* Objective Modula-2 gerador de Objective-C (available for peer review and testing purposes only)
* Mac Modula-2 para Macintosh, ambos Classic e Mac OS X - Conforme ISO(commercial + proprietary)
* MOCKA para várias plataformas - Conforme PIM(commercial, freeware Linux/BSD versions)
* TERRA M2VMS para OpenVMS - Conforme PIM(commercial + proprietary)
* Modula-2 System para Solaris, ambos SPARC e MC68K (free software, GPLed)
* XDS-C para Windows e Linux, gera ANSI ou K&R C código-fonte para plataformas de 16 e 32-bit - Conforme ISO(freeware)

## Livros

* Niklaus Wirth, Programming in Modula-2, Fourth Edition, 1989, ISBN 0-387-50150-9
* K. N. King, Modula-2, a comprehensive and clearly written text, continuously in print for now about two decades, ISBN 0-669-11091-4
* Richard J. Sutcliffe, "Modula-2: Abstractions for Data and Programming Structures," (Using ISO-Standard Modula-2) 2004-2005 Edition