免责声明:我不是以英语为母语的人,也不是该领域的专家,我是业余爱好者- 期待以下内容不精确和/或错误。因此,本着 stackoverflow 的精神,不要害怕纠正和改进我的散文和/或我的内容。另请注意,这不是对自动编程技术的完整调查(来自模型驱动架构(MDA)的代码生成(CG)至少值得一提)。
我想在Varkhan回答的内容中添加更多内容(这基本上是正确的)。
自动编程的遗传编程(GP) 方法结合其适应度函数,将两个不同的问题(“自编译”在概念上是显而易见的):
- 自我改进/适应 - 合成程序,如果需要,合成器本身;和
- 程序综合。
wrt self-improvement/adaptation参考 Jürgen Schmidhuber 的Goedel 机器:自我参照的通用问题解决者,可证明最佳的自我改进。(附带说明:有趣的是他在人工好奇心方面的工作。)与本次讨论相关的是自主系统。
wrt程序综合,我认为可以分为 3 个主要分支:随机(概率 - 像上面提到的 GP)、归纳和演绎。
GP本质上是随机的,因为它通过交叉、随机突变、基因复制、基因删除等启发式方法生成可能程序的空间……(而不是使用适应度函数测试程序并让适者生存和繁殖)。
归纳程序综合通常被称为归纳编程(IP),其中归纳逻辑编程(ILP)是一个子领域。也就是说,一般而言,该技术不限于逻辑程序合成或以逻辑编程语言编写的合成器(也不限于“ ..自动演示或语言/分类学习”)。
IP通常是确定性的(但也有例外):从不完整的规范(例如输入/输出对示例)开始,并使用它来限制满足此类规范的可能程序的搜索空间,然后对其进行测试(生成和测试)方法)或直接合成一个程序来检测给定示例中的重复,然后对其进行概括(数据驱动或分析方法)。整个过程本质上是统计归纳/推理——即考虑将什么包含在不完整的规范中类似于随机抽样。
生成和测试和数据驱动/分析§方法可以相当快,所以两者都是有希望的(即使直到现在只有很少的综合程序被公开展示),但是生成和测试(如 GP)是令人尴尬的并行然后可以预期显着的改进(缩放到实际的程序大小)。但请注意,本质上是顺序的增量归纳编程(IIP)§ 已证明比非增量方法更有效几个数量级。
§ 这些链接直接指向 PDF 文件:抱歉,我找不到摘要。
演示编程(PbD) 和示例编程(PbE) 是已知可实际利用归纳程序综合的最终用户开发技术。
演绎程序综合从(假定的)完整(正式)规范(逻辑条件)开始。其中一种技术利用了自动定理证明器:为了合成一个程序,它构造一个满足规范的对象存在的证明;因此,通过Curry-Howard-de Bruijn 同构(证明作为程序对应和公式作为类型对应),它从证明中提取程序。其他变体包括使用约束求解和子程序库的演绎组合。
在我看来,实践中的归纳和演绎综合是从两个稍微不同的角度来解决同一个问题,因为什么构成了完整的规范是有争议的(此外,今天的完整规范明天可能会变得不完整——世界不是静止的)。
When (if) these techniques (self-improvement/adaptation and program synthesis) will mature, they promise to rise the amount of automation provided by declarative programming (that such setting is to be considered "programming" is sometimes debated): we will concentrate more on Domain Engineering and Requirements Analysis and Engineering than on software manual design and development, manual debugging, manual system performance tuning and so on (possibly with less accidental complexity compared to that introduced with current manual, not self-improving/adapting techniques). This will also promote a level of agility yet to be demonstrated by current techniques.