Есть несколько различий между LLVM и «обычным компилятором», которые я буду считать «gcc»:
- LLVM предназначен для анализа всей программы (он же анализ времени компоновки), поэтому он может компилировать код в «битовый код», формат, который он может анализировать позже.
- LLVM предоставляет компилятор "точно в срок" (JIT), чтобы он мог повторно анализировать программы во время их работы, как это делает JVM.
- LLVM очень хорошо спроектирован:
- его компоненты модульные и хорошо разделены,
- у него есть 3 формата для его промежуточного представления (текстовое, двоичное и представление в памяти), которые эквивалентны,
- его промежуточное представление использует форму SSA,
- его промежуточное представление имеет систему типов.
Что касается Javascript и других динамических языков, мы видим много интересного в LLVM от сообщества динамических языков, когда его тестируют реализации Python и Ruby. Тем не менее, они не пытаются быть статическими компиляторами. Они сосредоточены на использовании JIT. В частности, они оптимизируют долго выполняемые исполняемые файлы, используя «интерпретатор смешанного режима», где они первоначально интерпретируют программы, а затем компилируют их, используя LLVM во время выполнения. Я не видел движок javascript, использующий LLVM, но, вероятно, он есть. Он просто не будет создавать статические исполняемые файлы, за исключением необычных обстоятельств или для урезанных версий Javascript.
Что касается причины создания LLVM, то это началось как часть работы Vikram Adve по исследовательской группе над пожизненной компиляцией (что означает JIT и оптимизацию времени соединения). ). После получения степени доктора наук Крис Латтнер перешел в Apple, что значительно продвинуло проект вперед (возможно, потому, что оно лицензировано BSD, что в прошлом вызывало у них проблемы с gcc, то есть GPL).