Fazendo uma língua, precisa de um bom back-end
-
05-09-2019 - |
Pergunta
Eu quero fazer uma linguagem compilada. Atualmente, estou avaliando backends. Até agora eu estou olhando para C por causa de sua velocidade de execução, compilando, e um pequeno, fácil de compilador utilização chamado TCC.
Depois de ler as discussões aqui em usá-lo como uma linguagem intermediária, eu estou tentando pensar em como torná-lo compatível com coleta de lixo e tratamento de exceções. Até agora, eu acho que pode resolver ambos, mas com muita sobrecarga.
Aqui estão alguns dos meus pensamentos sobre os outros backends possíveis:
- Assembleia:. Portável e uma dor total para o programa no
- NET: Se sente muito lento. 5 segundos para o arranque e 5 segundos para avaliar 1 + 2 em ironpython e vaia. Não é possível executar sem grande biblioteca.
- JVM: Sente-se um pouco lento. Sem acesso a bibliotecas binários. Não é possível executar sem grande biblioteca.
- LLVM: Sem janelas apoio. Ouvi dizer que o tamanho do executável compilado é de 16 mb +
- C--: olhares subdesenvolvidos .
- C ++: possivelmente. Não consegue encontrar um bom pequeno livre I pode agrupar com.
Algum de vocês pode mudar de idéia ou ter mais a acrescentar a esta lista?
Editar
Eu tenho experimentado com LLVM recentemente. Eu descobri que eles têm binários pré-compilados e que é possível compilar a montagem nativa.
Aqui estão os passos:
- Executar llvm-as em LLVM Assembléia, que produz um arquivo LLVM bytecode.
- Executar LLC no arquivo LLVM bytecode para produzir um arquivo de montagem.
- Executar uma montadora no arquivo de montagem para produzir um arquivo de objeto. (Ou correr llvm-LD que parece depender de um compilador c instalado externamente)
- Compilar ao executável com gcc etc.
Solução
Você considerou escrever um frontend para GCC ? Digo isto Para ser completo única - tanto quanto eu sei a interface backend é bastante complicado e a base de código é enorme e difícil de compreender
.Por outro lado, o GCC é um produto maduro, com muitos programadores experientes trabalhando nisso. No mínimo, isso provavelmente constitui a base mais sólida de todas as alternativas.
Pessoalmente, eu preferiria LLVM (arquitetura emocionante) ou IL do NET: muito, muito fácil de usar, tem suporte grande ferramenta ( refletor , Cecil , Reflexil e por último mas não menos importante, a API .NET reflexão) e duas implementações muito eficientes (nomeadamente a implementação canônica da Microsoft e Mono ).
Mas não posso reclamar experiência em qualquer uma das arquiteturas assim que tomar esta resposta com um grão de sal.
Outras dicas
Nesse caso LLVM é provavelmente uma escolha melhor.
LLVM tem suporte do Windows, ele só leva algum tempo para compilação
C ++ não lhe dará muito, uso C em seu lugar. Mas se você quiser, idioma a ser usado na Web, use .NET ou Java, com certeza eles lento para carregar, mas quando eles são, eles tão rápido quanto C.
Para SmartEiffel usamos C como um back-end.
Tcc é uma opção muito boa para a desenvolvimento-embora não para a libertação final (o objecto produzido é equivalente a gcc -O0)
Outro para adicionar à lista: Slava recentemente implementado Smalltalk em uma Fator backend . Eu não tentei isso mesmo, mas tenho a sensação de que vai oferecer mais das características que você quer de os de nível superior com mais como o tamanho / desempenho desde os de nível inferior.
TCC é a melhor escolha. É portátil e tem uma biblioteca para que ele possa ser facilmente usado como um backend que é chamado libtcc. Os executáveis ??são menores do que gcc e é ANSI C.