Je recherche un langage de programmation pour lequel un compilateur existe et qui prend en charge le code de modification automatique. J'ai entendu dire que LISP soutient ces caractéristiques, mais je me demandais s'il y a une langue plus c / c ++ / D - comme ces caractéristiques. P>
Pour clarifier ce que je veux dire: p>
Je veux pouvoir avoir d'une certaine manière accès au code de programmation au moment de l'exécution et appliquer tout type de modification, c'est-à-dire en supprimant les commandes, ajout de commandes, en changeant. Comme si j'avais l'astarté de mon programme. Bien sûr, je ne peux pas avoir cet arbre dans une langue compilée, il doit donc être fait différent. La compilée devra traduire les commandes auto-modificatives en leurs modifications équivalentes binaires afin de fonctionner à l'exécution avec le code compilé. P>
Je ne veux pas dépendre d'un VM, c'est ce que je voulais dire avec compilé :) p>
7 Réponses :
"Langue dynamique" est un terme large qui couvre une grande variété de concepts. Le typage dynamique est supporté par C # 4.0 qui est une langue compilée. Objective-C prend également en charge certaines caractéristiques des langues dynamiques. Cependant, aucun d'entre eux n'est même proche de LISP en termes de soutien de la modification automatique. P>
Soutenir un tel degré de dynamisme et de code auto-modificateur, vous devez avoir un compilateur complet à appeler au moment de l'exécution; C'est à peu près ce qu'un interprète est vraiment. p>
Certaines implémentations LISP n'ont pas d'interprètes en soi, mais simulent-le en compilant à la volée. Je suppose que cela aide lorsque vous avez le code dans une forme analysée en premier lieu.
David: En effet. C'est ce que je voulais dire de "... Vous devriez avoir un compilateur complet à appeler au moment de l'exécution." Un interprète fournit de manière transparente cette installation, tandis que dans un environnement compilé, vous devez essentiellement compiler des choses au moment de l'exécution. Néanmoins, ce n'est pas beaucoup comme le code statique de la compilation.
Vous voudrez peut-être envisager d'utiliser C ++ avec LLVM pour (principalement) génération de code portable. Vous pouvez même tirer dans Clang ainsi que pour travailler dans des arbres d'analyse C (Notez que Clang a une prise en charge incomplète pour C ++. Actuellement, mais est écrit en C ++ elle-même) p>
Par exemple, vous pouvez écrire un noyau d'auto-modification en C ++ pour interfacer avec Clang and LLVM et le reste du programme en C. Stocker l'arborescence d'analyse pour le programme principal à côté du code d'auto-modification, puis le manipuler avec clang au moment de l'exécution. CLANG vous permettra de manipuler directement l'arbre AST de quelque manière que ce soit, puis compilez-la jusqu'au code de la machine. P>
Gardez à l'esprit que la manipulation de votre AST dans une langue compilée signifie toujours, y compris un compilateur (ou un interprète) avec votre programme. LLVM n'est qu'une option facile pour cela. P>
Oui, j'ai beaucoup lu sur LLVM. C'est un très beau projet, mais pas ce dont j'ai besoin dans cette question particulière :)
En fait, cela ressemble exactement à ce dont vous avez besoin. J'ai clarifié une utilisation possible pour cela dans ma réponse.
Quelque part dans mon esprit, j'espérais un moyen d'appliquer directement de telles modifications, sans avoir à les compiler à nouveau - manipuler directement du code binaire. Mais il semble que cela soit presque impossible sans retourner à l'assembleur.
La manipulation directe du code binaire va être une douleur pure. Pour un, vous ne pourrez pas le faire d'une vue de haut niveau; Le compilateur va mélanger l'ordre d'exécution, garder des variables aléatoires dans des registres, etc., de sorte que la connexion entre l'ASM et le code C est non évidente. Le noyau Linux fait de l'auto-patching - mais seulement dans une mesure très limitée, et uniquement sur des segments d'assembleuse en ligne.
C # a toujours permis au code auto-modificateur. p>
Mais ce n'est pas compilé de façon natif (se déroule à l'intérieur du CLR). OP n'était pas clair à ce moment-là.
Ce n'est pas nécessairement vrai. C # compile au code natif sur certaines plates-formes telles que l'iPhone et la Xbox 360. Toutefois, vous ne pouvez pas utiliser la réflexion.MIT sur ces plates-formes.
essayez groovy. C'est une langue basée sur Java-JVM dynamique qui est compilée au moment de l'exécution. Il devrait être en mesure d'exécuter son propre code. P>
http://groovy.codehaus.org/ p>
Sinon, vous avez toujours PERL, PHP, etc ... mais ce ne sont pas, comme vous le suggérez, C / C ++ / D- Langues similaires. P>
Perl ou PHP suffirait assez C / C ++ / D comme, j'essayais plus d'exclure des choses comme Cobol, Lisp et similaire. Mais je ne veux pas Jit, je le veux vraiment complètement compilé et exécutable Independet
Dans ce cas, allez certainement avec perl ... vous ne reviendrez jamais.
javascupe + v8 fort> (le compilateur JavaScript chrome) p>
JavaScript est p>
Et vous pouvez maintenant le compiler avec V8: http://code.google.com/p / v8 / p>
V8 est compilé "juste dans le temps", mais il fonctionne toujours dans une machine virtuelle et l'astucieux ne le veut pas.
De toute évidence, la langue d'auto-évaluation doit être exécutée sur un compilateur JIT ou un interprète, sinon comment exécuter des données comme code? Il n'y a pas une telle chose qu'une langue auto-évaluatrice de 100% précompilée.
probablement il y a une raison pour laquelle LISP est comme si c'est? LISP a été conçu pour programmer d'autres langues et calculer avec des représentations symboliques du code et des données strong>. La limite entre le code et les données n'est plus là. Cela influence la conception et la mise en œuvre d'un langage de programmation. P>
LISP a obtenu ses fonctionnalités syntaxiques pour générer un nouveau code, traduire ce code et l'exécuter. Ainsi, le code pré-analysé utilise également les mêmes structures de données (symboles, listes, chiffres, caractères, ...) utilisés pour d'autres programmes. P>
LISP connaît ses données à l'exécution - vous pouvez tout interroger pour son type ou sa classe. Les classes sont des objets eux-mêmes, de même que les fonctions. Donc, ces éléments du langage de programmation et des programmes sont également des objets de première classe, ils peuvent être manipulés comme tels. langage dynamique em> n'a rien à voir avec "dactylographie dynamique". P>
"Langue dynamique" signifie que les éléments du langage de programmation (par exemple via des classes méta-objets et le protocole de méta-objet) et du programme (ses classes, fonctions, méthodes, emplacements, héritage, ...) Peut être examiné le temps d'exécution et peut être modifié au moment de l'exécution. strong> p>
Probablement plus de ces fonctionnalités que vous ajoutez à une langue, plus elle ressemblera à Lisp. Puisque Lisp est à peu près le maximum local d'un langage de programmation programmable simple, dynamique et programmable. Si vous souhaitez certaines de ces fonctionnalités, vous voudrez peut-être penser à quelles fonctionnalités de votre autre langage de programme que vous devez abandonner ou sont disposées à abandonner. Par exemple, pour une simple langue de code de code, le modèle de syntaxe C pourrait ne pas être pratique. P>
So C-like et "langage dynamique" pourrait ne pas vraiment être un bon ajustement - la syntaxe est une partie de l'image entière. Mais même le modèle de syntaxe C limite à quel point nous pouvons travailler avec une langue dynamique. P>
Merci pour cette question d'élaboration. Je en savais déjà certaines parties, mais je me demandais toujours si cela serait possible avec un plus de C-like et si quelqu'un l'a fait. Je suppose que je vais avoir un regard plus approfondi sur Lisp.
Je ne veux pas dépendre d'un VM, c'est ce que je voulais dire avec compilé :) p> blockQuote>
Si c'est tout ce que vous recherchez, je recommanderais Python ou Ruby. Ils peuvent tous les deux courir sur leurs propres machines virtuelles et la JVM et le CLR .NET. Ainsi, vous pouvez choisir n'importe quel exécution que vous voulez. Parmi les deux, Ruby semble avoir plus d'installations de méta-programmation, mais Python semble avoir plus d'implémentations matures sur d'autres plates-formes. P>
Je voulais dire que je ne veux pas avoir aucun i> vm de ce genre. Ruby, Java, tout ça, ce n'est pas compilé. Je ne veux pas ça
en.wikipedia.org/wiki/elf-modifier_code#high_level_languag ES
Que voulez-vous dire "code auto-modificateur", et pour cette affaire "dynamique"? Les deux ne sont généralement pas considérés comme synonymes. Si vous pouviez clarifier ce que vous voulez, nous pourrions probablement vous aider à mieux mieux vous aider.
Oui, j'avais un coup d'œil à la page Wiki auparavant, mais j'espérais d'autres langues, plus C / C ++ comme.
Quel est le cas d'utilisation? Pourquoi voulez-vous être capable de compiler le code à l'exécution? Et avez-vous essayé simplement d'appeler à GCC ou à un autre compilateur et à charger le code comme une bibliothèque dynamique?
Il n'y a pas de cas d'utilisation unique où j'en ai besoin. Je voudrais tout simplement aimer utiliser une telle langue, jouer avec elle. Un cas possible des États-Unis pourrait être une programmation et une optimisation de l'AI, mais pour moi, c'est juste quelque chose que j'aimerais vraiment avoir mes mains sur
Vous pouvez trouver un échantillon en C # ici: Reboltorial.com/blog/redirect- Shell-to-Rebol-console