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 biblioteca1. E a função da biblioteca Lua é converter o seu programa em código de máquina, para então poder ser executado.

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.

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 x86 ou amd64/x86_64).

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), ou usar o próprio WSL, que fornecerá uma distribuição Linux virtualizada com seu gerenciador de pacotes. Em ambos os 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órios2, então outra opção é obter pacotes pré-compilados no subprojeto LuaBinaries.

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 ambiente3 PATH do sistema.

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 ou WSL.

Conforme orientado na página oficial de downloads, na seção building (para a versão 5.4.6, 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.6.tar.gz
tar zxf lua-5.4.6.tar.gz
cd lua-5.4.6
make all test

Na primeira linha, baixamos o pacote .tar.gz referente à versão 5.4.6 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.6, 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:

O que se espera de uma instalação

Ao obter Lua, você deverá se deparar com alguns ou com todos os arquivos a seguir (dependendo do método escolhido para obter):

  1. Executáveis (lua e luac)
  2. Cabeçalhos (lua.h,luaconf.h,lualib.h,lauxlib.h e lua.hpp)
  3. Biblioteca Lua (liblua.a)
  4. Manuais (lua.1 e luac.1)

Quando a instalação é feita via pacotes do sistema operacional, a nomenclatura desses arquivos pode variar um pouco (especialmente porque é comum que versões diferentes de Lua sejam suportadas no mesmo sistema), e os arquivos podem ser distribuídos em pacotes diferentes.

Por exemplo, é bastante comum em sistemas POSIX que pacotes contendo arquivos executáveis sejam separados de pacotes contendo arquivos de cabeçalhos e bibliotecas, e em alguns casos até a documentação (manuais) é separada.

Além disso, outros arquivos podem ser disponibilizados. É o caso, por exemplo, de bibliotecas dinâmicas, que não são suportadas em todo sistema operacional, mas que são bastante comuns, e no geral possuem extensão .so ou .dll. De qualquer modo, isso já é um assunto específico de cada sistema operacional.

Além dos manuais dos programas lua e luac, arquivos HTML de documentação também tipicamente são copiados para algum diretório do sistema, especialmente quando a instalação é feita por um gerenciador de pacotes do sistema.

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.6  Copyright (C) 1994-2023 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.

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.

Muito bem! Isso significa que agora você obteve Lua com sucesso e já pode começar a programar. “Um pequeno passo” para um iniciante, “mas um grande passo” para a prática da programação.

Prossiga para o próximo tutorial, de execução de código Lua.

Conteúdo relacionado


  1. O termo biblioteca talvez não seja familiar para alguém que está começando a programar, então vamos esclarecê-lo: uma biblioteca é um tipo específico de programa que não se executa diretamente, mas que é reaproveitado dentro de outros programas. Ele pode fornecer uma coleção de funcionalidades que, do contrário teriam que ser criadas do zero no programa. 

  2. Alguns sistemas usam termos como “loja de aplicativos”, ou “central de software”, termos que considero imprecisos, mas que devo ressaltar aqui pois algumas pessoas podem estar mais familiarizadas com eles do que com o termo “repositório”. 

  3. Variáveis de ambiente do sistema operacional são lidas pelos programas e podem afetar o modo como executam. Em específico, a variável PATH é útil para terminais de linha de comando, para que não seja necessário informar o caminho completo até o local onde um programa está instalado.