Какова семантика движка Geavo для интерпретатора Javascript? - PullRequest
8 голосов
/ 17 апреля 2011

Редактировать

Принимая во внимание ответ ниже относительно ссылки Спецификация языка ECMAScript - 11.13.2 Назначение соединения

Учитывая, почему эти,

javascript:
   o="";  o = o + (o+=1)    ; alert(o);
   o="";  o =     (o+=1) + o; alert(o);

НЕ одинаковы.Существуют временные семантические проблемы с оценкой сценария слева направо (ссылка: Спецификация ECMA. - Оператор сложения ).Одним из следствий этого является то, что оператор + не обязательно является коммутативным.

Это также можно увидеть с помощью:

javascript:
   o=1;  o = o + (o+=1)    ; alert(o);
   o=1;  o =     (o+=1) + o; alert(o);

или

javascript:
   o=" _ ";  o = o + (o+=1)    ; alert(o);
   o=" _ ";  o =     (o+=1) + o; alert(o);

Парадигма ленивой оценки, ошибочно и неправильно использованная мной, создавая тем самым проблему ниже,также является плохим атрибутом моего личного образа действий.


Исходное сообщение

Следующие соображения, возможно, уже были учтены, хотя, похоже, это не так.Если да, можно ли предоставить ссылки на обсуждения?

Формальная денотационная семантика движка исполнения Gecko Javascript - загадка.Эмпирическое тестирование является исчерпывающим и не может быть исчерпывающим.

  • Имеется ли официальная официальная спецификация или официальная ссылка, определяющая, как именно Gecko интерпретирует Javascript?

Ссылка, Спецификация языка ECMAScript , кажется, неадекватна, хотя и предоставляется возможность создания таких сценариев, как,

javascript: alert( function(){return {}}().life=42 )

с последующим значением таких конструкций при связывании значений.

  • Существует ли определенная парадигма, описывающая интерпретацию кода Javascript для оценки объекта и экземпляра?

Это позволило бы прояснить концепцию вызова по (или, скорее, при использовании) потребности, значения, ссылки, логического вывода, имени,... актуально или нет.Таким образом, Javascript является интерпретатором прототипов, придает неявное значение некоторым из перечисленных ниже проблем.

Каков ожидаемый результат:

javascript: o={n:0}; f=function(){o.n+=1; return 10};
   alert([
      o.n,            f(),
      o.n,       o.n+=f(),
      o.n, eval('o.n+=f()'), 
      o.n, eval('o.n+='+f()),
      o.n,
   ].join(",\t"));

?Легко ли предсказать результаты (правильно!)?

Вопрос немного риторический, поскольку он был специально придуман с помощью eval для приведения и подчеркивания тонких нюансов интерпретации.Можно ли разрешить оценку этого сценария (и приведенную ниже) с помощью Спецификации языка ECMAScript или другого документа, на который ссылаются ранее?

(В качестве отступления рассмотрим:

javascript: ra=[];
   alert([
      ra, ra[ra.length]=" partially defined.",
      ra, ra.push("\n RA is not shown"),
      ra, ra.reverse()[42],
   ].join(",\t\t"));

, который отображает:

 RA is not shown, partially defined.,        partially defined.,        
 RA is not shown, partially defined.,       2,      
 RA is not shown, partially defined.,       

, где частичные оценки ra НЕ аналогичны o.n!

и следующим, менее экзотичнымчем при использовании on:

javascript: o=""; f=function(){o+=1; return 0};
   alert([
      o,          f(),
      o,       o+=f(),
      o, eval('o+=f()'), 
      o, eval('o+='+f()),
      o,
   ].join(",\t"));

, который отображает:

,   0,  1,  10, 10, 100,    100,    10010,  10010

)

С учетом следующего сценария:

javascript:
   asn="\t\t and so now,\t o.n is "; nl="\n\n";
   o={}; f=function(){o.n+=1; return 10};
   alert(["Using:\n",window.navigator.userAgent,
   nl,"The function f() is:\n ",f,
   nl,"What the!!?!? \t\t\t\t\t\t\t initially \t\t o.n is ",          o.n = 0,
 nl,"Called as a procedure: \t\tf() is ", f(),                   asn, o.n,
nl,"but, instead of 12 \t\to.n+=f() is ", o.n+=f(),              asn, o.n,
     nl,"however eval'd\t\to.n+=f() is ", eval("o.n+="+f()),     asn, o.n,
    "!\n\nIt makes no functional difference if, instead of o.n, o['n'] is used.",
    "\nThe expected o.n evaluation sequence is 0, 1, (+1+10=) 12, (+1+10=) 23.",
    "\n_____ _____ _____ _____ _____ _____ _____ _____^^ missing in result",
  ].join(""));

Вывод двигателя Gecko:

Using:
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3)
        Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3

The function f() is:
 function () {
    o.n += 1;
    return 10;
}

What the!!?!?                                initially       o.n is 0

Called as a procedure:      f() is 10        and so now,     o.n is 1

but, instead of 12      o.n+=f() is 11       and so now,     o.n is 11

however eval'd          o.n+=f() is 22       and so now,     o.n is 22!

It makes no functional difference if, instead of o.n, o['n'] is used.
The expected o.n evaluation sequence is 0, 1, (+1+10=) 12, (+1+10=) 23.
_____ _____ _____ _____ _____ _____ _____ _____^^ missing in result

1 Ответ

1 голос
/ 17 апреля 2011

JavaScript имеет модель выполнения с нетерпением к оценке (вызов по значению), четко изложенную в стандарте ECMA. Все эти вопросы могут быть решены путем тщательного прочтения стандарта. Например, причина, по которой результат равен 11 выше, а не 12, четко изложена в 11.13.2 стандарта. o.n оценивается до вызова f (), а не после, как указано в шаге 2.

...