Upload
lehuong
View
254
Download
7
Embed Size (px)
Citation preview
Lua i LuaJIT
● Stefan Pejić
● Đorđe Kovačević
● RT-RK, Computer Based Systems
● Fakultet tehničkih nauka, Novi Sad
● Radimo na programskom prevodiocu LuaJIT
● Današnje teme:
– Programski jezik Lua
– Programski prevodilac LuaJIT
Programski jezik Lua
● Skriptni jezik
– Interpretiran
– Dinamički tipiziran
– Python, Ruby, JavaScript, itd.
● Koristi se u različite svrhe
– Pisanje igara (veoma rasprostranjen!)
– Pisanje proširenja za programe (često)
– Pisanje testova
– Pisanje konfiguracija
– Opisivanje podataka
Osobine Lue
● Jednostavan jezik
– Pogodan za početnike
– Pogodan za osobe kojima programiranje nije primarna delatnost● Kompaktan
– Poseduje jako malu standardnu biblioteku
– Pogodan za upotrebu na namenskim uređajima● Poseduje mehanizme za širok skup funkcionalnosti
– Pogodan za kompleksne projekte● Ugradiv
– Lako se spreže sa drugim programskim jezicima
Osobine Lue
● Dinamičko tipiziranje
● Automatsko upravljanje memorijom
● Funkcije se tretiraju kao i tipovi
● Mehanizam za konkurentno izvršavanje programa
● Mehanizmi za:
– Objektno programiranje
– Funkcionalno programiranje
– Proceduralno programiranje
● Znatna upotreba tabela
Osobine Lue
● Lokalne i globalne promenljive
● Iteratori
● Moduli (biblioteke)
● Metatabele
● Opet tabele!
– Tabele su osnovna struktura podataka u Lui!
– Ostale strukture se predstavljaju tabelama
– Objekti/klase se predstavljaju tabelama
– Tabele se mogu koristiti kao namespace
Primer
x = 20
local y = 30
local function foo ()
return x + y
end
local foo1 = foo
print(foo1())
globalna promenljiva
lokalne promenljive
Lua u gaming industriji
● Veliki broj frameworka za pisanje igara
– LÖVE, Corona, MOAI, itd.
– Stingray 3D, Luxinia, Cafu 3D, itd.
● Igre proširive korišćenjem Lue:
– The Witcher
– Far Cry
– World of Warcraft
– Google „Lua-scripted video games“
Ostale upotrebe Lue
● Adobe Photoshop Lightroom
● VLC media player
● Apache web server
● Wikipedia
● Cisco Adaptive Security Appliance
● I mnogi drugi
Kako početi?
● Knjiga „Programming in Lua“, Roberto Ierusalimschy
● Lua zajednica: www.lua-users.org
● Mailing lista: http://www.lua.org/lua-l.html
● Lua priručnik: http://www.lua.org/manual/5.3/
Kako početi?
● Postoji više implementacija Lue:
– Lua (zvanični kompajler) i LuaJIT su najpoznatiji kompajleri za Luu
– http://www.lua.org/download.html
– http://luajit.org/download.html● Postoji nekoliko verzija Lue
– 5.1, 5.2 i 5.3 su najčešće implementirane
– Programi pisani za različite verzije Lue su nekada nekompatibilni
Programski prevodilac LuaJIT
● Programski prevodilac
● LuaJIT programski prevodilac za jezik Lua
– Nezavisna realizacija interpretera Lue sa prevodiocem tipa JIT
Prevodilac
IRPrednji kraj (analiza)
Zadnji kraj (sinteza)Izvorni kod Mašinski kod
Ulazne vrednosti
Rezultati
Šta je interpreter?
● Prevodi kod u toku izvršavanja
● Direktno izvršava operacije definisane u izvornom programu nad ulaznim podacima
● Mane:
– za svako novo izvršavanje ponavlja kompletno prevođenje
– ukupno zahteva više vremena za izvršavanje ulaznog programa
● Prednosti:
– koristi mnogo manje memorije
– bolju dijagnostiku grešaka i interaktivno ispitivanje
Šta je prevodilac tipa JIT?
● Just-In-Time
● Prevodi kod (međukod) tokom samog izvršavanja programa u formu čije izvršavanje je brže
● U većini programa postoje kritični delovi koda koji se izvršavaju uzastopno više puta
● Prevesti kritični deo koda samo jednom, sačuvati ga u memoriji i iskoristiti svaki naredni put kada treba da se izvrši isti segment
Programski prevodilac LuaJIT
● Znatno brže izvršavanje koda napisanog u Lui
● Koristi se u igrama, grafičkim programima, numeričkim simulacijama, mrežama, namenskim uređajima...
● Fleksibilnost
● Visoke performanse
● Neuporedivo mala upotreba memorije
Programski prevodilac LuaJIT
● LuaJIT se distribuira samo kao paket sa izvornim kodom
● Podržane arhitekture: x86, x64, ARM, MIPS, PPC
● Kompatibilan sa svim verzijama Lue do verzije 5.1
● Modul za operacije nad bitima
● FFI (Foreign Function Interface) modul
Interpreter LuaJITa
● Napisan u asembleru
● Interpreter bajt koda
● Sopstveni format bajt koda
– Dva formata instrukcija
– Razlikovanje po tipu operanada (pr. ADDVN)
● Direktno razrešavanje instrukcija
B C A OP
B A OP
Interpreter LuaJITa
Lua code:-----------------------local min = 100 local max = 1000local write = io.write
for i = min, max do write("Hello!")end
Bytecode:------------------------------------0001 KSHORT 0 1000002 KSHORT 1 10000003 GGET 2 0 ; "io"0004 TGETS 2 2 1 ; "write"0005 MOV 3 00006 MOV 4 10007 KSHORT 5 10008 FORI 3 => 00130009 => MOV 7 20010 KSTR 8 2 ; "Hello!"0011 CALL 7 1 20012 FORL 3 => 00090013 => RET0 0 1
Prevođenje tipa JIT
Generisanje mašinskog
koda
Generisanje mašinskog
koda
Izvorni kod
ParsiranjeParsiranje InterpretiranjeInterpretiranje
Snimanje tragova
Snimanje tragova
Optimizovanje međukoda
Optimizovanje međukoda
Međukod
interpretera
Međukod interpretera
Međukod prevodioca
Optimizovanmeđukod
Mašinski kod
Mašinski
kod
Izvorni kod
Prevođenje tipa JIT
● LuaJIT je prevodilac tipa tracing JIT
– Vrši formiranje koda bazirano na tragovima u toku izvršavanja
● Realizovano u programskom jeziku C
● Generiše IR instrukcije na osnovu bajt koda
● IR instrukcije su:
– 64 bita
– Kod operacije i 2 operanda
– Svaka ima tip povratne vrednosti
– Jedinstveno referencirane svojim položajem u nizu
IR kod
IR code:---------------------------------0001 int SLOAD #2 CI0002 > num SLOAD #1 T0003 num CONV 0001 num.int0004 + num ADD 0003 00020005 + int ADD 0001 +1 0006 > int LE 0005 +1000007 ------ LOOP ------------0008 num CONV 0005 num.int0009 + num ADD 0008 00040010 + int ADD 0005 +1 0011 > int LE 0010 +1000012 int PHI 0005 00100013 num PHI 0004 0009
Lua code:-----------------------local x = 5
for i = 1, 100 do X = x + iend
Prilagođavanje LuaJITa
● Arhitekturi MIPS32 bez jedinice za operacije u aritmetici pokretnog zareza (soft-float)
● Arhitekturi MIPS64
● Koraci:
– Prilagođavanje interpretera
– Prilagođavanje prevođenja tipa JIT
Prilagođavanje interpretera
● Prilagođavanje ABI-ja
– MIPS sa koprocesorom: argumenti funkcije u koprocesorskim registrima
– MIPS bez koprocesora: argumenti u registrima opšte namene
– Modifikovanje koda pri pozivu i povratku iz funkcije
● Aritmetičke operacije
– Pozivanje funkcija napisanih u C-u koje obavljaju datu operaciju
● Operacije poređenja
– Povratna vrednost ukazuje na relaciju između operanada
– Osnova za funkcije min, max i for petlje
Prilagođavanje JIT prevođenja
● Prevođenje tipa JIT implementirano u C-u
● Modifikovanje funkcija koje prevode dati međukod prevodioca u sekvencu mašinskih instrukcija
● Prilagođavanje ABI-ja
● Funkcije za čitanje i upis sadržaja u memoriju
● Funkcije min i max
Hvala na pažnji!
● Stefan Pejić – [email protected]
● Đorđe Kovačević – [email protected]
● RT-RK, Computer Based Systems
www.rt-rk.com