Oberon es un lenguaje de programación de propósito general publicado por primera vez en 1987 por Niklaus Wirth y el último miembro de la familia Wirthian de lenguajes similares a ALGOL ( Euler , ALGOL W , Pascal , Modula y Modula-2 ). [1] [2] [3] [4] Oberon fue el resultado de un esfuerzo concentrado para aumentar la potencia de Modula-2 , el sucesor directo de Pascal , y simultáneamente reducir su complejidad. Su principal característica nueva es el concepto de extensión de tipos de datos de tipos de registro . [5] Permite construir nuevos tipos de datos sobre la base de los existentes y relacionarlos, desviándose del dogma de la tipificación estática estricta de los datos. La extensión de tipos es la forma de herencia de Wirth que refleja el punto de vista del sitio principal. Oberon fue desarrollado como parte de la implementación de un sistema operativo , también llamado Oberon en ETH Zurich en Suiza . El nombre se inspiró tanto en las imágenes de la sonda espacial Voyager de la luna del planeta Urano , llamada Oberón , como porque Oberón es famoso por ser el rey de los elfos. [6]
Wirth mantuvo Oberon y la última actualización del compilador del Proyecto Oberon está fechada el 6 de marzo de 2020. [7]
Oberon está diseñado con un lema atribuido a Albert Einstein en mente: "Haz las cosas lo más simples posible, pero no más simples". La directriz principal fue concentrarse en las características que son básicas y esenciales y omitir los problemas efímeros. Otro factor fue el reconocimiento del crecimiento de la complejidad en lenguajes como C++ y Ada . En contraste con estos, Oberon enfatiza el uso del concepto de biblioteca para extender el lenguaje. Los tipos de enumeración y subrango, que estaban presentes en Modula-2, se omitieron, y los tipos de conjunto se limitan a conjuntos de números enteros. Todos los elementos importados deben calificarse con el nombre del módulo donde se declaran. Las facilidades de bajo nivel se destacan al permitir que solo se usen en un módulo que incluya el identificador SYSTEM
en su lista de importación. La verificación de tipos estricta , incluso entre módulos, y la verificación de índices en tiempo de ejecución , la verificación de punteros nulos y el concepto de extensión de tipos segura permiten en gran medida que la programación dependa solo de las reglas del lenguaje.
La intención de esta estrategia era producir un lenguaje que fuera más fácil de aprender, más simple de implementar y muy eficiente. Los compiladores Oberon han sido vistos como compactos y rápidos, a la vez que ofrecen una calidad de código comparable a la de los compiladores comerciales. [8]
Las características que caracterizan al idioma Oberón incluyen: [9]
Oberon admite la extensión de tipos de registros para la construcción de abstracciones y estructuras heterogéneas. A diferencia de los dialectos posteriores, Oberon-2 y Active Oberon, el Oberon original carece de un mecanismo de envío como característica del lenguaje, pero lo tiene como técnica de programación o patrón de diseño. Esto proporciona una gran flexibilidad en la programación orientada a objetos. En el sistema operativo Oberon, se utilizan dos técnicas de programación juntas para la llamada de envío: conjunto de métodos y manejador de mensajes.
En esta técnica, se define una tabla de variables de procedimiento y se declara una variable global de este tipo en el módulo extendido y se asigna nuevamente en el módulo genérico:
MÓDULO Figuras; (*Módulo abstracto*)TIPO Figura* = PUNTERO A FigureDesc; Interfaz* = PUNTERO A InterfaceDesc; InterfaceDesc* = RECORD draw* : PROCEDIMIENTO (f : Figura); clear* : PROCEDIMIENTO (f : Figura); marca* : PROCEDIMIENTO (f : Figura); mover* : PROCEDIMIENTO (f : Figura; dx, dy : ENTERO ); FIN ; FiguraDesc* = REGISTRO si : Interfaz; FIN ;PROCEDIMIENTO Init* (f : Figura; if : Interfaz); COMIENZA f.si := siFIN Init;PROCEDIMIENTO Dibujar* (f : Figura); COMENZAR f.si.dibujar(f)FIN Sorteo;(*Otros procedimientos aquí*)Figuras FINALES .
Extendemos el tipo genérico Figura a una forma específica:
MÓDULO Rectángulos;Cifras de IMPORTACIÓN ;TIPO Rectángulo* = PUNTERO A RectangleDesc; RectánguloDesc* = REGISTRO (Figuras.FiguraDesc) x, y, w, h : ENTERO ; FIN ;VAR si : Figuras.Interfaz;PROCEDIMIENTO Nuevo* ( VAR r : Rectángulo); COMIENZA NUEVO (r); Figuras.Init(r, if)FIN Nuevo;PROCEDIMIENTO Dibujar* (f : Figura); VAR r : Rectángulo;INICIO r := f(Rectángulo); (* f COMO Rectángulo *) (* ... *) FIN Dibujar;(*Otros procedimientos aquí*)BEGIN (* Inicialización del módulo *) NUEVO (si); if.draw := Dibujar; if.clear := Borrar; si.marca := Marca; if.move := MoverFIN Rectángulos.
El envío dinámico solo se realiza a través de procedimientos en el módulo Figuras, que es el módulo genérico.
Esta técnica consiste en sustituir el conjunto de métodos por un único procedimiento, que discrimina entre los distintos métodos:
MÓDULO Figuras; (*Módulo abstracto*)TIPO Figura* = PUNTERO A FigureDesc; Mensaje* = FIN DEL REGISTRO ; DrawMsg* = RECORD (Mensaje) FIN ; ClearMsg* = RECORD (Mensaje) FIN ; MarkMsg* = RECORD (Mensaje) FIN ; MoveMsg* = REGISTRO (Mensaje) dx*, dy* : ENTERO FIN ; Controlador* = PROCEDIMIENTO (f: Figura; Mensaje VAR : Mensaje); FiguraDesc* = REGISTRO (* Resumen *) manejar : Manejador; FIN ;PROCEDIMIENTO Handle*(f : Figura; VAR msg : Mensaje); COMIENZA f.handle(f, mensaje)Mango FINAL ;PROCEDIMIENTO Init* (f : Figura; handle : Handler); BEGIN f.handle := manejarFIN Init;Figuras FINALES .
Extendemos el tipo genérico Figura a una forma específica:
MÓDULO Rectángulos;Cifras de IMPORTACIÓN ;TIPO Rectángulo* = PUNTERO A RectangleDesc; RectánguloDesc* = REGISTRO (Figuras.FiguraDesc) x, y, w, h : ENTERO; FIN ;PROCEDIMIENTO Dibujar* (r : Rectángulo); INICIO (* ... *) FIN Dibujar;(*Otros procedimientos aquí*)PROCEDIMIENTO Manija* (f: Figura; Mensaje VAR : Figuras.Mensaje); var r : Rectángulo;COMENZAR r := f(Rectángulo); SI msg ES Figuras.DibujarMsg ENTONCES Dibujar(r) ELSIF msg ES Figuras.MarcarMsg ENTONCES Marcar(r) ELSIF msg ES Figuras.MoverMsg ENTONCES Mover(r, msg(Figuras.MoverMsg).dx, msg(Figuras.MoverMsg).dy) DE LO CONTRARIO (* ignorar *) FIN FIN Manejar;PROCEDIMIENTO Nuevo* ( VAR r : Rectángulo); COMIENZA NUEVO (r); Figuras.Init(r, Handle)FIN Nuevo;FIN Rectángulos.
En el sistema operativo Oberon, ambas técnicas se utilizan para el envío dinámico. La primera se utiliza para un conjunto conocido de métodos; la segunda se utiliza para cualquier método nuevo declarado en el módulo de extensión. Por ejemplo, si el módulo de extensión Rectangles implementara un nuevo procedimiento Rotate(), dentro del módulo Figures solo se podría llamar a través de un controlador de mensajes.
Se pueden encontrar implementaciones gratuitas de Oberon (el lenguaje) y Oberon (el sistema operativo) en Internet (varias son del propio ETHZ).
Se realizaron algunos cambios a la primera especificación publicada. Por ejemplo, se añadieron características de programación orientada a objetosFOR
(OOP) y se restableció el bucle. El resultado fue Oberon-2 . Una versión, llamada Native Oberon , incluye un sistema operativo y puede arrancar directamente en hardware de clase compatible con IBM PC . También se desarrolló en ETHZ una implementación .NET de Oberon con algunas extensiones menores relacionadas con .NET. En 1993, una empresa derivada de la universidad ETHZ sacó al mercado un dialecto de Oberon-2 llamado Oberon-L . En 1997, se le cambió el nombre a Component Pascal .
Los compiladores Oberon-2 desarrollados por ETH incluyen versiones para Microsoft Windows , Linux , Solaris y el sistema operativo Mac OS clásico . Existen implementaciones de otras fuentes para otros sistemas operativos, incluidos Atari TOS y AmigaOS .
Existe un escáner Oberon-2 Lex y un analizador sintáctico Yacc creado por Stephen J Bevan de la Universidad de Manchester, Reino Unido, basado en el de la referencia de Mössenböck y Wirth. Se encuentra en la versión 1.4.
Otros compiladores incluyen Oxford Oberon-2, [10] que también entiende Oberon-07, y Vishap Oberon. [11] Este último se basa en el compilador de código fuente a código fuente de Oberon a lenguaje C de Josef Templ (transpilador) llamado Ofront, [12] que a su vez se basa en el compilador OP2 desarrollado por Regis Crelier en ETHZ.
Oberon-07, definido por Niklaus Wirth en 2007 y revisado en 2008, 2011, 2013, 2014, 2015 y 2016, se basa en la versión original de Oberon en lugar de Oberon-2. Los principales cambios son: se deben utilizar funciones de conversión numérica explícitas (por ejemplo, FLOOR
y ); se omitieron las instrucciones , y ; se ampliaron las instrucciones; las instrucciones se pueden utilizar para pruebas de extensión de tipo; las instrucciones solo se pueden conectar al final de una función; las variables importadas y los parámetros de valor estructurado son de solo lectura; y, se pueden asignar matrices sin utilizar . [13]FLT
WITH
LOOP
EXIT
WHILE
CASE
RETURN
COPY
Los compiladores Oberon-07 se han desarrollado para su uso con muchos sistemas informáticos diferentes. El compilador de Wirth apunta a un procesador de computadora de conjunto de instrucciones reducidas (RISC) de su propio diseño que se utilizó para implementar la versión 2013 del sistema operativo Project Oberon en una placa Spartan-3 de matriz de puertas programables en campo (FPGA) de Xilinx. También existen puertos del procesador RISC a FPGA Spartan-6, Spartan-7, Artix-7 y un emulador RISC para Windows (compilable en Linux y macOS , y binarios disponibles para Windows). OBNC compila a través de C y se puede utilizar en cualquier sistema operativo compatible con la Interfaz de sistema operativo portátil ( POSIX ). La implementación comercial de Astrobe apunta a microcontroladores ARM Cortex-M3, M4 y M7 de 32 bits. El compilador Patchouli produce binarios de Windows de 64 bits. Oberon-07M produce binarios de Windows de 32 bits e implementa la revisión 2008 del lenguaje. Akron produce binarios tanto para Windows como para Linux. OberonJS traduce Oberon a JavaScript . Existe un IDE en línea para Oberon. oberonc es una implementación para la máquina virtual Java .
Active Oberon es otra variante de Oberon, que añade objetos (con protección de acceso centrada en objetos y control de actividad local), aserciones protegidas por el sistema, programación de prioridad preventiva y una sintaxis modificada para los métodos ( procedimientos con nombre vinculados al tipo en el vocabulario de Oberon). Los objetos pueden ser activos, lo que significa que pueden ser subprocesos o procesos. Además, Active Oberon tiene una forma de implementar operadores (incluida la sobrecarga), una sintaxis avanzada para usar matrices (consulte las extensiones del lenguaje OberonX y las Actas [14] de la 7.ª Conferencia conjunta de lenguajes modulares de 2006 en Oxford, Reino Unido) y conoce los espacios de nombres . [15] El sistema operativo A2 (anteriormente Active Object System (AOS), [16] luego Bluebottle ), especialmente el núcleo , sincroniza y coordina diferentes objetos activos.
ETHZ ha lanzado Active Oberon , que admite objetos activos y los sistemas operativos basados en ellos (Active Object System (AOS), Bluebottle, A2) y el entorno (JDK, HTTP, FTP, etc.) para el lenguaje. Al igual que con muchos diseños anteriores de ETHZ, hay versiones de ambos disponibles para descargar en Internet. A partir de 2003, las unidades centrales de procesamiento (CPU) compatibles incluyen x86 de uno y dos núcleos y StrongARM .
El desarrollo de los lenguajes de esta familia continuó. Una extensión posterior de Oberon-2 se denominó originalmente Oberon/L, pero luego se renombró Component Pascal (CP). CP fue desarrollado para Windows y Mac OS clásico por Oberon microsystems, una empresa derivada comercialmente de ETHZ, y para .NET por la Queensland University of Technology . Además, los lenguajes Lagoona [17] [18] [19] y Obliq llevan los métodos de Oberon a áreas especializadas.
Los esfuerzos posteriores de desarrollo de .NET en ETHZ se centraron en un nuevo lenguaje llamado Zonnon . Este incluye las características de Oberon y recupera algunas de Pascal (tipos enumerados, E/S integrada), pero tiene algunas diferencias sintácticas. Otras características incluyen compatibilidad con objetos activos, sobrecarga de operadores y manejo de excepciones.
Oberon-V (originalmente llamado Seneca, en honor a Séneca el Joven ) es un descendiente de Oberon diseñado para aplicaciones numéricas en supercomputadoras , especialmente arquitecturas vectoriales o segmentadas . Incluye constructores de matrices y una ALL
declaración. [20]
{{cite magazine}}
: CS1 maint: nombres numéricos: lista de autores ( enlace )