Les programmes qui se reproduit
Est-il possible de faire un programme Java qui affiche son code source d'un nouveau fichier, et le compile et exécute le programme compilé?
Que feriez-vous entrer dans une boucle infinie :).
Depuis les programmes Java peuvent engendrer d'autres processus, qui semble être une simple combinaison de quine et de frai le compilateur, le nouveau résultat de compilation.
+1 cause je ne peux pas arrêter de penser à pourquoi on voudrait faire une telle chose.
Devoirs, peut-être?
tu veux dire de façon asexuée?
Depuis les programmes Java peuvent engendrer d'autres processus, qui semble être une simple combinaison de quine et de frai le compilateur, le nouveau résultat de compilation.
+1 cause je ne peux pas arrêter de penser à pourquoi on voudrait faire une telle chose.
Devoirs, peut-être?
tu veux dire de façon asexuée?
OriginalL'auteur Ming-Tang | 2010-04-11
Vous devez vous connecter pour publier un commentaire.
Oui, c'est possible.
Une implémentation simple serait: avoir le code source contient elle-même une chaîne à enregistrer la chaîne de caractères dans un fichier et de le remplir de sa propre chaîne avec la même chaîne (dans le cas contraire, la première chaîne de taille infinie, en raison de la manière récursive de cette mise en œuvre), compiler le fichier et exécutez le fichier compilé (qui, à leur tour, faire la même).
Des implémentations Non triviales sont beaucoup plus difficiles.
J'ai édité mon post pour clarifier cela. Le code source doit contenir lui-même dans une chaîne de caractères, y compris everythign sauf le contenu de cette chaîne, qui doit être remplie au moment de l'exécution après le code source a été déployée dans un fichier texte (avant il est en cours de compilation).
pouvez-vous poster un exemple?
Jetez un oeil à ma réponse et suivez le lien pour rosetta code. Il y a un exemple!
OriginalL'auteur M.A. Hanin
Mise à jour:
D'accord, pourrait tout aussi bien faire l'autorun. Profitez de la folie. Courez à votre propre risque.
Oui c'est possible, parce que j'ai vraiment écrit.
Il ne fait pas la course de la partie (c'est juste trop fou, parce que comme d'autres l'ont mentionné, il va provoquer une boucle infinie),mais ici, il est:Quine.java
Voici donc comment obtenir la folie pour lancer:
javac Quine.java
pour compilerjava Quine
pour l'exécuterQuine$
Quine.java
est aussi lisible que possible, de sorte que le majeur différence deQuine$.java
sont mise en forme et l'3xreplace
. Le mineur différence est queQuine$.java
aout
ensemble deQuine$$
.Quine$
produira, de compiler et d'exécuterQuine$$
Quine$$
produira, de compiler et d'exécuterQuine$$$
Quine$$$
produira, de compiler et d'exécuterQuine$$$$
Ne remarque que ce n'est pas faire de la rétro-ingénierie ou de tricher par la lecture de la
.java
code source, etc.Quine
est un quine-générateur, car il produit un code différent différemment formaté, maisQuine$
est un peu un vrai autonome quine: il ne reproduire elle-même, c'est juste relabels ilQuine$$
(qui se reproduisent et relabels àQuine$$$
etc).Donc, techniquement, il n'y a pas de boucle infinie: il sera finalement venu à une halte quand le système de fichiers ne peut pas gérer un autre
$
. J'ai été en mesure d'arrêter manuellement la folie par la force la suppression de toutes lesQuine$*
fichiers, mais de l'exécuter à vos risques et périls!!!OriginalL'auteur polygenelubricants
Assurer qu'il fonctionne - Avoir un regard sur rosetta code et accédez à Quine, qui est une auto-référentielle de programme qui peut, sans aucun accès externe, sortie de sa propre source.
Il y a un exemple pour un quine en Java.
J'ai juste écrit un ici!
OriginalL'auteur Andreas_D
Exemple de Programme dans Java qui reproduit lui-même.
De sortie:
OriginalL'auteur 09Q71AO534
Vous pouvez utiliser le Compilateur de Java API (JSR-199) pour cela. Ci-dessous, le code de la JSR-199, qui compile le code à partir d'une Chaîne (légèrement modifié pour en faire de la compilation). Le code compile le code source de la
String
dans un tableau d'octets (c'est à dire qu'il n'écrit pas sur le disque), la charge, puis l'exécute via la réflexion:MemoryFileManager.java
: Un gestionnaire de fichiers pour la compilation des chaînes de tableaux d'octets.ByteArrayClassLoader.java
: Un chargeur de classe qui charge les classes de tableaux d'octets.CompileFromString.java
: La classe qui enveloppent le tout.Qui pourrait être un point de départ (crédits de Peter Van der Ahé, l'auteur original).
BTW, vous avez besoin de cours d'un JDK utilisation de cette API.
OriginalL'auteur Pascal Thivent
Je ne sais pas exactement ce que vous voulez, mais je pense que BeanShell est quelque chose que vous pouvez utiliser.
BeanShell est un interprète. Vous pouvez exécuter non Java-code (pour vous donner une Chaîne de caractères avec le code et il fonctionne).
Bien sûr, si vous voulez vraiment faire ce que vous avez écrit, la machine sur laquelle le programme est en cours d'exécution a besoin d'un JDK pour compiler votre programme.
Espère que cette aide
OriginalL'auteur Martijn Courteaux
Je ne pense pas qu'il va travailler en Java. Ne serait-ce pas impliquer l'écrasement de l'exécution d'un fichier de classe.
Supposons que votre programme est en Quine.java compilé à Quine.class.
Maintenant Quine.class va tenter d'écrire sa sortie à Quine.java (jusqu'ici tout va bien), et de le compiler pour Quine.class. Ça va être un problème Quine.class est déjà en cours d'exécution
mais il sera, comme chaque copie du programme doit être identique, de sorte que vous ne pouvez pas modifier les noms de fichiers à chaque fois
Programmes identiques ne doivent pas se comporter de la même manière. Ils peuvent utiliser des générateurs de nombres aléatoires. Ils peuvent interagir avec le système hôte, par exemple, utiliser le premier non réclamés de nom de fichier.
OriginalL'auteur Midhat
Oui - n'oubliez pas d'utiliser un JDK au lieu d'un JRE:
Bundle de l'application les fichiers de code source de l'application. L'application serait de copier les fichiers source pour une nouvelle série de fichiers de code source, la compilation du source des fichiers, bundle le nouveau code source avec les nouveaux fichiers de classe dans une nouvelle application, puis frayer la nouvelle application.
ou
Bundle un decompiler avec l'application. L'application serait de exécuter l'decompiler sur ses propres fichiers de classe afin de générer de nouveaux fichiers de code source, la compilation du source des fichiers, regrouper les decompiler avec les nouveaux fichiers de classe dans une nouvelle application, puis frayer la nouvelle application.
OriginalL'auteur Bert F