Architektura maszyny wirtualnej Implementacja maszyny Śledzenie operacji Kilka uwag na zakończenie Kurs języka Lua Wykład 11 Lua VM architektura Kornel Kisielewicz Instytut Informatyki Uniwersytet Wrocławski 20-01-2011 / Wykład 11 university-logo Architektura maszyny wirtualnej Implementacja maszyny Śledzenie operacji Kilka uwag na zakończenie Spis treści 1 Architektura maszyny wirtualnej Założenia architektury Reprezentacja wartości Tablice 2 Implementacja maszyny Rejestry Operacje 3 Śledzenie operacji Proste przykłady Złożone przykłady 4 Kilka uwag na zakończenie university-logo Architektura maszyny wirtualnej Implementacja maszyny Śledzenie operacji Kilka uwag na zakończenie Spis treści 1 Architektura maszyny wirtualnej Założenia architektury Reprezentacja wartości Tablice 2 Implementacja maszyny Rejestry Operacje 3 Śledzenie operacji Proste przykłady Złożone przykłady 4 Kilka uwag na zakończenie university-logo Architektura maszyny wirtualnej Implementacja maszyny Śledzenie operacji Kilka uwag na zakończenie Założenia architektury Założenia architektury Założenia architektury prostota najmniejszy zbiór, najmniejszy kod efektywność szybka kompilacja, szybkie wykonanie przenośność czysta implementacja ANSI C bez C-izmów osadzalność proste lecz silne API C opierające się na typach C, jednocześnie mały rozmiar API i Lua university-logo Architektura maszyny wirtualnej Implementacja maszyny Śledzenie operacji Kilka uwag na zakończenie Założenia architektury Założenia architektury Konflikty założeń efektywność szybki kompilator a szybkie wykonywanie efektywność a prostota sprytny kompilator a mały kompilator i inne... university-logo Architektura maszyny wirtualnej Implementacja maszyny Śledzenie operacji Kilka uwag na zakończenie Reprezentacja wartości Reprezentacja wartości Struktura wewnątrzna typedef struct { int t; Value v; } TObject; typedef union { GCObject *gc; void *p; lua_Number n; int b; } Value; Uwagi łancuchy - stałość, hashowanie i rozmiar rozmiar Value obiektowość GCObject university-logo Architektura maszyny wirtualnej Implementacja maszyny Śledzenie operacji Kilka uwag na zakończenie Tablice Tablice Hybrydowe rozwiązanie przypisanie indeksu 10000000000 dualne rozwiązanie heurystyka - połowa zajętości 1..n, przynajmniej jeden zajęty element > n/2 university-logo Architektura maszyny wirtualnej Implementacja maszyny Śledzenie operacji Kilka uwag na zakończenie Spis treści 1 Architektura maszyny wirtualnej Założenia architektury Reprezentacja wartości Tablice 2 Implementacja maszyny Rejestry Operacje 3 Śledzenie operacji Proste przykłady Złożone przykłady 4 Kilka uwag na zakończenie university-logo Architektura maszyny wirtualnej Implementacja maszyny Śledzenie operacji Kilka uwag na zakończenie Prototyp string i list [string] size_t - rozmiar byte[] - dane, zawierają NUL na końcu (więc size_t = #str+1!) [list] int - ilość elementów elem[] - dane, ilość zgodnie z powyższym university-logo Architektura maszyny wirtualnej Implementacja maszyny Śledzenie operacji Kilka uwag na zakończenie Prototyp chunk byte[4] - sygnatura Header signature: ESC, Lua or 0x1B4C7561 byte - wersja Lua (0x51/81 dec) dla Lua 5.1 (high - major, low - minor byte - wersja formatu (0=ofcjalna) byte - flaga endian (domyślnie 1 dla LE) byte - rozmiar int (domyślnie 4) byte - rozmiar size_t (domyślnie 4) byte - rozmiar instrukcji (domyślnie 4) byte - rozmiar lua_Number (domyślnie 8) byte - flaga lua_Number integral (domyślnie 0) Domyślnie na x86/LE/IEEE754/double nagłówek wynosi zawsze: 1B4C7561 51000104 04040800 university-logo Architektura maszyny wirtualnej Implementacja maszyny Śledzenie operacji Kilka uwag na zakończenie Prototyp function prototype string - nazwa zródła int - line number int - ostatni line number byte - liczba upvalues byte - liczba parametrów byte - maska VARARG 1 = VARARG_HASARG 2 = VARARG_ISVARARG 4 = VARARG_NEEDSARG byte - maksymalny rozmiar stosu (ilość użytych rejestrów) list - lista instrukcji (code) list - lista stałych list - lista prototypów funkcji list - lista pozycji w kodzie (opcjonalny debug data) list - lista zmiennych lokalnych (opcjonalny debug data) list- lista upvalue (opcjonalny debug data) university-logo Architektura maszyny wirtualnej Implementacja maszyny Śledzenie operacji Kilka uwag na zakończenie Pozostałe struktury [const] byte - typ ( 0=LUA_TNIL, 1=LUA_TBOOLEAN, 3=LUA_TNUMBER, 4=LUA_TSTRING ) data[]- tylko jeśli typ <> 0 [d_loc] string - nazwa zmiennej lokalnej int - początek zasięgu int - koniec zasięgu university-logo Architektura maszyny wirtualnej Implementacja maszyny Śledzenie operacji Kilka uwag na zakończenie Rejestry Rejestry Rejestry unikamy zbędnego (drogiego) kopiowania unikamy zbędnych operacji push pop prędkość działania wiele innych zalet! university-logo Architektura maszyny wirtualnej Implementacja maszyny Śledzenie operacji Kilka uwag na zakończenie Rejestry Rejestry local a,t,i 1: PUSHNIL 0 2 a=a+i 2: GETLOCAL 0 3: GETLOCAL 2 4: ADD 5: SETLOCAL 0 a=a+1 6: GETLOCAL 0 7: ADDI 1 8: SETLOCAL 0 a=t[i] 9: GETLOCAL 0 10: GETINDEXED 2 11: SETLOCAL 0 -------------- local a,t,i 1: LOADNIL 0 2 0 a=a+i 2: ADD 0 0 2 a=a+1 3: ADD 0 0 256 a=t[i] 4: GETTABLE 0 1 2 university-logo Architektura maszyny wirtualnej Implementacja maszyny Śledzenie operacji Kilka uwag na zakończenie Operacje Układ danych Układ danych insrtukcja zajmuje 32 bity są trzy typy instrukcji iABC, iABx i iAsBx kod operacji zajmuje 6 bitów, A zajmuje 8 bitów B i C zajmują 9 bitów, Bx i sBx 18 university-logo Architektura maszyny wirtualnej Implementacja maszyny Śledzenie operacji Kilka uwag na zakończenie Operacje Lista operacji Lista operacji Sięgnijmy do zródeł :) university-logo Architektura maszyny wirtualnej Implementacja maszyny Śledzenie operacji Kilka uwag na zakończenie Spis treści 1 Architektura maszyny wirtualnej Założenia architektury Reprezentacja wartości Tablice 2 Implementacja maszyny Rejestry Operacje 3 Śledzenie operacji Proste przykłady Złożone przykłady 4 Kilka uwag na zakończenie university-logo Architektura maszyny wirtualnej Implementacja maszyny Śledzenie operacji Kilka uwag na zakończenie Proste przykłady Prototyp string i list local a,b = 10; b = a local a,b,c,d,e = nil,nil,0 || local a,b,d,e local c=0 local a,b,c,d = 3,"foo",3,"foo" local a = 5 > 2 a = 40; local b = a local p = {}; p[1] = "foo"; return p["bar"] local a,b = 2,4; a = a + 4 b - a / 2 ^ b % 3 * local a = b + (4 + 7) local x,y = "foo","bar"; return x..y..x..y university-logo Architektura maszyny wirtualnej Implementacja maszyny Śledzenie operacji Kilka uwag na zakończenie Złożone przykłady Prototyp string i list z() || z(1,2,3) || local p,q,r,s = z(y()) print(string.char(64)) local a,b,c; c = a and b local a = 1; while a < 10 do a = a + 1 end local q = {1,2,3,4,5,} local m \ function p() \ local n \ function q() return m,n end \ end university-logo Architektura maszyny wirtualnej Implementacja maszyny Śledzenie operacji Kilka uwag na zakończenie Spis treści 1 Architektura maszyny wirtualnej Założenia architektury Reprezentacja wartości Tablice 2 Implementacja maszyny Rejestry Operacje 3 Śledzenie operacji Proste przykłady Złożone przykłady 4 Kilka uwag na zakończenie university-logo Architektura maszyny wirtualnej Implementacja maszyny Śledzenie operacji Kilka uwag na zakończenie Do czego nam ta wiedza? Do czego nam ta wiedza? lepsze zrozumienie efektywności języka analiza i optymalizacja LuaVM jako maszyna docelowa LuaVM do kodu maszynowego! university-logo