Usar a linguagem Vala em Linux embarcado pode ser uma escolha esperta

Vala

Vala é uma linguagem de alto nível de código aberto que apareceu em 2006, conta com um sistema de tipos moderno, orientada a objetos, compilada e estaticamente tipada, tem sintaxe quase idêntica a C# e é mantida pela GNOME. Foi criada para oferecer uma poderosa abstração das bibliotecas GLib e GTK, na qual todos os projetos GNOME se baseiam.

 

Além do sistema de tipo, implementado com gestão de memória automático por contagem de referência (oposto a Garbage Collection), Vala é uma linguagem moderna porque tem recursos como Generics, Delegates, Closures, Signals, Interfaces, Asyncs, Code Attributes e Contract Programming. É utilizada em aplicativos e bibliotecas GNOME, como Clocks, Shotwell e GXml.

 

Apesar de ser uma linguagem mais utilizada em desktops e aplicações gráficas, ela oferece orientação a objetos em uma sintaxe sexy a baixo custo de dependências, ótimo para projetos de Linux embarcado. Por isso, neste artigo eu faço uma argumentação forte a favor de Vala embarcado, e no final, eu mostro como iniciar com a linguagem. Então, veja porque ela pode ser uma escolha melhor do que Python, Qt, Java ou C#, considerando projetos comerciais.

 

 

1. ABI compatível com qualquer biblioteca C/C++

 

ABI (Application Binary Interface) define como as bibliotecas se conectam (link). Em linguagens como Python, C# e Java, que não geram binários nativos, você precisa de uma série de mecanismos para conectar com as bibliotecas do sistema, ao contrário de Vala, que, neste sentido, funciona exatamente como um programa C/C++.

 

 

2. Desempenho e consumo de memória

 

Python é muito fácil de usar em embarcados, mas é um monstro comedor de RAM e é comparativamente lento, já que é uma linguagem interpretada. Para executar Java e C# você precisa da JVM e do Mono, respectivamente, são duas máquinas virtuais grandes e só podem rodar em plataformas que dispõe de grandes volumes de memória e de processadores potentes, ou seja, BOM (Bill of Material) mais cara. E Vala? Vala se destaca quanto a consumo de memória e desempenho, escala muito bem em Linux com memória de 4 MB de NOR e 8 MB de SRAM em um processador MIPS. Neste cenário, as dependências de Vala ocuparam 500 KB de espaço contra 2 MB de Python e vários de megabytes para as VMs de Java e C#. Mas e QT? Qt é também tem um belo desempenho comparado, o que é ótimo, mas a biblioteca QtCore, principal dependência para projetos sem interface gráfica, ocupa 7 MB quando compilada (com configuração padrão) para MIPS, novamente elevando custos de plataforma. É por isso que neste tópico Vala ganha de lavada elevado ao quadrado, porque depender de uma plataforma significativamente mais barata em relação aos seus concorrentes é um fator muito relevante. Precisamente, um projeto Vala escala com qualidade em uma placa Linux de USD 15. Quer dizer que Vala tem o mesmo desempenho do que teria o projeto em C++? Não. Existe um custo computacional e de memória relacionados ao uso da GLib, porque, ao contrário do C++, toda a metaprogramação é construída durante a execução, e não na compilação. Para ser mais claro, uma classe em C++ é uma struct na memória, e, na GLib, é um conjunto de chamadas para configurar um GObject.

 

 

3. Dependências largamente disponíveis

 

Para rodar um programa Vala é preciso ter a GLib instalada, que é uma biblioteca largamente disponível em praticamente todas as distros e geradores de distros de Linux embarcado como OpenWRT, Yocto e Raspbian. Nisso as demais linguagens se assemelham, são todas largamente disponíveis.

 

 

4. Precisamos falar sobre otimização

 

Tive episódios na minha carreira em que precisei otimizar Python e foi horrível. Assim como teria sido com Java e C#, simplesmente porque essas linguagens não te dão acesso a implementações de baixo nível. Por serem linguagens não nativas fica fácil estourar os recursos disponíveis da plataforma, e, quando isso acontece, pode ser  game over, não tem muito o que fazer a respeito a não ser migrar pedaços do projeto para C ou outra linguagem nativa. E como seria com Vala? Bom, Vala é literalmente C que usa a GLib para implementar os recursos da linguagem e seus objetos nativos. Quando eu digo que Vala é literalmente C não é um exagero, ao compilar um programa Vala, o compilador (chamado de valac) produz código C, que então é processado pelo gcc (ou similar) e linkado contra a GLib, com isso tem-se ganho na hora da otimização, pois se a coisa apertar, você vai poder editar e analisar o código C gerado, além de poder incluir código escrito em C ou C++ no projeto e compilar junto com o código Vala.

 

 

5. “Certo, mas… hum… é uma linguagem nova.”

 

É uma linguagem de programação nova, e, por linguagem de programação leia-se o compilador valac, pois esse é o único componente novo em Vala. Todos os recursos disponíveis na linguagem são mapeamentos dos recursos existentes na GLib e demais bibliotecas, quando utilizadas. A GLib, por exemplo, foi introduzida lá no ano de 1998 e é o coração de todos os produtos GNOME. O resultado é que bugs, comumente encontrado em projetos novos, estarão existentes no transformador de código Vala para C, somente, a verdade é que eles existem, eu já me deparei com um, mas a documentação da linguagem e os grupos de discussão foram bem úteis nesse momento.

 

 

6. E quanto ao ecossistema?

 

Esse é um ponto contra Vala, justo por ser uma linguagem nova, o ecossistema ainda não é rico como em C, Python e cia. Então, neste quesito Vala perde feio. Embora a documentação seja ótima e esteja cheio de tutoriais para iniciantes, faltam ferramentas. A melhor IDE que eu encontrei foi o Atom com o plugin language-vala que tem um auto completar muito rudimentar.  O debug é funcional, usa-se o gdb mesmo, pois se rodar valac com a chave –debug ele vai inserir, no código gerado, diretrizes para o GDB navegar no fonte Vala. Eu uso o Nemvier ou o CLion como interface do GDB.

 

vala

 

 

7. Aplicações gráficas

 

Vala é uma boa pedida para aplicações gráficas, porque integra lindamente com o GTK, inclusive suporta Composite Templates. Para quem não sabe, isso é definir Widgets de uma interface gráfica em XML e, nativamente, transformar em código. Como os XMLs dizem respeito à GTK, e não a Vala, vocês vão encontrar um belo ferramental disponível. Eu nunca usei GTK embarcado, então não sei o custo envolvido. Quem quiser ver um exemplo de Composite Templates, eu tenho um repositório com uma demonstração aqui.

 

 

8. Testes automatizados

 

Ter um sistema de testes automatizados é pré-requisito para qualquer projeto que atinge algum tamanho além de umas duas mil linhas de código e Vala tem um framework de testes embutido. Infelizmente não é o melhor e está longe do estado da arte. Neste link vocês podem ver como são organizados os testes no ambiente padrão Vala.

 

 

9. Curva de aprendizado

 

Para mim foi rápido, varias semanas. Existem outros relatos de pessoas aprendendo Vala muito rápido. No meu caso, eu já tinha conhecimentos prévios em C, Python e um pouco de C++, e já havia estudado sobre OOP, design patterns e arquitetura de software. Vala é simples porque implementa apenas um pedaço do C#, mas é poderosa porque dispõe de recursos avançados da GLib. Ela herda a característica de ser uma linguagem limitativa, ao contrário de Python, que é extremamente abrangente e deixa o desenvolvedor mais solto. Do outro lado, conheço pessoas que odeiam a sintaxe de C# tendo preferência por Python. Acredito que essa comparação é relevante porque mostra dois tipos de pessoas: as “selvagens” e as “velocistas sobre trilhos” e um tipo tem mais tendência a gostar de Vala do que o outro mão pense que trabalhar com Vala é limitante, muito pelo contrário, produz-se projetos de grande escala, a exemplo do Elementary OS, uma distro Linux escrita em Vala.

 

 

10. “Mas e se a GNOME obsoletar Vala?"

 

Ok, este é um argumento válido, porque Vala é uma linguagem de nicho e tem uma adesão mais tímida do que se gostaria, e isso não é bom para os mantenedores. Entretanto temos de nos perguntar quanto aos impactos oferecidos na possibilidade de Vala ir para a gaveta. Supondo que isso aconteça hoje, perderíamos as abstrações de futuras tecnologias GNOME, como novas features da GLib e novas integrações nativas com bibliotecas que, porventura, sejam criadas. Esse prejuízo pode ser uma dor de cabeça para projetos Desktop, mas não para embarcados. Considere que, no nosso cenário, temos dependência com poucas bibliotecas GNOME e que o estado atual desses projetos já nos satisfaz, então um freeze na linguagem oferece poucos danos. E se surgirem novas bibliotecas, GNOME ou não, Vala oferece um mecanismo de binding (chamados de vapi - Vala API) para possibilitar o uso de bibliotecas direto em Vala.

 

Por fim, penso que devemos reconhecer que a escolha de uma linguagem de programação tem muita influência do gosto pessoal, visto que a atividade de desenvolvimento de software possui um grande componente criativo. Então eu fortemente recomendo que você experimente Vala, e se não for o seu lançe, tudo bem, a não ser que você esteja desenvolvendo para uma plataforma Linux realmente barata, Python e demais linguagens vão sempre atender as necessidades de um projeto de alto nível.

 

 

Mãos na massa

 

Dito tudo isso, eu convido vocês a conhecerem a dita cuja bem de pertinho e, preparem-se, porque ela é conhecida por enfeitiçar seus programadores.

 

Especialmente para este artigo, eu montei um projeto chamado de “LedDancingDemo” escrito em Vala, que está no Github.

 

Em uma máquina Linux, embarcado ou não, rodem os comandos:

 

 

 

 

Editem o arquivo Main.vala, na linha 24, e escolham os números dos GPIOs relativo a Leds da sua placa (precisam estar exportados no /sys/class/gpio):

 

 

 

Depois de compilado, os arquivos .c estarão disponíveis na pasta do projeto, e no Makefile, vocês podem ver como é a linha de comando que transformou o código Vala em C, e depois como o Gcc compilou o executável final.

 

Nesse projeto eu fui cuidadoso para mantê-lo simples, mas fiz questão de usar o pattern de Inversão de Dependência, suportado nativamente pelo uso do qualificador interface, e, no arquivo Dancer.vala, eu mostro um exemplo de paralelismo usando o objeto TimeoutSource.

 

Muito grato pelo seu tempo. Quero ouvir você! Comente neste artigo a sua experiência com a linguagem.

 

Um Grande Abraço.

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Felipe Lavratti
Engenheiro, desenvolve software para embarcados e Linux, evangelista dos processos de qualidade. Mais informações e redes sociais: http://flp.lv

3
Deixe um comentário

avatar
 
3 Comment threads
0 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
3 Comment authors
Taylan Branco MeurerMarcos De Lima CarlosSergio Prado Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Taylan Branco Meurer
Visitante
Taylan Branco Meurer

Já fiz dois projetos Python com Gtk3, agora vou fazer um com Vala.

Marcos De Lima Carlos
Visitante
Marcos De Lima Carlos

Cara um recurso muito legal que eu não conhecia. Excelente artigo.

Sergio Prado
Visitante

Otimo artigo Felipe!