Инлайнинг переменных

Инлайнинг переменных в SWC относится к классу оптимизаций, при которых идентификаторы заменяются их фактическими значениями или выражениями на этапе компиляции. Основная цель — уменьшение количества обращений к памяти, устранение промежуточных переменных и повышение эффективности последующего минифицирования кода.

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


Условия, при которых выполняется подстановка

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

Ключевые условия:

  • переменная объявлена через const
  • значение является неизменяемым выражением
  • отсутствуют побочные эффекты при вычислении
  • идентификатор используется в ограниченном контексте
  • переменная не экспортируется как изменяемая сущность

Пример безопасного инлайнинга:

const a = 10;
const b = a + 5;
console.log(b);

После трансформации:

const b = 10 + 5;
console.log(b);

Дальнейшее упрощение (folding):

const b = 15;
console.log(b);

Инлайнинг примитивов и константных выражений

SWC активно разворачивает примитивные значения: числа, строки, boolean и null. Дополнительно применяются правила частичного вычисления выражений.

const x = 2 * 4;
const y = x + 3;

Результат:

const y = 11;

При этом промежуточная переменная полностью удаляется, если она не используется в других местах.


Расширенный анализ цепочек присваивания

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

const a = 5;
const b = a;
const c = b;
console.log(c);

После оптимизации:

console.log(5);

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


Ограничения при наличии мутабельности

Инлайнинг блокируется, если переменная может быть изменена после объявления.

let a = 1;
a = 2;
console.log(a);

Подстановка невозможна, так как значение изменяется в рантайме:

let a = 1;
a = 2;
console.log(a);

SWC сохраняет исходную структуру, поскольку любая попытка инлайнинга нарушила бы семантику исполнения.


Побочные эффекты и вызовы функций

Если значение переменной связано с вызовом функции, инлайнинг выполняется только при доказуемой чистоте выражения. В противном случае подстановка запрещается.

const a = Math.random();
const b = a + 1;

Подстановка Math.random() невозможна из-за недетерминированности:

const b = Math.random() + 1;

При этом сама переменная a удаляется как промежуточная, если не используется отдельно.


Встраивание параметров функций

SWC может подставлять значения параметров функций, если вызов локализован и отсутствуют переопределения.

function sum(x) {
  return x + 10;
}

console.log(sum(5));

После анализа:

console.log(5 + 10);

И последующего упрощения:

console.log(15);

Однако при наличии сложной логики внутри функции инлайнинг отключается:

function sum(x) {
  const y = x + Date.now();
  return y;
}

Работа с областью видимости и замыканиями

Инлайнинг переменных в SWC строго ограничен границами lexical scope. Переменные, участвующие в замыканиях, редко подлежат раскрытию.

function outer() {
  const value = 42;
  return function inner() {
    return value;
  };
}

Здесь инлайнинг невозможен, так как value захватывается замыканием и может использоваться позже.


Инлайнинг и модули ES

В контексте ES-модулей SWC учитывает экспортируемые сущности. Экспортируемые переменные не всегда могут быть инлайнированы, даже если они константны.

export const version = "1.0.0";
console.log(version);

Внутри модуля:

console.log("1.0.0");

Однако при наличии внешнего импорта поведение меняется:

export const version = getVersion();

Инлайнинг запрещён, так как значение может зависеть от внешней логики.


Связь с мёртвым кодом и удалением переменных

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

const a = 10;
const b = a;
const c = b;

Если c не используется:

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


Влияние на минификацию и переименование

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

const threshold = 100;
if (threshold > 50) {
  console.log("ok");
}

После инлайнинга:

if (100 > 50) {
  console.log("ok");
}

После вычисления выражения:

console.log("ok");

Оптимизация логических выражений при инлайнинге

SWC активно комбинирует инлайнинг с логическим упрощением:

const flag = true;
if (flag) {
  doSomething();
}

Результат:

doSomething();

При этом сохраняется корректность короткого замыкания в сложных выражениях:

const flag = condition && getValue();

Инлайнинг выполняется только при гарантированной безопасности вычисления.


Инлайнинг и объектные структуры

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

const config = { port: 3000 };
console.log(config.port);

После трансформации:

console.log(3000);

Если объект содержит динамику:

const config = { port: getPort() };
console.log(config.port);

Инлайнинг значения невозможен.


Взаимодействие с переопределением идентификаторов

Если переменная перекрывается в пределах scope, SWC отключает инлайнинг для предотвращения конфликтов идентификаторов.

const x = 1;

function test() {
  const x = 2;
  return x;
}

Каждая область сохраняет собственное значение без глобальной подстановки.


Частичный инлайнинг в цепочках выражений

В сложных выражениях SWC может выполнять частичную подстановку, сохраняя структуру дерева операций.

const a = 2;
const b = 3;
const result = a * b + 10;

Результат:

const result = 2 * 3 + 10;

При дальнейшем упрощении:

const result = 16;

Условия отключения оптимизации

Инлайнинг переменных отключается или ограничивается при:

  • включённом режиме сохранения отладки
  • использовании source maps с высоким приоритетом точности
  • наличии директив, сохраняющих структуру AST
  • сложных побочных эффектах в выражениях
  • пересечении с внешними модулями динамического импорта