Modula-2 - Modula-2

Modula-2
Paradigmas imperativo , estruturado , modular , ocultação de dados e procedimentos , simultâneo
Família Wirth Modula
Projetado por Niklaus Wirth
Apareceu pela primeira vez 1978 ; 43 anos atrás ( 1978 )
Disciplina de digitação Estático , forte , seguro
Alcance Lexical (estático)
Plataforma Lilith ( AMD 2901 )
SO Plataforma cruzada
Extensões de nome de arquivo .mod, .m2, .def, .MOD, .DEF, .mi, .md
Local na rede Internet www .modula2 .org
Implementações principais
Compilador ETH escrito por Niklaus Wirth
GNU Modula-2
ADW Modula-2
Dialetos
PIM2, PIM3, PIM4, ISO
Influenciado por
Modula , Mesa , Pascal , ALGOL W , Euclid
Influenciado
Modula-3 , Oberon , Ada , Fortran 90 , Lua , Seed7 , Zonnon , Modula-GM

Modula-2 é uma linguagem de programação estruturada e procedural desenvolvida entre 1977 e 1985 por Niklaus Wirth na ETH Zurich . Foi criado como linguagem para o sistema operacional e software aplicativo da estação de trabalho pessoal Lilith . Posteriormente, foi usado para programação fora do contexto de Lilith.

Wirth via o Modula-2 como um sucessor de suas linguagens de programação anteriores, Pascal e Modula . Os principais conceitos são:

  1. O módulo como uma unidade de compilação para compilação separada
  2. A co-rotina como o bloco de construção básico para processos simultâneos
  3. Tipos e procedimentos que permitem o acesso a dados específicos da máquina

O design da linguagem foi influenciado pela linguagem Mesa e pelo Xerox Alto , ambos da Xerox PARC , que Wirth viu durante seu ano sabático de 1976 lá. A revista de informática Byte dedicou a edição de agosto de 1984 à linguagem e ao ambiente circundante.

Modula-2 foi seguido por Modula-3 e, mais tarde, pela série de línguas Oberon .

Descrição

Modula-2 é uma linguagem procedural de propósito geral , suficientemente flexível para fazer programação de sistemas , mas com uma aplicação muito mais ampla. Em particular, ele foi projetado para suportar compilação separada e abstração de dados de uma maneira direta. Grande parte da sintaxe é baseada na linguagem anterior e mais conhecida de Wirth, Pascal . Modula-2 foi projetado para ser amplamente semelhante ao Pascal, com alguns elementos e ambigüidades sintáticas removidos e a adição importante de um conceito de módulo e suporte de linguagem direto para multiprogramação .

A linguagem permite o uso de compiladores de uma passagem . Tal compilador por Gutknecht e Wirth foi cerca de quatro vezes mais rápido do que anteriores compiladores multi-passagem .

Aqui está um exemplo do código-fonte para o programa "Hello world":

MODULE Hello;
FROM STextIO IMPORT WriteString;
BEGIN
  WriteString("Hello World!")
END Hello.

Um módulo Modula-2 pode ser usado para encapsular um conjunto de subprogramas e estruturas de dados relacionados e restringir sua visibilidade de outras partes do programa. O design do módulo implementou o recurso de abstração de dados do Modula-2 de uma maneira muito limpa. Os programas Modula-2 são compostos por módulos, cada um dos quais é composto por duas partes: um módulo de definição , a parte da interface, que contém apenas as partes do subsistema que são exportadas (visíveis para outros módulos), e um módulo de implementação , que contém o código de trabalho interno ao módulo.

A linguagem tem controle de escopo estrito . O escopo de um módulo pode ser considerado uma parede impenetrável: exceto para identificadores padrão, nenhum objeto de fora é visível dentro de um módulo, a menos que explicitamente importado; nenhum objeto de módulo interno é visível de fora, a menos que seja explicitamente exportado.

Suponha que o módulo M1 exporte os objetos a, b, c e P enumerando seus identificadores em uma lista de exportação explícita

  DEFINITION MODULE M1;
    EXPORT QUALIFIED a, b, c, P;
    ...

Em seguida, os objetos a, b, c e P do módulo M1 tornam-se agora conhecidos fora do módulo M1 como M1.a, M1.b, M1.c e M1.P. Eles são exportados de maneira qualificada para o exterior (assumindo que o módulo M1 é global). O nome do módulo de exportação, ou seja, M1, é usado como um qualificador seguido pelo nome do objeto.

Suponha que o módulo M2 contenha a seguinte declaração IMPORT

  MODULE M2;
    IMPORT M1;
    ...

Então, isso significa que os objetos exportados pelo módulo M1 para fora de seu programa anexo agora podem ser usados ​​dentro do módulo M2. Eles são referenciados de maneira qualificada , assim: M1.a, M1.b, M1.c e M1.P. Exemplo:

    ...
    M1.a := 0;
    M1.c := M1.P(M1.a + M1.b);
    ...

A exportação qualificada evita conflitos de nome: por exemplo, se outro módulo M3 também exportaria um objeto chamado P, então ainda podemos distinguir os dois objetos, uma vez que M1.P difere de M3.P. Graças à exportação qualificada, não importa que ambos os objetos sejam chamados de P dentro de seus módulos de exportação M1 e M3.

Existe um método alternativo, que é amplamente utilizado por programadores Modula-2. Suponha que o módulo M4 seja formulado assim:

  MODULE M4;
    FROM M1 IMPORT a, b, c, P;

Então, isso significa que os objetos exportados pelo módulo M1 para o exterior podem ser usados ​​novamente dentro do módulo M4, mas agora por meras referências aos identificadores exportados de forma não qualificada , assim: a, b, c e P. Exemplo:

    ...
    a := 0;
    c := P(a + b);
    ...

Este método de desqualificar a importação permite o uso de variáveis ​​e outros objetos fora de seu módulo de exportação exatamente da mesma maneira simples, ou seja , não qualificada , como dentro do módulo de exportação. As paredes que cercam todos os módulos agora se tornaram irrelevantes para todos os objetos para os quais isso foi explicitamente permitido. É claro que a importação desqualificadora só pode ser usada se não houver conflito de nomes.

Essas regras de exportação e importação podem parecer desnecessariamente restritivas e prolixas. Mas eles não apenas protegem objetos contra acesso indesejado, mas também têm o agradável efeito colateral de fornecer referência cruzada automática da definição de cada identificador em um programa: se o identificador é qualificado por um nome de módulo, então a definição vem de esse módulo. Caso contrário, se ocorrer sem qualificação, basta pesquisar para trás e você encontrará uma declaração desse identificador ou sua ocorrência em uma instrução IMPORT que nomeia o módulo de onde ele vem. Esta propriedade se torna muito útil ao tentar entender programas grandes contendo muitos módulos.

A linguagem fornece simultaneidade de processador único (limitada) ( monitores , corrotinas e transferência explícita de controle) e acesso ao hardware (endereços absolutos, manipulação de bits e interrupções ). Ele usa um sistema de tipo nominal .

Dialetos

Existem dois dialetos principais de Modula-2. O primeiro é PIM , nomeado para o livro Programming in Modula-2 de Niklaus Wirth. Houve três edições principais do PIM: a segunda, a terceira (corrigida) e a quarta. Cada um descreve pequenas variações da linguagem. O segundo dialeto principal é ISO , nomeado para o esforço de padronização pela Organização Internacional para Padronização . Aqui estão algumas das diferenças entre eles.

  • PIM2 (1983)
    • EXPORTCláusula explícita necessária nos módulos de definição.
    • A função SIZEprecisa ser importada do móduloSYSTEM
  • PIM3 (1985)
    • Removida a EXPORTcláusula dos módulos de definição após a observação de que tudo dentro de um módulo de definição define a interface para aquele módulo, portanto, a EXPORTcláusula era redundante.
    • A função SIZEé abrangente (visível em qualquer escopo, sem importação)
  • PIM4 (1988)
    • Especificado o comportamento do MODoperador quando os operandos são negativos.
    • Requer que todas as ARRAY OF CHARstrings sejam terminadas por ASCII NUL, mesmo se a string se ajustar exatamente ao seu array.
  • ISO (1996, 1998)
    • ISO Modula-2 resolveu a maioria das ambigüidades no PIM Modula-2. Ele adicionou os tipos de dados COMPLEXe LONGCOMPLEXexceções, a terminação do módulo ( FINALLYcláusula) e uma biblioteca de entrada / saída padrão completa (E / S) . Existem muitas pequenas diferenças e esclarecimentos.

Superconjuntos

Existem vários superconjuntos de Modula-2 com extensões de linguagem para domínios de aplicativo específicos:

Derivados

Existem várias linguagens derivadas que se assemelham muito ao Modula-2, mas são novas linguagens por si mesmas. A maioria são idiomas diferentes com propósitos diferentes e com pontos fortes e fracos próprios:

  • Modula-3 , desenvolvido por uma equipe de ex-funcionários da Xerox que se mudaram para DEC e Olivetti
  • Oberon , desenvolvido na ETH Zürich para o System Oberon disponível online .
  • Oberon-2 , Oberon com extensões OO
  • Active Oberon , mais uma extensão orientada a objetos de Oberon , desenvolvida também na ETH com o objetivo principal de oferecer suporte à programação paralela em sistemas multiprocessadores e multicore.
  • Parallaxis, uma linguagem para programação paralela de dados independente de máquina
  • Umbriel, desenvolvido por Pat Terry como língua de ensino
  • YAFL, uma linguagem de pesquisa de Darius Blasband

Muitas outras linguagens de programação atuais adotaram recursos do Modula-2.

Elementos de linguagem

Palavras reservadas

PIM [2,3,4] define 40 palavras reservadas :

AND         ELSIF           LOOP       REPEAT
ARRAY       END             MOD        RETURN
BEGIN       EXIT            MODULE     SET
BY          EXPORT          NOT        THEN
CASE        FOR             OF         TO
CONST       FROM            OR         TYPE
DEFINITION  IF              POINTER    UNTIL
DIV         IMPLEMENTATION  PROCEDURE  VAR
DO          IMPORT          QUALIFIED  WHILE
ELSE        IN              RECORD     WITH

Identificadores integrados

PIM [3,4] define 29 identificadores embutidos :

ABS         EXCL            LONGINT    REAL
BITSET      FALSE           LONGREAL   SIZE
BOOLEAN     FLOAT           MAX        TRUE
CAP         HALT            MIN        TRUNC
CARDINAL    HIGH            NIL        VAL
CHAR        INC             ODD
CHR         INCL            ORD
DEC         INTEGER         PROC

Uso de sistema embutido

Modula-2 é usado para programar muitos sistemas embarcados .

Cambridge Modula-2

Cambridge Modula-2 da Cambridge Microprocessor Systems é baseado em um subconjunto do PIM4 com extensões de linguagem para desenvolvimento embarcado. O compilador roda em DOS e gera código para microcontroladores integrados baseados em Motorola série 68000 (M68k) rodando um sistema operacional MINOS.

Mod51

Mod51 da Mandeno Granville Electronics é baseado no ISO Modula-2 com extensões de linguagem para desenvolvimento embarcado seguindo IEC1131, um padrão da indústria para controladores lógicos programáveis (CLP) intimamente relacionado ao Modula-2. O compilador Mod51 gera código autônomo para microcontroladores baseados em 80C51.

Modula-GM

A Delco Electronics , então subsidiária da GM Hughes Electronics , desenvolveu uma versão do Modula-2 para sistemas de controle embarcados a partir de 1985. A Delco o nomeou Modula-GM. Foi a primeira linguagem de programação de alto nível usada para substituir o código de máquina (linguagem) para sistemas embarcados nas unidades de controle do motor (ECUs) da Delco . Isso era significativo porque a Delco estava produzindo mais de 28.000 ECUs por dia em 1988 para a GM. Este era então o maior produtor mundial de ECU. O primeiro uso experimental do Modula-GM em um controlador embarcado foi no Controlador do Sistema de Travagem Antibloqueio de 1985, baseado no microprocessador Motorola 68xxx, e em 1993 Gen-4 ECU usado pelas equipes de automobilismo da Champ Car World Series Championship (CART) e equipes da Indy Racing League (IRL). O primeiro uso de produção do Modula-GM foi em caminhões GM começando com o módulo de controle de veículos (VCM) do ano modelo 1990 usado para gerenciar os motores Vortec da GM Powertrain . Modula-GM também foi usado em todas as ECUs para a família de motores 90 ° Buick V6 da GM 3800 Série II usada no modelo do ano de 1997-2005 Buick Park Avenue . Os compiladores Modula-GM e as ferramentas de gerenciamento de software associadas foram fornecidos pela Delco da Intermetrics .

Modula-2 foi selecionado como a base para a linguagem de alto nível da Delco por causa de seus muitos pontos fortes sobre outras opções de linguagem alternativa em 1986. Depois que a Delco Electronics foi separada da GM (com outras divisões de componentes) para formar a Delphi Automotive Systems em 1995, global sourcing exigia o uso de uma linguagem de software de alto nível não proprietária. Software incorporado ECU agora desenvolvido em Delphi é compilado com compiladores comerciais para a linguagem C .

Satélites russos de radionavegação

Os satélites do russo de radionavegação por satélite de serviço quadro GLONASS , semelhante ao dos Estados Unidos Sistema de Posicionamento Global (GPS), são programados em Modula-2.

Compiladores

  • Amsterdam Compiler Kit (ACK) Modula-2 - para MINIX ; freeware
  • ADW Modula-2 - para Windows, compatível com ISO, ISO / IEC 10514-1, ISO / IEC 10514-2 (extensão OO), ISO / IEC 10514-3 (extensão genérica); freeware
  • Aglet Modula-2 - para AmigaOS 4.0 para PowerPC ; freeware
  • Ferramentas de software ajustadas (FST) Modula-2 - para DOS; freeware
  • Gardens Point Modula-2 (GPM) - para BSD, Linux, OS / 2, Solaris ; Compatível com ISO; freeware, a partir de 30 de julho de 2014
  • Gardens Point Modula-2 (GPM / CLR) - para .NET Framework ; freeware
  • GNU Modula-2 - para plataformas GCC, versão 1.0 lançada em 11 de dezembro de 2010; conformidade: PIM2, PIM3, PIM4, ISO; software livre , GNU General Public License (GPL)
  • M2Amiga - para Amiga ; software grátis
  • M2M - por N. Wirth e colaboradores da ETH Zurich, plataforma cruzada, gera código M para máquina virtual ; freeware
  • MacMETH - por N. Wirth e colaboradores de ETH Zurich para Macintosh, apenas Classic; freeware
  • Mod51 - para a família de microcontroladores Intel 80x51, compatível com ISO, extensões IEC1132; software proprietário
  • Megamax Modula-2 - para Atari ST com documentação apenas em alemão; freeware
  • Modula-2 R10 - compilador de referência para este Modula; código aberto, revisão por pares
  • ModulaWare - para OpenVMS ( VAX e Alpha ), compatível com ISO; software proprietário
  • ORCA / Modula-2 - para Apple IIGS por The Byte Works para Apple Programmer's Workshop
  • p1 Modula-2 - para Macintosh , Classic e macOS ( PowerPC e Carbon (API) apenas), compatível com ISO; software proprietário
  • MOCKA - para várias plataformas, compatível com PIM; versões comerciais, freeware do Linux / BSD
  • TDI Modula-2 - para Atari ST , por TDI Software
  • Terra M2VMS - para OpenVMS ( VAX e Alpha ), compatível com PIM; software proprietário
  • m2c, Ulm Modula-2 System - para Solaris (Sun SPARC e Motorola 68k ); software livre, GNU General Public License (GPL)
  • XDS - compatível com ISO, biblioteca compatível com TopSpeed: Native XDS-x86 para x86 (Windows e Linux); XDS-C para Windows e Linux (versões de 16 e 32 bits), destinos C ( K&R e ANSI ); freeware

Turbo Modula-2

Turbo Modula-2 foi um compilador e um ambiente de desenvolvimento integrado para MS-DOS desenvolvido, mas não publicado, pela Borland . Jensen and Partners, que incluía o co-fundador da Borland Niels Jensen, comprou a base de código não lançada e a transformou em TopSpeed ​​Modula-2. Ele acabou sendo vendido para a Clarion, agora propriedade da SoftVelocity, que ainda oferece o compilador Modula-2 como parte de sua linha de produtos Clarion .

Uma versão Zilog Z80 CP / M do Turbo Modula-2 foi brevemente comercializada pela Echelon sob licença da Borland. Um lançamento complementar para Hitachi HD64180 foi vendido pela Micromint como uma ferramenta de desenvolvimento para seu computador de placa única SB-180.

IBM Modula-2

A IBM tinha um compilador Modula-2 para uso interno que rodava em OS / 2 e AIX , e tinha suporte de primeira classe no editor E2 da IBM . O IBM Modula-2 foi usado para partes do OS / 400 Vertical Licensed Internal Code (efetivamente o kernel do OS / 400). Este código foi substituído por C ++ quando o OS / 400 foi transferido para a família de processadores IBM RS64 . A Motorola 68000 backend também existia, o que pode ter sido usado em produtos de sistemas embarcados.

Sistemas operacionais

Modula-2 é usado para programar alguns sistemas operacionais (SOs). A estrutura e o suporte do módulo Modula-2 são usados ​​diretamente em dois sistemas operacionais relacionados.

O sistema operacional denominado Medos-2 , para a estação de trabalho Lilith, foi desenvolvido na ETH Zurich, por Svend Erik Knudsen com aconselhamento de Wirth. É um sistema operacional orientado a objetos de usuário único, construído a partir de módulos Modula-2.

O sistema operacional denominado Excelsior , para a estação de trabalho Kronos , foi desenvolvido pela Academia de Ciências da União Soviética , filial da Sibéria, Centro de Computação de Novosibirsk , projeto Modular Asynchronous Developable Systems (MARS), Grupo de Pesquisa Kronos (KRG). É um sistema de usuário único baseado em módulos Modula-2.

Livros

  • Wirth, Niklaus (1988). Programação em Modula-2 (4ª ed.). Berlin Heidelberg : Springer-Verlag . doi : 10.1007 / 978-3-642-83565-0 . ISBN 978-0-387-96051-7.
  • King, KN (1 de janeiro de 1988). Modula-2: um guia completo . Burlington, Massachusetts : Jones and Bartlett Publishers. ISBN 978-0669110913.
  • Sutcliffe, Richard J. (2004–2005). Modula-2: Abstrações para dados e estruturas de programação . Arjay Books. ISBN 978-0-669-11091-3. Usa Modula-2 padrão ISO.
  • Gleaves, Richard (1984). Modula-2 para programadores Pascal . Springer Books on Professional Computing (1ª ed.). Suíça: Springer Nature. doi : 10.1007 / 978-1-4613-8531-8 . ISBN 978-0-387-96051-7.
  • Cooper, Doug (1 de setembro de 1990). Oh meu! Modula-2: Uma introdução à programação . Cidade de Nova York , Nova York : WW Norton & Company . ISBN 978-0393960099.

Referências

links externos

Este artigo é baseado em material retirado do Dicionário On-line Gratuito de Computação anterior a 1 de novembro de 2008 e incorporado sob os termos de "relicenciamento" do GFDL , versão 1.3 ou posterior.