重现自己的程序

Min*_*ang 18 java quine

是否有可能创建一个Java程序将其源代码打印到一个新文件,并编译它,并运行已编译的程序?

pol*_*nts 23

更新:

好吧,不妨让它自动运行.享受疯狂.运行风险自负.


是的,这是可能的,因为我实际上已经写完了.它没有RUN部分(这太疯狂了,因为正如其他人提到的那样,它会导致无限循环),但这里是:Quine.java

import java.io.*;
public class Quine {
   public static void main(String[] args) throws Exception {
      char q = 34;
      String out = "Quine$";
      String text = (
         "import java.io.*; " +
         "public class [OUT] { " +
           "public static void main(String[] args) throws Exception { " +
             "char q = 34; String out = `[OUT]$`; String text = `[TEXT]`; " +
             "PrintWriter pw = new PrintWriter(out + `.java`); " +
             "pw.format(text, 34, out, text); " +
             "pw.close(); Runtime runtime = Runtime.getRuntime(); " +
             "runtime.exec(`javac ` + out + `.java`).waitFor(); " +
             "runtime.exec(`java ` + out); " +
           "} " +
         "}"
      ).replace("`", "%1$c").replace("[OUT]", "%2$s").replace("[TEXT]", "%3$s");
      PrintWriter pw = new PrintWriter(out + ".java");
      pw.format(text, 34, out, text);
      pw.close();
      Runtime runtime = Runtime.getRuntime();
      runtime.exec("javac " + out + ".java").waitFor();
      runtime.exec("java " + out);
   }
}
Run Code Online (Sandbox Code Playgroud)

所以这里是如何让疯狂开始:

  • javac Quine.java 编译
  • java Quine 运行它
    • 它将生成,编译和运行 Quine$
  • 我确保Quine.java尽可能可读,因此主要区别Quine$.java在于格式化和3x replace.该未成年人不同的是,Quine$.java已经out设置为Quine$$.
  • Quine$ 将生产,编译和运行 Quine$$
  • Quine$$ 将生产,编译和运行 Quine$$$
  • Quine$$$ 将生产,编译和运行 Quine$$$$
  • ...

请注意,这不会通过阅读.java源代码进行任何逆向工程或作弊,等等Quine是一个quine生成器,因为它生成不同格式的不同代码,但Quine$它几乎是一个真正的自包含的quine:它确实重现本身,它只是重新标记它Quine$$(它自我复制和重新标记Quine$$$等).

所以从技术上讲,没有无限循环:当文件系统无法处理另一个循环时,它最终会停止$.我能够通过强行删除所有Quine$*文件手动停止疯狂,但运行风险自负!


M.A*_*nin 11

对的,这是可能的.一个简单的实现是:让源代码在字符串中包含自己,将字符串保存到文件中并用相同的字符串填充自己的字符串(否则,初始字符串将具有无限大小,因为它的递归方式实现),编译文件,并运行编译后的文件(反过来,它将执行相同的操作).

非平凡的实现要困难得多.

  • "让源代码包含在一个字符串中"如何?由于字符串将是源代码的一部分,这将导致无限字符串. (6认同)

And*_*s_D 6

当然有效 - 看看rosetta代码并导航到Quine,这是一个自助参与程序,可以在没有任何外部访问的情况下输出自己的源代码.

Java中有一个例子.


09Q*_*534 5

自我复制的程序或自我复制的程序被称为Quine 程序

复制自身的Java示例程序。

public class QuineProgram {

     public static void main(String[] args){
      String f = "public class QuineProgram { "
        + "public static void main(String[] args)"
        + "{ String f =%c%s%1$c;"
        + " System.out.printf(f,34,f);}} ";
      System.out.printf(f, 34, f);
     }

}
Run Code Online (Sandbox Code Playgroud)

输出:

public class QuineProgram { public static void main(String[] args){ String f ="public class QuineProgram { public static void main(String[] args){ String f =%c%s%1$c; System.out.printf(f,34,f);}} "; System.out.printf(f,34,f);}} 
Run Code Online (Sandbox Code Playgroud)