Vala (linguagem de programação) - Vala (programming language)

Vala
Vala Logo.svg
Paradigma Multi-paradigma : imperativo , estruturado , orientado a objetos
Desenvolvedor Jürg Billeter, Raffaele Sandrini
Apareceu pela primeira vez 2006 ; 15 anos atrás ( 2006 )
Versão estável
Disciplina de digitação Estático , forte , inferido , estrutural
SO Plataforma cruzada, tudo suportado por GLib , mas distribuído apenas como código-fonte.
Licença LGPLv2.1 +
Extensões de nome de arquivo .vala, .vapi
Local na rede Internet wiki .gnome .org / Projects / Vala
Influenciado por
C , C ++ , C # , D , Java , Boo

Vala é uma linguagem de programação orientada a objetos com um compilador auto-hospedado que gera código C e usa o sistema GObject .

Vala é sintaticamente semelhante ao C # e inclui recursos notáveis ​​como funções anônimas , sinais , propriedades , genéricos , gerenciamento de memória assistida , tratamento de exceções , inferência de tipo e instruções foreach . Seus desenvolvedores, Jürg Billeter e Raffaele Sandrini, queriam trazer esses recursos para o tempo de execução C simples com pouca sobrecarga e sem suporte de tempo de execução especial, visando o sistema de objetos GObject . Em vez de compilar diretamente para código de máquina ou linguagem assembly, ele compila para uma linguagem intermediária de nível inferior . Ele compila fonte a fonte em C, que é então compilado com um compilador C para uma determinada plataforma, como GCC ou Clang .

Usar a funcionalidade de bibliotecas de código nativas requer a gravação de arquivos vapi, definindo as interfaces da biblioteca . Escrever essas definições de interface está bem documentado para bibliotecas C, especialmente quando baseado em GObject. Bindings já estão disponíveis para um grande número de bibliotecas, inclusive para bibliotecas C que não são baseadas em GObject, como a biblioteca multimídia SDL , OpenGL , etc.

Descrição

Vala é uma linguagem de programação que combina o desempenho de tempo de construção de alto nível de linguagens de script com o desempenho de tempo de execução de linguagens de programação de baixo nível . O objetivo é trazer recursos de linguagem de programação moderna para desenvolvedores GNOME sem impor quaisquer requisitos de tempo de execução adicionais e sem usar uma ABI diferente , em comparação com aplicativos e bibliotecas escritos em C. A sintaxe do Vala é semelhante ao C # , modificado para melhor se adequar ao sistema de tipos GObject .

História

Vala foi concebido por Jürg Billeter e implementado por ele e Raffaele Sandrini, que desejava uma alternativa de nível superior para desenvolver aplicativos GNOME em vez de C. Eles gostaram da sintaxe e da semântica do C #, mas não queriam usar Mono , então eles terminaram um compilador em maio de 2006. Inicialmente, ele foi inicializado usando C e, um ano depois (com o lançamento da versão 0.1.0 em julho de 2007), o compilador Vala tornou - se auto-hospedado . Em 2021, o branch de versão estável atual com suporte de longo prazo é 0,48, e a linguagem está em desenvolvimento ativo com o objetivo de lançar uma versão estável 1.0.

Versão Data de lançamento
Versão antiga, não mais mantida: 0.0.1 15/07/2006
Versão antiga, não mais mantida: 0.1.0 09/07/2007
Versão antiga, não mais mantida: 0,10,0 18/09/2010
Versão antiga, não mais mantida: 0,20,0 27/05/2013
Versão antiga, não mais mantida: 0,30,0 18/09/2015
Versão antiga, não mais mantida: 0,40,0 12/05/2018
Versão antiga, não mais mantida: 0,42,0 01/09/2018
Versão antiga, não mais mantida: 0,44,0 09/05/2019
Versão antiga, não mais mantida: 0,46,0 05/09/2019
Versão estável atual: 0,48,18 09/06/2021
Versão estável atual: 0,50,9 2021-06-04
Versão estável atual: 0,52,4 2021-06-04
Lenda:
Versão antiga
Versão mais antiga, ainda mantida
Última versão
Versão de visualização mais recente
Lançamento futuro
Para versões antigas, apenas os primeiros lançamentos pontuais são listados

Design de linguagem

Recursos

Vala usa GLib e seus submódulos (GObject, GModule, GThread, GIO) como a biblioteca principal, que está disponível para a maioria dos sistemas operacionais e oferece coisas como encadeamento independente de plataforma , entrada / saída , gerenciamento de arquivo , soquetes de rede , plug-ins , expressões regulares , etc. A sintaxe do Vala atualmente oferece suporte aos recursos de linguagem modernos da seguinte maneira:

Interfaces gráficas de usuário podem ser desenvolvidas com o kit de ferramentas GTK GUI e o construtor Glade GUI .

Gerenciamento de memória

Para gerenciamento de memória, o sistema GType ou GObject fornece contagem de referência . Em C, um programador deve gerenciar manualmente a adição e remoção de referências, mas em Vala, o gerenciamento de tais contagens de referência é automatizado se um programador usa os tipos de referência internos da linguagem em vez de ponteiros simples. O único detalhe com que você precisa se preocupar é evitar a geração de ciclos de referência , pois nesse caso este sistema de gerenciamento de memória não funcionará corretamente.

Vala também permite o gerenciamento manual de memória com ponteiros como opção.

Bindings

Vala se destina a fornecer acesso em tempo de execução a bibliotecas C existentes, especialmente bibliotecas baseadas em GObject, sem a necessidade de ligações em tempo de execução. Para usar uma biblioteca com Vala, tudo o que é necessário é um arquivo API (.vapi) contendo as declarações de classe e método na sintaxe Vala. No entanto, as bibliotecas C ++ não são suportadas. No momento, os arquivos vapi para uma grande parte do projeto GNU e da plataforma GNOME estão incluídos em cada versão do Vala, incluindo GTK . Há também uma biblioteca chamada Gee, escrita em Vala, que fornece interfaces e classes baseadas em GObject para estruturas de dados comumente usadas .

Também deve ser facilmente possível escrever um gerador de vínculos para acesso a bibliotecas Vala a partir de aplicativos escritos em outras linguagens, por exemplo, C #, já que o analisador Vala é escrito como uma biblioteca, de modo que todas as informações em tempo de compilação estejam disponíveis ao gerar um vínculo .

Ferramentas

Editores

O ferramental para o desenvolvimento da Vala teve uma melhora significativa nos últimos anos. A seguir está uma lista de alguns IDEs populares e editores de texto com plug-ins que adicionam suporte para programação no Vala:

Inteligência de código

Atualmente, existem dois servidores de linguagem em desenvolvimento ativo que oferecem inteligência de código para Vala da seguinte forma:

  • benwaffle / vala-language-server, projetado para qualquer editor que suporte LSP , incluindo VSCode, vim e GNOME Builder
  • esodan / gvls, atualmente o servidor de linguagem padrão para Vala no GNOME Builder e fornece suporte para qualquer editor com suporte para LSP

Sistemas de construção

Atualmente, há vários sistemas de construção que suportam Vala, incluindo Automake , CMake , Meson e outros.

Depurando

A depuração de programas Vala pode ser feita com GDB ou LLDB . Para depuração em IDEs ,

Exemplos

Olá Mundo

Um programa simples " Hello, World! " Em Vala:

void main () {
	print ("Hello World\n");
}

Como pode ser observado, ao contrário de C ou C ++, não há arquivos de cabeçalho no Vala. A vinculação às bibliotecas é feita especificando --pkgparâmetros durante a compilação. Além disso, a biblioteca GLib está sempre vinculada e seu namespace pode ser omitido ( printna verdade é GLib.print).

Programação orientada a objetos

Abaixo está uma versão mais complexa que define uma subclasse HelloWorldherdada da classe base GLib.Object, também conhecida como classe GObject . Ele mostra alguns dos recursos orientados a objetos do Vala :

class HelloWorld: Object {
	private uint year = 0;
	
	public HelloWorld () {
	}
	
	public HelloWorld.with_year (int year) {
		if (year>0)
			this.year = year;
	}

	public void greeting () {
		if (year == 0)
			print ("Hello World\n");
		else
			/* Strings prefixed with '@' are string templates. */
			print (@"Hello World, $(this.year)\n"); 
	}
}

void main (string[] args) {
	var helloworld = new HelloWorld.with_year (2021);
	helloworld.greeting ();
}

Como no caso da biblioteca GObject , Vala não suporta herança múltipla , mas uma classe em Vala pode implementar qualquer número de interfaces , que podem conter implementações padrão para seus métodos. Aqui está um pedaço de código de amostra para demonstrar uma interface Vala com implementação padrão (às vezes chamada de mixin )

using GLib;

interface Printable {
	public abstract string print ();

	public virtual string pretty_print () {
		return "Please " + print ();
	}
}

class NormalPrint: Object, Printable {
	string print () {
		return "don't forget about me";
	}
}

class OverridePrint: Object, Printable {
	string print () {
		return "Mind the gap";
	}

	public override string pretty_print () {
		return "Override";
	}
}

void main (string[] args) {
	var normal = new NormalPrint ();
	var overridden = new OverridePrint ();

	print (normal.pretty_print ());
	print (overridden.pretty_print ());
}

Sinais e chamadas de retorno

Abaixo segue um exemplo básico para mostrar como definir um sinal em uma classe que não é compacta, que possui um sistema de sinalização integrado pela Vala através do GLib. Em seguida, as funções de retorno de chamada são registradas para o sinal de uma instância da classe. A instância pode emitir o sinal e cada função de retorno de chamada (também conhecida como manipulador) conectada ao sinal para a instância será chamada na ordem em que foram conectadas:

class Foo {
    public signal void some_event ();   // definition of the signal

    public void method () {
        some_event ();                  // emitting the signal (callbacks get invoked)
    }
}

void callback_a () {
    stdout.printf ("Callback A\n");
}

void callback_b () {
    stdout.printf ("Callback B\n");
}

void main () {
    var foo = new Foo ();
    foo.some_event.connect (callback_a);      // connecting the callback functions
    foo.some_event.connect (callback_b);
    foo.method ();
}

Threading

Um novo thread no Vala é uma parte do código, como uma função que é solicitada para ser executada simultaneamente no tempo de execução. A criação e sincronização de novos threads são feitas utilizando a Threadclasse em GLib, que assume a função como parâmetro na criação de novos threads, conforme mostra o exemplo a seguir (muito simplificado):

int question(){
    // Some print operations 
    for (var i = 0; i < 3; i++){
        print (".");
        Thread.usleep (800000);
        stdout.flush ();
    }

    return 42;
}

void main () {
    if (!Thread.supported ()) {
        stderr.printf ("Cannot run without thread support.\n");
        return;
    }
    print ("The Ultimate Question of Life, the Universe, and Everything");
    // Generic parameter is the type of return value
    var thread = new Thread<int> ("question", question);

    print(@" $(thread.join ())\n");
}

Interface gráfica do usuário

Abaixo está um exemplo usando GTK para criar uma GUI "Hello, World!" programa (veja também GTK hello world ) em Vala:

using Gtk;

int main (string[] args) {
	Gtk.init (ref args);

	var window = new Window ();
	window.title = "Hello, World!";
	window.border_width = 10;
	window.window_position = WindowPosition.CENTER;
	window.set_default_size (350, 70);
	window.destroy.connect (Gtk.main_quit);

	var label = new Label ("Hello, World!");

	window.add (label);
	window.show_all ();

	Gtk.main ();
	return 0;
}

A instrução Gtk.main ()cria e inicia um loop principal ouvindo eventos, que são transmitidos por meio de sinais para as funções de retorno de chamada. Como este exemplo usa o pacote GTK , ele precisa de um --pkgparâmetro extra (que invoca pkg-config no back-end C ) para compilar:

valac --pkg gtk+-3.0 hellogtk.vala

Veja também

  • Genie , uma linguagem de programação para o compilador Vala com uma sintaxe mais próxima do Python .
  • Shotwell , um organizador de imagens escrito em Vala.
  • Geary , um cliente de e-mail escrito em Vala.
  • elementary OS , uma distribuição Linux com um ambiente de desktop programado principalmente em Vala.
  • Budgie , um ambiente de desktop Linux programado principalmente em Vala.

Referências

links externos

Comparação com outras línguas