Как работает оптимизатор прочности?

Компилятор для надежности поддерживает флаг --optimize, который выполняет некоторый набор оптимизаций для скомпилированного кода надежности, что обычно приводит к снижению затрат на газ.

Как работает оптимизатор и какие примеры оптимизаций он сделает?

16 голосов | спросил Piper Merriam 27 Jam1000000amWed, 27 Jan 2016 03:57:00 +030016 2016, 03:57:00

1 ответ


15

Оптимизатор кажется мне волшебным даже для меня. Крисет (он главный разработчик DEV твердости ), вероятно, будет в лучшем положении, чтобы ответить на ваш вопрос, чем я. Вот интересный обзор высокого уровня, хотя я надеюсь ответить на ваш вопрос.

Все ниже представлено документами по надежности .

  

Внутренние - Оптимизатор

     

Оптимизатор Solidity работает на сборке, поэтому он может использоваться и использоваться другими языками. Он разбивает последовательность инструкций на базовые блоки в JUMP и JUMPDEST. Внутри этих блоков анализируются инструкции, и каждая модификация стека в память или память записывается как выражение, которое состоит из инструкции и списка аргументов, которые по существу указывают на другие выражения. Основная идея - найти выражения, которые всегда равны (на каждом входе) и объединить их в класс выражения. Оптимизатор сначала пытается найти каждое новое выражение в списке уже известных выражений. Если это не сработает, выражение упрощается согласно правилам, таким как константа + константа = sum_of_constants или X * 1 = X. Так как это выполняется рекурсивно, мы также можем применить последнее правило, если второй фактор является более сложным выражением, где мы знайте, что он всегда будет оценивать один. Изменения в хранилищах и ячейках памяти должны стирать знания о местах хранения и памяти, которые, как известно, не различаются: если мы сначала напишем в местоположение x, а затем в местоположение y, и оба являются входными переменными, вторая может перезаписать первую, поэтому мы на самом деле не знаю, что хранится в x после того, как мы написали y. С другой стороны, если упрощение выражения x - y оценивается с ненулевой константой, мы знаем, что мы можем хранить наши знания о том, что хранится в x.

     

В конце этого процесса мы знаем, какие выражения должны быть в стеке в конце и иметь список изменений в памяти и хранилище. Эта информация хранится вместе с базовыми блоками и используется для их связывания. Кроме того, знания о конфигурации стека, памяти и памяти передаются в следующий блок (ы). Если мы знаем цели всех инструкций JUMP и JUMPI, мы можем построить полный график потока управления программой. Если есть только одна цель, которую мы не знаем (это может произойти, как в принципе, цели перехода могут быть вычислены с входов), мы должны стереть все знания о состоянии ввода блока, поскольку это может быть целью неизвестного JUMP , Если найден JUMPI, условие которого оценивается константой, оно преобразуется в безусловный переход.

     

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

     

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

var x = 7;
data[7] = 9;
if (data[x] != x + 2)
  return 2;
else
  return 1;
  

упрощается до кода, который также может быть скомпилирован из

data[7] = 9;
return 1;
  

, хотя инструкции содержали скачок в начале.

ответил linagee 1 FebruaryEurope/MoscowbMon, 01 Feb 2016 09:06:48 +0300000000amMon, 01 Feb 2016 09:06:48 +030016 2016, 09:06:48

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132