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

Obtendo Lua

Neste tutorial vamos cumprir um requisito básico para que você possa programar em Lua, que é obter Lua.

Mas o que significa obter Lua?

Se Lua é uma linguagem, como ela poderia ser obtida? Linguagens podem ser aprendidas, não obtidas. Certo?

Certo, mas Lua não é apenas uma linguagem, é também uma biblioteca. E a função da biblioteca Lua é converter o seu programa em código de máquina, para então poder ser executado.

O que é uma biblioteca?

Essa biblioteca é responsável por interpretar trechos de código Lua dinamicamente, e então executar esses trechos. Ela foi feita para ser pequena e fácil de embutir em outros programas, o que inclui o interpretador de linha de comando lua, principal ferramenta que usaremos ao longo dos tutoriais para executar código Lua.

Tanto a biblioteca Lua como o interpretador de linha de comando (o programa lua, propriamente) são distribuídos em conjunto no que chamamos de distribuição padrão de Lua. Essa distribuição é software livre, sob os termos da licença MIT.

A distribuição padrão

A especificação da linguagem e sua implementação são coordenados por um pequeno grupo na universidade PUC-Rio, que também hospeda todo o projeto, sob o domínio lua.org.

Lá, pacotes contendo o código-fonte da biblioteca e do interpretador, junto com toda a documentação são disponibilizados.

Há dois caminhos para obter Lua. Um deles é baixar essa distribuição padrão e compilar o código-fonte de Lua para produzir os arquivos executáveis e bibliotecas de que necessita.

Caso não saiba ou não queira fazer isso, outro caminho é baixar distribuições binárias (isto é, pacotes que já foram compilados e estão prontos para você utilizar), em geral, realizadas por terceiros.

Qual versão de Lua utilizar?

Se prestar atenção a diversos projetos que usam Lua, verá que é bastante comum o suporte a mais de uma versão de Lua, geralmente abrangendo as versões 5.1, 5.2, 5.3 e 5.4.

Para o aprendizado, o mais indicado é que você se familiarize com a versão mais recente (ou a versão mais recente disponível para seu sistema, se optar por obter um pré-compilado).

Ainda assim, se você trabalhar com qualquer uma dessas quatro versões citadas, conseguirá tirar proveito dos tutoriais (e demais materiais) do Lu-a-Bá. Os procedimentos que veremos a seguir serão praticamente os mesmos para qualquer uma delas.

Obtendo pré-compilados

Especialmente entre um público menos especializado ou que está iniciando seus estudos, falar em compilação pode soar como algo difícil ou desafiador. Não é tão difícil como parece, mas se isso for uma barreira para que inicie seus estudos em Lua, não há por que se preocupar. Existem várias maneiras de obter versões pré-compiladas de Lua.

O que é compilação?

Entenda que pré-compilado, ou binário, quer dizer que alguém já fez esse trabalho de obter o código-fonte de Lua e o converteu em um conjunto de instruções binárias (bits) que podem ser executados na sua máquina.

Além disso, uma distribuição binária não é a mesma para todo mundo. Existem variações quanto ao sistema onde pode executar e até mesmo o hardware suportado (embora na maioria dos casos, binários pré-compilados sejam feitos para computadores convencionais, com arquitetura i386 ou amd64).

Quando os pré-compilados são fornecidos por algum sistema de pacotes do próprio sistema operacional, isso raramente é um problema, pois já é fornecido na versão correta para seu sistema/hardware. Portanto, já adianto que este é o modo mais prático de obtenção, quando disponível.

Isto é comum em distribuições de Linux, nas quais existem gerenciadores como apt, dnf, yum, apk, pacman, xbps e vários outros. Nos sistemas BSD o mesmo se aplica, cada qual possui seu gerenciador de pacotes. No macOS, pode-se usar o homebrew.

No Windows, algumas opções são utilizar o Cygwin, o qual possui um gerenciador de pacotes próprio (apt-cyg), o MSYS2, que também possui um gerenciador próprio (uma versão adaptada do pacman para Windows) ou usar o WSL, que virtualiza uma distribuição Linux. Em qualquer um desses casos, ainda há o bônus de ter acesso a um terminal aderente ao padrão POSIX.

Seja qual for o seu sistema, você deverá se familiarizar com o modo como ele gerencia instalações, e se ele de algum modo proporciona uma instalação automatizada de versões pré-compiladas de Lua.

Se estiver usando um sistema sem nenhuma possibilidade de gerenciamento de pacotes, ou se ele não tiver acesso a um pacote de instalação de Lua em seus repositórios, então outra opção é obter pacotes pré-compilados no subprojeto LuaBinaries.

O que é um repositório?

O LuaBinaries contempla distribuições binárias de executáveis e bibliotecas compartilhadas para GNU/Linux (usando a biblioteca C glibc), Windows e macOS. Pacotes com o sufixo _bin possuem os executáveis, já os pacotes com o sufixo _lib possuem cabeçalhos e a biblioteca compartilhada, que servem para desenvolver aplicações com Lua embutido.

Ao descompactar o pacote dos executáveis, você já terá acesso aos programas executáveis (lua e luac). Para poder executá-los a partir de qualquer local, deverá incluir o diretório onde eles foram descompactados na variável de ambiente PATH do sistema.

O que são variáveis de ambiente?

O processo de instalação utilizando o LuaBinaries pode ser simples, mas você não terá uma atualização automática desses pacotes. Ou seja, quando novas versões forem disponibilizadas, você deverá repetir esse procedimento manualmente se quiser atualizar seu ambiente de desenvolvimento.

Vantagens de obter pré-compilados:

Desvantagens de obter pré-compilados:

Certo, e se eu quiser compilar?

Compilar Lua é o “método canônico” para sua obtenção. Ou seja, você pode obter a distribuição padrão direto da fonte, extrair o código-fonte e compilar para gerar os executáveis e bibliotecas de que necessita para usar Lua.

Atenção: não saber o que é um processo de compilação poderá tornar o procedimento um pouco mais difícil ou confuso. Se você já obteve Lua pelo seu sistema operacional ou por empacotamentos binários de terceiros como LuaBinaries, não precisa realizar essa etapa.

Feito esse alerta, você verá que, como eu disse, o procedimento é bem simples. Alguns motivos:

  1. O projeto é relativamente pequeno, e não requer um grande poder computacional para compilar, geralmente levando pouco tempo;
  2. É inteiramente escrito em C89, isto é, pode ser compilado para qualquer plataforma para a qual existe um compilador aderente a este padrão (o que significa que são muitas, muitas mesmo);
  3. Sua única dependência é a própria biblioteca C.

Basicamente, você precisará obter o pacote na versão desejada, dispor de um compilador C e do programa make. Instruções estão disponíveis no arquivo README.html.

Os pacotes são fornecidos no formato .tar.gz, bastante comuns em sistemas POSIX. Essencialmente são pacotes tar compactados com o algoritmo gzip. Mesmo em sistemas não POSIX é possível encontrar/instalar utilitários para manipulação desses formatos.

Tipicamente em distribuições Linux, sistemas BSD e no macOS você já terá utilitários capazes de manipular esses formatos. No Windows, pode-se obter um ambiente POSIX (o que inclui esses utilitários) usando o Cygwin, o MSYS2 ou o WSL.

Conforme orientado na página oficial de downloads, na seção building (para a versão 5.4.7, em um sistema do tipo POSIX), pode-se obter e compilar Lua por meio dos seguintes passos:

curl -R -O http://www.lua.org/ftp/lua-5.4.7.tar.gz
tar zxf lua-5.4.7.tar.gz
cd lua-5.4.7
make all test

Na primeira linha, baixamos o pacote .tar.gz referente à versão 5.4.7 de Lua. Para isso utilizamos o programa curl (se não o tiver instalado, poderá usar algum outro cliente HTTP equivalente). Em seguida, na segunda linha desempacotamos e descompactamos o arquivo, para extrair o código-fonte.

Na terceira linha nos dirigimos ao diretório recém-criado, lua-5.4.7, dentro do qual o código foi extraído. Por fim, na quarta linha, executamos o script make, que compila Lua e testa os resultados para atestar que foi bem sucedido.

Até aqui o que fizemos foi gerar os arquivos necessários. Ainda falta o passo de instalação, que basicamente é copiar esses arquivos para diretórios de sistema (ou qualquer local da sua preferência). Isto será feito com o comando:

make install INSTALL_TOP=meu_diretorio

A opção INSTALL_TOP é opcional. Caso seja suprimida, os diretórios padrão do sistema serão usados como destino. Esses diretórios são definidos no próprio arquivo Makefile. Caso seja informada, deverá ter como valor o diretório base da instalação, ou seja, um diretório personalizado.

Caso tenha optado por usar diretório personalizado, nele serão criados os subdiretórios bin (para os executáveis), include (para arquivos de cabeçalho), lib (para a biblioteca Lua, e para módulos C que venha a instalar depois), man (para as páginas de manual) e share (para módulos Lua que venha a instalar depois).

Além disso, você provavelmente vai querer se certificar de que a variável de ambiente PATH inclua o subdiretório bin do local escolhido, para que possa executar os comandos lua e luac a partir de qualquer local.

Em sistemas que suportam páginas de manual no formato de manpages, você também deverá atualizar a variável MANPATH para incluir o subdiretório man. Isto permitirá que consulte as páginas de manual referentes aos programas lua e luac.

Quando você desejar obter novas versões de Lua, isto é, atualizar a sua instalação, esse procedimento manual deverá ser executado novamente, a não ser que seu sistema disponha de uma infraestrutura mais avançada de compilação, que permita automatizar esse processo.

Por exemplo, em sistemas BSD é bastante comum o conceito de ports, no qual existem “receitas” prontas para instalação de um pacote, porém compilado na máquina local, em geral permitindo que algumas opções de compilação (como o local de destino, INSTALL_TOP, mencionado aqui) sejam definidas.

Algumas distribuições de Linux (notadamente o Gentoo, por exemplo) também exploram esse conceito, que equilibra o gerenciamento de pacotes no sistema com a flexibilidade da compilação local.

Vantagens de compilar o código-fonte:

Desvantagens de compilar o código-fonte:

Usando Lua

Uma vez que você tenha instalado Lua no seu sistema, poderá testar os resultados acionando o interpretador de linha de comando (apenas o comando lua, sem argumentos). Ao executá-lo, deverá ver um cabeçalho como a seguir:

$ lua
Lua 5.4.7  Copyright (C) 1994-2024 Lua.org, PUC-Rio
>

Obs.: Neste exemplo estou assumindo que seu terminal utilize o sinal $ como prompt de comandos. Em todo caso, você pode ignorá-lo.

O que é um prompt de comando?

Ao executar o interpretador lua você verá uma linha com a versão e a nota de direitos autorais da PUC-Rio, e em seguida o prompt de comando de Lua (note o sinal > logo em seguida). Isto quer dizer que o interpretador está pronto para receber novos comandos.

Vamos testar um primeiro comando. Experimente digitar, após o prompt o comando os.exit(), seguido da tecla Enter. Isto encerrará o interpretador Lua.

> os.exit()
$

Perceba que ao executar esse comando, o interpretador é encerrado, e você volta para o prompt do sistema ($, nesse caso).

Muito bem! Isso significa que agora você obteve Lua com sucesso e já pode começar a programar.

Resumo

Neste tutorial você aprendeu que Lua não apenas é uma linguagem, mas também uma biblioteca, e que essa biblioteca está embutida nos programas que fazem parte da distribuição padrão de Lua (ou seja, no interpretador lua e no compilador luac).

Aprendeu também que existem diferentes versões de Lua ainda em uso corrente, sendo recomendado usar a mais recente, para novos projetos. E além disso, viu que existem essencialmente duas maneiras de obter essa distribuição:

Adendos

As seções a seguir tem relação com o conteúdo abordado, mas podem visar cenários mais específicos ou não interessar a uma parte do público, e por isso foram mantidas em separado:

Conteúdo relacionado