程序合成:挑战与范式
1. 程序合成的挑战
程序合成是一项极具挑战性的任务,目前尚未出现强大且可扩展的程序合成器。主要挑战如下:
- 搜索空间巨大 :指令组合数量随程序长度呈指数级增长,即使只有部分组合在给定编程语言中语法正确。以合成一个 m 元布尔函数为例,假设编程语言包含 k 个二元指令,由 n 个指令组成的树状程序数量为 $\binom{\frac{n}{2}}{k}\binom{\frac{n}{2}}{m}cat(n)$,其中 $cat(n)$ 是第 n 个卡特兰数,$cat(n) = \frac{\binom{2n}{n}}{n + 1}$。对于 11 位多路复用器(m = 11)和 k = 4 个二元指令,搜索空间估计有 $2.93 × 10^{11}$ 个程序。
- 多模态评估函数 :编程语言丰富,同一功能可通过多种方式表达,从程序空间到行为空间的映射是多对一的。这导致存在多个正确程序,搜索问题的评估函数具有多模态特性。多模态一方面增加了找到解决方案的统计概率,另一方面使搜索方向的优先级确定变得困难。此外,多模态可能表明程序合成任务约束不足,合成程序需要在训练集之外具有良好的泛化能力。
- 指令语义复杂 :指令是抽象符号,其含义取决于语义,而语义由程序执行的“基础”(如解释器、编译器或硬件)实现。单个指令的语义通常简单,但由于指令可在不同上下文和顺序中应用,其整体效果难以建模。指令之间存在强上位性,程序的行为可被视为涌现属性。
- 缺乏局部性 :与传统 AI 搜索问题(如 peg 谜题)不同,计算机程序的代码修改与行为变化
超级会员免费看
订阅专栏 解锁全文
1025

被折叠的 条评论
为什么被折叠?



