我的一个没有编程知识的朋友问我这个问题,我发现它很有趣。
我认为这是不可能的,因为这将需要真正先进的人工智能,该人工智能能够分析问题的文本,考虑解决方案并对其进行编程。对我而言,仅仅考虑一台能够编写简单计算器的机器就显得非常先进。
但是也许我错了,我想知道您对此有何看法,是否知道有关该主题的任何文章/研究,是否已经存在,或者是否有可能选择规格并获取机器可以对此“规范”进行自我编程?
我的一个没有编程知识的朋友问我这个问题,我发现它很有趣。
我认为这是不可能的,因为这将需要真正先进的人工智能,该人工智能能够分析问题的文本,考虑解决方案并对其进行编程。对我而言,仅仅考虑一台能够编写简单计算器的机器就显得非常先进。
但是也许我错了,我想知道您对此有何看法,是否知道有关该主题的任何文章/研究,是否已经存在,或者是否有可能选择规格并获取机器可以对此“规范”进行自我编程?
Answers:
乔尔实际上在几年前回答了这个问题。“教机器如何自行编程”的实际含义是“教机器如何获取规格并创建与该规格相对应的程序”。考虑到这一点:
这里的问题非常根本。为了机械地证明程序符合某些规范,规范本身需要非常详细。实际上,规范必须定义有关程序的所有内容,否则,任何事情都无法自动机械地得到证明。现在,如果规范确实定义了有关程序运行方式的所有内容,那么瞧瞧,它包含了生成程序所需的所有信息!现在,某些极客走到了一个非常黑暗的地方,他们开始考虑将规范自动编译到程序中,他们开始认为他们只是发明了一种无需编程即可对计算机进行编程的方法。
现在,这相当于永动机的软件工程。这是crackpots不断尝试做的事情之一,无论您告诉他们多少它永远无法工作。如果规范准确地定义了程序将执行的操作,并且具有足够的详细信息可以用来生成程序本身,那么这就引出了一个问题:您如何编写规范?这样一个完整的规范与底层计算机程序一样难以编写,因为规范编写者必须回答与程序员一样多的细节。要使用信息论中的术语:规范需要与计算机程序本身一样多的香农熵。熵的每一位都是规范编写者或程序员做出的决定。
因此,最重要的是,如果真的有一种机械方法可以证明程序的正确性,那么您所能证明的就是该程序是否与某些必须包含相同熵的程序相同。作为第一个程序,否则某些行为将是不确定的,因此未经证实。因此,现在编写规范与编写程序一样困难,并且您所做的一切只是将一个问题从这里移到了那里,并且什么也没做。
解决此问题的唯一方法是生产一台具有足够直觉的实际智能型计算机,以在生成软件时始终自动执行您和我所做的所有空白操作……在这种情况下,您最终会得到一台能够像人类开发人员一样进行自我编程的计算机。;)
当然,我们做 这 一切 的 时候(对于问题的子集极其有限)。想象一下再走一两步,然后将类似Siri的东西绑定到这些代码生成器的输入中(或类似Wolfram Alpha的东西),这反过来编写代码并解决您的问题,这是微不足道的。我希望某个地方已经存在可以做最基本的事情。
为企业编写复杂软件的问题不是编写程序来编写代码,而是编写程序来满足需求。
我认为@Mason Wheeler的答案掌握了关键思想。它是这样的:
井字游戏的Shannon熵非常小。因此,我们将井字游戏称为“已解决”或“确定性”游戏。一旦你读完小学,就没什么意思了。跳棋的熵较高,如果您考虑可以玩的所有可能游戏的熵。但是跳棋也是一种“解决”或“确定性”的游戏。如果您先走,则只能赢或平。国际象棋的熵要高得多,但自2006年以来,没有人能击败最好的计算机玩家。因此,从某种意义上说,计算机已经以人类无法掌握的方式掌握了国际象棋。蓝色巨人分析了维基百科,然后对人类玩家进行了危险游戏,并击败了他们。
下一步是什么?小说或莎士比亚的十四行诗的熵是什么?
同样,在编程领域,可能出现的是越来越多的能力。Prolog解决了一系列计算机问题,您在其中设置了问题,然后计算机解决了问题的答案。某人可能会发现一类计算机可以满足的简单编程问题,等等。然后有人将以此为基础在某些问题空间内生成“按需定制”。顺其自然。
我认为问题就变成了,人工智能要花多长时间才能掌握一定量的熵……以及需要多少计算资源?我认为计算机无法掌握人类最好的大脑所掌握的熵是不可想象的 -大脑没有任何魔力-但问题是,您需要多少个核,到达那里需要几个世纪?
但是...计算机能完成我的工作吗?不可思议!
这很难回答,因为就像人工智能一样,一旦我们完成了它,那将是因为我们将编写一个执行该程序的程序。评论家会说:“嗯,这台机器本身并不是真正的编程!它只是完全按照您给出的程序进行!”
嗯,是。无论我们用计算机完成什么工作,我们都将通过给它一些程序来执行它。如果那是反对的话,那么我们将无能为力。然而,在某些时候,人们认为象棋计算机显然是智能的。现在他们可以了,我们确切地知道怎么做,而且我们认为那不是明智的。潜水艇仍然不会游泳。
所以-考虑几个例子。
几十年来,我们有了解析器生成器。您给他们提供一种语言的描述,对其进行处理,结果是该语言的解析器的代码。我们确切地知道它是如何完成的,但是那不是计算机编程本身吗?
其次-告诉您犯了错误的编辑器(语法错误,不存在的变量等)。它本身不编程任何东西,但是可以告诉您您做错了什么。它只在表面上。
您只需单击并拖动UI控件即可使用的语言以及将使它们真正起作用的代码将自动生成。
JIT编译器。该软件可以识别当前正在运行的软件中的热点,并通过高度优化的编译代码代替其中的一些热点,从而在运行时有效地对其自身进行优化。我认为这是一个看起来像是机器编程本身的例子,直到您确切地知道它是如何发生的,然后事实证明,它只是像往常一样按照程序员的指示去做。
一般游戏。这是一个有趣的研究领域,研究人员编写的程序可以读取游戏规则的描述,然后程序可以相互对抗。因此,这些程序代替了井字游戏程序或国际象棋程序,而是读取井字游戏或国际象棋的规则或当场制作的一些新游戏的程序,然后可以玩它们。该程序本身并不是在编程,但是在没有对国际象棋规则进行硬编码的情况下,它确实可以下国际象棋。曾经有一段时间,显然可以认为这是计算机自学的东西。
我们朝着总体方向采取了许多小步骤。
但是我想不出任何可以根据早期运行结果重写自己的程序,或者可以在自己的代码中识别过时或效率低下的例程的程序。我认为有一天我们会拥有它,并且我们将认为它没有什么特别的,因为它只是最新编译器的一部分功能...