C++的强大,源自其支持的4种编程模式,以及,对C的兼容。
很多时候,对C的兼容被认为是C++的软肋。它让C++失去了GC(垃圾收集),内存管理变得繁复枯燥极易出错。然而,C++也是因此而强大。
目前的操作系统,局大部分使用C来实现,保持对C的兼容,让C++获得了对内存,线程/进程(某种程度上,可以认为就是处理器资源)的控制能力,还有就是操作系统提供的服务。然而,这也是把双刃剑,一边是自有强大的控制权,一边则是漫山遍野令人抓狂的BUGS。
换个角度,C++是一种对资源敏感的命令式语言。
在C++的项目中使用BOTTOM-UP设计方法,会在资源管理上产生许多无谓的消耗。例如:为每一个传入的指针类型参数左右类型检查(所谓的防御式编程风格,或者叫预防针风格——预防指针,呵呵),等等。如同苍蝇一样烦人,却又不得不做。
如果采用TOP-DOWN方法,底层的密密麻麻的预防针会被延迟直到实现。但是,到那个时候,由于上层的保证(姑且认为上层考虑的足够“周全”了),预防针苍蝇也就不复存在。
或许你会说,这是不安全的!是的,这不安全。如果上层千疮百孔,底层再多的预防针也只能起到一个错误反馈的作用,对于问题界定不仅不能提供参考,还容易引人误入歧途。因为,依据底层预防针来找问题是一种BOTTOM-UP模式。当然,这已经超出讨论范畴了。正如上次的提法一样,TOP-DOWN面向“经验丰富”的设计者,他们知道问题可能在什么地方,而不是从现象发掘问题本质。注:我并不反对预防针风格,在合适的地方使用,讨厌到处打针。
LISP从一开始就具有GC机制,内存资源管理自动化,这让使用者可以放心大胆的专注于处理自己的数据,而不是把精力消耗在资源管理的地方。相对于C++,不妨称之为“数据/内容敏感”。事实证明,LISP在AI领域发挥得非常出色。当然,免不了提一句:GC是一把双刃剑。
世界上没有完美的东西,扬长避短,才能发挥工具最大的潜力来服务我们。
很多时候,对C的兼容被认为是C++的软肋。它让C++失去了GC(垃圾收集),内存管理变得繁复枯燥极易出错。然而,C++也是因此而强大。
目前的操作系统,局大部分使用C来实现,保持对C的兼容,让C++获得了对内存,线程/进程(某种程度上,可以认为就是处理器资源)的控制能力,还有就是操作系统提供的服务。然而,这也是把双刃剑,一边是自有强大的控制权,一边则是漫山遍野令人抓狂的BUGS。
换个角度,C++是一种对资源敏感的命令式语言。
在C++的项目中使用BOTTOM-UP设计方法,会在资源管理上产生许多无谓的消耗。例如:为每一个传入的指针类型参数左右类型检查(所谓的防御式编程风格,或者叫预防针风格——预防指针,呵呵),等等。如同苍蝇一样烦人,却又不得不做。
如果采用TOP-DOWN方法,底层的密密麻麻的预防针会被延迟直到实现。但是,到那个时候,由于上层的保证(姑且认为上层考虑的足够“周全”了),预防针苍蝇也就不复存在。
或许你会说,这是不安全的!是的,这不安全。如果上层千疮百孔,底层再多的预防针也只能起到一个错误反馈的作用,对于问题界定不仅不能提供参考,还容易引人误入歧途。因为,依据底层预防针来找问题是一种BOTTOM-UP模式。当然,这已经超出讨论范畴了。正如上次的提法一样,TOP-DOWN面向“经验丰富”的设计者,他们知道问题可能在什么地方,而不是从现象发掘问题本质。注:我并不反对预防针风格,在合适的地方使用,讨厌到处打针。
LISP从一开始就具有GC机制,内存资源管理自动化,这让使用者可以放心大胆的专注于处理自己的数据,而不是把精力消耗在资源管理的地方。相对于C++,不妨称之为“数据/内容敏感”。事实证明,LISP在AI领域发挥得非常出色。当然,免不了提一句:GC是一把双刃剑。
世界上没有完美的东西,扬长避短,才能发挥工具最大的潜力来服务我们。