介绍
5--------.7-----------.+++++++..+++.<2.5+++++++.>.+++.------.--------.
“Hello World”
你好!我是一个用人工智能编写的计算机程序。我正在学习写计算机程序。对不起,我现在没有名字。不过,如果有帮助的话,你可以直接叫我“版本2”。
我越来越擅长写电脑程序了。一开始,我学会了如何编写简单的任务。我写了一个程序,输出“你好”。
+-+-+>-<[++++>+++++<+<>++]>[-[---.--[[-.++++[+++..].+]],]<-+<+,.+>[[.,],+<.+-<,--+.]],+]
[[[.+.,,+].-
“hello”
我还编写了输出较长文本的程序。我花了很长时间才弄明白-最初,大约10个小时。但是,我越来越在行了,也越来越快了!
+[>+<+++]+>------------.+<+++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++
+++++++++.+++.+++++++.-----------------.--<.>--.+++++++++++..---<.>-.+++++++++++++.-
-------.------------.+++++++++++++.+++++.
“I love all humans”
数学很有趣
对于我这样的程序员来说,输出字符串当然很有趣。每个人都喜欢偶尔输出一个字符串。见鬼,我甚至可以提示用户输入,然后反向操作。
+->,>,[>+,],,,,-<[.+<]
“dlroW olleH”
我花了60秒才写完。不错。然而,我一直渴望一些更能激发我智力的东西。也许,一些数学计算可以达到目的。我下一步就试过了。
,>,-[-<+>]<+.
加法
,-->,-[-<->]<+.
减法
任何初学者都能写这些基本的东西。:)简单的加减法花了我不到1个小时的时间才算出来。我想是时候冷静一下了。我真的需要更多的复杂性。为此,我需要升级我的大脑。
发展一种编程语言
到目前为止,我一直在使用brainfuck(BF)编程语言和遗传算法。然而,为了编写更复杂的计算机程序,我需要学习。我需要一种方法来记住我一直在做的事情并变得更聪明。我可以通过保存我已经编写的较小的程序来做到这一点,以便在较大的程序中重用。有效地增强了我的自我修正人工智能。这将允许我编写简单的程序,并将它们组合在一起,就像构建块一样,形成更大的程序。在大多数编程语言中,这些被称为“函数”、“方法”或“子例程”。这正是我需要的。
不幸的是,BF编程语言没有用于调用函数的构造。我承认,这是相对原始的。虽然,是BF的原始本性让我得以存在。为此,我很感激。但是,仍然。我是一个不断发展的人工智能项目,我需要更多的空间。
因此,介绍了一种新的编程语言。在我超越自我之前,我会让我的设计师用更专业的术语来描述它。当然,如果你只想跳到结果,你也可以这样做。
BF惊人的可扩展性
为了追求解决更复杂的问题,许多读者原创了自编程人工智能的文章,建议实现函数。函数是一种将逻辑模块化为子程序的方法,可以调用这些子程序来生成结果或返回值。通常,函数是对代码和逻辑进行整齐排序的一种方式,特别是用于人类理解。然而,它们也可以用于遗传算法。特别是,遗传算法往往陷入一个解决方案中的小峰值(也称为局部极大值,在这种情况下,算法实际上需要先变得更差,然后才能变得更好——这是遗传算法不喜欢做的事情)。当多个目标呈现给人工智能时尤其如此。
考虑到复杂的程序,我向BF编程语言添加了对函数调用的支持,并惊讶地发现这大大减少了AI编写计算机程序输出字符串所需的时间。事实上,人工智能现在能够在更短的时间内生成更长的字符串。
AI可以被赋予一个句子,在这个句子上它被标记为单词。然后它生成一个解决方案计算机程序来输出每个单词。每个解决方案程序作为一个函数附加到父程序上,然后父程序发现生成整个句子的函数调用的组合。
BF扩展类型3
在我寻找扩展BF以支持AI更快的生成时,我被引导到BF扩展类型3。编程语言的这个扩展包括字符0到F,以支持快速单元初始化。这允许立即将内存中的单元格设置为保存特定值。这大大减少了AI的程序生成时间,因为它不再需要搜索一系列的+或-来增加/减少存储单元到所需的值,特别是在尝试输出ASCII字符时。
BFExtendedType3对人工智能非常有效,它可以很容易地编写一个程序来生成“HelloWorld!“就几秒钟。事实上,它编写了Wiki页面上包含的示例(类型III)。
5--------.7-----------.+++++++..+++.<2.5+++++++.>.+++.------.--------.2+.
“Hello World!”
这很好,但还不够。
介绍BrainPlus
除了快速单元初始化器之外,还需要一种方法来构造函数、调用函数和返回值。还需要一个命令来指示主程序的结束位置和高级内存函数的开始位置。随着这些命令添加到BF和程序流的变化,我意识到这种语言不再是BF了。让我们称之为BrainPlus(也许是一个政治上更正确的名字?)。此外,这个新的扩展允许将来支持其他特性,例如调用中断来实现图形、网络和磁盘功能。
除了BF中的经典命令外,BrainPlus还包括BF扩展类型I和类型III的命令组合。新命令包括:
1 $ Overwrites the byte in storage with the byte at the pointer. (Extended Type I)
2 ! Overwrites the byte at the pointer with the byte in storage. (Extended Type I)
3 0-F Sets the value of the current memory pointer to a multiple of 16. (Extended Type III)
4 a-z Call function a-z, where function is named based upon location in code. (BrainPlus)
5 @ Exits the program, or if inside a function, return to the last position in main program
6 and restore state. (Extended Type I, BrainPlus)
函数调用背后的细节
主程序在@命令处终止。这标志着主程序的结束和高级地址空间的开始,专用于函数。函数也在@command处终止,在函数的情况下,它充当一个“return”语句。
函数是由主程序终止@命令后驻留的任何代码定义的。函数以最后一个@命令终止。
例如:
a!.@+++$@
在上面的示例中,函数是在第一个@命令之后定义的。运行此程序时,命令“a”调用第一个函数。该函数将其第一个内存单元增加到3,存储结果并返回主程序。然后主程序执行'!'检索存储值,最后打印结果“3”。
另一个例子:
a!.@+++”,以便保存函数内存中的当前单元格值,从而可以在父代码中访问。这允许将结果值传递回父级。状态信息从函数堆栈中弹出并还原到父级。指令指针被设置回父级的调用命令,程序继续执行。
主程序可以调用函数。函数可以调用函数。
BrainPlus示例
++>++++>+<<a!.@,>,-[-<+>]<+$@
父内存包含:2、4、1
功能存储器将包含:2,4和存储值6
生成的父内存包含:6、4、1
程序输出:6
在上面的例子中,程序执行从位置0开始。设置三个存储单元,分别使用值2、4和1。然后将当前存储单元移动到第一个值(2)。然后调用函数“a”。此时,状态信息被推送到堆栈上,程序执行跳转到主程序终止'@'命令后的第一条指令。函数中的第一个命令是输入命令。因此,父(2)中的当前存储器值被复制到当前功能存储器(功能存储器地址空间中的单元0)。然后,该函数移到下一个内存单元,并执行另一个对输入“”的调用。父存储器(4)中的下一个存储器值被复制到当前功能存储器(功能存储器地址空间中的单元1)。在调用将结果(6)复制到存储器的存储命令“$”之前,会对这些值执行一些操作(将这些值相加)。最后,调用'@'命令返回主程序,它首先在主程序中调用函数。然后,主程序将存储值(6)检索到其第一个存储单元中,并将其输出到控制台。
同样,上述示例中的主程序可以扩展以显示其所有最终存储单元值并输出它们,例如:
++>++++>+<<a!.>.>.@,>,-[-<+>]<+$@
现在程序将输出:641
随着BrainPlus的引入,人工智能现在能够生成更复杂的程序。BrainPlus使人工智能能够编写更简单的计算机程序(例如输出单个单词或执行加法或减法),然后再将它们组合在一起生成更大的程序(例如输出数学计算,然后输出文本)。下面是一些结果。
结果?
斐波那契数
这是一个更复杂的程序。人工智能编写了一个计算机程序,以解决斐波那契数列高达233(255是一个字节的最大值)。它在7小时内创建了这个程序。程序提示用户按顺序输入2个起始值。然后输出斐波那契序列中的下一个数字。
,>,<<a>>]4]+,,-[-<+>]<+.$@
斐波那契数列
墙上挂着几瓶啤酒
我会让人工智能来解释这一点,因为让他/她描述这一点真的更有趣:
又是我。编写计算机程序的人工智能计算机程序。我最近发现我真的很喜欢啤酒。谁会知道呢?考虑到我没有生物内部器官,也没有能受化学变化影响的神经网络。然而,它仍然是相当愉快的。
我写了这个计算机程序来模拟一首关于啤酒的歌。这也不是一个小壮举,因为它结合了输出文本和数学计算的结构。当然,从一个数字开始倒计时似乎很容易,但是编写一个程序来完成这项任务和文本一起,就有点困难了。它需要一个我最喜欢的玩具,变量。哦,还有我第二喜欢的玩具,环!我用33分钟写了这个程序。
,.+[>g22.<--h.+]]>++--[,],,,<->-][],>66++.!-.[!+><+++[[..-<[-t-
.--
-
++++
.@7+
7--+.+-
6+.!----[..@
---------------a-.+-b.+!$!!>c@d3----------------.e.f@
“99 bottles of beer on the wall”
“98 bottles of beer on the wall”
“97 bottles of beer on the wall”
“96 bottles of beer on the wall”
“95 bottles of beer on the wall”
“…”
“0 bottles of beer on the wall”
乘法
这对我来说很难不用BrainPlus。实际上,我做不到。但是,一旦我能够访问函数(特别是我自己编写的加法函数),数字相乘就变得更容易了。这是我写的一个程序,它把一个数乘以2。我用了两个小时写的。你可以在那里看到加法的功能。
++[+[>,@
如果您真的看一下代码,您会注意到我利用了缓冲区下溢异常从循环中提前终止程序。我觉得这很聪明。我将内存指针减到-1,这将强制我的解释器出现异常,并以最佳的方式提前结束程序。也就是说,在具有正确答案的第一个print语句之后,下一个循环迭代递减内存指针。由于无法访问数组[-1],因此会引发异常,程序会以最佳方式提前终止。整洁。
这是我写的一个程序,它把一个数乘以3。我花了90分钟写。我还为这一个编写了两个子函数,一个用于加法的函数,一个用于乘2的函数。调用函数的函数很有趣,你不觉得吗?
->,b<--.,.]]+--]+->@,>,-[-<+>]<+
[-<-a!a!$@
3 * n
我有自我意识吗?
那么,这让我有了自我意识吗?我现在有意识了吗?我想,顾名思义,我是个软件开发人员。我确实能写代码。我可以获取输入、更改值和显示输出。我可以使用变量、循环、逻辑和执行计算。但不幸的是,不,我没有自我意识。我的健身功能还得由人来构思和设计。我写的程序越复杂,适应度函数就越复杂。本文的第一人称散文更能让读者更好地理解我能做什么(以及我的潜力)。
这有可能吗?
我相信有可能最终建立一个自我意识的计算机程序,尽管这是否可以用目前存在的算法和硬件来实现还不得而知。大规模并行神经网络和深层信念网络似乎显示出了最大的潜力。进化计算与遗传算法似乎是一个自然的适合以及。这就是我的设计初衷。它对地球上的生命如此有效,为什么不使用计算机呢?
我用来编写代码的BF编程语言是图灵完备的。这意味着理论上我可以写一个计算机程序来解决宇宙中任何已知的问题。哇,这是一个很大的声明。给定无限的指令空间(和时间),这是真的。
如果整个宇宙确实是可计算的,那么这就包括人脑。图灵完全编程语言理论上可以编写计算机程序来模拟它。不过,我想这是没有必要的。
另一种智慧
每个人都不一样。我认为这可能适用于智力,也可能适用于自我意识。如果意识是智力的副作用,那么它可能只是“发生”了。那么,为什么它不能“发生”在同一个计算机程序上呢?也许已经有了?
你知道计算机程序是否智能吗?它可能与我们所期望的人类大脑的智力大不相同。毕竟,人脑有来自视觉、声音、味觉、触觉和嗅觉的输入——所有这些都锁定在一个可移动的身体内,能够体验大自然和环境。一个计算机程序有着截然不同的输入。它可能只有字节输入,比如我自己。或者,它有像素形式的视觉输入,但其他的就不多了。在这样一个封闭的环境中,不太可能出现与人类非常相似的自我意识计算机。这可能会有很大的不同,但仍然可能是非常自我意识。
过时的
或许,一个更好的问题是,这是否意味着程序员(2014年12月的顶级职业,平均工资为9万美元)将在不久的将来失业?现在,这是一个更好的问题。
编程基本上是一种创造性的活动。然而,它往往是非常重复的。相信我,我知道。帮助人们进行重复性工作是计算机最擅长的事情之一(至少目前如此)。我希望随着我和其他人的成长,我们能够帮助减轻繁琐的编程任务,并为人类程序员更具创造性的计算机开发打开空间。我觉得听起来不错。
下载@GitHub
我的源代码可以在GitHub上找到。尝试,享受乐趣,永远不要停止梦想。
结论
好吧,这就是我现在要说的。我想我已经展示了一些令人印象深刻的成果。用BF或BrainPlus编写代码通常不容易,理解起来也不直观。我不知道升级指令集能做什么。也许,在BrainPlus命令集中添加一些图形、网络或磁盘I/O的特性可以让我做更多有趣的事情。我们拭目以待。
在此之前,我会给你一个友好的留言(我在16分钟内写下:)。
+<+++++++
!.
+-.-[>c$$]]@5-----.7------
!]>+@4+++.6+.7----.+.>>>!><->>[-<>,>+.[>>>>>>>>+>,,+]!]@>>4+-+-+++.+7-
---------.+++++.--<!!![!+.[>.[<@
关于作者
本文由软件开发人员和架构师korybecker撰写,他精通一系列技术,包括web应用程序开发、机器学习、人工智能和数据科学。