Обновить

LLVM IR: что это такое?

Главной особенностью LLVM является промежуточное представление кода (англ. Intermediate Representation, IR), форма, которую использует LLVM для представления кода в компиляторе. LLVM IR был разработан для выполнения функций промежуточного анализа и преобразований внутри оптимизатора компилятора. Ее создание имело целью решение множества специализированных задач, включая поддержку легковесных оптимизаций среды выполнения, кроссфункциональные и межпроцедурные оптимизации, полный анализ программы и агрессивные реструктурирующие преобразования. Промежуточное представление кода определено как язык первого порядка с четкой семантикой.

IR (Intermediate Representation) в контексте LLVM — это промежуточное представление кода. Это низкоуровневое, независимое от платформы и типобезопасное представление программного кода, которое используется в качестве промежуточного языка между интерфейсной частью и серверной частью компилятора.

define i32 @add1(i32 %a, i32 %b) {
entry:
  %tmp1 = add i32 %a, %b
  ret i32 %tmp1
}

define i32 @add2(i32 %a, i32 %b) {
entry:
  %tmp1 = icmp eq i32 %a, 0
  br i1 %tmp1, label %done, label %recurse

recurse:
  %tmp2 = sub i32 %a, 1
  %tmp3 = add i32 %b, 1
  %tmp4 = call i32 @add2(i32 %tmp2, i32 %tmp3)
  ret i32 %tmp4

done:
  ret i32 %b
}

Этот код LLVM IR соответствует следующему коду на языке C, обеспечивающему возможность сложения целых чисел двумя разными способами:

unsigned add1(unsigned a, unsigned b) {
  return a+b;

}
// возможно не самый лучший способ сложения двух чисел
unsigned add2(unsigned a, unsigned b) {
  if (a == 0) return b;
  return add2(a-1, b+1);
}

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

Строго говоря, промежуточное представление LLVM является четко определенным и единственным интерфейсом оптимизатора. Это означает, что всё, что необходимо знать, чтобы писать фронтенды для LLVM, это: что такое LLVM IR, как он работает и какие инварианты ему необходимы. Так как LLVM IR имеет текстовую форму, то имеет смысл создавать фронтенд, который выводит LLVM IR в виде текста, а затем отправляет его на оптимизатор и необходимый генератор кода при помощи каналов Unix.

Теги:
Всего голосов 5: ↑3 и ↓2+3
Комментарии0

«Инцидент в Сасово» как зеркало современного капитализма

10.26 для Яндекса – это черный октябрь. 8 октября 2026 г. произошел, как его называют официальные лица, «инцидент» в Центре Обработки Данных в Сасово. 9 октября в ЦОДе в Калуге, согласно новоязу, «несколько модулей полностью выведены из строя». 11 октября ЦОД во Владимире «остановлен полностью». Корпоративные клиенты удручены, средний и мелкий бизнес разбегается, рядовые потребители недовольны, а работники Яндекса самого низового звена (таксисты и пр.) – вообще в шоке.

Все в этой истории очень типично, знакомо и предсказуемо. Но только если посмотреть на Яндекс не через привычную призму, через которую обычно смотрят на «родную» IT-компанию: через призму технологий, алгоритмов и возможностей найма, а по-другому. Если посмотреть на Яндекс как на IT-монополию, имеющую тенденцию к объединению с другими монополиями и сращиванию с государством, то ситуация становится предельно ясной.

Попробуем посмотреть вместе. Фактов будет предостаточно.

«Инцидент в Сасово» как зеркало современного капитализма

Публикации