Question

Je travaille sur un programme qui rend les systèmes fractals itérés. Je voulais ajouter une fonctionnalité permettant à quelqu'un de définir son propre processus d'itération et de compiler ce code pour qu'il soit exécuté efficacement.

Actuellement, je ne sais pas comment faire cela et j'aimerais avoir des conseils sur ce qu'il faut lire pour apprendre à le faire.

Le programme principal est écrit en C ++ et je connais le C ++. En fait, étant donné la plupart des scénarios, je sais comment le convertir en code d'assemblage qui permettrait d'atteindre l'objectif, mais je ne sais pas comment franchir l'étape supplémentaire pour le convertir en code machine. Si possible, j'aimerais compiler le code de manière dynamique, comme je le pense, de nombreux émulateurs de systèmes de jeu fonctionnent.

Si ce que je demande n'est pas clair, dites-le-moi afin que je puisse clarifier les choses.

Merci!

Était-ce utile?

La solution

Certains émulateurs de processeurs traitent le code machine comme s'il s'agissait d'un code octet et ils compilent JIT, presque comme s'il s'agissait de Java. Ceci est très efficace, mais cela signifie que les développeurs doivent écrire une version du compilateur pour chaque processeur sur lequel leur émulateur est exécuté et pour chaque processeur émulé.

Cela signifie généralement que cela ne fonctionne que sur x86 et est agaçant pour quiconque souhaite utiliser quelque chose de différent.

Ils pourraient également le traduire en code octet LLVM ou Java ou en .Net CIL, puis le compiler, ce qui fonctionnerait également.

Dans votre cas, je ne suis pas sûr que ce genre de chose soit la meilleure voie à suivre. Je pense que je le ferais en utilisant des bibliothèques dynamiques. Créez un répertoire censé contenir des "plugins". et laissez l'utilisateur compiler leur propre. Demandez à votre programme d’analyser le répertoire et de charger chaque DLL ou .so qu’il trouve.

En procédant ainsi, vous passerez moins de temps à écrire des compilateurs de code et plus de temps à effectuer des tâches.

Autres conseils

La routine à compiler dynamiquement doit-elle être dans un langage particulier? Si la réponse à cette question est "Oui, il doit s'agir de C ++". vous n'avez probablement pas de chance. C ++ est le pire choix possible pour la recompilation en ligne.

La partie dynamique de votre application (la routine itérateur fractal) constitue-t-elle un goulot d'étranglement majeur du processeur? Si vous pouvez vous permettre d'utiliser un langage non compilé, vous pourrez probablement vous épargner beaucoup de problèmes. Lua et JavaScript sont deux langages interprétés fortement optimisés qui ne s'exécutent que quelques fois plus lentement que le code natif compilé.

Si vous avez vraiment besoin que la fonctionnalité dynamique soit compilée en code machine, votre meilleur pari sera probablement d'utiliser clang / llvm. clang est le frontal C / Objective-C développé par Apple (et quelques autres) pour permettre une recompilation dynamique en ligne et performante. llvm est le type d'arrière-plan utilisé pour convertir un code octet portable en code machine natif. Sachez que clang ne prend actuellement pas beaucoup en charge le C ++, car c'est un langage difficile à maîtriser.

Si vous pouvez écrire vos extensions dynamiques en C (pas C ++), vous pouvez trouver le compilateur Tiny C être utile. Il est disponible sous la licence LGPL, compatible avec Windows et Linux, et constitue un petit exécutable (ou une bibliothèque) de ~ 100 Ko pour le pré-processeur, le compilateur, l'éditeur de liens et l'assembleur, très rapidement. L’inconvénient, c’est que cela ne peut se comparer aux optimisations que vous pouvez obtenir avec GCC. Un autre inconvénient potentiel est que c'est X86 seulement, autant que je sache.

Si vous avez décidé d'écrire l'assembly, TCC peut gérer cela - la documentation indique qu’elle prend en charge une syntaxe semblable à celle du gaz et prend en charge les codes opération X86.

TCC prend également totalement en charge la norme ANSI C, qui est presque entièrement compatible avec C99.

Cela étant dit, vous pouvez inclure TCC en tant qu'exécutable avec votre application ou utiliser libtcc (il n'y a pas beaucoup de documentation sur libtcc en ligne, mais elle est disponible dans le paquet source). De toute façon, vous pouvez utiliser tcc pour générer des bibliothèques dynamiques ou partagées , ou des exécutables. . Si vous aviez choisi la route de la bibliothèque dynamique, il vous suffirait d'y insérer une fonction Render (ou autre), et dlopen ou LoadLibrary dessus. et appelez Render pour exécuter enfin le rendu conçu par l'utilisateur. Vous pouvez également créer un exécutable autonome et popen . / a> et effectuez toutes vos communications via les stdin et stdout des ordinateurs autonomes.

Puisque vous générez des pixels à afficher sur un écran, avez-vous envisagé d'utiliser HLSL avec la compilation de shader dynamique? Cela vous donnera accès au matériel SIMD conçu pour ce type de choses, ainsi qu’au compilateur dynamique intégré directement à DirectX.

LLVM devrait pouvoir faire ce que vous voulez. Il vous permet de former une description du programme que vous souhaitez compiler de manière orientée objet, puis de le compiler en code machine natif au moment de l'exécution.

Nanojit est un très bon exemple de ce que vous voulez. Il génère un code machine à partir d'une langue intermédiaire. C'est C ++, c'est petit et multi-plateforme. Je ne l'ai pas beaucoup utilisé, mais j'ai aimé jouer avec des démos.

Crachez le code dans un fichier et compilez-le en tant que bibliothèque chargée dynamiquement, puis chargez-le et appelez-le.

Existe-t-il des raisons pour lesquelles vous ne pouvez pas utiliser de solutions basées sur un processeur graphique? Cela semble crier pour un.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top