De que maneira o LLVM Low Level?

12

De que maneira o LLVM (Máquina Virtual de Baixo Nível ) é de Baixo Nível? (No momento em que escrevi, não encontrei essa expansão da abreviação "LLVM" em seu site, mas na Wikipedia .)

É chamado "Nível Baixo" no que foi projetado (uma infraestrutura de compilador) ou porque funciona em um "nível inferior" do que outras ferramentas?

Como (uma espécie de) "ilustração" disso, o LLVM é de nível inferior ao da JVM e do CLR , ou foi projetado apenas para usos de "nível inferior"?

Abbafei
fonte

Respostas:

16

O LLVM é de nível inferior ao das VMs típicas, como JVM e CLR. Por exemplo, embora tenha ganchos para um coletor de lixo, ele não fornece um coletor de lixo propriamente dito.

Da mesma forma, a JVM possui um compilador JIT integrado (exceto em versões realmente antigas). O LLVM possui alguns compiladores JIT para o LLVM IR, mas ainda cabe ao desenvolvedor juntar as coisas e, na verdade, JIT o código.

Quando a JVM encontra um externo não resolvido, sai e encontra a classe certa para satisfazê-lo, e sabe procurar arquivos .class diretamente no sistema de arquivos e nos arquivos .jar 1 . Os compiladores JIT do LLVM têm ganchos onde você pode decidir como essas coisas são tratadas. Como seria de esperar, algumas pessoas escreveram algumas versões padrão, para que ele possa fazer as coisas aproximadamente na mesma ordem que a JVM - mas você também pode ignorá-las e fazer as coisas de maneira diferente, se quiser.

Simplificando, se você estiver desenvolvendo um compilador (ou algo nessa ordem), ele possui muitas ferramentas para facilitar sua vida. Em vez de se preocupar muito com a otimização, você pode fazer praticamente a tradução mais simples que pode gerenciar do código-fonte para o LLVM IR e, em seguida, usar as bibliotecas do LLVM para gerenciar a otimização, JITing, vinculação etc. Mesmo assim, são bibliotecas - fornece algumas funções realmente úteis para que você não precise lidar com todos os detalhes, mas elas ainda funcionam e você ainda está escrevendo código para invocá-las. Não é um produto acabado, apenas ferramentas úteis para criar produtos de forma relativamente rápida e fácil.


1 Tecnicamente, nem tudo isso é incorporado à JVM. Ele especifica o que geralmente é chamado de carregador de classe primordial como parte da JVM adequada e, em seguida, há carregadores de classe de usuário especificados em java.util.ClassLoader que tratam de outras coisas. Alguns carregadores de classes são incluídos por padrão e, se você desejar o suficiente, poderá complementá-los definindo seus próprios.

Jerry Coffin
fonte
12

O nível é baixo porque foi projetado para que as máquinas virtuais existentes ou futuras (a JVM) possam usá-lo como o núcleo de sua implementação.

Veja desta maneira: As máquinas virtuais de Java e Python são muito portáteis porque são escritas no padrão C e dependem muito de suas próprias bibliotecas. A intenção do LLVM é fornecer uma infraestrutura para facilitar a portabilidade de qualquer máquina virtual para uma plataforma que já suporte o LLVM.

O LLVM está oferecendo suporte para compilação estática e JIT, e foi projetado de maneira a poder ser executado em espaço confiável no sistema operacional. Isso significa que, em teoria, executar uma máquina virtual sobre o LLVM deve significar muito menos trabalho e produzir algo muito mais rápido e eficiente. Em teoria.

Então o LLVM, sendo de nível inferior, deve ser mais fácil de portar para diferentes arquiteturas de SO e hardware.

Existem grandes economias se os implementadores de idiomas puderem gravar em uma plataforma de baixo nível única e fácil de transportar. As VMs mais conhecidas estão no meio do caminho entre o idioma que elas servem e o sistema operacional e precisam implementar suas próprias representações intermediárias e o JITC.

Apalala
fonte
5

A parte "baixo nível" do nome LLVM refere-se ao nível do conjunto de instruções virtual usado. A linguagem intermediária (IR) usada pelo LLVM está próxima do nível do código da máquina, embora seja uma arquitetura independente e geral.

O bytecode da JVM e CLR, por outro lado, é de nível bastante alto, pois possui instruções que estão em uma camada de abstração mais alta. Ambos são linguagens de montagem baseadas em pilha orientadas a objetos. Por exemplo, a JVM possui a instrução invokevirtual, que é uma instrução que precisa saber sobre o modelo de objeto específico da linguagem Java.

Zayenz
fonte
3

É certamente um nível mais baixo do que qualquer uma das VMs específicas do idioma e as VMs unificadas, como JVM e CLR. Seu design é próximo da representação intermediária de baixo nível no GCC (GIMPLE) e em compiladores similares. Não há GC padrão, nenhum sistema específico de tipo de alto nível é imposto, nenhum alinhamento é assumido (deve ser especificado explicitamente), os tipos de dados inteiro e de ponto flutuante são explícitos (e dependentes da plataforma) e o nível mais baixo de todos - a aritmética de ponteiro decente está disponível.

SK-logic
fonte