GPT4又把程序员取代了?(上)
最近又开始了一波GPT4的散播焦虑活动,而实际上,ai并不能在特别精细的地方替代人类,例如一个基于GPT4的工具——cursor,它可以用来生成代码,但如果代码涉及一些特别麻烦的东西,那指定还是不行的,比如我在试用该工具的时候让它编写的c代码(经过我修改了不妨类型和指针转换后勉强可以通过编译,但会segmentation fault):
这里我一步步的要求它编写了一个只有很小一部分功能的ecs,从一个allocator(我猜错误多半发生在这个allocator,但我没有仔细研究)开始,编写一些数据结构,然后用这些数据结构构建一个简单的ecs的数据部分
这里我们来复现一下这个过程,看看是否为之前操作不当

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

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

于是,就获得了一个回收的函数
这里我们不自己检查代码,让它来检查



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

然后它就把这个类型变成专门管理某一个指针内存的类型了
于是,我们问它:


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



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



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

看起来不错的样子
但是只能存整数有点一般

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

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

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


我们刚才就说了,这里的free其实一次性释放了所有依托于该allocator的内存,所有多次调用必然会崩,其实这样就行(其实看到这里就知道ai其实还是替代不了程序员,至少目前还不能替代我)
而且,当前实现的问题其实已经很明显的暴露出来了,只能一次性开所有内存,也只能一次性回收所有内存,没有回收单个指针的内存的解决方案,由于没有考虑获取到的内存是分页的,可能还存在跨页内存的问题,我倒要看看这个ai怎么解决,先告诉它一点小毛病


强调一下:


那么,我们刚才说的问题都得解决对不对,我们一项一项来
先安排它解决单个指针的内存回收问题:


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


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


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


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



让它自己检查一下:




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


问题是,我们要的是一个分页管理内存的allocator啊,这种方式显然是不合理的
那么,如果我们写好声明,让它来实现呢?






你猜怎么着,能用:

那我们就先加功能:

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






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








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



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


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




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

到一半就没了
那么我们试试分布实现要求吧

看起来貌似没有问题
然后问问它有没有优化方案:


那么,老规矩,让它写点例子试用一下:
居然没有错误,可以的啊
然后我们来加点要求:


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


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


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


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

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




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



老实说,到现在已经感觉比我自己写代码更累了(一直在看别人写的代码有没有毛病,还只提供修改意见,代码审核了属于是)
但是,有一点需要注意的是,我们现在才刚刚拥有两个基本的数据结构而已(还不一定对)
废话不多说,我们继续

这是啥啊你这是




继续

老规矩,试试看:
然后bug就来了:

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