25
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

Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

  • Upload
    lehuong

  • View
    254

  • Download
    7

Embed Size (px)

Citation preview

Page 1: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

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

Page 2: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

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

Page 3: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

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

Page 4: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

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

Page 5: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

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

Page 6: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

Primer

x = 20

local y = 30

local function foo ()

return x + y

end

local foo1 = foo

print(foo1())

globalna promenljiva

lokalne promenljive

Page 7: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

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“

Page 8: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

Ostale upotrebe Lue

● Adobe Photoshop Lightroom

● VLC media player

● Apache web server

● Wikipedia

● Cisco Adaptive Security Appliance

● I mnogi drugi

Page 9: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

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/

Page 10: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

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

Page 11: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

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

Page 12: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

Š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

Page 13: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

Š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

Page 14: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

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

Page 15: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

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

Page 16: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

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

Page 17: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

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

Page 18: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

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

Page 19: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

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

Page 20: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

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

Page 21: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

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

Page 22: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje 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

Page 23: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

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

Page 24: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

Hvala na pažnji!

Page 25: Lua i LuaJIT - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/dpj/09/LUA.pdf · Lua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

● Stefan Pejić – [email protected]

● Đorđe Kovačević – [email protected]

● RT-RK, Computer Based Systems

www.rt-rk.com