LLVM, инструментальная коробка для переносимости кода

Logo LLVM émergeant d'un ordinateur

LLVM приносит это вместе с кодом IR (Intermediate Representation), который он производит. Этот язык объектов довольно похож на язык сборки, и оптимизация его кода, которую было бы трудно производить и поддерживать на языке высокого уровня, обеспечивает необходимую скорость. Затем IR выполняется компилятором Just In Time, который почти сразу переводит его в машинный код.

LLVM (Low Level Virtual Machine) - это больше, чем виртуальная машина, это также инфраструктура компилятора, набор инструментов, написанных на C++ и работающих на системах Unix и Linux, а также на Windows. Эти инструменты работают с биткодом (а не байтекодом) LLVM, который является упаковкой ИК-кода в распределяемый модуль.
Инструменты состоят из компилятора Clang, который поддерживает четыре языка и производит биткод (включая IR) или бинарный исполняемый файл, оптимизатор кода, отладчик LDB, редактор ссылок, виртуальные машины JIT, интерпретатор.
Он был создан Университетом Иллинойса и получил вклад Apple, написавшей, в частности, Clang.

LLVM дает новую молодость старым программам, написанным на C, C++ или других языках (все статически типизированные языки могут быть скомпилированы в IR). Он позволяет запускать их на новых системах. Они могут быть преобразованы в JavaScript (с Emscribtem) и работать в браузерах. Или благодаря Переносному собственному клиенту, после перевода на IR, работать также на любой системе...
Таким образом, LLVM является альтернативой Java с добавлением Web в качестве возможной цели: его IR-код можно скомпилировать в Asm.js или WebAssembly .

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

В 2018 году сотрудники неожиданно покидают проект из-за того, что он стал слишком политическим и ставит социальную повестку дня выше компетенции, что оставляет сомнения в будущем качестве кодекса.

Схема работы LLVM

Diagramme du fonctionnement de LLVM

LLVM позволяет генерировать биткод из многих статически типированных языков: C и Objective C с CLang, Java, ADA, Fortran с GCC и другими языками с другими компиляторами, поскольку они поддерживают биткод на выходе.

Этот битовый код оптимизируется и может использоваться непосредственно виртуальной машиной LLVM. С редактированием ссылок и статической компиляцией он может стать исполняемым бинарником. А еще можно прибегнуть к Emscribtem, чтобы конвертировать его JavaScript или Asm.js, что позволяет раскрутить программу в браузере.

LLVM включает виртуальную машину JIT, которую используют Mono, Julia и многие другие проекты.

Разница между кодом Java и LLVM

Лучше всего увидеть разницу между производимыми кодами, например:

Либо простая функция в C, либо Java для компиляции:

int arith(int x, int y, int z) {    
    return(x * y + z);  
}

LLVM производит этот IR-код:

define i32 @arith(i32 %x, i32 %y, i32 %z) {  
   entry:    
   %tmp = mul i32 %x, %y    
   %tmp2 = add i32 %tmp, %z    
   ret i32 %tmp2  
}

Пока Java производит этот байткод (его можно увидеть с помощью java-инструмента JDK):

public class demo.Demo {
  public static int arith(int, int, int);
    Code:
       0: iload_0
       1: iload_1
       2: imul
       3: iload_2
       4: iadd
       5: ireturn
}

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

И

разница между биткодом и байткодом

В чем разница между биткодом и ИК? Почему мы говорим о биткоде, а не о байткоде, как это происходит с Java ?

В обоих случаях код выполняется виртуальной машиной, JIT или нет. Имя bytecode происходит от того, что изначально набор инструкций был закодирован на байте (байт на английском языке). Это уже не обязательно так, но поток остается байтовым потоком (bytestream), в то время как мы используем биткод, чтобы отметить, что поток выражен в битах (биттрейме), а значит, не в байтах, а в единицах переменных размеров.

IR (Intermediate Representation) - язык, разработанный для виртуальной машины или компилятора, и он инкапсулируется в файл, который в случае LLVM называется биткодом. Он кодируется как битовый поток (битовый поток), состоящий из блоков (блоков) и записей (рекордов).

Инструменты

В Windows можно использовать Visual Studio или Eclipse CDT с плагином LLVM. QtCreator также может использовать Clang.