Javascript.RU

Эвристическое переименование свойств

Где-то посередине между продвинутым и обычным сжатием находится эвристическое переименование.

При его использовании Google Closure Compiler переименует все свойства объекта и прототипа, кроме тех, которые начинаются с _подчеркивания.

Эти свойства оптимизатор считает публичными (да-да, не приватными а публичными) и не переименует вообще.

Например, объявим класс Animal. Он будет состоять из конструктора и методов в прототипе.

/** @constructor */
function Animal() { }
Animal.prototype = {
  speed: 10,
   
  calculateDistance: function(time, speed) {
    return time*speed;
  },
  
  _setSpeed: function(speed) {
    this.speed = speed
  },  
  
  _run: function(time) {     
     alert(this.calculateDistance(time, this.speed))
  }
}

После обычной оптимизации:

function Animal() {
}
Animal.prototype = {speed:10, calculateDistance:function(a, b) {
  return a * b
}, _setSpeed:function(a) {
  this.speed = a
}, _run:function(a) {
  alert(this.calculateDistance(a, this.speed))
}};

После оптимизации с эвристическим переименованием:

function Animal() {
}
Animal.prototype = {a:10, b:function(a, b) {
  return a * b
}, _setSpeed:function(a) {
  this.a = a
}, _run:function(a) {
  alert(this.b(a, this.a))
}};

Как видите, все свойства, кроме _setSpeed, _run были переименованы.

При этом компилятор учел, что speed переименовано в a и также переименовал this.speed в this.a.

Оптимизация касается прототипов и объектов в литеральной нотации {prop: 'val', ...}.

Для определения, какие свойства экспортируемые, а какие нет, Closure Compiler использует класс GoogleCodingConvention, метод isExported которого можно поменять на удобный вам. Например, наоборот сделать экспортируемыми методы без подчеркивания.

Переименованием занимается класс RenamePrototypes, логика методов canRenamePrototypeProperty и canRenameObjLitProperty также в вашем распоряжении.

Чтобы включить эвристическое переименование, можно создать соответствующий флаг.

Этот флаг включен в сборку MyCompiler под именем property_renaming_policy:

--property_renaming_policy=AGGRESSIVE_HEURISTIC

Есть также значение HEURISTIC, но в нем вообще мало смысла, даже рассматривать нет резона.

Продвинутый режим сжатия не совместим (и его не стоит использовать) с эвристическим переименованием, так как он представляет собой следующую ступень агрессивности - переименовывает все подряд.

То есть, по возрастающей идут:

  • Простая оптимизация - сжимаются локальные свойства.
  • Эвристическое переименование (при простой оптимизации) - дополнительно сжимаются все свойства, кроме начинающихся с подчеркивания.
  • Продвинутая оптимизация - сжимается все.

Возможно, эвристическое переименование было промежуточным этапом в разработке компилятора, до продвинутой оптимизации.

Мне было интересно разобраться в этом режиме, но сложно придумать ему применение. Если вам придет в голову что-то дельное - напишите


Автор: vlad0 (не зарегистрирован), дата: 13 января, 2010 - 13:56
#permalink

попробовал я --property_renaming_policy=AGGRESSIVE_HEURISTIC
на моем проекте вываливается с ошибкой "ERROR - Rename prototypes and inline variables cannot be used together"

в сорцах нашел упоминание
if (isInliningForbidden()) {
// In old renaming schemes, inlining a variable can change whether
// or not a property is renamed. This is bad, and those old renaming
// schemes need to die.
return new ErrorPass(compiler, CANNOT_USE_PROTOTYPE_AND_VAR);


Автор: Илья Кантор, дата: 13 января, 2010 - 17:12
#permalink

Видимо вы врубили одновременно ADVANCED оптимизацию.


Автор: Гость (не зарегистрирован), дата: 7 мая, 2010 - 13:11
#permalink

Подтверждаю - если при компиляции указаны опции AGGRESSIVE_HEURISTIC или HEURISTIC - не работает и вываливается с той же ошибкой.
ERROR - Rename prototypes and inline variables cannot be used together

--compilation_level SIMPLE_OPTIMIZATIONS

В режиме же

--compilation_level WHITESPACE_ONLY

просто ничего не делается.


Автор: Гость (не зарегистрирован), дата: 7 мая, 2010 - 13:21
#permalink

Закомментировал вызовы isInliningForbidden - все равно ничего не происходит. Опция совершенно мёртвенькая.


Автор: Zenitchik, дата: 15 июля, 2013 - 13:45
#permalink

В какой версии это ещё работало?


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
8 + 2 =
Введите результат. Например, для 1+3, введите 4.
 
Текущий раздел
Поиск по сайту
Реклама
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum