这是一个通用的问题,尽管我很确定它的一些部分已经得到解答,但我需要的是意见而不是广泛的讨论。我打算做进化计算和遗传编程的硕士论文,我希望Linux/C++专家的意见是否可以从遗传程序创建源代码文件,调用gcc编译它们,如果它们失败编译以捕获失败的原因,如果它们编译执行编译的程序(作为新的进程),然后能够向该程序发送输入并捕获输出和任何引发的异常(或崩溃)。我知道这个话题太广泛了,但我想知道是否有人认为这是可撤销的,很难尝试,或者即使可以有更好的方式来做到这一点。C++遗传编程:调用链接器/编译器,执行编译后的程序和管道输入/输出
回答
是的,有可能这样做,而且其实很简单。你将源代码输出到一个临时文件(mkstmp
),fork
/exec
一个编译过程(输出到一个临时文件),你的fork/exec
生成的程序,在此之前你dup2
和pipe
插入一个输入和一个输出。这是基本的Unix编程,在C中做这件事并不复杂。
代码生成本身可能会更难以正确,但这很大程度上取决于项目。
此外,我们拥有几个月以来的现代化工具:我相信Clang可能是最值得关注的东西。如果您计划执行的代码很简单(或者不简单,但是结构化),那么您也可以直接输出LLVM代码。这并不难,并且使您能够及时生成高效的编译代码。
非常感谢您的链接!我没有想过使用其他编译器。 它自己的代码生成将是一个GP进化的过程,所以如果它没有编译,它就会死亡。如果编译和崩溃,段,引发异常等,它会死亡。即使它编译和运行顺利,它仍然必须按照每种情况下所需做的来生存。我想我可以改用Clang。代码生成将完全取决于所需任务的世代和复杂性。 – 2011-04-07 21:24:37
你想在这个遗传程序中优化什么?除了寻找运行的程序外,您还需要寻找什么标准?我不太明白...
要清楚,我问这个问题的原因是因为我只理解使用遗传算法试图解决某种优化问题。在这种情况下,你会有某种启发式方法,你可以评估过程中的所有孩子,然后根据启发式和选择标准培育新的后代。我不明白产生这个源的预期结果是什么,或者你会如何创建启发式来评估它。
它不是一个试图优化某些东西的遗传算法,它是一种机器学习 - 人造生命,试验看看机器是否有可能演化复杂的计算机代码,从中可以学习和演化更复杂的代码。程序功能,类别等将在每种情况下都应符合特殊标准进行评估,并且这样做有望能够创建“规则集”。例如,在我的第一步中,我会尝试发展一个函数,返回两个输入中哪一个更大。稍后,引擎应该能够使用该功能。 – 2011-04-07 21:18:36
好吧,如果你想使用遗传算法,在某个时间点,你将不得不根据你想优化的东西形成你的问题。你还需要形式化启发式评估你正在生成的源代码。我不明白为什么你在做什么与遗传算法有关。不过很酷的是,它似乎试图通过随机更改源代码行来“发展”计算机,但似乎并没有任何背后的方法。 – jberg 2011-04-07 21:22:50
有一种方法!此外,它不是一种优化算法,它是一种演化算法,用于创建可行,有意义且可用的代码。通过以下方式进行评估:a)编译错误检查b)异常检查c)无法完成任何可能的目标(输入和输出检查)。就像我说过的,我之前做过这件事,我的担心不是评估本身,而是与编译器和被调用的过程进行沟通,以便进行实际评估。此外,它不是一个GA,它是一个GP,没有字符串编码,固定的字符串,等等。参见:http://www.genetic-programming.org – 2011-04-08 01:41:06
- 1. 编译Fortran和C++程序并从intel编译器链接
- 2. 调试和编译C++程序后的不同输出
- 3. 编译Fortran程序和编译器/库
- 4. 以编程方式调用C#编译器编译C#代码
- 5. C程序编译但没有输出
- 6. 用ISPC编译器编译OpenMP程序
- 7. 从java程序调用C编译器
- 8. Objective C程序编译和执行
- 9. .NET编译器输出
- 10. Ruby Compass编译器输出
- 11. 编译器输出IndexOutOfBoundsException
- 12. 在C#中编译java编译器的输出结果
- 13. 编译器的编译可能会影响编译的程序?
- 14. 在C++程序中输出编译器版本
- 15. 通输出到编译器/连接
- 16. LLVM中编译器和编译器驱动程序的区别?
- 17. 更改默认C编译器输出
- 18. 为emacs编译模式捕获pva多行编译器输出
- 19. 在Objective-C编译器上编译不正确的C程序
- 20. 链接错误“LogonUser”编译C++程序?
- 21. 如何使用Borland C++编译器v5.5(bcc32)编译程序
- 22. 编译mysql连接器用mingw编译C++,编译错误
- 23. 编译后输出错误
- 24. 编译执行和编程语言
- 25. Rhino编译器的编程接口?
- 26. 编译与intel编译器icpc在linux的C++程序
- 27. 编辑预编译的通用处理程序的输出.ashx
- 28. 无法在eclipse中编译带有输入和输出的C++程序
- 29. 编译,运行并返回C++程序的输出,从PHP
- 30. 用C++编译器编译c代码
根本不傻,但非常耗时。在智力上具有挑战性的部分是想出一个很好的C++ DNA进化。你原始汤的主题/目标是什么? – 2011-04-07 18:23:29
是否有限制做到这一点是C++?我认为如果你打算让软件发生变化,可能会有更好的选择... – 2011-04-07 18:26:34
这不会起作用。发生突变并最终有助于改善是极不可能的。编译器不会忍受单个字母的变化,它们被设计为做相反的事情。 – 2011-04-07 18:43:16