Pergunta

Eu estou trabalhando em um programa que torna os sistemas iterados fractais. Eu queria acrescentar a funcionalidade onde alguém poderia definir seu próprio processo de iteração, e compilar esse código para que ele iria funcionar de forma eficiente.

Actualmente, eu não sei como fazer isso e gostaria dicas sobre o que ler para aprender como fazer isso.

O programa principal é escrito em C ++ e estou familiarizado com C ++. Na verdade dada a maioria dos cenários eu sei como convertê-lo em código assembly que cumprir a meta, mas eu não sei como dar o passo extra para convertê-lo em código de máquina. Se possível, eu gostaria de compilar dinamicamente o código como como eu acredito que muitos emuladores sistema de jogo de trabalho.

Se não está claro o que estou pedindo, diga-me para que eu possa esclarecer.

Obrigado!

Foi útil?

Solução

Alguns emuladores de CPU tratar o código de máquina como se fosse byte código e eles fazem uma compilação JIT, quase como se fosse Java. Isto é muito eficiente, mas isso significa que os desenvolvedores precisam para escrever uma versão do compilador para cada CPU seus funcionamentos do emulador em e para cada CPU emulada.

Isso normalmente significa que ele só funciona em x86 e é irritante para qualquer um que gostaria de usar algo diferente.

Eles também poderiam traduzi-lo para LLVM ou código Java byte ou .Net CIL e, em seguida, compilá-lo, o que também funcionaria.

No seu caso eu não tenho certeza de que tipo de coisa é o melhor caminho a percorrer. Eu acho que eu iria fazer isso usando bibliotecas dinâmicas. Faça um diretório que deve conter "plugins" e permitir que o usuário de compilação conta própria. Faça o seu programa de digitalização do diretório e carregar cada DLL ou .so que encontra.

fazê-lo desta forma forma como você gasta menos tempo compiladores de código de escrita e mais tempo realmente recebendo o material feito.

Outras dicas

Será que a rotina para ser compilado dinamicamente precisa estar em qualquer linguagem particular. Se a resposta a essa pergunta é "Sim, deve ser C ++" provavelmente você está sem sorte. C ++ é a pior escolha possível para recompilação online.

É a parte dinâmica do seu aplicativo (a rotina iterador fractal) um grande gargalo CPU? Se você pode pagar usando uma linguagem que não é compilado, você provavelmente pode salvar uma enorme quantidade de problemas. Lua e JavaScript são duas linguagens interpretadas altamente otimizado que só funcionam algumas vezes mais lento do que o código nativo, compilados.

Se você realmente precisa a funcionalidade dinâmica para ser compilado para código de máquina, a sua melhor aposta é provavelmente vai estar usando clang / llvm. clang é o front-end C / Objective-C que está sendo desenvolvido pela Apple (e alguns outros) para fazer on-line, a recompilação dinâmica bom desempenho. llvm é os usos backend clang para traduzir a partir de um bytecode portátil para código de máquina nativo. Esteja ciente de que clang atualmente não suporta muito do C ++, já que é uma língua tão difícil de acertar.

Se você pode escrever suas extensões dinâmicas em C (não C ++), que você pode encontrar o minúsculo C Compiler para ser de uso. Está disponível sob a LGPL, é compatível para Windows e Linux, e é um pequeno executável (ou biblioteca) em ~ 100kb para o pré-processador, compilador, vinculador e montador, tudo o que ele faz muito rápido. A desvantagem para isso, é claro, é que não se pode comparar com as otimizações que você pode começar com o GCC. Outra desvantagem potencial é que é somente x86 AFAIK.

Se você se decidir escrever montagem, TCC pode lidar com isso - a documentação diz que suporta um gás-como sintaxe, e ele faz suporte opcodes X86.

TCC também apoia plenamente ANSI C, e é quase totalmente compatível com C99.

Dito isto, você poderia incluir TCC como um executável com sua aplicação ou uso libtcc (não há muita documentação de libtcc on-line, mas está disponível no pacote de origem). De qualquer maneira, você pode uso tcc para gerar dinâmico ou bibliotecas compartilhadas , ou executáveis . Se você foi a rota biblioteca dinâmica, você teria apenas colocar em um Render (ou qualquer outro) função nele, e dlopen ou LoadLibrary sobre ele, e Render chamada para finalmente executar a prestação projetado pelo usuário. Alternativamente, você poderia fazer um autônomo executável e popen -lo, e fazer toda a sua comunicação através stdin e stdout do autônomo.

Uma vez que você está gerando pixels a ser exibido em uma tela, você considerou usando HLSL com compilação shader dinâmico? Isso lhe dará acesso a hardware SIMD projetado exatamente para este tipo de coisa, assim como o compilador dinâmico embutido no DirectX.

LLVM deve ser capaz de fazer o que você quer fazer. Ele permite que você para formar uma descrição do programa que você gostaria de compilar de forma orientada a objeto, e então ele pode compilar que a descrição do programa em código de máquina nativo em tempo de execução.

Nanojit é um exemplo muito bom do que você quer. Ele gera o código de máquina a partir de um intermediário langauge. É C ++, e é pequeno e multi-plataforma. Eu nunca usei isso muito extensivamente, mas eu gostava de brincar ao redor apenas para demonstrações.

Spit o código em um arquivo e compilá-lo como uma biblioteca dinamicamente carregada, em seguida, carregá-lo e chamá-lo.

É há razão para que você não pode usar uma solução baseada em GPU? Isso parece estar gritando por um.

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