用于遗传编程的基于llvm的代码突变?
Posted
技术标签:
【中文标题】用于遗传编程的基于llvm的代码突变?【英文标题】:llvm based code mutation for genetic programming? 【发布时间】:2015-02-09 19:34:43 【问题描述】:对于遗传编程的研究,我想在 llvm 的基础上实现一个进化系统并应用代码突变(可能在 IR 级别)。
我发现llvm-mutate 执行点突变非常有用。 据我了解,指令被计数/编号,然后可以例如删除编号指令。
但是,引入新指令似乎是代码中可用的语句之一。 然而,真正的突变将允许插入任何允许的 IR 指令,而不管它是否在要突变的代码中使用。 此外,应该可以插入链接库的库函数调用(当前代码中没有使用,但可能可用,因为lib已经在clang中链接了)。
我是否在 llvm-mutate 中忽略了这一点,还是到目前为止真的不可能?
是否有任何项目试图/已经为 llvm 实施(ed)此类突变?
llvm 有很多代码分析工具,应该可以实现上述方法。 llvm 很大,所以我有点迷失方向。有哪些工具可能有用的提示(例如,获取可用库函数的列表等)?
谢谢 亚历克斯
【问题讨论】:
【参考方案1】:非常有趣的问题。一段时间以来,我一直对进行二进制级遗传编程的可能性很感兴趣。关于你问的:
从他们的文档中可以明显看出,LLVM-mutate 无法满足您的要求。但是,我认为不这样做是明智的。我的推理是,任何机器语言基因程序都不可避免地会面临"Halting Problem",例如不可能知道随机生成的指令是否会使整个计算机完全崩溃(例如,通过为操作系统保留的指针分配一个值),或者它可能会永远运行并占用所有 CPU 周期。图灵定理告诉我们,不可能提前知道给定程序是否会这样做。请注意,LLVM 变异可能会导致完全无害的程序仍然崩溃或永远运行,但我认为他们的方法仅通过现有指令就不太可能发生这种情况。
然而,像“不可能”这样的事情只会让科学家望而却步,而不是工程师 :-)...
我一直在想的是:在自然界中,真正的突变更像 LLVM 突变,就像我们在正常的遗传编程中所做的那样。换句话说,他们只是从非常有限的集合(A,T,C,G)中交换字母,并且每一种可能的变化都来自于此。我们可以有一个程序或一组程序,其中包含一组初始指令,以及一组链接或在程序中定义的“可能功能”。这些函数中的大多数实际上不会被使用,但它们将在那里为突变提供“原始 DNA”,就像在our DNA 中一样。这组函数将具有问题空间的完整(或半完整)可能函数集。然后,我们只需使用 LLVM-mutate 中的基本操作。
一些可能的问题:
考虑到可能的可变性,唯一的方法是 可接受的执行时间将是有大量的 计算能力。可能在云端或通过 GPU 实现。
您仍然需要解决图灵先生的停机问题。 但是我认为这可以通过在 如果解决方案崩溃,它不会让您失望的“沙盒”: 类似于一次性虚拟机或类似 Docker 的东西 容器,有时间限制(摆脱无限循环)。一种 崩溃或超时的解决方案将变得最糟糕 健身,因此程序往往会偏离那些 路径。
至于为什么要这样做,我可以看到一些有趣的应用程序:自我修复程序、针对特定环境进行自我优化的程序、针对漏洞的程序“疫苗接种”、变异病毒、质量保证等。
我认为这里有一个潜在的开源项目。这将是疯狂、危险和耗时的漩涡:这只是我的项目。如果有人这样做,算我一个。
【讨论】:
你最终尝试过这个吗?据我所知,没有人有。我确实找到了 slash/A,这是对基于非 AST 的基因编程的不同看法。以上是关于用于遗传编程的基于llvm的代码突变?的主要内容,如果未能解决你的问题,请参考以下文章