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?
Essa é uma pergunta importante, pois é fácil se confundir na terminologia. Se Lua é uma linguagem, como ela poderia ser obtida? Linguagens podem ser aprendidas, não obtidas.
Ocorre que Lua não é apenas uma linguagem, mas também uma biblioteca1. Afinal, uma linguagem de programação não é útil se no fim das contas ela não permitir que seu programa seja convertido para linguagem de máquina e então possa ser executado em algum dispositivo.
A biblioteca Lua é 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.
A biblioteca Lua e o interpretador de linha de comando 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
Tanto a especificação da linguagem, quanto a sua implementação são conduzidos na universidade PUC-Rio, a qual hospeda o projeto e sua documentação, no 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.
Tenha em mente que uma distribuição binária, diferente do código-fonte, não é a mesma para todo mundo.
Para cada sistema operacional, por exemplo, deverá existir uma distribuição binária diferente, porque cada sistema pode possuir uma biblioteca C diferente e portanto não ser binariamente compatível com um programa pré-compilado. Então, ao obter uma distribuição binária, deve se certificar de que ela é destinada ao seu sistema.
Outro fator que varia é a arquitetura de processamento. Isto é algo que importa principalmente se você estiver trabalhando com dispositivos embarcados, cenário em que provavelmente não utilizaria um pré-compilado.
Mas enfim, vamos ao que interessa. O modo mais prático de obter versões pré-compiladas é por meio de gerenciadores de pacotes nativos do sistema, quando há este recurso.
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:
- Tende a ser mais fácil, especialmente para iniciantes;
- Em caso de obter via pacotes do sistema operacional, contará com atualizações automáticas e utilizará caminhos padrão do sistema.
Desvantagens de obter pré-compilados:
- Menor controle sobre os arquivos obtidos (afinal, foram gerados por terceiros), o que faz diferença quando precisa aplicar personalizações próprias ou quando há critérios mais rígidos de segurança;
- Você talvez não encontre pré-compilados para o seu sistema operacional, para seu processador ou para a versão de Lua que deseja usar.
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:
- O projeto é relativamente pequeno, e não requer um grande poder computacional para compilar, geralmente levando pouco tempo;
- É 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)
- 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:
- Maior possibilidade de personalização dos arquivos gerados;
- Maior segurança, pois pode-se inspecionar o código-fonte antes de gerar os arquivos binários;
- Como alguns sistemas não suportam ligação dinâmica, compilar e ligar estaticamente os binários com módulos próprios é uma opção;
- Pode-se escolher precisamente a versão de Lua que se deseja utilizar.
Desvantagens de compilar o código-fonte:
- Para alguns usuários iniciantes pode exigir um pouco mais de estudo ou parecer confuso;
- Se não houver uma infraestrutura avançada de compilação, o procedimento manual precisará ser repetido para novas versões.
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):
- Executáveis (
lua
eluac
) - Cabeçalhos (
lua.h
,luaconf.h
,lualib.h
,lauxlib.h
elua.hpp
) - Biblioteca Lua (
liblua.a
) - Manuais (
lua.1
eluac.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
- Curadoria – Uma introdução à programação em Lua
- Glossário – Distribuição padrão
- Glossário – Interpretador Lua
- Versões – Versões de Lua
-
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. ↩
-
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”. ↩
-
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. ↩