是否可以编写一个可以每天输出数百个应用程序的自动应用程序生成器?应用程序只是一系列二进制值。如果超级计算机每天生成数百万个组合并输出生成的具有不同大小的二进制文件。然后这些二进制文件将“运行”以查看它们是否实际运行,如果它们执行,则会将这些二进制文件发送给某些测试人员以检查“生成的内容”。
谁知道,我们可能会开始获得100%无错误的解决方案。
答案 0 :(得分:7)
假设您正在生成大小为1KB的二进制文件(非常小)。 1KB是8192位。这意味着总共有2个 8192 可能的1KB“程序”。假设您每秒可以生成2个 20 程序(大约每秒一百万个程序,这是非常高的)。这意味着它仍然需要2 8172 秒来生成所有可能的1KB二进制文件,这是(根据wolfram alpha)大约10 2442 乘以宇宙的年龄。这应该让您了解在详尽搜索所有1KB程序时遇到有用程序的可能性有多大(无论如何有多少有用的1KB程序?)
答案 1 :(得分:4)
我将扩展Firestand关于遗传编程的答案。
有像你这样的想法;他们几乎一直都局限于一些人造环境。
我的朋友写了一个系统来自动(使用遗传编程)演变CoreWars环境的程序。这些程序不长(数十到数百个汇编指令),并且法律指令集不是很大,因此可能程序的空间比x86的完整GUI应用程序小得多。起初机器人几乎没有互相争斗;但是每一代人都有更好更好的战士。
您可以在research paper (PDF)中了解有关此概念的更多信息。
将这个想法应用到x86并不是一件容易的事情,这里的指令集很大,它们之间的交互有时非常复杂。但是,理论上您可以构建一个具有简化指令集的虚拟机,并为其演化程序。我已经在某个地方读到了这个,但我不记得在哪里。
尽管如此,即使对于非常简单的代码,检查所有可能的组合也是不合理的。你真的想要一些启发式策略,比如遗传编程。
你的想法还有另一个缺陷。您假设您可以严格指定程序的所有要求,以便可以自动测试所有要求。这是不可能的或非常接近不可能的。假设您要查找添加两个int32数字的程序,要确保程序正常工作,您必须检查所有可能的输入,因此有2 ^ 64种可能性。试着想象一下你在编写财务计划时需要检查多少场景。
您可以尝试使用“智能”系统来查找程序的正确性证明...但是因为您不仅限于某些程序子集(您可以生成任何可以在处理器上运行的东西),由于Halting problem,你不能推理所有程序。简单地说,如果不检查所有可能的输入,就无法检测某些程序是否正常工作。
答案 2 :(得分:3)
答案 3 :(得分:2)
答案 4 :(得分:1)
简短回答:不。虽然这在理论上是可行的,但与你在世界上的每一个彩票中每天赢得大奖的可能性相比,你的余生都要少得多。
应用程序只是一系列的 二进制值。
确实 - 一系列精确排序的二进制值。通过随机生成一系列二进制值,您将获得一个实际上是可执行文件的应用程序,实际执行,并且在Universe结束之前不会立即崩溃,概率为0。 (好吧,它并不完全为零,但它接近零,以至于它与真实宇宙中的它无法区分,而不是数学)。
请参阅Infinite monkey theorem,尤其是概率部分。
答案 5 :(得分:1)
这就像旧的锯:如果你有大量的猴子打字足够长的时间,他们最终会产生莎士比亚的作品。
这是个好消息。坏消息是,它们也会产生莎士比亚作品的每一个可能的拼写错误,包括那些倒退的作品,或者每个美丽的单词都被粗俗的单词所取代,甚至那将是他们将产生的所有其他东西中可忽略不计的部分。
除非你只有一只猴子,莎士比亚本人。