而且我们中很大一部分人都对C有自己的意见。缓冲区溢出,栈溢出,整型数据溢出,C有很多广为人知毛病,而这些毛病被人们随意传播,乃至那些不熟习C的人们。我自己已经有10年没有打仗C了,由于这样或那样的缘故原由。开始的时候,编译器是很昂贵的(在免费的UNIX被发布之前)而且很慢,那时的环境是很糟的。而且,所有关于C的胆怯故事让我以为我这么一个小小的普通程序员怎么可以写出可靠的C程序。
撇过一些我直接从别的地方复制粘贴过来的很多小的C模块不说,我自己写的第一个C程序是Converge VM。个中有两件事情让我惊呆了:-o 。第一,写C程序原来不是那么难。事后我才知道我年轻的时候摧残浪费蹂躏韶光写汇编代码这件事在生理上给我了很大的支持,毕竟C是高等一点的汇编措辞。一旦一个人理解了像指针(可以说是低级措辞中最奇妙的观点,由于真实天下中没有相对应的比喻)这样的观点。第二件事情是,Converge VM没有像我期待那样满是bug。
有兴趣一起互换学习 c/c++的小伙伴可以加群:941636044 一起互换
实际上,忽略可能在任何编程措辞上都存在的逻辑缺点,到目前为止在Converge VM中引发实际问题的只有两个只针对C才会有的缺点(把稳,我肯定还有很多潜伏的bug,但是我环境还没有碰上太多)。
第一个缺点是,一个list没有以\0(C中经典的缺点),这个问题花了很永劫光去调试。
另一个缺点则神奇的多了,花了我好几个月韶光。Converge 垃圾回收器可以谨慎地根据指针回收随意分配的内存空间。在所有的现在构造中,指针都指的是字和字对齐的边界。然而,已经分配的内存块在长度上常常不是字和字对齐的。 (In all modern architectures, pointers have to live on word-aligned boundaries.However, malloc'd chunks of memory are often not word-aligned in length.) 以是有时候垃圾回收器会在一个内存块位置为4的地方考试测验读取4bytes,纵然那个内存块是5bytes长。换句话来说,垃圾回收器考试测验读入一块数据的1bytes和内存中理论上没有权限的3bytes随机数据。罕见和神奇的是,这导致的缺点险些没法阐明。但是不夸年夜的说,在多少编程措辞中一个人可以递归地加上垃圾回收器?
我和Converge VM的经历不怎么不符合我之前的偏见。我已经逐步承认C程序会随机涌现segfault,丢数据,而且常常会像Vikings(维京海盗)去Lindisfarne一样。比拟来看,用高等措辞编写的程序会按照正常逻辑和可以预见的模式报错。逐渐地,这些问题在我日常利用的我可以信赖的这些用C写的程序中,我都碰到了。我不记得上次这些程序发生大问题的时候了。这些不会崩溃,也会优雅的处理次要的缺点。就算,我对这些软件(我利用OpenBSD9年了,以是没有比这些质量更好的软件了)极度挑剔,还有一些明显的缘故原由以至于为什么它为什么如此可靠:它被很多人利用,而这些人帮助我们找出bug。软件已经被开拓出来很永劫光了,以是之前的版本都存在bug。
并且,坦诚一点,只有相称能干的程序员首选会方向于C。