of 28 /28
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 - · PDF fileLua priručnik: Kako početi? ... Mašinski kod Mašinski kod Izvorni kod. Prevođenje tipa JIT

  • Author
    dokhue

  • View
    250

  • Download
    10

Embed Size (px)

Text of Lua i LuaJIT - · PDF fileLua priručnik: Kako početi? ... Mašinski kod...

  • Lua i LuaJIT

    Stefan Peji ore Kovaevi RT-RK, Computer Based Systems Fakultet tehnikih nauka, Novi Sad Radimo na programskom prevodiocu LuaJIT Dananje teme:

    Programski jezik Lua Programski prevodilac LuaJIT

  • Glavni ciljevi jezika

    Portabilnost Jednostavnost Kompaktnost Skriptovanje

  • Portabilnost

    Podrava mnogo arhitektura Veoma lako se prilagoava novim arhitekturama ANSI C LuaJIT nema ove osobine

    Koristi asembler, noviji C standard i raznovrsne GCC ekstenzije

  • Jednostavnost

    Dinamiki tipiziran jezik

    Nema eksplicitnih tipova Interpretiran

    Nema potrebe za prevoenjem Jednostavna osnovna sintaksa

  • Skriptovanje

    Lua je implentirana kao biblioteka

    Take da je mogue korisiti iz drugih jezika Povezivanje sa drugim aplikacijama i jezicima Pogodan za ugraivanje i proirivanje

    Ugraivanje: korienje Lue u aplikacijama koje nisu napisane u Lui

    Proirivanje: pravljenje modula (biblioteka) za Luu u nekom drugom programskom jeziku

  • Upotreba Lue

    Veliki broj frameworka za pisanje igara LVE, Corona, MOAI, itd. Stingray 3D, Luxinia, Cafu 3D, itd.

    Igre proirive korienjem Lue: The Witcher Far Cry World of Warcraft Google Lua-scripted video games

  • Upotreba Lue

    Adobe Photoshop Lightroom VLC media player Apache web server Wikipedia Cisco Adaptive Security Appliance I mnogi drugi

  • Zanimljive osobine Lue

    Tabele

    Jedan od osnovnih tipova u Lui Mogu se tretirati kao nizovi ili kao mape

    Metatabele

    Slue za definisanje operacija nad tipovima Funkcije

    Kao i tabele, jedan od osnovnih tipova Closure functions

    Anonimne funkcije koje imaju pristup promenljivama roditeljske funkcije

  • Kako poeti?

    Knjiga Programming in Lua, Roberto Ierusalimschy Lua zajednica: www.lua-users.org Mailing lista: http://www.lua.org/lua-l.html Lua prirunik: http://www.lua.org/manual/5.3/

    http://www.lua-users.org/http://www.lua.org/lua-l.htmlhttp://www.lua.org/manual/5.3/

  • Kako poeti?

    Postoji vie implementacija Lue:

    Lua (zvanini 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 najee implementirane Programi pisani za razliite verzije Lue su nekada

    nekompatibilni

    http://www.lua.org/download.htmlhttp://luajit.org/download.html

  • 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 Mainski kod

    Ulazne vrednosti

    Rezultati

  • ta je interpreter?

    Prevodi kod u toku izvravanja Direktno izvrava operacije definisane u izvornom programu

    nad ulaznim podacima Mane:

    za svako novo izvravanje ponavlja kompletno prevoenje ukupno zahteva vie vremena za izvravanje ulaznog programa

    Prednosti:

    koristi mnogo manje memorije bolju dijagnostiku greaka i interaktivno ispitivanje

  • ta je prevodilac tipa JIT?

    Just-In-Time Prevodi deo koda (meukoda) tokom samog izvravanja

    programa u formu ije izvravanje je bre U veini programa postoje kritini delovi koda koji se izvravaju

    uzastopno vie puta Ideja:

    Prevesti kritini deo koda samo jednom i sauvati ga u memoriji Iskoristiti preveden kod svaki naredni put kada treba da se izvri

    isti segment

  • Programski prevodilac LuaJIT

    Koristi se u igrama, grafikim programima, numerikim simulacijama, mrenim i namenskim ureajima...

    LuaJIT se distribuira samo kao paket sa izvornim kodom

    Podrane arhitekture: x86, x64, PPC, ARM, ARM64, MIPS, MIPS64

  • Programski prevodilac LuaJIT

    Visoke performanse

    Neuporedivo mala upotreba memorije Znatno bre izvravanje koda napisanog u Lui

    Fleksibilnost

    Kompatibilan sa svim verzijama Lue do verzije 5.1 Modul za operacije nad bitima FFI (Foreign Function Interface) modul

  • LuaJIT interpreter

    Napisan u asembleru (DynASM) Interpretira bajt kod (Bytecode)

    Bajt kod instrukcija se zameni odgovarajuim mainskim kodom

    Sopstveni format bajt koda

    Dva formata instrukcija Razlikovanje po tipu operanada (pr.

    ADDVN)

    B C A OPB A OP

  • LuaJIT interpreter

    Lua code:-----------------------local x = 5

    for i = 1,100 do x = x + iend

    io.write(x)

    Bytecode:------------------------------------0001 KSHORT 0 50002 KSHORT 1 10003 KSHORT 2 1000004 KSHORT 3 10005 FORI 1 => 00080006 => ADDVV 0 0 40007 FORL 1 => 00060008 => GGET 1 0 ; "io"0009 TGETS 1 1 1 ; "write"0010 MOV 2 00011 CALL 1 1 20012 RET0 0 1

  • LuaJIT interpreter

    caseBC_KSHORT:|//RA=dst,RC=int16_literal|sxthRCw,RCw|addTMP0,RC,TISNUM|strTMP0,[BASE,RA,lsl#3]|ldrINSw,[PC],#4|addTMP1,GL,INS,uxtb#3|decode_RARA,INS|ldrTMP0,[TMP1,#GG_G2DISP]|decode_RDRC,INS|brTMP0break;

    lj_BC_KSHORT:.long0x13003f9c,0x8b180388,0xf83b7a68,0xb84046b0.long0x8b300ec9,0xd3483e1b,0xf9479928,0xd3507e1c.long0xd61f0100

  • Prevoenje tipa JIT

    Generisanje mainskog

    koda

    Generisanje mainskog

    koda

    Izvorni kod

    ParsiranjeParsiranje InterpretiranjeInterpretiranje

    Snimanje tragova

    Snimanje tragova

    Optimizovanje meukoda

    Optimizovanje meukoda

    Meukodinterpretera

    Meukod interpretera

    Meukod prevodioca

    Optimizovanmeukod

    Mainski kod

    Mainskikod

    Izvorni kod

  • Prevoenje tipa JIT

    LuaJIT je prevodilac tipa tracing JIT Vri formiranje koda bazirano na tragovima u toku izvravanja

    Realizovano u programskom jeziku C Generie IR instrukcije na osnovu bajt koda IR instrukcije su:

    64 bita Kod operacije i 2 operanda Svaka ima tip povratne vrednosti Jedinstveno referencirane svojim poloajem u nizu

  • IR kod

    IR code:---------------------------------0001 int SLOAD #3 I0002 > int SLOAD #2 T0003 >+ int ADDOV 0002 00010004 + int ADD 0001 +1 0005 > int LE 0004 +1000006 ------ LOOP ------------0007 >+ int ADDOV 0004 00030008 + int ADD 0004 +1 0009 > int LE 0008 +1000010 int PHI 0004 00080011 int PHI 0003 0007

    Lua code:----------------------local x = 5

    for i = 1, 100 do x = x + iend

    io.write(x)

    Byte code:--------------------------TRACE1starttest.lua:40006ADDVV0040007FORL1=>0006

  • IR kod

    IR code:---------------------------------

    ---- TRACE 1 IR0001 int SLOAD #3 I0002 > int SLOAD #2 T0003 >+ int ADDOV 0002 00010004 + int ADD 0001 +1 0005 > int LE 0004 +1000006 ------ LOOP ------------0007 >+ int ADDOV 0004 00030008 + int ADD 0004 +1 0009 > int LE 0008 +1000010 int PHI 0004 00080011 int PHI 0003 0007

    Machine code:------------------------------------- TRACE 1 mcode 720058ff9c mov x0, #65529, lsl #160058ffa0 ldr w27, [x19, #8]0058ffa4 ldr x28, [x19]0058ffa8 cmp x0, x28, lsr #320058ffac bne 0x0058fff0 ->00058ffb0 adds w28, w28, w270058ffb4 bvs 0x0058fff0 ->00058ffb8 add w27, w27, #10058ffbc cmp w27, #1000058ffc0 bgt 0x0058fff4 ->1->LOOP:0058ffc4 mov x26, x280058ffc8 adds w28, w27, w260058ffcc bvs 0x0058fff8 ->20058ffd0 add w27, w27, #10058ffd4 cmp w27, #1000058ffd8 ble 0x0058ffc4 ->LOOP0058ffec b 0x0058fffc ->3---- TRACE 1 stop -> loop

  • Interpreter vs. JITInterpreter:

    ---------------------------------Dumpofassemblercodeforfunctionlj_BC_ADDVV:=>0x00434308: ubfx x17,x16,#24,#80x0043430c: and x28,x28,#0xff0x00434310: ldr x0,[x19,x17,lsl#3]0x00434314: ldr x1,[x19,x28,lsl#3]0x00434318: cmp x25,x0,lsr#320x0043431c: b.ne 0x4343500x00434320: cmp x25,x1,lsr#320x00434324: b.ne 0x4343500x00434328: adds w0,w0,w10x0043432c: b.vs 0x435eb80x00434330: add x0,x0,x240x00434334: str x0,[x19,x27,lsl#3]0x00434338: ldr w16,[x21],#40x0043433c: add x9,x22,w16,uxtb#30x00434340: ubfx x27,x16,#8,#80x00434344: ldr x8,[x9,#3888]0x00434348: ubfx x28,x16,#16,#160x0043434c: br x80x00434350: ldr d0,[x19,x17,lsl#3]0x00434354: ldr d1,[x19,x28,lsl#3]0x00434358: cmp x25,x0,lsr#320x0043435c: b.ls 0x435eb80x00434360: cmp x25,x1,lsr#320x00434364: b.ls 0x435eb80x00434368: fadd d0,d0,d10x0043436c:str d0,[x19,x27,lsl#3]0x00434370:b 0x434338Dumpofassemblercodeforfunctionlj_BC_FORL:=>0x00435480: lsr x0,x21,#10x00435484: and x0,x0,#0x7e0x00435488: add x0,x0,#0xeb00x0043548c: ldrh w1,[x22,x0]0x00435490: subs x1,x1,#0x20x00435494: strh w1,[x22,x0]0x00435498: b.cc 0x437060

    JIT:----------------------0058ff9cmovx0,#65529,lsl#160058ffa0ldrw27,[x19,#8]0058ffa4ldrx28,[x19]0058ffa8cmpx0,x28,lsr#320058ffacbne0x0058fff0 >00058ffb0movw28,w280058ffb4addsw28,w28,w270058ffb8bvs0x0058fff0 >00058ffbcaddw27,w27,#10058ffc0cmpw27,#1000058ffc4bgt0x0058fff4 >1>LOOP:0058ffc8addsw28,w27,w280058ffccbvs0x0058fff8 >20058ffd0addw27,w27,#10058ffd4cmpw27,#1000058ffd8ble0x0058ffc8 >LOOP0058ffdcb0x0058fffc >3

    Byte code:--------------------------TRACE1starttest.lua:40006ADDVV0040007FORL1=>0006

  • Uporedni test

    n = 40

    0 5 10 15 20 25

    LuaJITLuaJIT (interpreter)Lua

    localfunctionfib(n)ifn

  • Prilagoavanje LuaJITa

    Arhitekturi MIPS32 bez jedinice za operacije u aritmetici pokretnog zareza (soft-float)

    Arhitekturi ARM64 Arhitekturi MIPS64 Koraci:

    Prilagoavanje interpretera Prilagoavanje prevoenja tipa JIT

  • Prilagoavanje LuaJITa