No soy un experto en optimización de compiladores. Ni siquiera estoy seguro de qué es "razonable" esperar en cuanto a compiladores u optimizaciones. Solo tengo curiosidad y hacer preguntas es todo.Optimizaciones del compilador de Erlang
En cualquier caso, estaba codificación algo de Erlang en una forma básica como este:
% TOY EXAMPLE 1
test(X) ->
if
X-1 > 0 ->
yes;
X-1 == 0 ->
maybe;
true -> no
end.
Luego entonces optimicé ella con el fin de no hacer la reste dos veces:
% TOY EXAMPLE 2
test(X) ->
Z = X-1,
if
Z > 0 ->
yes;
Z == 0 ->
maybe;
true -> no
end.
Entonces pensé "una pérdida de tiempo, seguramente el compilador optimiza el primer ejemplo en el segundo de todos modos". Así que decidí verificar ejecutando compilar: archivo con la opción 'S' para ambos. Aquí está la salida:
% 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.
No son lo mismo. Si estoy leyendo esto bien (tal vez no), la optimización no se realiza.
puedo ver algunas posibilidades:
La optimización puede llevarse a cabo, simplemente no estoy permitiendo a las optimizaciones porque estoy usando la función incorrecta para compilar, o no usar las banderas correctas, etc.
La optimización simplemente no se realiza.
Otro.
¿Qué es?
Nota: Por favor, no se empantanen con la conversación de "si usa una declaración de caso puede hacer tal o cual cosa" o "puede evitar esto haciendo bla-bla". El objetivo es simplemente probar qué optimizaciones hace o no el compilador de erlang, y por qué o por qué no.
Gracias.
"Eliminación común de subexpresiones" - lo conseguí. Sabía que había escuchado ese término en alguna parte antes. Creo que simplemente optimizaré la mayoría de las cosas y dejaré que Erlang optimice algunas cosas relacionadas con la recursión y otras cosas. –