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