Lu-a-Bá - O bê-a-bá de Lua para a comunidade lusófona

Documento: “Lua – Conceitos Básicos e API C”

Tutorial elaborado pela comunidade de desenvolvedores do projeto Kepler, em 2008.

Público-alvo

Este documento é útil tanto para quem deseja aprender a programar em Lua, como para quem deseja embutir a biblioteca Lua em outros programas, usando a API C. O documento pressupõe conhecimento prévio de programação em C (sobretudo a partir do ponto que explica a API C), embora seja possível usufruir dele sem esse conhecimento para aprender sobre a linguagem Lua, nos capítulos iniciais.

Estrutura

A apostila se divide em 9 capítulos:

Resumo

O capítulo 1 apresenta os principais elementos da linguagem Lua que um programador poderia buscar saber para iniciar sua jornada, sem aprofundar muito, mas já permitindo um contato inicial. Alguns conceitos como os tipos de dados (simples e complexos), alguns operadores e estruturas de controle e repetição são apresentados neste primeiro capítulo.

O capítulo 2 detalha um pouco mais as pecularidades das funções dentro do ambiente de desenvolvimento Lua, tal como a possibilidade de múltiplos retornos (que inclusive podem variar entre chamadas), o fato de serem valores de primeira classe e como isso pode ser explorado para construir fechos, o fato de poderem ser anônimas, dentre outros detalhes particulares em Lua.

O capítulo 3 apresenta o conceito de cadeia de caracteres (string) em Lua, como um dos tipos básicos, e algumas funções presentes na biblioteca padrão que tem a finalidade de manipular estas cadeias.

O capítulo 4 fala sobre tabelas, algumas operações básicas (inserção e remoção de itens, ver tamanho), e também algumas formas de usar esse tipo para algumas finalidades, como descrição de dados e até mesmo uma forma de orientação a objetos, fazendo uso do conceito de metatabelas e metamétodos, que dão grande versatilidade às tabelas.

O capítulo 5 explica o sistema de módulos, que reaproveita vários conceitos nativos da linguagem para estruturar bibliotecas. Este capítulo cobre também a criação, instalação e o uso de módulos.

O capítulo 6 inicia a explicação sobre a API C de Lua, apresentando o conceito da pilha virtual que faz a comunicação entre o código C e o código Lua, separando tanto o sistema de tipos como o controle de memória, visto que ambos diferem nas duas linguagens. Alguns exemplos de código são utilizados para demonstrar as funções de criação, consulta e manipulação dessa pilha.

O capítulo 7 mostra uma das aplicabilidades da integração entre C e Lua, fazendo uso da API. Neste caso, usa-se a um arquivo Lua para configurar uma aplicação principal (escrita em C). Portanto, a linguagem Lua neste cenário é usada para descrição de dados.

Ainda assim, fica evidente que, para além de um arquivo de configuração convencional, esta abordagem permite incluir até mesmo funções no código Lua que serão chamadas a partir do programa principal, o que também caracteriza Lua como uma linguagem de extensão.

O capítulo 8 trata sobre funções C exportadas para o ambiente Lua. Ou seja, se por um lado o capítulo anterior fala sobre execução de código Lua em C, este capítulo fala sobre execução de código C em Lua. Primeiro ele mostra o protocolo a ser seguido para criar funções desse tipo, e em seguida como funções C podem ser agrupadas em uma biblioteca para uso em Lua.

Ainda neste capítulo se fala também sobre a criação de funções C que guardam estado, isto é, funções que trabalham com valores persistidos entre chamadas, utilizando de três métodos diferentes: usando um registro global disponível pela biblioteca para uso em código C, usando ambientes e usando variáveis locais externas (ou upvalues).

O capítulo 9 ensina a criar tipos de usuário específicos, ou seja, tipos de dados que são definidos em C, porém acessíveis em Lua, por uma interface pré-definida. Ele começa apresentando um exemplo básico e depois ajustando para utilizar metamétodos (o que permite uma abordagem orientada a objetos).

Por fim ele mostra uma terceira abordagem alternativa, que separa o tipo C e funções associadas de uma interface Lua que apenas reaproveita essa estrutura pré-existente. Neste caso, funções Lua encapsulam as funções C existentes e são associadas ao tipo (userdata) criado em Lua.

Comentários

O nome “Lua” é bastante apropriado porque para um observador terrestre, o satélite natural homônimo possui duas faces, uma visível e outra oculta. Neste sentido, é comum abordar Lua mencionando a sua face visível (uma linguagem de alto nível), porém esquecer sua face oculta (uma biblioteca C)1, que são indissociáveis e igualmente importantes. Este é um ótimo material introdutório, que explora por igual esses dois lados.

O documento pode ser dividido logicamente em três partes. Do capítulo 1 ao 4, são tratados assuntos relativos apenas à linguagem Lua em si. No meio, o capítulo 5 ainda se refere à linguagem, porém já menciona questões relacionadas à implementação, em especial por tratar sobre módulos, diretórios padrão e variáveis de ambiente.

Do capítulo 6 ao 9 o tema central passa a ser a API Lua, seguindo um roteiro relativamente comum ao abordar esse assunto, que passa por quatro tópicos principais: apresentação da pilha virtual, execução de código Lua dentro da aplicação C, criação de bibliotecas C para execução a partir do código Lua e por fim a criação de novos tipos definidos em C para uso em Lua, usando o tipo userdata.

Sobre o capítulo 5 uma ressalva deve ser feita: embora não esteja totalmente desatualizado, e ainda tenha relevância para a explicação sobre o funcionamento de módulos, houve uma mudança significativa na maneira como eles funcionam a partir da versão 5.2,em parte por causa da mudança no conceito de ambientes e da convenção de que módulos não sejam variáveis globais a partir de então.

É importante frisar também que o conceito de ambientes não foi abordado neste documento, porém citado no capítulo 5, para explicar a função module(). Ocorre que este é um conceito importante para uma compreensão mais abrangente sobre módulos. Depois, no capítulo 8, é citado novamente, em referência a um dos métodos utilizados para criar funções C com estado em Lua.

Além do conceito de ambientes, outro tópico que não foi abordado neste documento é o mecanismo de co-rotinas, que é um dos pilares da linguagem, embora programas mais simples raramente façam uso desse mecanismo. E ainda outro conceito que ficou de fora foi a interface de depuração, que oferece diversos mecanismos para inspecionar e manipular internamente um programa Lua, a fim de identificar possíveis falhas ou comportamentos imprevisíveis.

Evidentemente, esse material é proveitoso para mais de um público-alvo. Para quem deseja apenas programar em Lua, seja para construir pequenos programas ou realizar configurações ou extensões de programas que já utilizam Lua, os capítulos 1 a 5 serão de maior interesse. Para quem deseja integrar Lua a uma outra aplicação, biblioteca ou sistemas embarcados, a atenção maior estará sobre os capítulos 6 a 9.

Pontos de atenção

Conteúdo relacionado


  1. Talvez do ponto de vista do código C a melhor analogia seria o contrário, isto é, a face oculta sendo a linguagem e a face visível a biblioteca, já que o código C interage com o código Lua por meio da API C da biblioteca Lua.