非常有意思的问题。实际上已经有不少前沿工作了:
但是编译器很复杂,不仅是词法语法的解析,还有各类标准的约束,不能用模糊推理来做,约束是非常严格的。要做理解,可能要准确的理解几百页甚至几千页的标准文档(或者它的一部分子集),并能够搞明白编译器和标准的区别,理解各类未定义行为。可想而知:
并且,既然能够理解代码,并进行推断,那么离正确的构造出可用程序也已经不远,AI就有极大的可能可以进行真正的自我强化,意味着:强AI的时代马上就会到来了。
主要问题是直接写个source to source的编译器就能达到100%的准确率了,而你训练NN不知道什么时候才能达到非0的准确率呢……
这个跟自然语言处理有不同之处。自然语言在有NN前的解决方案更糟,所以NN进来可以有改进。代码翻译本来就是切实可行的工程问题,现实中代码翻译的项目不多只是这种工程并不总有性价比。
不信你看javascript世界,首先有各种各样的专门设计成编译到javascript的语言,然后有各种各样的把别的语言编译到javascript的编译器,然后有各种各样的just in time的编译器去在运行时把javascript编译成机器码来跑……这并不是因为javascript这个语言本身的特性有什么过人之处,而是它作为web前端世界的唯一通用语言而使得它特别重要。重要的事情就有价值。
我觉得AI更适合去做一些还没有完全被解决的问题。比方说现有的解决方案也只是heuristic,那么很可能你有很大的样本去训练一个新的heuristic,我会觉得靠谱很多。
比方说你来做一个AI,它“看”一遍程序就给出一些分支概率的预测,我觉得我是能相信它可以比编译器里的那些手写的规则要好的,虽然还是比不过真的profiling。
EDIT
还有一个问题是自然语言的翻译天生是局部的。归根到底都是人。不太存在说一种自然语言的散文翻译到另一种自然语言里变成了诗歌,或者一种自然语言的小说到了另一种自然语言里,叙述顺序发生了变化。
但是比方说你要把shared-memory通信改写成message-passing,还要保持语言的style不变化。嘿嘿嘿。
这问题是我提的,真是没有意思,我回答上千个编程类的问题,一共就提过两次问,心血来潮讨论一个可能的方向,被嘲讽不知道什么是编译器,不懂编译原理,不知道什么是转码器?我开发好几个上万行代码项目,还是不同语言的人,一种编程语言都不会?
我科班毕业工作4年的人没用过gcc是怎么的?写十几年C++不知道什么是编译?
提这个问题是因为看到了另一个讨论Google的机器翻译中应用人工神经网络的问题,说实话实际看到的效果大大出乎我的意料,许多我以前认为机器翻译无法达到的效果都已经实现了,比如说中文和英文中同一个语义有不同的习惯性的语序,都可以自动调整过来,甚至可以将修饰内容从一个从句移到另一个从句中。所以我在考虑,相似的技术是否也可以用于编程语言?
在我看来,编程语言是有两面的,它的一面是面向人的接口,另一面是面向机器的接口。编译(以及解释执行)是面向机器的一面,通过程序,它可以将一段高级语言转化为可执行的机器码(或者中间码,还可以是中间语言比如说Javascript)。
但是,转化为可执行代码的过程,只保留了程序如何执行这一信息,而丢失了:
所以说,编译器将一段程序编译成了可执行代码,这和程序员阅读一段程序之后,将它改写成另一种语言,是一种完全不同的操作。编译器保证编译的过程绝对正确,但是在这个过程中,最开始编写程序的人的思维方式丢失了;而由程序员改写,则可以将原来的设计在一定程度上作为保留。这也正像是自然语言翻译中发生的事情:翻译的人需要理解原作者想要表达的含义,然后用另一种语言将这个含义表示出来,而不是堆砌原来文字中每个字词的字典解释。
我希望达到的所谓“翻译”而非“编译”的效果,正是希望在这个过程中,原始的架构设计、业务命名乃至于设计思想、设计风格能够在一定程度上被保留,以至于生成的是可维护的代码,类似于找一个程序员来照着重写的效果。
既然机器在不可能完全理解自然语言中的含义的情况下也可以做出相对准确的翻译,那么编程语言为什么不可能呢?
请不要忽视编程语言也是一种为人使用而设计的语言这一事实。既然它为人使用而设计,计算机直接生成起来就是有困难的、复杂的,所以用神经网络进行拟合并没有什么值得奇怪的地方。
至于应用,可以说这个问题本来就是探讨可能性,也和很多人讨论过错误率的问题,但毕竟可能与否可能是0到1的关键。如果说从一种编程语言翻译到另一种编程语言是可能的,那么从自然语言翻译到编程语言呢?从业务需求描述到UML呢?
世界很大。