欢迎光临散文网 会员登陆 & 注册

GPT4又把程序员取代了?(上)

2023-03-22 10:22 作者:pathologyenigma  | 我要投稿

最近又开始了一波GPT4的散播焦虑活动,而实际上,ai并不能在特别精细的地方替代人类,例如一个基于GPT4的工具——cursor,它可以用来生成代码,但如果代码涉及一些特别麻烦的东西,那指定还是不行的,比如我在试用该工具的时候让它编写的c代码(经过我修改了不妨类型和指针转换后勉强可以通过编译,但会segmentation fault):

这里我一步步的要求它编写了一个只有很小一部分功能的ecs,从一个allocator(我猜错误多半发生在这个allocator,但我没有仔细研究)开始,编写一些数据结构,然后用这些数据结构构建一个简单的ecs的数据部分

这里我们来复现一下这个过程,看看是否为之前操作不当

之所以创建.c而不是.h是因为会被当成c++

然后我们得到这样的代码,显然和分页不能说是完全符合,只能说是毫无关系

于是我们要求它修改

很神奇的是,这次它居然知道用mmap(这里我们先不管对不对,先让它写着)

然后自然是需要处理回收内存的逻辑

于是,就获得了一个回收的函数

这里我们不自己检查代码,让它来检查

这次我们选择的是chat
它说是对的,那我们就继续加东西了
加点需求

它似乎没有理解到位

这里,只是做了基于页的内存绑定,但我们需要这个类型同时还帮我们处理指针的内存分配和回收,于是我们这样告诉他:

然后它就把这个类型变成专门管理某一个指针内存的类型了

于是,我们问它:

它给出了解决方案和一些解释

但我们显然不满意,我们着是page allocator,限制其的一个是内存,而不是指针的数量

告诉它
它依旧没有明白指针的数量可以是不定的
于是我们告诉它我们只是需要分页式的内存块,然后可以分配给指针

当然,这里会不会有内存错误我们是没有确认的,让它提供一个例子我们来试试:

编译没有问题
跑起来貌似也ok

那么我们先暂时这样,开始下一步:

看起来不错的样子

但是只能存整数有点一般

这里,它只是把int替换成了void*,就不贴上全部的代码了,老规矩让它提供一个使用例:

其实,这里就已经有错了,因为并没有提供回收内存的逻辑,只是简单的整个释放,而它却出现了这样的调用:page_free(&list->allocator, current);需要让它自行修复,果然删除了第二个参数

看看,什么来了

于是我们直接提错误给它:

呃,其实还是不对的

我们刚才就说了,这里的free其实一次性释放了所有依托于该allocator的内存,所有多次调用必然会崩,其实这样就行(其实看到这里就知道ai其实还是替代不了程序员,至少目前还不能替代我)

而且,当前实现的问题其实已经很明显的暴露出来了,只能一次性开所有内存,也只能一次性回收所有内存,没有回收单个指针的内存的解决方案,由于没有考虑获取到的内存是分页的,可能还存在跨页内存的问题,我倒要看看这个ai怎么解决,先告诉它一点小毛病

我看它是完全不懂哦

强调一下:

它终于懂了

那么,我们刚才说的问题都得解决对不对,我们一项一项来

先安排它解决单个指针的内存回收问题:

它在干什么呢?

看来得给出更明确的说法:

卧槽,你别,你这样不是把自己的内存释放了,但却记录的是别人的地址

血压已经上来了,可能是我英文不好?试试中文和它说?

它给加了一个链表在里面,而且每个指针都是单独的使用mmap来分配内存

那我们先accept,待会儿再看有没有bug再让它改,那么当务之急时让它修改链表的逻辑来适应新的allocator

看着还不错

但是有一个问题,那就是该链表使用了这个allocator,但不代表它具有该allocator的所有权,你链表释放关我allocator什么事,你把我内存全释放了干嘛

貌似有点不对劲

让它自己检查一下:

加了一个头文件以使用memcpy
node被移除了
使用了正确的回收函数

实际上,当前的问题已经多到我一时半会不知道怎么解决的地步了,我让它自己解释一下它在写什么吧:

他说它写的这个是链表

问题是,我们要的是一个分页管理内存的allocator啊,这种方式显然是不合理的

那么,如果我们写好声明,让它来实现呢?

好像有问题,但又不知道怎么说
它很奇怪的认为page_allocate函数还在
等等,它直接把mmap的结果转成这个类型了?

你猜怎么着,能用:

那我们就先加功能:

看似没有问题,但是还是有点问题的:

让它检查一下,自己修复
改完以后编译肯定是能通过的
老朋友segmentation fault回来了
直接跟它反馈
ai总是喜欢过度释放内存

那么,这里我们肯定不能让bst释放内存的时候直接把内存管理器的内存全释放了,毕竟我们不只是为这一个类型准备的

它是不是理解错了
苦口婆心的劝说它一下
绷不住了,你遍历一下树,然后逐个删除不行吗?
手把手教它
这不对吧?
看看它知不知道
你知道错了,但是你还是没有改啊

删除节点应该是试用中序遍历比较方便吧

这不是挺好的嘛

这样就不会和allocator冲突了,然而到这里已经花了两个小时时间了,自己写虽然不一定更好,但我想应该还是能快点儿

那么我继续让它优化代码

那么,问题来了,写这个bst和ecs有没有关系呢?其实未必,毕竟可以使用的数据结构很多,倒也不必非得使用树,但树比较容易暴露管理内存的问题,等等,它这树好像不平衡

让它平衡一下

加了一个高度
一些用于保持平衡的函数
计算高度差,然后通过旋转来保持平衡
删除某个节点后也需要保持平衡

然后我们需要来创建一个hashmap,由于要求比较复杂,考虑到个人英文水平,这里还是用中文吧:

到一半就没了

那么我们试试分布实现要求吧

看起来貌似没有问题

然后问问它有没有优化方案:

它还真的有方案

那么,老规矩,让它写点例子试用一下:

居然没有错误,可以的啊

然后我们来加点要求:

只加了一个参数有点草率啊

这里直接问它有没有更好的办法:

这里它给了一种办法,但还不够,我们需要确认用户自己实现的hash算法函数是否符合要求

这里我给这个类型加了一个函数指针,然后让它更新代码:

然后,我们需要它提供一种默认的hash实现:

默认的实现真的离大谱,直接强转uint32_t

接下来就需要它编写一些常用的hash函数了

要么是类型强转,要么是xorshift(对于数据结构学到不好的小朋友可能不明所以,只需要知道该方法不好即可),同时这里它假定了uint32_t是32位,而double是64位(其实有的平台不是这样的)

那么,基于我们以上的问题,我们来要求它修改:

没错,它是使用了我要求的算法,但是它自己没有实现,这是等着我来实现吗?
必须实现
看起来没有什么问题

修改了这么多,得再试试看能不能用(老实说,由于不是我自己写的,我现在有点太长了不看的想法):

一些重复定义错误
去掉此处的代码即可
谢天谢地没有见到老朋友

老实说,到现在已经感觉比我自己写代码更累了(一直在看别人写的代码有没有毛病,还只提供修改意见,代码审核了属于是)

但是,有一点需要注意的是,我们现在才刚刚拥有两个基本的数据结构而已(还不一定对)

废话不多说,我们继续

这是啥啊你这是

看起来有点样子了
初具雏形了

继续

老规矩,试试看:

然后bug就来了:

由于专栏图片数量限制,我把改专栏拆分成了两份,并非有意而为之


GPT4又把程序员取代了?(上)的评论 (共 条)

分享到微博请遵守国家法律