Оптимизация компилятора Erlang

Я не эксперт по оптимизации компиляторов. Я даже не уверен, чего «разумного» ожидать в отношении компиляторов или оптимизаций. Мне просто любопытно, и я задаю вопросы.

Во всяком случае, я кодировал некоторый Erlang в базовой форме, такой как:

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

Затем я оптимизировал его, чтобы не выполнять вычитание дважды:

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

Тогда я подумал, что «пустая трата времени - конечно, компилятор все равно оптимизирует первый пример во второй ". Поэтому я решил проверить, запустив compile: file с опцией «S» для обоих. Вот вывод:

% 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.

Они не совпадают. Если я правильно это прочитал (а может, и нет), оптимизация не выполняется.

Я вижу несколько возможностей:

  1. Оптимизация может быть выполнена, я просто не включаю оптимизацию, потому что я использую неправильную функцию для компиляции или не использую правильные флаги и т. Д.

  2. Оптимизация просто не производится.

  3. Другое.

Что это такое?

Примечание: пожалуйста, не увязайте в разговорах о том, «если вы используете оператор case, вы можете сделать то-то и то-то» или «вы можете избежать этого, выполнив бла-бла». " Дело в том, чтобы просто проверить, какие оптимизации делает компилятор erlang, а какие нет, и почему или почему нет.

Спасибо.

7
задан X Z 8 February 2012 в 12:27
поделиться