O que exatamente é LLVM?

464

Eu continuo ouvindo sobre LLVM o tempo todo. Está em Perl, depois está em Haskell, então alguém usa em alguma outra língua? O que é isso?

bodacydo
fonte
45
Há um bom capítulo em um livro explicando tudo bem aqui: www.aosabook.org/en/llvm.html
David d C e Freitas

Respostas:

369

O LLVM é uma biblioteca usada para construir, otimizar e produzir código de máquina intermediário e / ou binário.

O LLVM pode ser usado como uma estrutura de compilador, na qual você fornece o "front end" (analisador e lexer) e o "back end" (código que converte a representação do LLVM em código de máquina real).

O LLVM também pode atuar como um compilador JIT - ele suporta a geração de conjuntos x86 / x86_64 e PPC / PPC64 com otimizações rápidas de código destinadas à velocidade de compilação.

Se você estiver interessado, pode jogar com o código de máquina do LLVM gerado a partir do código C ou C ++ na página de demonstração , mas a página de demonstração está desativada no momento desde 2013.

LiraNuna
fonte
39
Se você quiser jogar com ele, olhar para este artigo incrível: gnuu.org/2009/09/18/writing-your-own-toy-compiler
LiraNuna
29
O link fornecido na resposta diz "A página de demonstração do LLVM está desativada no momento".
EngrStudent
5
ellcc.org/demo/index.cgi é outra maneira de jogar com a compilação de C / C ++ através de LLVM a vários alvos, incluindo código intermediário
Tom Goodfellow
1
você pode dar um exemplo real do que isso significa?
Migrate2Lazarus ver meu perfil
112

Um bom resumo do LLVM é este:

insira a descrição da imagem aqui

No frontend, você tem Perl e muitas outras linguagens de alto nível. No back-end, você tem o código nativo que é executado diretamente na máquina.

No centro está sua representação de código intermediária. Se todas as linguagens de alto nível puderem ser representadas nesse formato de IR LLVM, as ferramentas de análise baseadas nessa IR poderão ser facilmente reutilizadas - essa é a lógica básica.

Peter Teoh
fonte
39
imagem vale mais que mil palavras ip
ipatch 31/05
3
Portanto, parece que o LLVM é útil para designers de compiladores. Um programador deve se preocupar se ele compila com um compilador padrão ou com base no LLVM, além de analisar o código gerado independentemente do código-fonte?
jinawee
4
se você pode compilar com o LLVM para seu IR, muitas ferramentas podem ser abertas para você analisar o IR. Mas se sua ferramenta é capaz apenas de analisar os binários nativos (x86 por exemplo), se são binários gerados por LLVM ou binários gerados por gcc ou gerados pelo compilador Intel, não há diferença.
22618 Peter Teoh
73

LLVM (usado para significar "Máquina virtual de baixo nível", mas não mais) é uma infraestrutura de compilador, escrita em C ++, projetada para otimização de programas escritos em tempo de compilação, tempo de link, tempo de execução e "tempo ocioso" em linguagens de programação arbitrárias. Originalmente implementado para C / C ++, o design independente da linguagem (e o sucesso) do LLVM gerou uma grande variedade de front-ends, incluindo Objective C, Fortran, Ada, Haskell, bytecode Java, Python, Ruby, ActionScript, GLSL , e outros.

Leia isto para obter mais explicações.
Confira também Unladen Swallow

N 1.1
fonte
13
.. então o que os documentos estão tentando dizer; enquanto LLVM é um acrônimo para Máquina Virtual de Baixo Nível , o projeto é simplesmente chamado de LLVM , não as palavras totalmente escritas.
Jochem Kuijpers
2
Anteriormente, tinha abreviação acima, mas depois foi removida en.wikipedia.org/wiki/LLVM
VVB
2
Para resumir os comentários. "A máquina virtual de baixo nível (LLVM)" deve ser algo como "LLVM (que significava" máquina virtual de baixo nível "no início da vida útil do projeto)"
ssokolow 04/07/19
52

De acordo com o livro 'Introdução às bibliotecas principais do LLVM' (c):

De fato, o nome LLVM pode se referir a qualquer um dos seguintes:

  • O projeto / infraestrutura do LLVM: esse é um guarda-chuva para vários projetos que, juntos, formam um compilador completo: frontends, backends, otimizadores, assemblers, linkers, libc ++, compiler-rt e um mecanismo JIT. A palavra "LLVM" tem este significado, por exemplo, na seguinte frase: "LLVM é composto por vários projetos".

  • Um compilador baseado em LLVM: Este é um compilador construído parcial ou completamente com a infraestrutura LLVM. Por exemplo, um compilador pode usar LLVM para front-end e back-end, mas usar bibliotecas de sistema GCC e GNU para executar o link final. O LLVM tem esse significado na seguinte frase, por exemplo: "Eu usei o LLVM para compilar programas C em uma plataforma MIPS".

  • Bibliotecas LLVM: Esta é a parte do código reutilizável da infraestrutura LLVM. Por exemplo, o LLVM tem esse significado na frase: "Meu projeto usa o LLVM para gerar código por meio da estrutura de compilação Just-in-Time".

  • Núcleo do LLVM: as otimizações que ocorrem no nível da linguagem intermediária e os algoritmos de back-end formam o núcleo do LLVM onde o projeto foi iniciado. LLVM tem esse significado na seguinte frase: "LLVM e Clang são dois projetos diferentes".

  • O IR LLVM: Esta é a representação intermediária do compilador LLVM. O LLVM tem esse significado quando usado em frases como "Eu construí um frontend que traduz meu próprio idioma para o LLVM".

Ittrin
fonte
35

O LLVM é basicamente uma biblioteca usada para criar compiladores e / ou software orientado a linguagem. A essência básica é que, embora você tenha o gcc, que provavelmente é o conjunto mais comum de compiladores, ele não foi criado para ser reutilizável, ou seja. é difícil pegar componentes do gcc e usá-lo para criar seu próprio aplicativo. O LLVM aborda bem esse problema criando um conjunto de "tecnologias modulares e reutilizáveis ​​de compiladores e cadeias de ferramentas" que qualquer pessoa poderia usar para criar compiladores e software orientado a linguagem.

redbandit
fonte
6
Então o LLVM é a biblioteca e Clang é o compilador?
Abdul
11
Clang é o compilador front-end C / C ++ do LLVM. Ele converte o código C em código de bit LLVM, que é traduzido em alguma linguagem Assembly por um compilador de back-end.
Boris Mulder
6

A infraestrutura do compilador LLVM é particularmente útil para executar otimizações e transformações no código. Também consiste em várias ferramentas que servem usos distintos. O llvm-prof é uma ferramenta de criação de perfil que permite fazer o perfil da execução para identificar pontos de acesso do programa. Opt é uma ferramenta de otimização que oferece várias passagens de otimização (eliminação de código morto, por exemplo).

É importante ressaltar que o LLVM fornece as bibliotecas para você escrever seus próprios passes. Por exemplo, se você precisar adicionar uma verificação de intervalo em certos argumentos que são passados ​​para determinadas funções de um programa, basta escrever um passe LLVM simples.

Para obter mais informações sobre como escrever seu próprio passe, consulte este http://llvm.org/docs/WritingAnLLVMPass.html

Hashim Sharif
fonte