1
A Linguagem de Programação Lua
Fábio Ellwanger
UNISINOS
fabio@skconsultoria.com.br
Gustavo Balbinot
UNISINOS
gdbalbinot@hotmail.com
Resumo
Lua é uma linguagem de programação poderosa e
leve, projetada para estender aplicações. Lua também é
freqüentemente usada como uma linguagem de propósito
geral.
Lua combina programação procedural com poderosas
construções para descrição de dados, baseadas em
tabelas associativas e semântica extensível. Lua é tipada
dinamicamente, interpretada a partir de bytecodes, e tem
gerenciamento automático de memória com coleta de
lixo. Essas características fazem de Lua uma linguagem
ideal para configuração, automação (scripting) e
prototipagem rápida.
Lua é distribuída gratuitamente em vários sites. Estão
disponíveis os códigos fonte de todas as versões
públicas. A versão corrente é Lua 5.0, lançada em 11
Abr 2003. Estão disponíveis também binários prontos
para várias plataformas.
A distribuição de Lua é gratuita: Lua pode ser usada
para quaisquer propósitos, tanto acadêmicos quanto
comerciais, sem nenhum custo.
Lua foi projetada e implementada por uma equipe no
Tecgraf, o Grupo de Computação Gráfica da Puc-Rio
(Pontifícia Universidade Católica do Rio de Janeiro).
1. Introdução
Este artigo teve como base diversos documentos
publicados na internet, assim como o manual e a
especificação oficial desta linguagem, encontradas no site
dos criadores e mantenedores do projeto Lua
(www.lua.org).
Recomenda-se a leitura dessas especificações uma vez
que este artigo não tem o objetivo de ensinar a programar
em Lua, e sim dar uma visão geral desta ferramenta e
seus recursos.
2. Mas o que é Lua?
Lua foi desenvolvida nos laboratórios do Tecgraf, na
PUC-Rio, por Roberto Ierusalimschy, Luiz Henrique de
Figueiredo e Waldemar Celes. Desde o início, seus
criadores tiveram como meta principal desenvolver um
código eficiente, portável, simples e eficaz. Desde então,
Lua tem se espalhado pelo mundo, já tendo sido usada
desde em controle de robôs a sistemas criadores de jogos.
Lua é de código aberto e uso gratuito inclusive em
aplicações comerciais, não estando restrita por uma
licença como a GPL. Lua é uma linguagem de
aprendizado extremamente rápido para qualquer
programador. Na verdade, devido a sua extensa gama de
utilizações, o background de um programador
provavelmente define como ela será compreendida -
programadores VB a verão como linguagem de scripting,
aqueles acostumados com Lisp admirarão suas
capacidades como linguagem funcional, enquanto os de
C++ e Java se voltarão para as facilidades que Lua
fornece para a orientação a objeto. De forma geral,
qualquer programa Lua pode ser tão simples ou tão
complexo quanto se queira.
Por ter sido desenvolvida completamente em ANSI C,
as bibliotecas de Lua podem ser usadas em qualquer
plataforma que tenha um compilador compatível com o
padrão ANSI. Lua já foi compilada para, entre outras,
DOS, Linux, Windows 9x/NT/2000/Me, Solaris, SunOs,
AIX, Irix, EPOC, PalmOs, Macintosh e até Playstation II
- a lista cresce a cada dia. O código de Lua é
extremamente compacto e modular, podendo ter seus
componentes removidos quando não necessários,
facilitando em muito o desenvolvimento de versões para
serem embutidas em sistemas pequenos e portáteis, como
aparelhos wireless e hardware especializado. Lua
também é extremamente rápida quando comparada a
outras linguagens interpretadas. Blocos de código em Lua
(chunks) podem ser pré-compilados para um formato
binário e interpretados posteriormente. Lua provê
estruturas de dados associativas baseadas em hash tables
com uma interface extremamente simples, o que aumenta
em muito a velocidade de aplicações típicas.
Devido à sua extensibilidade, Lua é freqüentemente
usada como o cimento que une aplicações e linguagens
diversas que tenham interface com C. Da mesma forma,
Lua pode ser usada como uma linguagem alto nível de
scripting. Tanto um robô para exploração espacial quanto
2
os inimigos de um jogo de computador poderiam ter seu
comportamento descrito por blocos de código em Lua.
Por sua simplicidade, Lua é perfeita para protótipos de
algoritmos e sistemas antes da implementação definitiva.
Além disso, Lua também funciona muito bem como
linguagem de descrição de dados, reduzindo o trabalho
de um programador, tornando desnecessário que ele crie
seus
próprios parsers.
3. Ambiente de programação
3. Ambiente de Programação
Todos os comandos e construções de Lua são
executados em um único ambiente global. Este ambiente,
que guarda todas as variáveis globais e definições de
funções, é automaticamente inicializado quando o
interpretador é ativado e persiste enquanto o
interpretador estiver em execução.
O ambiente global de Lua pode ser manipulado por
códigos escritos em Lua ou por bibliotecas C que utilizem
funções da interface C-Lua. Códigos Lua são compostos
por comandos globais e definições de funções. Um
módulo Lua é um arquivo ou uma cadeia de caracteres
contendo códigos Lua. Quando se carrega um módulo
Lua, os códigos são compilados para uma linguagem de
máquina interna, para serem posteriormente executados.
Os códigos globais (que não estão dentro de funções) são
automaticamente executados ao fim da compilação do
módulo. Os códigos de funções são armazenados e
executados na chamada das respectivas funções. Em
outras palavras, Lua usa uma estratégia híbrida de
compilação e interpretação, que evita o custo de
desempenho de interpretação textual direta, ao mesmo
tempo que mantém a versatilidade de um ambiente
interpretativo.
Pode-se carregar diversos módulos inicialmente
independentes. Todos, no entanto, são carregados dentro
do único ambiente global de Lua. Portanto, a ordem com
que se carrega diversos módulos é importante, tendo em
vista que os comandos globais de cada módulo são
executados imediatamente após sua compilação. Não
existe uma formatação rígida para o código Lua, isto é, a
linguagem permite comandos em qualquer coluna do
texto, podendo ocupar diversas linhas. Os comandos de
Lua podem opcionalmente ser separados por ponto e
vírgula (;). Comentários iniciam-se com traços duplos (--
) e persistem até o final da linha.
4. Lua estendendo Lua
Diferentemente de outras linguagens, que ou fornecem
elementos específicos para a orientação a objetos (como
C++), ou que forçam o usuário a se ater a Orientação a
Objetos (como Java), Lua é orientada a objeto somente se
e da maneira que quisermos. Funcionalidade como
herança, métodos e variáveis protegidas, e polimorfismo
pode ser implementado tanto em C quanto em Lua. Lua
dispõe de tabelas, mapas associativos que podem ser
indexados tanto por números quanto por strings. O que
isso representa na prática é um tipo de estrutura
extremamente poderoso, eficiente, e fácil de ser utilizado.
Tais tabelas podem conter qualquer tipo de objeto,
desde números até referências a funções. Outro recurso
extremamente poderoso de Lua é o uso de tag methods. O
sistema de tags de Lua permite que qualquer tabela possa
ter seu próprio conjunto de métodos básicos de sistema.
Usando tag methods, pode-se redefinir o que acontece
quando se tenta, por exemplo, indexar valores de uma
tabela ou somar um objeto a outro.
5. Adicionando funções em C
Lua não foi concebida para ser universal. Na verdade,
um dos mais poderosos aspectos da linguagem é sua
extensibilidade, e o fato de que programas em Lua são
sempre executados por um programa anfitrião em C ou
correspondente. Um conjunto de funções define como se
faz a conexão entre as duas linguagens, permitindo ao
programa anfitrião executar comandos arbitrários de Lua
e disponibilizar funções para uso na mesma. Pode-se por
exemplo encapsular funções específicas de sistema
operacional em chamadas de Lua, e assim ajudar a
modularizar o sistema desenvolvido.
Qualquer tipo de Lua pode ser passado como
parâmetro ou valor de retorno para uma função C e vice-
versa, incluindo números, tabelas, funções Lua e até
funções em C. Na verdade, usando o tipo userdata,
absolutamente qualquer dado de C pode ser passado para
Lua. O tipo userdata, aliado ao recurso das tag methods,
é um mecanismo extremamente poderoso. Podemos por
exemplo construir um objeto em C++ e passar o seu
endereço para Lua indicando sua classe através de uma
tag. Assim, quando este for indexado, o valor retornado
será determinado pela função correspondente em C++.
Como pode ser visto, bibliotecas inteiras podem ser
definidas em C/C++ e exportadas para programas Lua.
As mesmas podem inclusive estar encapsuladas dentro de
tabelas, de forma a não “poluir” as globais de Lua. Vale
ressaltar — se a biblioteca C for ANSI, ela poderá ser tão
portável quanto Lua, tornando-se disponível em
absolutamente qualquer plataforma onde esta possa ser
compilada.
Outra forma de adicionar a Lua é a de alterar o
próprio código do interpretador que pode ser explorado
como se queira - por exemplo, para alterar o
comportamento básico de indexação de objetos ou criar-
3
se uma estrutura de herança embutida. A única condição
associada a esse tipo de alteração é que a nova linguagem
não pode ser chamada de “linguagem Lua”.
6. A Linguagem
Conforme citado anteriormente Lua é uma linguagem
tipada dinamicamente e seu projeto inicial previa os
seguintes tipos de dados:
1. number: implementado como float
2. string
3. tabelas associativas
4. userdata: tipo que tinha a capacidade de
armazenar um ponteiro de C
5. function: funções da linguagem Lua
6. C function: funções de C
7. nil
Os tipos userdata e C function foram criados com o
intuito de permitir a interação de Lua com aplicações
escritas em C (fazendo jus à sua proposta de ser uma
linguagem de extensão). Para deixar a linguagem o mais
leve possível também se evitou criar um tipo booleano
(nil representaria false e qualquer outro valor
representaria true). A versão mais atual de Lua não
contem mais o tipo C function e passou a contar com os
tipos thread e boolean. Aqui as funções são consideradas
valores de primeira ordem, ou seja, podem ser
armazenadas em variáveis, passadas como parâmetros
para outras funções ou servir como retorno destas.
A especificação completa da linguagem pode ser
encontrada em [5], incluindo a descrição de sua sintaxe
com a notação BNF (Bakus-Naur Form). Notamos que de
uma maneira geral a semântica de Lua foi especificada
de uma maneira informal.
Lua foi projetada para ser uma linguagem interpretada
a partir de bytecodes gerados por uma pré-compilação.
Para manter a simplicidade do projeto usaram-se
ferramentas j´a existentes na geração de tal código
intermediário: o lex e o yacc (o primeiro para dividir o
programa fonte em tokens e o segundo para achar a
estrutura hierárquica).
7. Evolução
A consolidação do projeto de Lua se deu ao longo dos
anos. A intenção inicial do projeto da linguagem
manteve-se durante a sua evolução, porém muitas
características foram adicionadas e outras retiradas: tipos
deixaram de existir enquanto outros surgiram, a
implementação da linguagem foi revista para aumentar
sua performance, estruturas de controle foram
adicionadas, etc. Nesta seção tentaremos expor quais
mudanças mais significativas afetaram Lua a medida em
que o seu leque de utilizações cresceu.
Em um primeiro momento, percebeu-se o potencial
que Lua possuía para trabalhar com meta-arquivos
gráficos e como nessa área de aplicação, é necessário que
sejam lidos arquivos fonte da ordem de centenas de
Kbytes, sentiu-se a necessidade de acelerar o processo de
compilação. Assim a ferramenta lex foi substituída por
um analisador léxico dedicado, o que quase dobrou a
velocidade do compilador. A primeira versão de Lua a
trazer essas alterações foi a versão 1.1 (que também foi a
primeira disponível publicamente).
A versão 2.1 de Lua trouxe consigo um novo conceito
que representava uma importante decisão de projeto: a de
n˜ao saturar a linguagem com construções diversas, e sim
prover meta-mecanismos que permitissem ao
programador criar as construções que achasse
necessárias. Tal mecanismo foi o de fallbacks, que
consistia em funções definidas pelos usuários que eram
chamadas quando a linguagem n˜ao sabia o que fazer.
Por exemplo: se dois valores tivessem de ser adicionados
e um destes n˜ao fosse numérico, um fallback seria
chamado para retornar o valor da soma. Al´em da clara
vantagem de permitir o tratamento de erros na
linguagem, o conceito de fallbacks favorecia a
programação orientada a objetos (fallbacks para acesso à
tabelas permitiam por exemplo a implementação de
herança). Na versão 2.4 foi introduzido um compilador
externo, o luac.
Lua 3.0 implementou os tag methods (uma versão
evoluída do conceito de fallbacks que permitia ao
programador descrever como uma tabela implementava
os seus operadores) e a capacidade de suportar
compilação condicional. Al´em disso, eliminou o tipo C
function. A versão 4.0 da linguagem removeu a
capacidade de compilação condicional, reformulou a API
e introduziu a estrutura de controle for. A versão mais
atual da linguagem é a 5.0, que introduziu os tipos
Thread e boolean.
8. Utilização
Lua foi projetada para servir como linguagem de
extensão, ou seja, não se escreveria um programa
somente utilizando ela, mas seu código estaria embutido
em uma outra aplicação que utilizaria o código Lua como
uma maneira de customizar aspectos da mesma. O
projeto inicial de Lua superou as expectativas dos seus
criadores. Devido a sua sintaxe simples e familiar e aos
meta-mecanismos fornecidos pela linguagem alem de
mudanças na sua implementação, tornou-se comum ver
Lua sendo usada não como linguagem de extensão mas
sim como linguagem principal.
Após alguns papers e publicações ([2],[3]), Lua
acabou por se tornar mais conhecida perante a
4
comunidade internacional. Despertou interesse especial
de programadores da Lucas Art, que viram na linguagem
potencial para do desenvolvimento de jogos.
Alguns exemplos de jogos desenvolvidos em Lua são:
Baldur’s Gate e Grim Fandango.
Alem de figurar no projeto de games, Lua é utilizada
para implementar software embutido em equipamentos
de rede(switches ethernet), aplicações de simulação em
laboratórios de física (tendo sido esta uma de suas
primeiras utilizações fora da PUC-Rio, no Observatório
Astrofísico de Smithsonian), etc. Para uma relação mais
abrangente de projetos que utilizam Lua, consulte [4].
9. Conclusão
Lua, por ser uma linguagem recente e em constante
desenvolvimento, ainda evoluirá muito de acordo com as
necessidades de seus usuários. Lua é uma solução leve e
de baixíssimo custo para problemas que tem sido
atacados pelos grandes jogadores do mercado. A
diferença crucial, é claro, é que os desenvolvedores de
Lua e seus colaboradores não vendem sistemas
operacionais ou outras ferramentas e portanto não estão a
priori atrelados a interesses comerciais.
No mais, Lua é intuitiva, rápida, de fácil aprendizado
e, principalmente, extremamente portável, e o número de
ferramentas e bibliotecas para a mesma tem crescido
vertiginosamente.
10. Referências
[1] R. Ierusalimschy, L. H. Figueiredo e W. Celes. The
Evolution of an Extension Language:
A History of Lua. In Proceedings of V Brazilian
Symposium on Programming Lan-
guages (2001) B-14–B-28.
[2] R. Ierusalimschy, L. H. Figueiredo e W. Celes. Lua –
an Extensible Extension Language.
In Software: Practice and Experience, 26(6):635–
652,1996.
[3] R. Ierusalimschy, L. H. Figueiredo e W. Celes. Lua:
an extensible embedded language.
In Dr. Dobb’s Journal, 21(12):26–33, Dez. 1996.
[4] Lista de projetos que utilizam Lua. Dispon´õvel em:
http://www.lua.org/uses.html.
[5] R. Ierusalimschy, L. H. Figueiredo e W. Celes. Lua
5.0 Reference manual. Dispon´õvel em:
http://www.lua.org/ftp/refman-5.0.pdf.

A Linguagem de Programação Lua-uma linguagem de programação poderosa e leve

  • 1.
    1 A Linguagem deProgramação Lua Fábio Ellwanger UNISINOS fabio@skconsultoria.com.br Gustavo Balbinot UNISINOS gdbalbinot@hotmail.com Resumo Lua é uma linguagem de programação poderosa e leve, projetada para estender aplicações. Lua também é freqüentemente usada como uma linguagem de propósito geral. Lua combina programação procedural com poderosas construções para descrição de dados, baseadas em tabelas associativas e semântica extensível. Lua é tipada dinamicamente, interpretada a partir de bytecodes, e tem gerenciamento automático de memória com coleta de lixo. Essas características fazem de Lua uma linguagem ideal para configuração, automação (scripting) e prototipagem rápida. Lua é distribuída gratuitamente em vários sites. Estão disponíveis os códigos fonte de todas as versões públicas. A versão corrente é Lua 5.0, lançada em 11 Abr 2003. Estão disponíveis também binários prontos para várias plataformas. A distribuição de Lua é gratuita: Lua pode ser usada para quaisquer propósitos, tanto acadêmicos quanto comerciais, sem nenhum custo. Lua foi projetada e implementada por uma equipe no Tecgraf, o Grupo de Computação Gráfica da Puc-Rio (Pontifícia Universidade Católica do Rio de Janeiro). 1. Introdução Este artigo teve como base diversos documentos publicados na internet, assim como o manual e a especificação oficial desta linguagem, encontradas no site dos criadores e mantenedores do projeto Lua (www.lua.org). Recomenda-se a leitura dessas especificações uma vez que este artigo não tem o objetivo de ensinar a programar em Lua, e sim dar uma visão geral desta ferramenta e seus recursos. 2. Mas o que é Lua? Lua foi desenvolvida nos laboratórios do Tecgraf, na PUC-Rio, por Roberto Ierusalimschy, Luiz Henrique de Figueiredo e Waldemar Celes. Desde o início, seus criadores tiveram como meta principal desenvolver um código eficiente, portável, simples e eficaz. Desde então, Lua tem se espalhado pelo mundo, já tendo sido usada desde em controle de robôs a sistemas criadores de jogos. Lua é de código aberto e uso gratuito inclusive em aplicações comerciais, não estando restrita por uma licença como a GPL. Lua é uma linguagem de aprendizado extremamente rápido para qualquer programador. Na verdade, devido a sua extensa gama de utilizações, o background de um programador provavelmente define como ela será compreendida - programadores VB a verão como linguagem de scripting, aqueles acostumados com Lisp admirarão suas capacidades como linguagem funcional, enquanto os de C++ e Java se voltarão para as facilidades que Lua fornece para a orientação a objeto. De forma geral, qualquer programa Lua pode ser tão simples ou tão complexo quanto se queira. Por ter sido desenvolvida completamente em ANSI C, as bibliotecas de Lua podem ser usadas em qualquer plataforma que tenha um compilador compatível com o padrão ANSI. Lua já foi compilada para, entre outras, DOS, Linux, Windows 9x/NT/2000/Me, Solaris, SunOs, AIX, Irix, EPOC, PalmOs, Macintosh e até Playstation II - a lista cresce a cada dia. O código de Lua é extremamente compacto e modular, podendo ter seus componentes removidos quando não necessários, facilitando em muito o desenvolvimento de versões para serem embutidas em sistemas pequenos e portáteis, como aparelhos wireless e hardware especializado. Lua também é extremamente rápida quando comparada a outras linguagens interpretadas. Blocos de código em Lua (chunks) podem ser pré-compilados para um formato binário e interpretados posteriormente. Lua provê estruturas de dados associativas baseadas em hash tables com uma interface extremamente simples, o que aumenta em muito a velocidade de aplicações típicas. Devido à sua extensibilidade, Lua é freqüentemente usada como o cimento que une aplicações e linguagens diversas que tenham interface com C. Da mesma forma, Lua pode ser usada como uma linguagem alto nível de scripting. Tanto um robô para exploração espacial quanto
  • 2.
    2 os inimigos deum jogo de computador poderiam ter seu comportamento descrito por blocos de código em Lua. Por sua simplicidade, Lua é perfeita para protótipos de algoritmos e sistemas antes da implementação definitiva. Além disso, Lua também funciona muito bem como linguagem de descrição de dados, reduzindo o trabalho de um programador, tornando desnecessário que ele crie seus próprios parsers. 3. Ambiente de programação 3. Ambiente de Programação Todos os comandos e construções de Lua são executados em um único ambiente global. Este ambiente, que guarda todas as variáveis globais e definições de funções, é automaticamente inicializado quando o interpretador é ativado e persiste enquanto o interpretador estiver em execução. O ambiente global de Lua pode ser manipulado por códigos escritos em Lua ou por bibliotecas C que utilizem funções da interface C-Lua. Códigos Lua são compostos por comandos globais e definições de funções. Um módulo Lua é um arquivo ou uma cadeia de caracteres contendo códigos Lua. Quando se carrega um módulo Lua, os códigos são compilados para uma linguagem de máquina interna, para serem posteriormente executados. Os códigos globais (que não estão dentro de funções) são automaticamente executados ao fim da compilação do módulo. Os códigos de funções são armazenados e executados na chamada das respectivas funções. Em outras palavras, Lua usa uma estratégia híbrida de compilação e interpretação, que evita o custo de desempenho de interpretação textual direta, ao mesmo tempo que mantém a versatilidade de um ambiente interpretativo. Pode-se carregar diversos módulos inicialmente independentes. Todos, no entanto, são carregados dentro do único ambiente global de Lua. Portanto, a ordem com que se carrega diversos módulos é importante, tendo em vista que os comandos globais de cada módulo são executados imediatamente após sua compilação. Não existe uma formatação rígida para o código Lua, isto é, a linguagem permite comandos em qualquer coluna do texto, podendo ocupar diversas linhas. Os comandos de Lua podem opcionalmente ser separados por ponto e vírgula (;). Comentários iniciam-se com traços duplos (-- ) e persistem até o final da linha. 4. Lua estendendo Lua Diferentemente de outras linguagens, que ou fornecem elementos específicos para a orientação a objetos (como C++), ou que forçam o usuário a se ater a Orientação a Objetos (como Java), Lua é orientada a objeto somente se e da maneira que quisermos. Funcionalidade como herança, métodos e variáveis protegidas, e polimorfismo pode ser implementado tanto em C quanto em Lua. Lua dispõe de tabelas, mapas associativos que podem ser indexados tanto por números quanto por strings. O que isso representa na prática é um tipo de estrutura extremamente poderoso, eficiente, e fácil de ser utilizado. Tais tabelas podem conter qualquer tipo de objeto, desde números até referências a funções. Outro recurso extremamente poderoso de Lua é o uso de tag methods. O sistema de tags de Lua permite que qualquer tabela possa ter seu próprio conjunto de métodos básicos de sistema. Usando tag methods, pode-se redefinir o que acontece quando se tenta, por exemplo, indexar valores de uma tabela ou somar um objeto a outro. 5. Adicionando funções em C Lua não foi concebida para ser universal. Na verdade, um dos mais poderosos aspectos da linguagem é sua extensibilidade, e o fato de que programas em Lua são sempre executados por um programa anfitrião em C ou correspondente. Um conjunto de funções define como se faz a conexão entre as duas linguagens, permitindo ao programa anfitrião executar comandos arbitrários de Lua e disponibilizar funções para uso na mesma. Pode-se por exemplo encapsular funções específicas de sistema operacional em chamadas de Lua, e assim ajudar a modularizar o sistema desenvolvido. Qualquer tipo de Lua pode ser passado como parâmetro ou valor de retorno para uma função C e vice- versa, incluindo números, tabelas, funções Lua e até funções em C. Na verdade, usando o tipo userdata, absolutamente qualquer dado de C pode ser passado para Lua. O tipo userdata, aliado ao recurso das tag methods, é um mecanismo extremamente poderoso. Podemos por exemplo construir um objeto em C++ e passar o seu endereço para Lua indicando sua classe através de uma tag. Assim, quando este for indexado, o valor retornado será determinado pela função correspondente em C++. Como pode ser visto, bibliotecas inteiras podem ser definidas em C/C++ e exportadas para programas Lua. As mesmas podem inclusive estar encapsuladas dentro de tabelas, de forma a não “poluir” as globais de Lua. Vale ressaltar — se a biblioteca C for ANSI, ela poderá ser tão portável quanto Lua, tornando-se disponível em absolutamente qualquer plataforma onde esta possa ser compilada. Outra forma de adicionar a Lua é a de alterar o próprio código do interpretador que pode ser explorado como se queira - por exemplo, para alterar o comportamento básico de indexação de objetos ou criar-
  • 3.
    3 se uma estruturade herança embutida. A única condição associada a esse tipo de alteração é que a nova linguagem não pode ser chamada de “linguagem Lua”. 6. A Linguagem Conforme citado anteriormente Lua é uma linguagem tipada dinamicamente e seu projeto inicial previa os seguintes tipos de dados: 1. number: implementado como float 2. string 3. tabelas associativas 4. userdata: tipo que tinha a capacidade de armazenar um ponteiro de C 5. function: funções da linguagem Lua 6. C function: funções de C 7. nil Os tipos userdata e C function foram criados com o intuito de permitir a interação de Lua com aplicações escritas em C (fazendo jus à sua proposta de ser uma linguagem de extensão). Para deixar a linguagem o mais leve possível também se evitou criar um tipo booleano (nil representaria false e qualquer outro valor representaria true). A versão mais atual de Lua não contem mais o tipo C function e passou a contar com os tipos thread e boolean. Aqui as funções são consideradas valores de primeira ordem, ou seja, podem ser armazenadas em variáveis, passadas como parâmetros para outras funções ou servir como retorno destas. A especificação completa da linguagem pode ser encontrada em [5], incluindo a descrição de sua sintaxe com a notação BNF (Bakus-Naur Form). Notamos que de uma maneira geral a semântica de Lua foi especificada de uma maneira informal. Lua foi projetada para ser uma linguagem interpretada a partir de bytecodes gerados por uma pré-compilação. Para manter a simplicidade do projeto usaram-se ferramentas j´a existentes na geração de tal código intermediário: o lex e o yacc (o primeiro para dividir o programa fonte em tokens e o segundo para achar a estrutura hierárquica). 7. Evolução A consolidação do projeto de Lua se deu ao longo dos anos. A intenção inicial do projeto da linguagem manteve-se durante a sua evolução, porém muitas características foram adicionadas e outras retiradas: tipos deixaram de existir enquanto outros surgiram, a implementação da linguagem foi revista para aumentar sua performance, estruturas de controle foram adicionadas, etc. Nesta seção tentaremos expor quais mudanças mais significativas afetaram Lua a medida em que o seu leque de utilizações cresceu. Em um primeiro momento, percebeu-se o potencial que Lua possuía para trabalhar com meta-arquivos gráficos e como nessa área de aplicação, é necessário que sejam lidos arquivos fonte da ordem de centenas de Kbytes, sentiu-se a necessidade de acelerar o processo de compilação. Assim a ferramenta lex foi substituída por um analisador léxico dedicado, o que quase dobrou a velocidade do compilador. A primeira versão de Lua a trazer essas alterações foi a versão 1.1 (que também foi a primeira disponível publicamente). A versão 2.1 de Lua trouxe consigo um novo conceito que representava uma importante decisão de projeto: a de n˜ao saturar a linguagem com construções diversas, e sim prover meta-mecanismos que permitissem ao programador criar as construções que achasse necessárias. Tal mecanismo foi o de fallbacks, que consistia em funções definidas pelos usuários que eram chamadas quando a linguagem n˜ao sabia o que fazer. Por exemplo: se dois valores tivessem de ser adicionados e um destes n˜ao fosse numérico, um fallback seria chamado para retornar o valor da soma. Al´em da clara vantagem de permitir o tratamento de erros na linguagem, o conceito de fallbacks favorecia a programação orientada a objetos (fallbacks para acesso à tabelas permitiam por exemplo a implementação de herança). Na versão 2.4 foi introduzido um compilador externo, o luac. Lua 3.0 implementou os tag methods (uma versão evoluída do conceito de fallbacks que permitia ao programador descrever como uma tabela implementava os seus operadores) e a capacidade de suportar compilação condicional. Al´em disso, eliminou o tipo C function. A versão 4.0 da linguagem removeu a capacidade de compilação condicional, reformulou a API e introduziu a estrutura de controle for. A versão mais atual da linguagem é a 5.0, que introduziu os tipos Thread e boolean. 8. Utilização Lua foi projetada para servir como linguagem de extensão, ou seja, não se escreveria um programa somente utilizando ela, mas seu código estaria embutido em uma outra aplicação que utilizaria o código Lua como uma maneira de customizar aspectos da mesma. O projeto inicial de Lua superou as expectativas dos seus criadores. Devido a sua sintaxe simples e familiar e aos meta-mecanismos fornecidos pela linguagem alem de mudanças na sua implementação, tornou-se comum ver Lua sendo usada não como linguagem de extensão mas sim como linguagem principal. Após alguns papers e publicações ([2],[3]), Lua acabou por se tornar mais conhecida perante a
  • 4.
    4 comunidade internacional. Despertouinteresse especial de programadores da Lucas Art, que viram na linguagem potencial para do desenvolvimento de jogos. Alguns exemplos de jogos desenvolvidos em Lua são: Baldur’s Gate e Grim Fandango. Alem de figurar no projeto de games, Lua é utilizada para implementar software embutido em equipamentos de rede(switches ethernet), aplicações de simulação em laboratórios de física (tendo sido esta uma de suas primeiras utilizações fora da PUC-Rio, no Observatório Astrofísico de Smithsonian), etc. Para uma relação mais abrangente de projetos que utilizam Lua, consulte [4]. 9. Conclusão Lua, por ser uma linguagem recente e em constante desenvolvimento, ainda evoluirá muito de acordo com as necessidades de seus usuários. Lua é uma solução leve e de baixíssimo custo para problemas que tem sido atacados pelos grandes jogadores do mercado. A diferença crucial, é claro, é que os desenvolvedores de Lua e seus colaboradores não vendem sistemas operacionais ou outras ferramentas e portanto não estão a priori atrelados a interesses comerciais. No mais, Lua é intuitiva, rápida, de fácil aprendizado e, principalmente, extremamente portável, e o número de ferramentas e bibliotecas para a mesma tem crescido vertiginosamente. 10. Referências [1] R. Ierusalimschy, L. H. Figueiredo e W. Celes. The Evolution of an Extension Language: A History of Lua. In Proceedings of V Brazilian Symposium on Programming Lan- guages (2001) B-14–B-28. [2] R. Ierusalimschy, L. H. Figueiredo e W. Celes. Lua – an Extensible Extension Language. In Software: Practice and Experience, 26(6):635– 652,1996. [3] R. Ierusalimschy, L. H. Figueiredo e W. Celes. Lua: an extensible embedded language. In Dr. Dobb’s Journal, 21(12):26–33, Dez. 1996. [4] Lista de projetos que utilizam Lua. Dispon´õvel em: http://www.lua.org/uses.html. [5] R. Ierusalimschy, L. H. Figueiredo e W. Celes. Lua 5.0 Reference manual. Dispon´õvel em: http://www.lua.org/ftp/refman-5.0.pdf.