Pergunta

Eu tenho animado sobre LLVM ser baixa o suficiente para modelar qualquer sistema, e viu-o como prometendo que a Apple estava adotá-lo; mas mais uma vez a Apple não apoiar especificamente Haskell ;

E, alguns pensam que Haskell seria melhor fora com C-- :

Que LLVM'ers não resolveram o problema da coleta de lixo zero sobrecarga não é muito surpreendente. Resolver este agnóstico durante a sua estada do modelo de dados é uma questão em aberto em ciência da computação.

- LHC não vai estar usando LLVM.

Foi útil?

Solução

Bem, há um projeto em UNSW para traduzir GHC Core para LLVM

Lembre-se: não estava claro há 10 anos que LLVM iria construir toda a infraestrutura C-- não foi capaz de. Infelizmente, LLVM tem a infra-estrutura para o código portátil, otimizado, mas não a infra-estrutura para suporte linguagem de alto nível bom, que C-- ha (s) d.

Um projeto interessante seria alvo LLVM de C-- ...


Atualização , a partir das GHC 7, GHC usa LLVM para geração de código . Use o sinalizador -fllvm. Isso melhorou o desempenho numérico para alguns programas de baixo nível. Caso contrário, o desempenho é semelhante ao antigo backend GCC.

Outras dicas

Tendo trabalhado um pouco com o novo backend geração de código que manipula C--, eu posso dizer, há uma série de razões pelas quais C-- pode ser melhor do que LLVM, e também por isso que eles não são realmente de todo a mesma coisa.

  1. C-- opera em um nível mais alto de abstração do que LLVM; por exemplo, podemos gerar o código em C-- onde o ponteiro da pilha é totalmente implícita, e só manifesta-lo mais tarde durante o processo de compilação. Isso faz com que a aplicação de certos tipos de otimizações muito mais fácil, porque a representação nível mais elevado permite mais movimento de código com menos invariantes.

  2. Enquanto estamos procurando ativamente para corrigir isso, sofre LLVM do mesmo problema que a via-C backend sofreu: ela nos obriga a criar pontos proc Quais são os pontos Proc.? Essencialmente, porque Haskell não usa o clássico de chamada / ret convenção de chamada, sempre que fazemos o equivalente moral de uma chamada OnFilterComboChange, precisamos empurrar uma continuação para a pilha e depois ir para o subprocedimento. Esta continuação é geralmente um rótulo local, mas LLVM requer que ele seja um procedimento real, por isso precisamos de quebrar funções em pedaços menores (cada peça que está sendo chamado de ponto proc). Esta é uma má notícia para otimizações, que trabalham em um nível procedimento.

  3. C-- e LLVM ter uma abordagem diferente para fluxo de dados de otimização. LLVM utiliza estilo SSA tradicional com Phi-nós: C-- usa um quadro legal chamado Hoopl que não requer que você mantenha o invariante SSA. Posso confirmar:. Programação otimizações em Hoopl é muito divertido, embora certos tipos de otimizações (Inlining das variáveis ??utilizadas de uma só vez vem à mente) não são exatamente o mais natural neste cenário de fluxo de dados

GHC tem agora oficialmente um backend LLVM, e verifica-se que de competitiva com o GCC e nativo-CodeGen e realmente mais rápido em alguns casos . E o projeto LLVM aceitou a nova convenção de chamada David Terei criado para Haskell em LLVM, tão surpreendentemente, os dois projetos estão realmente trabalhando juntos agora.

Uma questão na prática é LLVM tem sido muito mais de um alvo em movimento.

GHC tem tido alguns problemas para tentar suportar várias versões do LLVM. Há um discussão na discussão ghc-dev lista sobre isso.

Btw, atualmente o backend llvm em GHC é após a Haskell é traduzido para o idioma cmm (que eu acredito é na maior parte apenas C-- estendido com certos registros da STG Language), e devido ao acima para-ser- abordada dificuldades, há otimizações redundantes sendo feito o que retarda a compilação.

Além disso, historicamente, e atualmente AFAIK, o projeto LLVM não prioriza fornecendo uma plataforma portátil, e alguns desenvolvedores fizeram um ponto de articulação que é um compilador IR e não uma forma de portáteis linguagem assembly .

O LLVM IR você escreve para um alvo destinatario não pode de todo ser útil para um alvo pretendido diferente. Para efeito de comparação, o site C-- na verdade se refere a ele como montagem portátil. "Você ficaria muito mais feliz com uma linguagem de montagem portátil que poderia ser ..." é uma citação de seu site . Esse site também menciona uma interface de tempo de execução para facilitar a implementação portátil de coleta de lixo e tratamento de exceção.

Então, você poderia pensar em C-- como um terreno comum portátil para todos os front-ends que tem um pouco mais em comum com CIL e código Java byte e LLVM IR como um common-chão expressivo para todos os seus back-ends que facilita a unificação otimizações de baixo nível comum para vários destinos. LLVM IR também oferece a vantagem adicional de que o projeto LLVM irá implementar muitas dessas baixo otimização nível. Dito isto, em alguns aspectos LLVM IR poderia realmente ser considerado nível superior C--, por exemplo LLVM IR tem diferentes tipos onde, como em C-- tudo só é um pouco vetores.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top