Oberon (programmeringssprog) - Oberon (programming language)

Oberon
Oberon programmeringssprog logo.svg
Paradigmer Imperativt , struktureret , modulært , objektorienteret
Familie Wirth Oberon
Designet af Niklaus Wirth
Udvikler ETH Zürich
Første gang dukkede op 1987 ; 34 år siden ( 1987 )
Stabil udgivelse
Oberon-07 / 6. marts 2020 ; 18 måneder siden ( 2020-03-06 )
Skrive disciplin Stærk , hybrid ( statisk og dynamisk )
Anvendelsesområde Leksikalsk
Platform ARM , StrongARM ; IA-32 , x86-64 ; SPARC , Ceres ( NS32032 )
OS Windows , Linux , Solaris , klassisk Mac OS , Atari TOS , AmigaOS
Internet side www .projektoberon .com
Påvirket af
Modula-2
Påvirket
Oberon-2 , Oberon-07 , Zonnon , Go , Nim , Active Oberon , Komponent Pascal

Oberon er et almindeligt programmeringssprog, der først blev udgivet i 1987 af Niklaus Wirth og det seneste medlem af Wirthian-familien af ALGOL- lignende sprog ( Euler , ALGOL W , Pascal , Modula og Modula-2 ). Oberon var resultatet af en koncentreret indsats for at øge magten hos Modula-2 , Pascals direkte efterfølger , og samtidig reducere dens kompleksitet. Dens vigtigste nye funktion er konceptet med typeudvidelse af rekordtyper. Det tillader konstruktion af nye datatyper på grundlag af eksisterende og at relatere dem, afvigende fra dogmet om strengt statisk indtastning af data. Typeudvidelse er Wirths måde at arve på, hvilket afspejler synspunktet på det overordnede websted. Oberon blev udviklet som en del af implementeringen af ​​et operativsystem , også kaldet OberonETH Zürich i Schweiz . Navnet er fra månen på planeten Uranus , opkaldt Oberon .

Oberon vedligeholdes stadig af Wirth, og den seneste Project Oberon -kompilatoropdatering er dateret den 6. marts 2020.

Design

Oberon er designet med et motto tilskrevet Albert Einstein i tankerne: "Gør tingene så enkle som muligt, men ikke enklere." Den vigtigste retningslinje var at koncentrere sig om funktioner, der er grundlæggende og væsentlige, og at udelade flygtige spørgsmål. En anden faktor var anerkendelse af kompleksiteten i sprog som C ++ og Ada . I modsætning til disse understreger Oberon brugen af bibliotekskonceptet til at udvide sproget. Optælling og subrange typer, der var til stede i Modula-2, blev udeladt, og sættyper er begrænset til sæt af heltal. Alle importerede varer skal kvalificeres med navnet på det modul, hvor de er deklareret. Faciliteter på lavt niveau fremhæves ved kun at tillade dem at bruges i et modul, der indeholder identifikatoren SYSTEM i importlisten. Strenge typekontrol , selv på tværs af moduler, og indekskontrol ved runtime , nullmarkørkontrol og konceptet sikker typeudvidelse tillader stort set programmering at stole på sprogreglerne alene.

Hensigten med denne strategi var at producere et sprog, der er lettere at lære, lettere at implementere og meget effektivt. Oberon -kompilatorer er blevet set som kompakte og hurtige, samtidig med at de leverer kodekvalitet, der kan sammenlignes med kommercielle kompilatorer.

Egenskaber

Funktioner, der kendetegner Oberon -sproget, omfatter:

  • Bogstavsfølsom syntaks med store søgeord
  • Typeudvidelse med typetest
  • Moduler og separat kompilering
  • Strengoperationer
  • Isolering af usikker kode
  • Understøttelse af systemprogrammering

Objektorientering

Oberon understøtter udvidelse af rekordtyper til konstruktion af abstraktioner og heterogene strukturer. I modsætning til de senere dialekter, Oberon-2 og Active Oberon, mangler den originale Oberon en forsendelsesmekanisme som sprogfunktion, men har den som en programmeringsteknik eller designmønster. Dette giver stor fleksibilitet i OOP. I Oberon -operativsystemet bruges to programmeringsteknikker sammen til afsendelsesopkaldet: Method suite og Message handler.

Metode suite

I denne teknik, en tabel over procedure variabler er defineret og en global variabel af denne type er erklæret i den udvidede modul og tildelt tilbage i den generiske modul:

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.

Vi udvider den generiske type figur til en bestemt form:

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.

Dynamisk afsendelse udføres kun via procedurer i figurmodulet, der er det generiske modul.

Beskedbehandler

Denne teknik består i at udskifte sæt af metoder med en enkelt procedure, som skelner mellem de forskellige metoder:

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.

Vi udvider den generiske type figur til en bestemt form:

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.

I Oberon -operativsystemet bruges begge disse teknikker til dynamisk forsendelse. Den første bruges til et kendt sæt metoder; den anden bruges til alle nye metoder, der er angivet i udvidelsesmodulet. For eksempel, hvis udvidelsesmodulet Rektangler skulle implementere en ny Rotate () -procedure, kunne det inden for figurmodulet kun kaldes via en meddelelseshåndterer.

Implementeringer og varianter

Oberon

Gratis implementeringer af Oberon (sproget) og Oberon (operativsystemet) findes på Internettet (flere er fra ETHZ selv).

Oberon-2

Et par ændringer blev foretaget i den første udgivne specifikation. For eksempel blev objektorienterede programmeringsfunktioner (OOP) tilføjet, FORsløjfen blev genindført. Resultatet blev Oberon-2 . Én udgivelse, der hedder Native Oberon, som indeholder et operativsystem, og som kan starte direkte på IBM PC -kompatibel hardware. En .NET- implementering af Oberon med tilføjelse af nogle mindre .NET-relaterede udvidelser blev også udviklet på ETHZ. I 1993 bragte et ETHZ spin off-selskab en dialekt af Oberon-2 til markedet ved navn Oberon-L . I 1997 blev det omdøbt til komponent Pascal .

Oberon-2-kompilatorer udviklet af ETH inkluderer versioner til Microsoft Windows , Linux , Solaris og klassisk Mac OS . Implementeringer fra andre kilder findes for nogle andre operativsystemer, herunder Atari TOS og AmigaOS .

Der er en Oberon-2 Lex- scanner og Yacc- parser af Stephen J Bevan fra Manchester University, UK, baseret på den i Mössenböck- og Wirth-referencen. Det er i version 1.4.

Andre kompilatorer omfatter Oxford Oberon-2, som også forstår Oberon-07 og Vishap Oberon. Sidstnævnte er baseret på Josef Templ's Oberon to C- sprog kilde-til-kilde compiler (transpiler) ved navn Ofront, som igen er baseret på OP2 Compiler udviklet af Regis Crelier på ETHZ.

Oberon-07

Oberon-07, defineret af Niklaus Wirth i 2007 og revideret i 2008, 2011, 2013, 2014, 2015 og 2016 er baseret på den originale version af Oberon frem for Oberon-2. De vigtigste ændringer er: eksplicitte numeriske konverteringsfunktioner (f.eks. FLOOROg FLT) skal bruges, de WITH, LOOPog EXITudsagn blev udeladt, WHILEsætninger blev udvidet, CASEsætninger kan bruges til typetypetest, RETURNsætninger kan kun forbindes til slutningen af ​​en funktion, importerede variabler og strukturerede værdiparametre er skrivebeskyttet, og arrays kan tildeles uden brug COPY.

Oberon-07-kompilatorer er udviklet til brug med mange forskellige computersystemer. Wirths kompilator retter sig mod en reduceret instruktionssæt computer (RISC) processor af sit eget design, der blev brugt til at implementere 2013-versionen af Project Oberon- operativsystemet på et Xilinx feltprogrammerbart gate array (FPGA) Spartan-3-kort. Porte til RISC-processoren til FPGA Spartan-6, Spartan-7, Artix-7 og en RISC-emulator til Windows (kompilerbar på Linux og macOS og binære filer tilgængelige til Windows) findes også. OBNC kompileres via C og kan bruges på ethvert bærbart operativsysteminterface ( POSIX ) kompatibelt operativsystem. Den kommercielle Astrobe- implementering er rettet mod 32-bit ARM Cortex-M3, M4 og M7 mikrokontrollere. Den Patchouli compiler producerer 64-bit Windows binære filer. Oberon-07M producerer 32-bit Windows-binære filer og implementerer revision 2008 af sproget. Akrons producerer binære filer til både Windows og Linux. OberonJS oversætter Oberon til JavaScript . Der er online IDE til Oberon . oberonc er en implementering til den virtuelle Java -maskine .

Aktiv Oberon

Active Oberon er endnu en variant af Oberon, som tilføjer objekter (med objekt-centreret adgangsbeskyttelse og lokal aktivitetskontrol), systembeskyttede påstande, præventiv prioritetsplanlægning og en ændret syntaks for metoder (navngivet typebundne procedurer i Oberons ordforråd). Objekter kan være aktive, hvilket betyder, at de kan være tråde eller processer. Endvidere har Active Oberon en måde at implementere operatører på (inklusive overbelastning), en avanceret syntaks til brug af arrays (se OberonX -sprogudvidelser og Proceedings of the 7. Joint Modular Languages ​​Conference 2006 Oxford, UK), og kender til navneområder . Operativsystemet A2 (tidligere Active Object System (AOS), derefter Bluebottle ), især kernen , synkroniserer og koordinerer forskellige aktive objekter.

ETHZ har frigivet Active Oberon, som understøtter aktive objekter og operativsystemerne baseret på det (Active Object System (AOS), Bluebottle, A2) og miljø (JDK, HTTP, FTP osv.) For sproget. Som med mange tidligere designs fra ETHZ er versioner af begge tilgængelige til download på Internettet. Fra 2003 inkluderer understøttede centrale processorenheder (CPU'er) single og dual core x86 og StrongARM .

Relaterede sprog

Udviklingen fortsatte med sprog i denne familie. En yderligere udvidelse af Oberon-2, oprindeligt opkaldt til Oberon/L, men senere omdøbt til komponent Pascal , blev udviklet til Windows og klassisk Mac OS af Oberon microsystems, en kommerciel virksomhed spin-off fra ETHZ og til .NET af Queensland University of Technology . Endvidere transporterer sprogene Lagoona og Obliq Oberon -metoder til specialiserede områder.

Senere .NET -udviklingsindsats på ETHZ fokuserede på et nyt sprog ved navn Zonnon . Dette inkluderer funktionerne i Oberon og gendanner nogle fra Pascal (opregnede typer, indbygget IO), men har nogle syntaktiske forskelle. Andre funktioner omfatter understøttelse af aktive objekter, overbelastning af operatører og håndtering af undtagelser.

Oberon-V (oprindeligt opkaldt Seneca, efter Seneca den Yngre ) er en efterkommer af Oberon designet til numeriske applikationer på supercomputere , især vektor- eller rørledningsarkitekturer . Det inkluderer array -konstruktører og en ALLerklæring.

Se også

Ressourcer

Generel

Evolution af Oberon

Referencer