这两天尝试将一个用C++实现的项目改用C语言实现。
原本估计工作量并不大,因为在不少人看来,C++只是加了语法糖的C语言而已。
这次尝试并没有重写一点点与业务功能相关的代码,仅仅只是想把原本用C++实现的项目,稍加改写通过C的编译器。实际证明,如果不加这块语法糖,有些实现工作要苦得多。将用c写出来的代码交给C++编译器,要改动的地方有一些,但是真的很少,但将用C++写出来的代码交给C编译器,要改动的地方就不是一点点。这次尝试的只是一个很小很小的项目,几十个函数而已,但需要改写的地方就不是一点两点。
这里列一个并不完全的改写工作列表,仅供参考:
1、class显然要转写为struct,但struct中不能定义函数,只能定义函数指针,函数指针与实际函数的绑定要手工完成;构造函数与析构函数要另外实现,并在合适的时机手工调用;
2、new操作符要改写为工厂方法,delete操作符要改写为工厂方法
3、this指针要改写,并在参数列表中添加this指针项,在头文件中增加新的相关函数的声明
4、原来在类中定义的方法,要单独做为函数实现,如果需要,需要加上原类名做前缀,避免名字冲突
5、原本在类中定义的结构体,枚举要单独抽取出来,如果需要,需加上原类名做前缀,避免名字冲突
6、原本可以块中随时定义的变量,按标准c的要求,必须定义在块开始处,当然c99支持在任意位置定义变量,但并不是所有的编译器都完全支持c99.这样一来,很多方法变成函数后,变量的定义位置可能要移到函数开始处
7、原本C++重载的方法,现在要重新命名
8、一些与操作系统相关的函数,C++版本与C版本的参数个数并不一样,所以有时需要手工追加一些实参。
从以上的工作内容可以看出,如果一个项目很大,一开始就规划用C++实现了,以后就不要动念头将其改写为C语言来实现。可以做一个简单的类比,如果一个项目用C语言实现了,将其手工改写为汇编语言实现几乎是不可以想象的。
我个人的看法是C++的面向对象特征使得C++成为了一门新的语言,并不是只加了一点糖的C那么简单。
C++已经发明了,再退化到C,是违背历史发展规律的。C++可以处理的代码复杂程度要远远高于C处理的代码复杂程度,就像C可以处理的代码复杂程度要远远高于汇编语言处理的代码复杂程度。不能因为C++可以编译成C代码,C代码可以编译成汇编代码,就认为语言的进化没有必要,恰恰相反,编程语言的进化规律是越来越与人类的思维方式相接近。用自然语言编程显然是将来的发展趋势。随着AI的发展,这一天也不会太遥远。
如果没有的C++,现在的很多项目用C实现将是很困难的事情,生产效率下降,成本上升是可以预见的情境。所以C++的发明,是历史的必然,从编程语言的进化角度来看,java,python等等高级语言的出现,也是历史的必然,没有java,也会有kava,lava。
作者:littleZhuHui