Você está na página 1de 52

A Linguagem Lua

Caractersticas das Linguagens de Programao Nome: Rodrigo da S. Yanagisawa 1

Viso geral
Lua uma linguagem de programao interpretada imperativa, procedural, pequena e leve, projetada para expandir aplicaes em geral, para ser usada como linguagem extensvel (que une partes de um programa feitas em mais de uma linguagem). Lua normalmente descrito como uma linguagem de mltiplos paradigmas, oferecendo um pequeno conjunto de caractersticas gerais que podem ser estendidas para encaixar diferentes tipos de problemas, em vez de fornecer uma especificao mais complexa e rgida para combinar com um nico paradigma.

Viso geral
Lua uma linguagem que suporta apenas um pequeno nmero de estruturas de dados, tais como valores booleanos, nmeros (tipicamente double), e strings. Matrizes, listas e registros podem ser representados por meio da nica estrutura de dados presente na linguagem que a Tabela (Table).

Devido sua eficincia, clareza e facilidade de aprendizado, passou a ser usada em diversos ramos da programao, como no desenvolvimento de jogos, controle de robs, processamento de texto, etc.

Viso geral
A distribuio de Lua gratuita: Lua pode ser usada para quaisquer propsitos, tanto acadmicos quanto comerciais, sem nenhum custo. Lua foi projetada e implementada por uma equipe no Tecgraf, o Grupo de Computao Grfica da Puc-Rio (Pontifcia Universidade Catlica do Rio de Janeiro).

Um pouco de Histria...
5

Origens
DEL Data-Entry Language Linguagem para Especificao de Dilogos

SOL Simple Object Language Linguagem para Descrio de Objetos

Origens

Origens
Essas duas linguagens foram desenvolvidas de forma independente entre os anos de 92 e 93, e tinham como preocupao adicionar flexibilidade a dois diferentes projetos (ambos eram programas grficos interativos para aplicaes de engenharia na Petrobras). Mas...

1993

DEL e SOL tinham vrios problemas em comum. Roberto Ierusalimschy, Luiz Henrique de Figueiredo e Waldemar Celes se juntaram para achar uma soluo comum a seus problemas...

O que eles precisavam?


Uma linguagem de configurao genrica; Uma linguagem completa; Facilmente acoplvel; Porttil; O mais simples possvel; Sintaxe no intimidante. Para usurios finais (engenheiros, gelogos etc.)

Como estvamos largando Sol, um amigo sugeriu um novo nome...

10

E da surgiu a Lua

11

Logo, vrios projetos no Tecgraf estavam usando Lua

12

"63% of the main Lightroom-team authored code is Lua", Troy Gaul, Adobe
13

Utilizao

Lua utilizada tambm para implementar software embutido em equipamentos de rede (switches ethernet), aplicaes de simulao em laboratrios de fsica (tendo sido esta uma de suas primeiras utilizaes fora da PUC-Rio, no Observatrio Astrofsico de Smithsonian) etc.

14

Utilizao
Por ter sido desenvolvida completamente em ANSI C, as bibliotecas de Lua podem ser usadas em qualquer plataforma que tenha um compilador compatvel com o padro ANSI. Lua j foi compilada para, entre outras, DOS, Linux, Windows 9x/NT/2000/Me, Solaris, SunOs, AIX, Irix, EPOC, PalmOs, Macintosh, Playstation 2 e PSP- a lista cresce a cada dia.

15

Lua nos Games (o incio)


From: Bret Mogilefsky <mogul@lucasarts.com> To: "'lua@icad.puc-rio.br'" <lua@icad.puc-rio.br> Subject: LUA rocks! Question, too. Date: Thu, 9 Jan 1997 13:21:41 -0800 Hi there... After reading the Dr. Dobbs article on Lua I was very eager to check it out, and so far it has exceeded my expectations in every way! Its elegance and simplicity astound me. Congratulations on developing such a well-thought out language. Some background: I am working on an adventure game for the LucasArts Entertainment Co., and I want to try replacing our older adventure game scripting language, SCUMM, with Lua.

16

17

18

19

20

21

22

23

Utilizao
Lua no desenvolvimento de games
Uma pesquisa realizada em setembro de 2003 pela gamedev.net que a grande maioria dos jogos (72%) desenvolvida com o auxlio de uma linguagem de script. Acoplar uma linguagem de script em um jogo traz vrios benefcios. A linguagem de script pode ser usada para efetivamente implementar o script do jogo, para definir objetos e seus comportamentos, para gerenciar os algoritmos de inteligncia artificial e controlar os personagens, e ainda para tratar os eventos de entrada e descrever a interface com o usurio.

24

Utilizao
Lua no desenvolvimento de games
A escolha de uma linguagem de script simples permite ainda que seja dado a roteiristas e artistas acesso programvel ao jogo, a fim de que eles que possam experimentar novas idias e variaes. Esses profissionais conduzem a maior parte do desenvolvimento real do jogo mas no so em geral programadores profissionais e no esto familiarizados com tcnicas sofisticadas de programao.

Pesquisa na gamedev.net (set/2003):


20% usam Lua 7% usam Phyton

25

Caractersticas
Lua uma linguagem de extenso projetada para dar suporte programao procedural, oferecendo facilidades para descrio de dados. No contexto da programao de jogos, isso significa que Lua possibilita combinar a descrio de objetos e a programao de seus comportamentos num mesmo contexto. Lua uma biblioteca implementada em C, podendo ser compilada em qualquer plataforma que tenha um compilador C padro. Lua tambm pode ser compilada sem alteraes como uma biblioteca C++.

26

Caractersticas
Por ser uma linguagem de extenso, Lua trabalha acoplada a uma aplicao hospedeira (host). Essa aplicao pode criar e ler valores armazenados em Lua, executar funes de Lua e registrar funes C no ambiente de Lua. As funes C registradas em Lua, por sua vez, podem ser invocadas de programas Lua. Dessa forma, podemos conciliar as facilidades de uma linguagem de script oferecidas por Lua com a eficincia das linguagens C e C++. A distribuio da linguagem Lua inclui um programa hospedeiro, lua.c, que pode ser usado para executar scripts Lua interativamente ou em batch.

27

Caractersticas
Para que uma aplicao tenha acesso a Lua, precisamos abrir a biblioteca. Ao final, a aplicao deve fechar a biblioteca. Aps a abertura da biblioteca, a aplicao pode usar os recursos oferecidos por Lua, como por exemplo, executar scripts Lua e acessar dados armazenados em Lua. Programas ou scripts Lua so armazenados em arquivos (usualmente com extenso .lua) ou em strings da aplicao. Um arquivo ou string com cdigo Lua caracteriza o que chamamos de chunk, que simplesmente uma seqncia de comandos Lua.

28

A Linguagem

29

Variveis e Tipos
Em Lua, as variveis no tm tipos associados a elas: os tipos esto associados aos valores armazenados nas variveis. Dessa forma, uma mesma varivel pode num momento armazenar um valor de um tipo e depois passar a armazenar o valor de outro tipo (naturalmente, a varivel deixa de armazenar o valor inicial). O trecho de cdigo abaixo ilustra o uso de variveis armazenando diferentes valores: a = "Exemplo" b = 1.23 ... b = nil a=3 -- a armazena string -- b armazena numero -- b armazena nil -- a armazena numero

30

Variveis e Tipos
Em Lua, variveis globais no precisam ser declaradas. Quando escrevemos a = 3, a varivel a , por default, uma varivel global. Se desejarmos que uma varivel tenha escopo local (a um bloco ou chunk), devemos declar-la previamente usando a palavra reservada local. Por exemplo:

local a ... a=3

31

Os valores em Lua podem ser de oito tipos:

Tipo nil
O tipo nil representa o valor indefinido. Todas as variveis ainda no inicializadas assumem o valor nil. Assim, se o cdigo: a=b for encontrado antes de qualquer atribuio varivel b, ento esta assumida como contendo o valor nil, o que significa que a tambm passa a armazenar nil, independentemente do valor anteriormente armazenado em a.

32

Tipo number
O tipo number representa valores numricos. Lua no faz distino entre valores numricos com valores inteiros e reais. Todos os valores numricos so tratados como sendo do tipo number. Assim, o cdigo a=4 b = 4.0 c = 0.4e1 d = 40e-1

armazena o valor numrico quatro nas variveis a, b, c e d.

33

Tipo string
O tipo string representa cadeia de caracteres. Uma cadeia de caracateres em Lua definida por uma seqncia de caracteres delimitadas por aspas simples (' ') ou duplas (" ").

Por simplicidade, quando a cadeia de caracteres delimitada por aspas duplas, pode-se usar aspas simples no seu contedo, sem necessidade de trat-las como seqncias de escape. Entretanto, para reproduzir na cadeia de caracteres as aspas usadas como delimitadoras, necessrio usar os caracteres de escape. Assim, so vlidas e equivalentes as seguintes atribuies:
s = "Olho d'agua" s = 'Olho d\'agua'

34

Tipo function
Funes em Lua so consideradas valores de primeira classe. Isto significa que funes podem ser armazenadas em variveis, passadas como parmetros para outras funes, ou retornadas como resultados. A definio de uma funo equivale a atribuir a uma varivel global o valor do cdigo que executa a funo. function func1 (...) ... end que pode posteriormente ser executada atravs de uma chamada de funo: func1(...)

35

Tipo userdata
O tipo userdata permite que dados C arbitrrios possam ser armazenados em variveis Lua. Este tipo corresponde a um bloco de memria e no tem operaes prdefinidas em Lua, exceto atribuio e teste de identidade. Contudo, atravs do uso de metatables, o programador pode definir operaes para valores userdata. Valores userdata no podem ser criados ou modificados em Lua, somente atravs da API C. Isto garante a integridade dos dados que pertencem ao programa hospedeiro.

36

Tipo table
O tipo table implementa arrays associativos, isto , arrays que podem ser indexados no apenas por nmeros, mas por qualquer valor (exceto nil).

Tabelas podem ser heterogneas; isto , elas podem conter valores de todos os tipos (exceto nil).
Tabelas so o nico mecanismo de estruturao de dados em Lua; elas podem ser usadas para representar arrays comuns, tabelas de smbolos, conjuntos, registros, grafos, rvores, etc. Para representar registros, Lua usa o nome do campo como um ndice.

37

Tipo thread
O tipo thread representa fluxos de execuo independentes e usado para implementar co-rotinas. No confunda o tipo thread de Lua com processos leves do sistema operacional. Lua d suporte a co-rotinas em todos os sistemas, at mesmo naqueles que no do suporte a processos leves.

Tipo boolean
Boolean o tipo dos valores false e true.

38

Atribuio simples e mltipla


possvel atribuir diversas variveis em um mesmo comando.

Por exemplo:
s, v = "Linguagem Lua", 2

Quando o nmero de variveis listadas esquerda do sinal de igualdade diferente do nmero de resultados direita da igualdade, a linguagem automaticamente ajusta as listas: ou preenchendo as ltimas variveis da esquerda com valores nils ou descartando os ltimos resultados da direita. Por exemplo: a, b = 2 c, d = 2, 4, 6
O cdigo acima atribui 2 varivel a, nil varivel b, 2 varivel c, 4 varivel d, e despreza o valor 6.
39

Atribuio simples e mltipla

A possibilidade de atribuio mltipla permite a troca de valores armazenados em duas variveis com um nico comando. Portanto a, b = b, a faz com que a receba o valor anteriormente armazenado por b e que b receba o valor anteriormente armazenado por a, sem necessidade de variveis temporrias.

40

Operadores relacionais
Os operadores relacionais disponveis em Lua so: < menor que > maior que <= menor que ou igual a >= maior que ou igual a == igual a ~= diferente de Os operadores relacionais retornam o valor nil quando o resultado falso e o valor 1 quando o resultado verdadeiro. Assim, as atribuies

a=4<3 b=4>3
armazenam em a o valor nil e em b o valor 1. Os operadores >, <, >=, <= s so aplicveis em dados do tipo number ou string, e tm a interpretao usual.
41

Controle de fluxo (if)


if condio then bloco end

ou

ou ainda

if condio then bloco1... else bloco2... end

if condio1 then bloco1 elseif condio2 then bloco2 ... elseif condioN then bloco N else bloco N+1 end

42

Lao iterativo (while)


while condio1 do bloco end

Exemplo:

f=1 i=n while i > 0 do f=f*i i=i1 end

43

Lao iterativo (repeat)


repeat bloco until condio1

Exemplo:

f=1 i=n while i > 0 do f=f*i i=i1 end

44

Lao iterativo (for)


for var = exp1, exp2, exp3 do bloco end

Exemplo: for i = 10, 1, -1 do print(i) end

45

Funes
A linguagem Lua trata funes como valores de primeira classe. Isto quer dizer que funes podem ser armazenadas em variveis, podem ser passadas como parmetros para outras funes e podem ser retornadas como resultados de funes. function nome ( [lista-de-parmetros] ) bloco de comandos end A chamada da funo segue a forma bsica nome ( [lista-de-argumentos] ) Lua passa parmetros por valor. Isto quer dizer que quando se altera o valor de um parmetro dentro de uma funo, altera-se apenas o valor da varivel local correspondente ao parmetro. O valor da varivel passada como argumento na chamada da funo permanece inalterado.
46

Funes
Os valores retornados por uma funo so ajustados para a atribuio na linha que faz a chamada. Para exemplificar, supe-se uma funo que incrementa os valores de um ponto cartesiano (x, y):
function translada (x, y, dx, dy) return x+dx, y+dy end Considera-se, agora, que a chamada da funo feita por: a, b = translada(20, 30, 1, 2) Assim, a recebe o valor 21 (=20+1) e b recebe o valor 32 (=30+2).

47

Funes
Seguindo o mesmo exemplo, se a chamada fosse a = translada(20, 30, 1, 2) Ento o segundo valor retornado seria desprezado, e a receberia o valor 21. Por outro lado, a atribuio: a, b, c = translada(20, 30, 1, 2) Faria a= 21, b = 32 e c = nil.

48

LuaJava
Uma ferramenta de scripting para Java

LuaJava uma biblioteca que permite estender a linguagem Java usando Lua como ferramenta de scripting. A grande jogada da biblioteca LuaJava permitir interoperabilidade total entre o ambiente Java e o ambiente Lua. Voc pode, por exemplo, criar classes em Lua e usar uma interface para instance-las em Java, ou ento importar uma biblioteca escrita em Java (seja ela criada por voc ou do pacote padro) e usar em seus scripts Lua.

49

LuaState
O principal objeto da LuaJava o LuaState. O LuaState guarda uma referencia para a mquina virtual Lua, e a partir dele que voc vai carregar arquivos de script, registrar classes, chamar funes, etc. public static void main(String[] args){ LuaState luaState; luaState = LuaStateFactory.newLuaState(); luaState.openLibs(); luaState.LdoFile("helloworld.lua"); luaState.close(); } No arquivo .lua print("Hello World")

50

99 Bottles of Beer
function PrintBottleNumber(n) local bs if n == 0 then bs = "No more bottles" elseif n == 1 then bs = "One bottle" else bs = n .. " bottles" end return bs .. " of beer" end for bn = 99, 1, -1 do write(PrintBottleNumber(bn), " on the wall, \n") write(PrintBottleNumber(bn), "\n") write("Take one down and pass it around,\n") write(PrintBottleNumber(bn-1), " on the wall, \n\n") end write("No more bottles of beer on the wall,\nNo more bottles of beer\n") write("Go to the store, buy some more!\n")

51

Obrigado!
52