Kompilator Ruby – C
Jan Stępień Julian Zubek
2 lutego 2011
Slide 2
Slide 2 text
Ruby jest wolny
Źródło: http://shootout.alioth.debian.org
Slide 3
Slide 3 text
Ruby jest wolny
Przetłumaczmy Ruby na C!
Slide 4
Slide 4 text
Cele projektu
Ruby −→ binarny plik wykonywalny
Uzyskać krótszy czas wykonania
Slide 5
Slide 5 text
Wspierany podzbiór Ruby
Obiektowość: klasy, obiekty, metody, pola
Dynamiczne nadpisywanie metod
Uproszczone bloki
Ułamek biblioteki standardowej
Slide 6
Slide 6 text
Schemat działania
Wczytanie kodu
Parsowanie
Translacja
Generowanie kodu C
Kompilacja
Linkowanie
Kod Ruby
AST Ruby
AST C
Kod C
Plik obiektowy
Slide 7
Slide 7 text
Schemat działania
Wczytanie kodu
Parsowanie
Translacja
Generowanie kodu C
Kompilacja
Linkowanie
ruby parser
GCC
Slide 8
Slide 8 text
Narzędzia
Translator napisany w Ruby
Biblioteka standardowa w C
Parser: ruby parser
Garbage collector: BDWGC
Struktury danych: GLib
Slide 9
Slide 9 text
Proste wyrażenia
b = 0
a = if b
a = 1
b = 2
end
Object *b;
b = (Fixnum_new (0));
Object *a;
Object *var1;
if (boolean_value (b)) {
a = (Fixnum_new (1));
b = (Fixnum_new (2));
var1 = b;
}
a = var1;
Slide 10
Slide 10 text
Obiekty
typedef struct {
uint32_t type;
} Object;
typedef struct {
Object parent;
int val;
} Fixnum;
Slide 11
Slide 11 text
Tłumaczenie klas
class A
def set(a)
@a = a
end
def get
@a
end
end
typedef struct {
Object meta;
Object *a;
} A;
Object * A_set_Fixnum(Object *self,
Object *a) {
(((A *) self)->a) = a;
return ((A *) self)->a;
}
Object * A_get(Object *self) {
return ((A *) self)->a;
}
Biblioteka standardowa
class Fixnum
defined_in_stdlib
def /(arg)
defined_as :Fixnum__DIV_
Fixnum.returned_if Fixnum
Float.returned_if Float
end
def to_s
defined_as :Fixnum_to__s
returns String
end
# I tak dalej...
end
Slide 22
Slide 22 text
Zgodność z Ruby 1.9
97% pokrycia kodu testami
Cel: odpalić RubySpec
quicksort.rb – rekurencja i tablice
main
0 (0.0%)
of 266 (100.0%)
M_Object_qsort_Array
21 (7.9%)
of 262 (98.5%)
262
Fixnum_new
10 (3.8%)
of 126 (47.4%)
boolean_value
8 (3.0%)
1
3226
53
call_method
20 (7.5%)
of 80 (30.1%)
80
Array_length
1 (0.4%)
of 74 (27.8%)
52
Array_push
2 (0.8%)
of 36 (13.5%)
27
Array__INDEX_
10 (3.8%)
7
7
xmalloc_atomic
4 (1.5%)
of 116 (43.6%)
115
Garbage
54.8%
collector
112
22 9
3
Float__LT_
6 (2.3%)
of 8 (3.0%)
8
Array_method_find
6 (2.3%)
of 7 (2.6%)
7
72
Slide 27
Slide 27 text
strings.rb – bardzo długie stringi
String__PLUS_
0 (0.0%)
of 1232 (98.2%)
*__GI_strncpy
801 (63.8%)
801
String_new
0 (0.0%)
of 400 (31.9%)
393
__strlen_sse2
38 (3.0%)
38
xmalloc_atomic
0 (0.0%)
of 304 (24.2%)
295
g_string_append_len
0 (0.0%)
of 99 (7.9%)
99
GC_malloc_atomic
0 (0.0%)
of 304 (24.2%)
GC_generic_malloc
0 (0.0%)
of 298 (23.7%)
294
304
290
main
1 (0.1%)
of 261 (20.8%)
242
Garbage
23.7%
collector
__memcpy_ssse3
99 (7.9%)
g_slice_alloc
(inline)
0 (0.0%)
of 99 (7.9%)
g_string_append_len
(inline)
0 (0.0%)
of 99 (7.9%)
99
99
99
99
198
Slide 28
Slide 28 text
Dalszy rozwój
Brakujące elementy Ruby: lambdy, moduły,
wątki, wyjątki, biblioteka standardowa...
Optymalizacja przetwarzanego kodu
Wykorzystanie rozwiązań z YARV
Optymalizacja wyszukiwania metod
Dalsza praca nad statycznym
rozpoznawaniem typów
RubySpec, self-hosting
Slide 29
Slide 29 text
Open source już wkrótce
(jak tylko nie będziemy się mieli czego wstydzić)
Źródła zdjęć
http://flickr.com/photos/10943651@N00/3044525754
http://flickr.com/photos/thomasgraham/2360853639
Prezentację utworzono przy pomocy pakietu L
A
TEX.