Pergunta

Digamos que eu tenha um programa ou biblioteca Haskell que eu gostaria de tornar acessível a não-Haskellers, potencialmente programadores C. Posso compilá -lo para C usando o GHC e depois distribuí -lo como uma fonte C?

Se isso for possível, alguém pode fornecer um exemplo mínimo? (por exemplo, um makefile)

É possível usar o GHC para determinar automaticamente quais sinalizadores e cabeçalhos do compilador e precisar e, em seguida, talvez agrupar isso em uma única pasta?

Basicamente, estou interessado em poder escrever partes de programas em C e Haskell e depois distribuí -lo como um tarball, mas sem exigir que o alvo tenha o GHC e a cabala instalados.

Foi útil?

Solução

Estou interessado em poder escrever partes de programas em C e Haskell e depois distribuí -lo como um tarball, mas sem exigir que o alvo tenha o GHC e a cabala instalados.

Você está pedindo muita infraestrutura que é improvável que você encontre. Lembre-se disso Qualquer programa Haskell, mesmo que seja compilado para C, é quase certo depender de um sistema de tempo de execução grande e complexo para sua operação correta. No mínimo, esse sistema de tempo de execução precisa suportar a coleta de lixo e a avaliação preguiçosa. Então você tem mais do que apenas um problema de tradução.

Sugiro que você resolva esse problema como um problema de distribuição de software. Em vez de um tarball, forneça um pacote para sua plataforma de distribuição favorita (Debian, Red Hat, InstallShield, o que for). Pessoalmente, para reutilizar os esforços de outras pessoas, eu buscava algo que verifique a cabala, instala Cabal, se necessário, usa Cabal para instalar o restante do que seus usuários precisarão.

Outras dicas

Você pode fazer isso com JHC. É um programa completo que otimiza o compilador que se compila com C. Ele não possui todas as extensões sofisticadas que o GHC suporta.

Mesmo se você pudesse, eu não chamaria isso de "fonte C". O GHC pode usar C como parte de seu sistema de compilação, mas o código C gerado nem é ligeiramente legível. Mesmo que pudesse ser lido e compreendido, não faria sentido modificá-lo, porque não há como (além de fazer as mudanças no Haskell) para incorporar quaisquer modificações feitas por h hackers em versões futuras do seu programa.

O termo "fonte" significa o código que é escrito por um humano e usado para gerar o programa. Nesse caso, esse é o Haskell. C gerado por um compilador não é "código -fonte", é uma representação intermediária.

Você não pode chegar lá com o GHC. Mesmo quando compila via C, o GHC depende da manipulação da assembléia resultante para embaralhar segmentos, um enorme sistema de tempo de execução e muita bagagem.

Por outro lado, você pode ter mais sorte se o que você deseja for suportado por um conjunto de recursos um pouco mais limitado do compilador JHC de John Meacham, no entanto, que gera uma saída C razoavelmente compacta.

Eu sei que este é um post antigo, mas eu ainda queria mencionar também AJHC. O AJHC bifurou o JHC com os planos de adicionar novos recursos e posteriormente empurrar as atualizações de volta ao JHC.

Digamos que eu tenha um programa ou biblioteca Haskell que eu gostaria de tornar acessível a não-Haskellers, potencialmente programadores C. Posso compilá -lo para C usando o GHC e depois distribuir isso como uma fonte C

Você pode compilar com C, mas o C resultante não é legível por humanos. É melhor escrever arquivos de cabeçalho e usar o excelente CFI C ao lado dele. De qualquer forma, a distribuição do C gerado parece uma tarefa de tolo.

Basicamente, estou interessado em poder escrever partes de programas em C e Haskell e depois distribuí -lo como um tarball, mas sem exigir que o alvo tenha o GHC e a cabala instalados.

Não conheço nenhuma soluções que não envolvam GHC. Você teria que distribuir pelo menos o Haskell RTS.

Posso compilá -lo para C usando o GHC e depois distribuí -lo como uma fonte C?

Não, não é possível, mas você pode criar facilmente interface entre Haskell e C usando a interface de função estranha (FFI) de Haskell.

Você pode ter mais exemplo aqui.

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