2012-02-08 12 views
6

Nie jestem ekspertem od optymalizacji kompilacji. Nie jestem nawet pewien, czego można oczekiwać od kompilatorów lub optymalizacji. Jestem po prostu ciekawy, a zadawanie pytań jest wszystkim.Optymalizacje kompilatora Erlang

W każdym razie, było kodowanie trochę Erlang w podstawowej postaci, jak to:

% TOY EXAMPLE 1 
test(X) -> 
    if 
     X-1 > 0 -> 
      yes; 
     X-1 == 0 -> 
      maybe; 
     true -> no 
    end. 

Następnie wtedy optymalizować ją, aby nie robić Odejmij dwukrotnie:

% TOY EXAMPLE 2 
test(X) -> 
    Z = X-1, 
    if 
     Z > 0 -> 
      yes; 
     Z == 0 -> 
      maybe; 
     true -> no 
    end. 

Wtedy pomyślałem "strata czasu" - z pewnością kompilator i tak optymalizuje pierwszy przykład na drugi. " Postanowiłem więc sprawdzić, uruchamiając kompilację: plik z opcją "S" dla obu. Tutaj jest wyjście:

% TOY EXAMPLE 1 
{function, test, 1, 15}. 
    {label,14}. 
    {func_info,{atom,exchange},{atom,test},1}. 
    {label,15}. 
    {gc_bif,'-',{f,16},1,[{x,0},{integer,1}],{x,1}}. 
    {test,is_lt,{f,16},[{integer,0},{x,1}]}. 
    {move,{atom,yes},{x,0}}. 
    return. 
    {label,16}. 
    {gc_bif,'-',{f,17},1,[{x,0},{integer,1}],{x,1}}. 
    {test,is_eq,{f,17},[{x,1},{integer,0}]}. 
    {move,{atom,maybe},{x,0}}. 
    return. 
    {label,17}. 
    {move,{atom,no},{x,0}}. 
    return. 

% TOY EXAMPLE 2 
{function, test, 1, 15}. 
    {label,14}. 
    {func_info,{atom,exchange},{atom,test},1}. 
    {label,15}. 
    {gc_bif,'-',{f,0},1,[{x,0},{integer,1}],{x,0}}. 
    {test,is_lt,{f,16},[{integer,0},{x,0}]}. 
    {move,{atom,yes},{x,0}}. 
    return. 
    {label,16}. 
    {test,is_eq,{f,17},[{x,0},{integer,0}]}. 
    {move,{atom,maybe},{x,0}}. 
    return. 
    {label,17}. 
    {move,{atom,no},{x,0}}. 
    return. 

To nie to samo. Jeśli czytam to dobrze (może nie jestem), optymalizacja nie jest wykonywana.

Widzę kilka możliwości:

  1. Optymalizację można wykonać, ja po prostu nie umożliwia optymalizacje ponieważ używam niewłaściwego funkcji do kompilacji, lub nie stosując odpowiednie flagi, itp.

  2. Optymalizacja właśnie się nie odbywa.

  3. Inne.

Co to jest?

Uwaga: Proszę się nie grzęznąć mówiąc "jeśli użyjesz oświadczenia, że ​​możesz zrobić takie-takie-takie" lub "możesz tego uniknąć, robiąc blah-bla". Chodzi po prostu o sprawdzenie, jakie optymalizacje wykonuje lub czego nie robi kompilator erlang i dlaczego lub dlaczego nie.

Dzięki.

Odpowiedz

4

Masz całkowitą rację - kompilator Beam nie wykonuje żadnej wspólnej eliminacji podwyrażeń. Powodem jest prawdopodobnie to, że w typach programów, do których Erlang jest zwykle używany, nie miałoby to zauważalnego efektu, więc nikt nie zadał sobie trudu, aby go wdrożyć. (W rzadkich przypadkach intensywnego obliczeniowo kodu Erlang programista zwykle nie może się tym zająć, podobnie jak w drugim przykładzie.)

Jeśli skompilujesz kod natywny, możesz uzyskać tego rodzaju optymalizację - kompilator HiPE dokłada większych starań, aby wygenerować dobry kod niskiego poziomu.

+0

"Wspólna eliminacja wyrażeń" - otrzymałem. Wiedziałem, że już wcześniej słyszałem to określenie. Sądzę, że po prostu zoptymam większość rzeczy i pozwolę erlangowi zoptymalizować kilka rzeczy związanych z rekurencją, a co nie. –