stringtranslate.com

Vala (lenguaje de programación)

Vala es un lenguaje de programación orientado a objetos con un compilador autohospedado que genera código C y utiliza el sistema GObject .

Vala es sintácticamente similar a C# e incluye características notables como funciones anónimas , señales , propiedades , genéricos , administración asistida de memoria , manejo de excepciones , inferencia de tipos y declaraciones foreach . [1] Sus desarrolladores, Jürg Billeter y Raffaele Sandrini, querían llevar estas características al entorno de ejecución de C simple con poca sobrecarga y sin soporte especial en el entorno de ejecución apuntando al sistema de objetos GObject . En lugar de compilar directamente a código de máquina o lenguaje ensamblador, compila a un lenguaje intermedio de nivel inferior . Compila de fuente a fuente a C, que luego se compila con un compilador de C para una plataforma determinada, como GCC o Clang . [2]

Para utilizar la funcionalidad de las bibliotecas de código nativo es necesario escribir archivos vapi que definan las interfaces de la biblioteca . La escritura de estas definiciones de interfaz está bien documentada para las bibliotecas de C. Los enlaces ya están disponibles para una gran cantidad de bibliotecas, incluidas las bibliotecas que no se basan en GObject, como la biblioteca multimedia SDL y OpenGL .

Descripción

Vala es un lenguaje de programación que combina el rendimiento de alto nivel en tiempo de compilación de los lenguajes de scripting con el rendimiento en tiempo de ejecución de los lenguajes de programación de bajo nivel . Su objetivo es brindar características de lenguaje de programación moderno a los desarrolladores de GNOME sin imponer ningún requisito de tiempo de ejecución adicional y sin usar una ABI diferente , en comparación con las aplicaciones y bibliotecas escritas en C. La sintaxis de Vala es similar a C# , modificada para adaptarse mejor al sistema de tipos GObject . [3]

Historia

Vala fue concebido por Jürg Billeter y fue implementado por él y Raffaele Sandrini, quienes deseaban una alternativa de nivel superior para desarrollar aplicaciones GNOME en lugar de C. Les gustaba la sintaxis y la semántica de C# pero no querían usar Mono , por lo que terminaron un compilador en mayo de 2006. Inicialmente, se inició usando C, y un año después (con el lanzamiento de la versión 0.1.0 en julio de 2007), el compilador Vala se convirtió en autoalojado . En 2008, se creó el lenguaje Genie para exponer una sintaxis similar a Python al compilador Vala. [4] A partir de 2021, la rama de lanzamiento estable actual con soporte a largo plazo es 0.48, y el lenguaje está en desarrollo activo con el objetivo de lanzar una versión estable 1.0. [5]

Diseño del lenguaje

Características

Vala utiliza GLib y sus submódulos ( GObject , GModule, GThread, GIO) como biblioteca principal, que está disponible para la mayoría de los sistemas operativos y ofrece cosas como subprocesamiento independiente de la plataforma , entrada/salida , administración de archivos , sockets de red , complementos , expresiones regulares , etc. La sintaxis de Vala actualmente admite características de lenguaje moderno de la siguiente manera:

Se pueden desarrollar interfaces gráficas de usuario con el kit de herramientas GTK GUI y el generador de GUI Glade .

Gestión de la memoria

Para la gestión de memoria, el sistema GType o GObject proporciona un conteo de referencias . En C, un programador debe gestionar manualmente la adición y eliminación de referencias, pero en Vala, la gestión de dichos conteos de referencias se automatiza si un programador utiliza los tipos de referencia integrados del lenguaje en lugar de punteros simples. El único detalle del que uno debe preocuparse es de evitar generar ciclos de referencia , porque en ese caso este sistema de gestión de memoria no funcionará correctamente. [7]

Vala también permite la gestión manual de memoria con punteros como opción.

Encuadernaciones

Vala está pensado para proporcionar acceso en tiempo de ejecución a bibliotecas C existentes, especialmente bibliotecas basadas en GObject , sin necesidad de enlaces en tiempo de ejecución. Para utilizar una biblioteca con Vala, todo lo que se necesita es un archivo API (.vapi) que contenga las declaraciones de clases y métodos en sintaxis Vala. Sin embargo, no se admiten bibliotecas C++. En la actualidad, los archivos vapi para una gran parte del proyecto GNU y la plataforma GNOME se incluyen con cada versión de Vala, incluido GTK . También existe una biblioteca llamada Gee, escrita en Vala, que proporciona interfaces y clases basadas en GObject para estructuras de datos de uso común . [8]

También debería ser fácilmente posible escribir un generador de enlaces para acceder a las bibliotecas Vala desde aplicaciones escritas en otros lenguajes, por ejemplo, C#, ya que el analizador Vala está escrito como una biblioteca, de modo que toda la información en tiempo de compilación esté disponible al generar un enlace.

Herramientas

Editores

Las herramientas para el desarrollo de Vala han mejorado significativamente en los últimos años. A continuación, se incluye una lista de algunos IDE y editores de texto populares con complementos que agregan compatibilidad con la programación en Vala:

Inteligencia de código

Actualmente, hay dos servidores de lenguaje en desarrollo activo que ofrecen inteligencia de código para Vala de la siguiente manera:

Construir sistemas

Actualmente, hay varios sistemas de compilación que admiten Vala, incluidos Automake , CMake , Meson y otros. [14]

Depuración

La depuración de programas Vala se puede realizar con GDB o LLDB . Para la depuración en IDE ,

Ejemplos

Hola Mundo

Programa sencillo " ¡Hola, mundo! " en Vala:

void main () { print ( "Hola mundo \n " ); }    

Como se puede observar, a diferencia de C o C++, en Vala no hay archivos de encabezado. La vinculación a las bibliotecas se realiza especificando --pkgparámetros durante la compilación. Además, la biblioteca GLib siempre está vinculada y su espacio de nombres se puede omitir ( printde hecho, lo está GLib.print).

Programación orientada a objetos

A continuación se muestra una versión más compleja que define una subclase HelloWorldque hereda de la clase base GLib.Object, también conocida como la clase GObject . Muestra algunas de las características orientadas a objetos de Vala :

clase HolaMundo : Objeto { privado uint año = 0 ; público HolaMundo ( ) { } público HolaMundo.with_año ( int año ) { si ( año > 0 ) este.año = año ; }                 public void saludo () { if ( year == 0 ) print ( "Hola mundo \n " ); else /* Las cadenas con el prefijo '@' son plantillas de cadena. */ print ( @"Hola mundo, $(this.year) \n " ); } }          void main ( string [ ] args ) { var holamundo = new HolaMundo.con_año ( 2021 ) ; holamundo.saludo ( ) ; }          

Al igual que en el caso de la biblioteca GObject , Vala no admite herencia múltiple , pero una clase en Vala puede implementar cualquier cantidad de interfaces , que pueden contener implementaciones predeterminadas para sus métodos. Aquí se incluye un fragmento de código de muestra para demostrar una interfaz de Vala con implementación predeterminada (a veces denominada mixin ).

utilizando GLib ; interfaz Imprimible { cadena abstracta pública print ();      cadena virtual pública pretty_print () { devolver "Por favor " + imprimir (); } }         clase NormalPrint : Objeto , Imprimible { string print () { return "no te olvides de mí" ; } }        clase OverridePrint : Object , Printable { string print () { return "Cuidado con el espacio" ; }        cadena de anulación pública pretty_print () { return "Anular" ; } }      void main ( cadena [] args ) { var normal = nueva NormalPrint (); var anulado = nuevo OverridePrint ();              imprimir ( normal . pretty_print ()); imprimir ( anulado . pretty_print ()); }    

Señales y devoluciones de llamadas

A continuación se muestra un ejemplo básico para mostrar cómo definir una señal en una clase que no es compacta, que tiene un sistema de señales integrado por Vala a través de GLib. Luego, las funciones de devolución de llamada se registran en la señal de una instancia de la clase. La instancia puede emitir la señal y cada función de devolución de llamada (también denominada controlador) conectada a la señal de la instancia se invocará en el orden en que se conectaron:

clase Foo { señal pública void some_event (); // definición de la señal         método public void () { some_event (); // emitiendo la señal (se invocan las devoluciones de llamada) } }        void callback_a () { stdout.printf ( " Devolución de llamada A \ n " ); }     void callback_b () { stdout.printf ( " Devolución de llamada B \ n " ); }     void main () { var foo = new Foo (); foo . some_event . connect ( callback_a ); // conectando las funciones de devolución de llamada foo . some_event . connect ( callback_b ); foo . method (); }                

Enhebrado

Un nuevo subproceso en Vala es una parte del código, como una función, que se solicita que se ejecute simultáneamente en tiempo de ejecución. La creación y sincronización de nuevos subprocesos se realiza mediante la Threadclase en GLib, que toma la función como parámetro al crear nuevos subprocesos, como se muestra en el siguiente ejemplo (muy simplificado):

int question (){ // Algunas operaciones de impresión para ( var i = 0 ; i < 3 ; i ++ ) { print ( "." ); Thread.usleep ( 800000 ); stdout.flush ( ) ; }                   devolver 42 ; } void main () { if ( ! Thread . supported ()) { stderr . printf ( "No se puede ejecutar sin soporte de subproceso. \n " ); return ; } print ( "La pregunta fundamental sobre la vida, el universo y todo" ); // El parámetro genérico es el tipo de valor de retorno var thread = new Thread < int > ( "pregunta" , pregunta );                      imprimir ( @" $(thread.join ()) \n " ); }

Interfaz gráfica de usuario

A continuación se muestra un ejemplo que utiliza GTK para crear un programa GUI "Hola, mundo!" (consulte también GTK hello world ) en Vala:

utilizando Gtk ; int main ( cadena [] argumentos ) { Gtk . init ( ref argumentos );      var ventana = new Ventana ( ) ; ventana.título = " ¡ Hola , mundo ! " ; ventana.ancho_border = 10 ; ventana.posición_ventana = PosiciónVentana.CENTRO ; ventana.establecer_tamaño_predeterminado ( 350 , 70 ) ; ventana.destruir.conectar ( Gtk.main_quit ) ;              var label = new Label ( "¡Hola, mundo!" );     ventana . add ( etiqueta ); ventana . show_all ();  Gtk . main (); devolver 0 ; }  

La declaración Gtk.main ()crea e inicia un bucle principal que escucha eventos, que se transmiten mediante señales a las funciones de devolución de llamada. Como este ejemplo utiliza el paquete GTK , necesita un --pkgparámetro adicional (que invoca pkg-config en el backend de C ) para compilar:

valac  --pkg  gtk+-3.0  hellogtk.vala

Véase también

Referencias

  1. ^ "Vala: programación de alto nivel con menos grasa". Ars Technica . 2 de septiembre de 2007 . Consultado el 13 de diciembre de 2011 .
  2. ^ "Una mirada a dos nuevos lenguajes: Vala y Clojure".
  3. ^ "Vala· GitLab". GNOME . Consultado el 16 de marzo de 2021 .
  4. ^ Jančár, M.; Chodarev, S. (2015). "Un marco generativo para el desarrollo de aplicaciones de escritorio Linux basadas en CRUD". 2015 IEEE 13th International Scientific Conference on Informatics . Poprad, Eslovaquia. págs. 133–138. doi :10.1109/Informatics.2015.7377821. El compilador Vala también admite el lenguaje Genie, que es casi igual a Vala excepto por la sintaxis. Esto es útil especialmente para definir modelos debido a la sintaxis simple, "similar a Python", de Genie.
  5. ^ Michael Lauer (2019). Introducción a la programación Vala. doi :10.1007/978-1-4842-5380-9. ISBN 978-1-4842-5379-3. S2CID  207911698 . Consultado el 16 de marzo de 2021 .
  6. ^ "Vala Releases". Proyecto Vala . Consultado el 18 de marzo de 2021 .
  7. ^ "Explicación de la gestión de la memoria de Vala".
  8. ^ "Libgee en Gitlab".
  9. ^ ab "Codificación en Vala con Visual Studio Code" . Consultado el 17 de marzo de 2021 .
  10. ^ "Codificación en Vala con el editor de texto Vim" . Consultado el 17 de marzo de 2021 .
  11. ^ "Habilitar el resaltado de sintaxis de Vala y la compatibilidad con el explorador de código en GNU Emacs" . Consultado el 17 de marzo de 2021 .
  12. ^ "vala-lang/vala-language-server en Github". GitHub . Consultado el 17 de marzo de 2021 .
  13. ^ "esodan/gvls en GitLab" . Consultado el 17 de marzo de 2021 .
  14. ^ "Vala Tools" . Consultado el 29 de marzo de 2021 .

Enlaces externos

Comparación con otros idiomas