Большинство компиляторов имеют передний конец, некоторый средний код/структуру и структуру. Когда вы берете свою программу на C и используете clang и компилируете, чтобы в итоге вы получили не-JIT-x86-программу, которую вы можете просто запустить, вы все равно переходите от интерфейса к среднему для бэкэнд. То же самое касается gcc, gcc идет от интерфейса к среднему и к бэкэнду. Средство Gccs не является широко открытым и удобным, как LLVM.
Теперь одно интересное/интересное о llvm, которое вы не можете сделать с другими или, по крайней мере, gcc, состоит в том, что вы можете взять все модули исходного кода, скомпилировать их в байт-код llvms, объединить их в один большой файл байт-кода, а затем оптимизируйте все это, а не каждый файл или оптимизацию каждой функции, которую вы получаете с другими компиляторами, с llvm вы можете получить любой уровень частичной оптимизации программы компиляции. то вы можете взять этот байт-код и использовать llc для экспорта его на ассемблер целей. Я обычно встраиваюсь, поэтому у меня есть свой собственный код запуска, который я обертываю, но теоретически вы должны взять этот файл ассемблера и скомпилировать gcc и связать его и запустить. gcc myfile.s -o myfile.Я предполагаю, что есть способ получить инструменты llvm для этого, и не нужно использовать binutils или gcc, но я не нашел времени.
Мне нравится llvm, потому что это всегда кросс-компилятор, в отличие от gcc вам не нужно собирать новую для каждой цели и иметь дело с нюансами для каждой цели. Я не знаю, что я использую для JIT то, что я говорю, я использую его как кросс-компилятор и как родной компилятор.
Итак, ваш первый случай - это фронт, середина, конец, и процесс скрыт от вас, вы начинаете с источника и получаете двоичный код. Второй случай - если я правильно понял фронт и середину и остановился с некоторым файлом, представляющим середину. Тогда среднее и конечное (конкретный целевой процессор) может произойти как раз во время выполнения. Разница в том, что бэкэнд, выполнение в реальном времени среднего языка второго случая, скорее всего, отличается от бэкэнда случая один.
Так использовать LLVM, как JIT вы должны связать его в приложение, верно? Существуют ли приложения, которые это делают? – zaharpopov