Oberon
ParadigmaImperativa, Estruturada, Modular, Orientada a objetos
Surgido em1987; há 39 anos
Última versãoOberon-07 (6 março 2020; há 6 anos)
Criado porNiklaus Wirth Edit this on Wikidata
FamíliaWirth Oberon
Projetado porNiklaus Wirth Edit this on Wikidata
Influenciada porModula-2
InfluenciouOberon-2, Oberon-07, Active Oberon, Component Pascal, Zonnon, Go, V (Vlang), Nim
PlataformaARM, StrongARM; IA-32, x86-64; SPARC, Ceres (NS32032)
Sistema operacionalWindows, Linux, Solaris, classic Mac OS, Atari TOS, AmigaOS
Página oficialprojectoberon.net

Oberon é uma linguagem de programação de propósitos gerais primeiramente publicada em 1987 por Niklaus Wirth e último membro da família Wirthian de linguagens tipo ALGOL(Euler, ALGOL W, Pascal, Modula e Modula-2.[1][2][3][4] Oberon foi o resultado de esforços concentrados para aumentar o poder de Modula-2, o sucessor direto de Pascal, e ao mesmo tempo para reluzir sua complexidade. Sua principal nova característica é o conceito de extensão de tipo de dado de tipo de registros.[5] Isso permite a construção de novos tipos de dados com base em tipos existentes e relacionados com eles, desviando do dogma de tipagem estática de dados. Extensão de tipos o forma de Wirth de herança refletindo o ponto de vista do site pai. Oberon foi desenvolvida como parte da implementação de um sistema operacional, também chamado Oberon no ETH Zurich na Suíça. O nome foi inspirado tanto pelas fotos da sonda espacial Voyager da lua do planeta Urano, nomeada Oberon, e porque Oberon é famoso como o rei dos elfos.[6]

Oberon era mantida por Wirth a a ultima atualização do compilador do Projeto Oberon foi en 6 de março de 2020.[7]

Design

editar

Oberon é projetada com o lema atribuído Albert Einstein em mente: "Make things as simple as possible, but not simpler." A diretriz principal era se concentrar em recursos que são básicos e essenciais e para omitir problemas efêmeros. Outro fator foi o reconhecimento do crescimento da complexidade me linguagens como C++ e Ada. Em contraste a essas, Oberon enfatiza o uso do conceito de bibliotecas para estender a linguagem. Tipos de enumeração e subrange, que estavam presentes em Modula-2, form omitidos, e tipos de conjunto são limitados a conjuntos de inteiros. Todos os itens importados tem de ser qualificados pelo nome do módulo em que eles foram declarados. Recursos de baixo nível são destacados por permitindo apenas ser usado em módulos que incluem o identificador SYSTEM na sua lista de imports. Checagem de tipos estrita, mesmo através de módulos, e index checking em tempo de execução, verificação de null pointer, e o conceito de extensão tipagem segura amplamente permitiram programação depender apenas das regras da linguagem. A intenção dessa estratégia era produzir uma linguagem que é mais fácil de aprender, simples de implementar e muito eficiente. Compiladores Oberon tem sido vistos como compactos e rápidos, e ainda sim provendo qualidade de código comparável a compiladores comerciais.[8]

Características

editar

Atributos caracterizando a linguagem Oberon incluem:[9]

  • Sintaxe sensível a capitalização com palavras chave com letras maiúsculas
  • Extensão de tipos com teste de tipo
  • Módulos e compilação separada
  • Operações de string
  • Isolamento de código inseguro
  • Suporte para programação a nível de sistema

Orientação a objetos

editar

Oberon suporta extensão de tipos de registro para construção de abrações e estruturas heterogêneas. Em contraste a dialetos posteriores, Oberon-2 e Active Oberon, Oberon original sofria da falta de mecanismos de dispatch como uma característica mas tem isso como uma técnica de programação ou padrão de design. Isso dá grande flexibilidade em OOP. No sistema operacional Oberon, duas técnicas de programação são usadas juntas para o dispatch call: Method suite e Message handler.

Method suite

editar

Nessa técnica, uma tabela a de procedimentos variáveis é definida e uma variável global desse tipo é declarada em um módulo estendido e atribuído de volta a esse módulo genérico:

MODULE Figures; (* Abstract module *)

TYPE
   Figure*    = POINTER TO FigureDesc;
   Interface* = POINTER TO InterfaceDesc;

   InterfaceDesc* = RECORD
      draw*  : PROCEDURE (f : Figure);
      clear* : PROCEDURE (f : Figure);
      mark*  : PROCEDURE (f : Figure);
      move*  : PROCEDURE (f : Figure; dx, dy : INTEGER);
   END;

   FigureDesc* = RECORD
      if : Interface;
   END;

PROCEDURE Init* (f : Figure; if : Interface);
BEGIN
   f.if := if
END Init;

PROCEDURE Draw* (f : Figure);
BEGIN
   f.if.draw(f)
END Draw;

(* Other procedures here *)

END Figures.

Nós estendemos o tipo genérico Figure para um formato específico:

MODULE Rectangles;

IMPORT Figures;

TYPE
   Rectangle* = POINTER TO RectangleDesc;

   RectangleDesc* = RECORD
      (Figures.FigureDesc)
      x, y, w, h : INTEGER;
   END;

VAR
   if : Figures.Interface;

PROCEDURE New* (VAR r : Rectangle);
BEGIN
   NEW(r);
   Figures.Init(r, if)
END New;

PROCEDURE Draw* (f : Figure);
   VAR
      r : Rectangle;
BEGIN
   r := f(Rectangle); (* f AS Rectangle *)
   (* ... *)
END Draw;

(* Other procedures here *)

BEGIN (* Module initialisation *)
   NEW(if);
   if.draw  := Draw;
   if.clear := Clear;
   if.mark  := Mark;
   if.move  := Move
END Rectangles.

Dispatch dinâmico só é feito via procedimentos em módulo Figure que é um módulo genérico.

Message handler

editar

Essa técnica consiste de substituir o conjunto de métodos com um único procedimento, que descrimina entre vários métodos:

MODULE Figures; (* Abstract module *)

TYPE
   Figure*    = POINTER TO FigureDesc;

   Message*   = RECORD END;
   DrawMsg*   = RECORD (Message) END;
   ClearMsg*  = RECORD (Message) END;
   MarkMsg*   = RECORD (Message) END;
   MoveMsg*   = RECORD (Message) dx*, dy* : INTEGER END;

   Handler*   = PROCEDURE (f : Figure; VAR msg : Message);

   FigureDesc* = RECORD
      (* Abstract *)
      handle : Handler;
   END;

PROCEDURE Handle* (f : Figure; VAR msg : Message);
BEGIN
   f.handle(f, msg)
END Handle;

PROCEDURE Init* (f : Figure; handle : Handler);
BEGIN
   f.handle := handle
END Init;

END Figures.

Nós estendemos o tipo genérico Figure para um formato específico:

MODULE Rectangles;

IMPORT Figures;

TYPE
   Rectangle* = POINTER TO RectangleDesc;

   RectangleDesc* = RECORD
      (Figures.FigureDesc)
      x, y, w, h : INTEGER;
   END;

PROCEDURE Draw* (r : Rectangle);
BEGIN
  (* ... *)
END Draw;

(* Other procedures here *)

PROCEDURE Handle* (f: Figure; VAR msg: Figures.Message);
   VAR
      r : Rectangle;
BEGIN
   r := f(Rectangle);
   IF    msg IS Figures.DrawMsg THEN Draw(r)
   ELSIF msg IS Figures.MarkMsg THEN Mark(r)
   ELSIF msg IS Figures.MoveMsg THEN Move(r, msg(Figures.MoveMsg).dx, msg(Figures.MoveMsg).dy)
   ELSE  (* ignore *)
   END
END Handle;

PROCEDURE New* (VAR r : Rectangle);
BEGIN
   NEW(r);
   Figures.Init(r, Handle)
END New;

END Rectangles.

No sistema operacional Oberon ambas essas técnicas são usadas para dispatch dinâmico. O primeiro é usado para um conjunto conhecido de métodos; o segundo é usado apenas para novos métodos declarados numa módulo de extensão. Por exemplo, se o módulo de extensão Rectangles fosse implementar um novo procedimento Rotate(), dentro o módulo Figures ele poderia somente ser chamado via um message handler.

Implementações e variantes

editar
  • Oberon
  • Oberon-2
  • Oberon-07
  • Active Oberon

Linguagens relacionadas

editar

O desenvolvimento continuou em linguagens nessa família. Uma extensão adicional de Oberon-2 foi originalmente chamada Oberon/L mas mais tarde renomeada Component Pascal (CP). CP foi desenvolvido para Windows e Mac OS clássico pela Oberon microsystems, um espresa spin-off comercial da ETHZ, e para .NET pela Universidade de Tecnologia de Queensland. Além disso, as linguaguagens Lagoona[10][11][12] e Obliq levam métodos Oberon a áreas especializadas.

Mais tarde esforços de desenvolvimento .NET no ETHZ focou em uma nova linguagem nomeada Zonnon. Isso inclui as features do Oberon e restaura algumas de Pascal (tipos enumerados, built-in IO) mas tem algumas diferenças de sintaxe. Outras features incluem suporte para active objects, sobrecarga de operador e tratamento de exceções.

Oberon-V (originalmente chamada Seneca, em homenagem a Séneca) é um descendente de Oberon projetado para aplicações numéricas em supercomputadores especialmente em arquitetura vetoriais ou pipelined. Ela inclui contrutores de array e ALL statement.[13]

Ver também

editar

Referências

  1. Wirth, Niklaus (1987). From Modula to Oberon and the programming language Oberon (Relatório). ETH Technical Reports D-INFK. Band 82. Wiley. doi:10.3929/ethz-a-005363226 
  2. Wirth, Niklaus (julho de 1988). «The Programming Language Oberon». Software: Practice and Experience. 18 (7): 661–670. doi:10.1002/spe.4380180707 
  3. Wirth, Niklaus (julho de 1988). «From Modula to Oberon». Software: Practice and Experience. 18 (7): 671–690. doi:10.1002/spe.4380180706 
  4. Wirth, Niklaus (abril de 1988). «Type Extensions». ACM Transactions on Programming Languages and Systems. 10 (2): 204–214. doi:10.1145/42190.46167Acessível livremente 
  5. Pountain, D. March 1991. «Modula's Children, Part II: Oberon». Byte. 16 (3). pp. 135–142 
  6. Wirth, Niklaus; Gutknecht, Jürg (1987–2021). «Project Oberon» (PDF). Cópia arquivada (PDF) em 10 de abril de 2026 
  7. Wirth, Niklaus. «Oberon Change Log». ETH Zurich. Consultado em 16 de janeiro de 2021. Cópia arquivada em 7 de abril de 2019 
  8. Mössenböck, Hanspeter. «Compiler Construction: The Art of Niklaus Wirth» (PDF). Consultado em 28 de maio de 2025. Cópia arquivada (PDF) em 12 de abril de 2026 
  9. Wirth, Niklaus; Gutknecht, Jürg (1987–2021). «Project Oberon». Cópia arquivada em 28 de abril de 2026 
  10. Fröhlich, Peter H.; Franz, Michael. On Certain Basic Properties of Component-Oriented Programming Languages (PDF) (Relatório). University of California, Irvine. Consultado em 18 de janeiro de 2021 
  11. Fröhlich, Peter H.; Gal, Andreas; Franz, Michael (abril de 2005). «Supporting software composition at the programming language level». Elsevier B.V. Science of Computer Programming. 56 (1–2): 41–57. doi:10.1016/j.scico.2004.11.004Acessível livremente  Retrieved 18 January 2021.
  12. Franz, Michael; Fröhlich, Peter H.; Kistler, Thomas (20 de novembro de 1999). «Towards language support for component-oriented real-time programming». Proceedings: Fifth International Workshop on Object-Oriented Real-Time Dependable Systems. [S.l.]: Institute of Electrical and Electronics Engineers (IEEE). pp. 125–129. ISBN 0-7695-0616-X. doi:10.1109/WORDSF.1999.842343  Retrieved 21 January 2021.
  13. Griesemer, Robert (1993). «A Language for Numerical Applications on Vector Computers». Proceedings CONPAR 90: VAPP IV Conference, Diss Nr. 10277. [S.l.]: ETH Zurich 

📚 Artikel Terkait di Wikipedia

Linguagem de programação

Liberty, Jesse (2002). Programming C# (em inglês) 2ª ed. Beijing: O´Reilly. 629 páginas. ISBN 0-596-00309-9  Lutz, Mark (2001). Programming Python (em inglês)

Módulo carregável do núcleo

extension module no AIX, kernel-mode driver no Windows NT e downloadable kernel module (DKM) no VxWorks. Eles também são conhecidos como Módulos do Núcleo

C (linguagem de programação)

laboratórios, mas em 1978 Brian Kernighan e Dennis Ritchie lançam o livro The C Programming Language que serviu de tutorial e mudou a história da programação em

História das linguagens de programação

inglês). Consultado em 13 de Setembro de 2021  Wirth, Niklaus (1988). Programming in Modula-2 Fourth edition ed. Berlin: [s.n.] OCLC 18746666  «Já pensou porque

Modula-2

RETURN CASE FOR MODULE hello; FROM InOut IMPORT writestring, writeln; BEGIN WriteString("Hello, world!"); Writeln; END hello. MODULE Vetores; FROM InOut

Programação extrema

Programação extrema (do inglês eXtreme Programming), ou simplesmente XP, é considerada uma metodologia ágil e se ajusta bem a projetos de software com

ISAPI

Application Programming Interface — ISAPI é um protocolo usado por computadores baseados no Windows para rodar uma aplicação dinâmica carregando um módulo externo

Python

de encapsulamento. Ainda na CNRI, Guido lançou a iniciativa Computer Programming for Everybody (CP4E; literalmente, "Programação de Computadores para