Table Of ContentO autor e a editora empenharam-se para citar adequadamente e dar o devido crédito a todos os detentores
dos direitos autorais de qualquer material utilizado neste livro, dispondo-se a possíveis acertos caso,
inadvertidamente, a identificação de algum deles tenha sido omitida.
Não é responsabilidade da editora nem do autor a ocorrência de eventuais perdas ou danos a pessoas ou
bens que tenham origem no uso desta publicação.
Apesar dos melhores esforços do autor, da tradutora, do editor e dos revisores, é inevitável que surjam erros
no texto. Assim, são bem-vindas as comunicações de usuários sobre correções ou sugestões referentes ao
conteúdo ou ao nível pedagógico que auxiliem o aprimoramento de edições futuras. Os comentários dos
leitores podem ser encaminhados à LTC — Livros Técnicos e Científicos Editora pelo e-mail
[email protected].
Direitos exclusivos para a língua portuguesa
Copyright © 2015 by
LTC — Livros Técnicos e Científicos Editora Ltda.
Uma editora integrante do GEN | Grupo Editorial Nacional
Reservados todos os direitos. É proibida a duplicação ou reprodução deste volume, no todo ou em parte, sob
quaisquer formas ou por quaisquer meios (eletrônico, mecânico, gravação, fotocópia, distribuição na
internet ou outros), sem permissão expressa da editora.
Travessa do Ouvidor, 11
Rio de Janeiro, RJ – CEP 20040-040
Tels.: 21-3543-0770 / 11-5080-0770
Fax: 21-3543-0896
[email protected]
www.ltceditora.com.br
Capa: Leônidas Leite
Produção digital: Geethik
CIP-BRASIL. CATALOGAÇÃO NA FONTE
SINDICATO NACIONAL DOS EDITORES DE LIVROS, RJ
I23p
3. ed.
Ierusalimschy, Roberto
Programando em Lua / Roberto Ierusalimschy ; tradução Ana
Lúcia de Moura. - [3. ed.] - Rio de Janeiro : LTC, 2015.
24 cm.
Tradução de: Programming in Lua
Inclui índice
ISBN 978-85-216-2913-9
1. Lua (Linguagem de programação de computador). I. Título.
15-21109
CDD: 005.13
CDU: 004.43
Prefácio
Quando Waldemar, Luiz e eu começamos a desenvolver Lua, em 1993, não
poderíamos imaginar que a linguagem alcançaria a repercussão que alcançou.
Criada como uma linguagem interna para dois projetos específicos, Lua é, hoje,
amplamente usada em todas as áreas que podem se beneficiar de uma linguagem
de script simples, extensível, portável e eficiente, como sistemas embarcados,
dispositivos móveis e, é claro, jogos.
Desde o princípio, Lua foi projetada para ser integrada aos softwares escritos
em C/C++ e outras linguagens convencionais. Essa integração traz muitos
benefícios. Lua é uma linguagem simples e muito pequena, em parte, porque não
tenta fazer o que C já faz bem, como computações de alto desempenho,
operações de baixo nível e interfaces com software de terceiros. Lua delega a C
essas tarefas. O que Lua realmente oferece são coisas nas quais C não é bom:
uma boa distância do hardware, estruturas dinâmicas, ausência de redundâncias
e facilidade para testar e depurar. Para isso, Lua tem um ambiente seguro,
gerenciamento automático de memória e conveniências para a manipulação de
cadeias de caracteres e outros tipos de estruturas de dados de tamanho dinâmico.
Parte do poder de Lua vem das suas bibliotecas. Isso não acontece por acaso;
afinal, um dos seus pontos fortes é a extensibilidade. Diversas características da
linguagem contribuem para esse poder. A tipagem dinâmica permite um alto
grau de polimorfismo. O gerenciamento automático de memória simplifica
interfaces, uma vez que não é necessário decidir quem é responsável por alocar e
desalocar memória ou como tratar overflows. Funções de ordem superior e
funções anônimas permitem um alto grau de parametrização, tornando as
funções mais versáteis.
Mais do que extensível, Lua é também uma linguagem de conexão. Dá
suporte ao desenvolvimento de software baseado em componentes, em que uma
aplicação é criada por meio da conexão de componentes de alto nível já
existentes. Esses componentes são escritos em uma linguagem compilada, tipada
estaticamente, como C ou C++; Lua é a cola que usamos para compor e conectar
esses componentes. Geralmente, os componentes (ou objetos) representam
conceitos concretos, de mais baixo nível (como widgets e estruturas de dados),
que não estão sujeitos a muitas mudanças durante o desenvolvimento do
programa e que consomem a maior parte do tempo de CPU do programa final.
Lua dá a forma final da aplicação, que provavelmente mudará bastante durante o
ciclo de vida do produto. Diferentemente de outras tecnologias de cola, Lua é
também uma linguagem completa, e, por isso, podemos usá-la não apenas para
colar componentes, mas também para adaptá-los e remodelá-los e para criar
componentes totalmente novos.
É claro que Lua não é a única linguagem de script disponível. Há outras que
você pode usar mais ou menos para os mesmos propósitos. Lua, entretanto,
oferece um conjunto de características que a tornam a melhor escolha para
muitas tarefas e que dão a ela um perfil único:
Extensibilidade: A extensibilidade de Lua é tão notável que muitas
pessoas pensam nela não como uma linguagem, mas como um kit para a
construção de linguagens de domínio específico. Lua foi projetada, desde
o início, para ser estendida, tanto por meio de código Lua, quanto por
meio de código C externo. Como uma prova de conceito, Lua implementa
a maior parte de sua própria funcionalidade básica através de bibliotecas
externas. É realmente muito fácil fazer sua interface com C/C++, e Lua
tem sido usada de forma integrada também a várias outras linguagens,
como Fortran, Java, Smalltalk, Ada, C# e, até mesmo outras linguagens de
script, como Perl e Phyton.
Simplicidade: Lua é uma linguagem simples e pequena, com poucos (mas
poderosos) conceitos. Essa simplicidade a torna fácil de aprender e
contribui para o seu pequeno tamanho. A distribuição completa da
linguagem (código-fonte, manual, além dos binários para algumas
plataformas) cabe confortavelmente em um disquete.
Eficiência: Lua tem uma implementação bastante eficiente. Benchmarks
independentes mostram-na como uma das mais rápidas linguagens de
script.
Portabilidade: Quando tratamos de portabilidade, estamos falando sobre
executar Lua em todas as plataformas sobre as quais já ouvimos falar:
todas as variantes UNIX e Windows, PlayStation, Xbox, Mac OS X e iOS,
Android, Kindle Fire, NOOK, Haiku, QUALCOMM Brew, mainframes
IBM, RISC OS, Symbian OS, processadores Rabbit, Raspberry Pi,
Arduino e muitas mais. O código-fonte para cada uma dessas plataformas
é virtualmente o mesmo. Lua não usa compilação condicional para adaptar
seu código para máquinas diferentes; em vez disso, ela mantém o padrão
ANSI (ISO) C. Dessa forma, você geralmente não precisa adaptá-la a um
novo ambiente: se você tiver um compilador ANSI C, só precisará
compilar Lua, sem nenhuma complicação adicional.
Audiência
Os usuários de Lua se enquadram tipicamente em três grandes grupos: aqueles
que a utilizam já embarcada em uma aplicação; aqueles que a utilizam como
uma linguagem autossuficiente; e aqueles que a utilizam junto com C.
Muitas pessoas usam Lua embarcada em uma aplicação, como Adobe
Lightroom, Nmap ou World of Warcraft. Essas aplicações usam a API Lua–C
para registrar novas funções, criar novos tipos e modificar o comportamento de
algumas operações da linguagem, configurando Lua para seus domínios
específicos. Frequentemente, os usuários de tais aplicações nem mesmo sabem
que Lua é uma linguagem independente, adaptada a um domínio particular.
Muitos desenvolvedores de plug-ins para Lightroom, por exemplo, não
conhecem os outros usos da linguagem; os usuários do Nmap costumam pensar
em Lua como a linguagem da Nmap Scripting Engine; os jogadores de World of
Warcraft veem Lua como uma linguagem exclusiva desse jogo.
Lua também é útil como uma linguagem autossuficiente, não apenas para
processamento de texto e pequenos programas descartáveis, mas também (e cada
vez mais) para projetos de médio e grande porte. Para esses usos, a principal
funcionalidade de Lua vem de suas bibliotecas. As bibliotecas-padrão, por
exemplo, oferecem funções básicas de casamento de padrões e outras funções
para o tratamento de cadeias de caracteres. À medida que Lua melhora o seu
suporte a bibliotecas, há uma proliferação de pacotes externos. LuaRocks, um
sistema de implantação e gerência de módulos Lua, disponibiliza, atualmente,
mais de 300 pacotes.
Finalmente, há aqueles programadores que trabalham no outro extremo,
escrevendo aplicações que usam Lua como uma biblioteca C. Essas pessoas irão
programar mais em C do que em Lua, embora precisem ter um bom
entendimento de Lua para criar interfaces simples, fáceis de usar e bem
integradas à linguagem.
Este livro tem muito para oferecer a todas essas pessoas. A primeira parte
cobre a linguagem propriamente dita, mostrando como podemos explorar todo o
seu potencial. Nela, nos concentramos em diferentes construções da linguagem e
usamos inúmeros exemplos e exercícios para mostrar como utilizá-las em tarefas
práticas. Alguns capítulos nessa parte cobrem conceitos básicos, como estruturas
de controle, enquanto outros cobrem tópicos mais avançados, como iteradores e
corrotinas.
A segunda parte é totalmente dedicada às tabelas, a única estrutura de dados
em Lua. Seus capítulos discutem estruturas de dados, persistência, pacotes e
programação orientada a objetos. Eles irão revelar o verdadeiro poder dessa
linguagem.
A terceira parte apresenta as bibliotecas-padrão. Essa parte é particularmente
útil para aqueles que usam Lua como uma linguagem autossuficiente, embora
Description:Lua é uma linguagem de programação de impecável elegância, que combina o poder de linguagens clássicas, como Scheme, com uma sintaxe simples e moderna. Atualmente, além de ser altamente indicada para sistemas complexos em várias áreas, é a mais utilizada por quem busca uma linguagem de scr