Промежуточные представления могут быть немного многословными по сравнению с не виртуальным ассемблером. Я узнал это, глядя на .NET IL, хотя я никогда не шел намного дальше, чем смотрел. Я не очень знаком с LLVM, но думаю, что это та же проблема.
Хотя, если подумать, это имеет смысл. Одно большое отличие состоит в том, что IR должны иметь дело с большим количеством метаданных. В ассемблере очень мало - процессор неявно определяет многое, и соглашения для таких вещей, как вызовы функций, оставляются на усмотрение программиста / компилятора. Это удобно, но создает большие проблемы с переносимостью и взаимодействием.
Промежуточные представления, такие как .NET и LLVM, заботятся о том, чтобы убедиться, что отдельно скомпилированные компоненты могут работать вместе - даже компоненты, написанные на разных языках и скомпилированные разными интерфейсами компилятора. Это означает, что метаданные необходимы для описания того, что происходит на более высоком уровне, чем, например, произвольные нажатия, щелчки и загрузки, которые могут быть обработкой параметров, но могут быть чем угодно. Вознаграждение довольно большое, но есть цена, которую нужно заплатить.
Есть и другие проблемы. Промежуточное представление на самом деле не предназначено для написания людьми, но оно должно быть читаемым. Кроме того, он должен быть достаточно общим, чтобы выдержать несколько версий без полной несовместимой редизайн с нуля.
По сути, в этом контексте явное почти всегда лучше, чем неявное, поэтому многословия трудно избежать.