stringtranslate.com

Oxygene (lenguaje de programación)

Oxygene (anteriormente conocido como Chrome ) es un lenguaje de programación desarrollado por RemObjects Software para la infraestructura de lenguaje común de Microsoft , la plataforma Java y Cocoa . Oxygene se basa en Object Pascal de Delphi , pero también tiene influencias de C# , Eiffel , Java , F# y otros lenguajes.

En comparación con el ahora obsoleto Delphi.NET , Oxygene no enfatiza la compatibilidad total con versiones anteriores, pero está diseñado para ser una "reinvención" del lenguaje, ser un buen ciudadano en las plataformas de desarrollo administradas y aprovechar todas las características y tecnologías proporcionadas por el Tiempos de ejecución .NET y Java.

Oxygene es un producto comercial y ofrece integración total con Visual Studio IDE de Microsoft en Windows, así como con su propio IDE llamado Fire para usar en macOS . Oxygene es uno de los seis lenguajes soportados por la cadena de herramientas subyacente Elements Compiler, junto a C# , Swift , Java , Go y Mercury (basado en Visual Basic.NET ).

De 2008 a 2012, RemObjects Software otorgó licencia a Embarcadero su compilador y su tecnología IDE para que los utilizara en su producto Embarcadero Prism . [2] A partir del otoño de 2011, Oxygene estuvo disponible en dos ediciones separadas, y la segunda edición agregó soporte para los tiempos de ejecución de Java y Android. A partir del lanzamiento de XE4, Embarcadero Prism ya no forma parte del SKU de RAD Studio. Existen numerosas rutas de soporte y actualización para que los clientes de Prism migren a Oxygene. [3] A partir de 2016, solo existe una edición de Oxygene, que permite el desarrollo en Windows o macOS, y que puede crear ejecutables para Windows, Linux, WebAssembly .NET, iOS, Android, Java y macOS.

El idioma

El lenguaje Oxygene tiene su origen en Object Pascal en general y en Delphi en particular, pero fue diseñado para reflejar las pautas de programación .NET y crear ensamblados totalmente compatibles con CLR. Por lo tanto, algunas características menores del lenguaje conocidas de Object Pascal / Delphi se han eliminado o revisado, mientras que se han agregado al lenguaje una serie de características nuevas y más modernas, como Genéricos o Secuencias y Consultas.

Oxygene es un lenguaje orientado a objetos , lo que significa que utiliza clases, que pueden contener datos y ejecutar código, para diseñar programas. [ se necesita aclaración ] Las clases son "prototipos" de objetos, como la idea de una manzana es el prototipo de la manzana que uno puede comprar en una tienda. Se sabe que una manzana tiene un color y que se puede pelar: esos son los datos y el "código" ejecutable de la clase manzana.

Oxygene proporciona soporte a nivel de lenguaje para algunas características de la programación paralela. El objetivo es utilizar todos los núcleos o procesadores de una computadora para mejorar el rendimiento. Para alcanzar este objetivo, las tareas deben distribuirse entre varios subprocesos. La clase de .NET FrameworkThreadPool ofrecía una manera de trabajar eficientemente con varios subprocesos. La biblioteca paralela de tareas (TPL) se introdujo en .NET 4.0 para proporcionar más funciones para la programación paralela.

Los operadores se pueden sobrecargar en Oxygene usando la class operatorsintaxis:

operador de clase implícito ( i : entero ) : MiClase ;      

Tenga en cuenta que para la sobrecarga de operadores, cada operador tiene un nombre que debe usarse en la sintaxis de sobrecarga de operadores, porque, por ejemplo, "+" no sería un nombre de método válido en Oxygene. [4]

Estructura del programa

Oxygene no usa "Unidades" como lo hace Delphi, sino que usa espacios de nombres .NET para organizar y agrupar tipos. Un espacio de nombres puede abarcar varios archivos (y ensamblados), pero un archivo solo puede contener tipos de un espacio de nombres. Este espacio de nombres se define en la parte superior del archivo:

espacio de nombres ConsoleApplication1;

Los archivos Oxygene están separados en una interfaz y una sección de implementación, que es la estructura conocida de Delphi. La sección de la interfaz sigue la declaración del espacio de nombres. Contiene la usescláusula que en Oxygene importa tipos de otros espacios de nombres:

utiliza el sistema . Linq ; 

Los espacios de nombres importados deben estar en el propio proyecto o en ensamblados a los que se hace referencia. A diferencia de C#, en Oxygene los nombres de alias no se pueden definir para espacios de nombres, solo para nombres de un solo tipo (ver más abajo).

Después de la usescláusula, un archivo contiene declaraciones de tipo, como las que se conocen en Delphi:

interfazescriba ConsoleApp = clase método de clase pública Principal ; fin ;        

Como en C#, el método Main es el punto de entrada para cada programa. Puede tener un parámetro args : Array of Stringpara pasar argumentos de línea de comando al programa.

Se pueden declarar más tipos sin repetir la typepalabra clave.

La implementación de los métodos declarados se coloca en la sección de implementación:

implementaciónMétodo de clase ConsoleApp . Principal ; comenzar // agrega tu propio código aquí Consola . WriteLine ( 'Hola mundo' ) ; fin ;    fin .

Los archivos siempre terminan conend.

Tipos

Como lenguaje .NET, Oxygene utiliza el sistema de tipos .NET: hay tipos de valor (como estructuras) y tipos de referencia (como matrices o clases).

Aunque no introduce tipos propios "predefinidos", Oxygene ofrece nombres genéricos más "pascalianos" para algunos de ellos, [5] de modo que por ejemplo se System.Int32pueden utilizar como Integery Boolean( System.Boolean), Char( System.Char), Real( System.Double) se unen a la familia. de nombres de tipos pascal también. El carácter de estructura de estos tipos, que forma parte de .NET, se conserva por completo.

Como en todos los lenguajes .NET, los tipos en Oxygene tienen visibilidad. En Oxygene la visibilidad predeterminada es assembly, que equivale a la internalvisibilidad en C#. El otro tipo de visibilidad posible es public.

escriba MiClase = fin de clase pública ;    

La visibilidad se puede configurar para cada tipo definido (clases, interfaces, registros, ...).

Se puede definir un nombre de alias para los tipos, que se pueden usar localmente o en otros ensamblajes de Oxygene.

escriba IntList = Lista pública <Entero> ;//visible en otros ensamblajes de Oxygene SecretEnumerable = IEnumerable < String >; //no visible en otros ensamblajes         

Los alias de tipo público no serán visibles en otros idiomas.

Registros

Los registros son lo que se llaman estructuras .NET en Oxygene. Se declaran igual que las clases, pero con la recordpalabra clave:

escriba MyRecord = método de registro Foo ; fin ;      

Como son solo estructuras .NET, los registros pueden tener campos, métodos y propiedades, pero no tienen herencia y no pueden implementar interfaces .

Interfaces

Las interfaces son un concepto muy importante en el mundo .NET, el propio marco hace un uso intensivo de ellas. Las interfaces son la especificación de un pequeño conjunto de métodos, propiedades y eventos que una clase debe implementar al implementar la interfaz. Por ejemplo, la interfaz IEnumerable<T>especifica el GetEnumeratormétodo que se utiliza para iterar sobre secuencias.

Las interfaces se declaran como clases:

escriba MyInterface = método de interfaz pública MakeItSo : IEnumerable ; Barra de propiedades : cadena de lectura y escritura ; fin ;               

Tenga en cuenta que, para las propiedades, el captador y el definidor no se especifican explícitamente.

Delegados

Los delegados definen firmas para los métodos, de modo que estos métodos puedan pasarse en parámetros (por ejemplo, devoluciones de llamada) o almacenarse en variables, etc. Son el equivalente NET con seguridad de tipos a los punteros de función. También se utilizan en eventos. Al asignar un método a un delegado, uno tiene que usar el @operador, para que el compilador sepa que no quiere llamar al método, sino simplemente asignarlo.

Oxygene puede crear delegados anónimos; por ejemplo, se pueden pasar métodos al Invokemétodo de un control sin declarar el delegado:

método MainForm . MainForm_Load ( remitente : System . Object ; e : System . EventArgs ) ;     comenzar a invocar ( @DoSomething ) ; fin ; 

DoSomethingEl compilador creará un delegado anónimo con la firma del método .

Oxygene admite delegados polimórficos, lo que significa que los delegados que tienen parámetros de tipos descendentes son compatibles con la asignación. Supongamos dos clases MyClassy MyClassEx = class(MyClass), luego, en el siguiente código BlubbExla asignación es compatible con Blubb.

escriba delegado Blubb ( remitente : Objeto ; m : MiClase ) ; delegado BlubbEx ( remitente : Objeto ; mx : MyClassEx ) ;              

Los campos se pueden usar para delegar la implementación de una interfaz, si el tipo del que son implementa esta interfaz:

Implementador = clase pública ( IMyInterface ) //... implementar interfaz... fin ;    MyClass = clase pública ( IMyInterface ) fSomeImplementor : Implementador ; implementaciones públicas IMyInterface ; //se encarga de implementar la interfaz end ;          

En este ejemplo, el compilador creará métodos y propiedades públicos en MyClass, que llaman a los métodos/propiedades de fSomeImplementor, para implementar los miembros de IMyInterface. Esto se puede utilizar para proporcionar una funcionalidad similar a la de un mixin. [6]

Métodos anónimos

Los métodos anónimos se implementan dentro de otros métodos. No se puede acceder a ellos fuera del método a menos que se almacenen dentro de un campo delegado. Los métodos anónimos pueden utilizar las variables locales del método en el que están implementados y los campos de la clase a la que pertenecen.

Los métodos anónimos son especialmente útiles cuando se trabaja con código que se supone que debe ejecutarse en un subproceso de GUI, lo cual se realiza en .NET pasando un método Invoke( Control.Invokeen WinForms, Dispatcher.Invokeen WPF):

método Ventana1 . PredecirNearFuture ; //declarado como asíncrono en la interfaz   comenzar // ... Calcule el resultado aquí, guárdelo en la variable "theFuture" Dispatcher . Invocar ( DispatcherPriority . ApplicationIdle , método ; comenzar theFutureTextBox . Texto : = theFuture ; finalizar ) ; fin ;        

Los métodos anónimos también pueden tener parámetros:

método Ventana1 . PredecirNearFuture ; //declarado como asíncrono en la interfaz   comenzar // ... Calcule el resultado aquí, guárdelo en la variable "theFuture" Dispatcher . Invocar ( DispatcherPriority . ApplicationIdle , método ( aFuture : String ) ; comenzar theFutureTextBox . Text : = aFuture ; end , theFuture ) ; fin ;            

Ambos códigos fuente utilizan delegados anónimos.

Notificación de propiedad

La notificación de propiedades se utiliza principalmente para el enlace de datos, cuando la GUI debe saber cuándo cambia el valor de una propiedad. El marco .NET proporciona las interfaces INotifyPropertyChangedy INotifyPropertyChanging(en .NET 3.5) para este propósito. Estas interfaces definen eventos que deben activarse cuando se cambia o se cambia una propiedad.

Oxygene proporciona el notifymodificador, que se puede utilizar en las propiedades. Si se usa este modificador, el compilador agregará las interfaces a la clase, las implementará y creará código para generar los eventos cuando la propiedad cambie o se haya cambiado.

propiedad Foo : Cadena leída fFoo escritura SetFoo ; notificar ; Barra de propiedades : Cadena ; notificar a 'Blubb' ; //notificará que se cambió la propiedad "Blubb" en lugar de "Bar"              

El modificador se puede utilizar en propiedades que tienen un método de establecimiento. El código para generar los eventos se agregará a este método durante el tiempo de compilación.

Ejemplos de código

Hola Mundo

espacio de nombres HolaMundo ;  interfazescriba HelloClass = clase método de clase pública Principal ; fin ;        implementaciónmétodo de clase HolaClase . Principal ; comenzar writeLn ( '¡Hola mundo!' ) ; fin ;   fin .

Contenedor genérico

espacio de nombres GenericContainer ;  interfaztipo TestApp = clase método de clase pública Principal ; fin ;         Persona = propiedad pública de clase Nombre : Cadena ; propiedad Apellido : Cadena ; fin ;           implementaciónutiliza el sistema . Colecciones . Genérico ; Método de clase TestApp . Principal ; comenzar var myList : = nueva Lista <Persona> ; //inferencia de tipos myList . Agregar ( nueva persona ( Nombre : = 'John' , Apellido : = 'Doe' )) ; mi lista . Agregar ( nueva persona ( nombre : = 'Jane' , apellido : = 'Doe' )) ; mi lista . Agregar ( nueva persona ( nombre : = 'James' , apellido : = 'Doe' )) ; Consola . WriteLine ( miLista [ 1 ] .Nombre ) ;//No se necesita conversión Consola . LeerLínea ; fin ;                                   fin .

Método genérico

espacio de nombres PruebaMetodoGenérico ;  interfazescriba GenericMethodTest = clase estática método de clase pública Principal ; método de clase privada Swap <T> ( var izquierda , derecha : T ) ;método de clase DoSwap <T> ( izquierda , derecha : T ) ;fin ;                   implementaciónmétodo de clase GenericMethodTest . DoSwap <T> ( izquierda , derecha : T ) ;comenzar var a := izquierda ; var b := derecha ; Consola . WriteLine ( 'Tipo: {0}' , tipo de ( T )) ; Consola . WriteLine ( '-> a = {0}, b = {1}' , a , b ) ; Intercambiar <T> ( var a , var b ) ;Consola . WriteLine ( '-> a = {0}, b = {1}' , a , b ) ; fin ;                           método de clase GenericMethodTest . Principal ; comenzar var a := 23 ; // inferencia de tipos var b := 15 ; DoSwap <Entero> ( a , b ) ;// no hay abatimiento hacia el Objeto en este método.              var aa := 'abc' ; // inferencia de tipos var bb := 'def' ; DoSwap <cadena> ( aa , bb ) ;// no hay abatimiento hacia el Objeto en este método.           DoSwap ( 1.1 , 1.2 ) ; // inferencia de tipos para parámetros genéricos Consola . LeerLínea () ; fin ;   método de clase GenericMethodTest . Intercambiar <T> ( var izquierda , derecha : T ) ;comenzar var temp : = izquierda ; izquierda := derecha ; derecha := temperatura ; fin ;               fin .

Salida del programa:

Tipo: Sistema.Int32-> a = 23, b = 15-> a = 15, b = 23Tipo: Sistema.Cadena-> a = abc, b = definición-> a = definición, b = abcTipo: Sistema.Doble-> a = 1,1, b = 1,2-> a = 1,2, b = 1,1

Diferencias entre Delphi y Oxygene

Crítica

Algunas personas [ ¿quién? ] quisiera trasladar su código Win32 Delphi a Oxygene sin realizar cambios importantes. Esto no es posible porque, si bien Oxygene se parece a Delphi, hay suficientes cambios como para hacerlo incompatible con una simple recompilación. Si bien el nombre le da la apariencia de otra versión de Delphi, eso no es del todo cierto. [7]

Además de la diferencia de idioma, el marco de la biblioteca de componentes visuales no está disponible en Oxygene. [8] Esto hace que la portabilidad sea aún más difícil porque el código Delphi clásico depende en gran medida de la VCL.

Ver también

Referencias

  1. ^ "Evolución del lenguaje Oxygene | Oxygene | Elementos". Archivado desde el original el 5 de enero de 2018 . Consultado el 4 de enero de 2018 .
  2. ^ "Página de Embarcadero Prism, en la parte inferior de la página una imagen que indica que funciona con RemObjects Oxygene". Archivado desde el original el 27 de diciembre de 2011 . Consultado el 14 de diciembre de 2011 .
  3. ^ "Prism XE4, ¿dónde estás? | Blogs de RemObjects". Archivado desde el original el 20 de junio de 2013 . Consultado el 6 de junio de 2013 .
  4. ^ "Sobrecarga del operador: prisma de Delphi". Archivado desde el original el 8 de julio de 2011 . Consultado el 9 de enero de 2010 .
  5. ^ "Tipos integrados: prisma de Delphi". Archivado desde el original el 8 de julio de 2011 . Consultado el 10 de enero de 2010 .
  6. ^ "Proporciona una funcionalidad similar a Mixin: Delphi Prism". Archivado desde el original el 8 de julio de 2011 . Consultado el 17 de enero de 2010 .
  7. ^ "Una discusión sobre Stack Overflow donde la gente comenta que Oxygene no es Delphi Win32". Archivado desde el original el 25 de octubre de 2012 . Consultado el 25 de julio de 2016 .
  8. ^ "Revisión de Delphi Prism 2010 donde afirman en el tercer párrafo que VCL.net no está disponible". Archivado desde el original el 4 de septiembre de 2009 . Consultado el 14 de diciembre de 2009 .

enlaces externos