我们为什么可以不学C++

    技术2022-05-11  90

    在程序设计的学习过程中,一种主流的观点是:无论学什么,首先应该从C或者C++入手,如果不懂C++就好像完全是编程的门外汉一样,但可能却很少有人去深入的思考这个问题:我们为什么一定要学习C++?要完整的回答这个问题,我们首先来了解一下目前C++的主流应用:

      1.操作系统,驱动程序的编写。因为无论是操作系统还是驱动程序都是和硬件紧密相关,频繁通信,这就要求选用的语言具有和硬件直接通信的能力。如果仅从这方面考虑,似乎汇编语言是最佳的选择,但因为汇编语言编写效率太低,完全不能胜任现在大型程序的要求,所以能够直接嵌入汇编语言的C语言当仁不让的成为了最佳选择,在使用C语言编写系统程序的时候,那些不需要和底层硬件通信的基本逻辑模块可以完全采用基本的C语法编写,而必须和硬件通信的模块则嵌入汇编语言编写,这样就完美的解决了效率和功能的矛盾。

      2.大型游戏的编写。在游戏的应用上,C++也许不是唯一的选择(例如韩国的某些大型网络事实上是用Delphi编写的),但我敢肯定C++在其中占有的比例至少超过80%,而且随着Borland(Delphi的生产商)的没落,C++正有一统大型游戏编写的趋势。那么大型游戏的编写为什么如此青睐C++呢?答案很简单:效率。我们已经知道,操作系统是用C编写的,所以系统API天然的就是以C函数的形式提供的,自然在C++中调用就得心应手,而且不需要任何接口转换,效率高低可想而知。又因为目前的大型游戏都是计算高度密集的程序,所以效率显得至关重要,谁有能够接受一个卡的不能再卡的游戏呢!在这里还有一个不得不提的因素,那就是DirectX。大家都知道,目前DirectX基本上已经取代OPGL成为大型游戏的驱动框架,而DirectX也仅仅提供了C语言接口,那么如果采用DirectX编写游戏,还有没有比C++更好的选择呢?

      上面介绍的两个方面就目前的技术形式来开,在短期内还只有C++可以选择,但决不是说C++只能做这两个方面。事实上,如果我们不从“最佳”选择考虑,C++是个相当通用的语言,它基本上可以完成绝大多数的应用,例如我们比较熟悉的“金山词霸”,“超级解霸”都是用C++编写的。但请注意了,我已经说过了,可以用,但却不一定是“最佳”选择。那么什么是“最佳”选择呢,要讲解这个问题,我们必须了解了解C++的缺点。

      第一个,C++语言相当庞杂,而且随着计算机的发展,C++语言本身也在不断的扩展,以致到现在对语言初学者来说就像一个怪物。当然,我的意思并不是说语言本身不应该发展,但C++的发展并却不同于普通的良性发展,而是一种无奈的修修补补,这种无奈源自C++发明初期的先天不足。大家都知道,C++的前辈C来源于贝尔实验室的Unix项目,所以C设计初期就是用来开发系统程序的,当然到后来的C++也继承了这个缺点。但是“无心插柳柳成荫”,C++被后来越来越多的程序员用在通用的开发中,但因为C++的先天不足,C++逐渐不能满足越来越多样的应用开发需求,于是C++的国际标准组织为了满足不断的需求不得不不断的对C++进行扩展,以致现在的C++变得越来越庞杂,在后到的程序员眼中,简直就是一个“语言怪物”。

      如果你作为一个程序初学者,而且你的目的仅仅是为了完成与底层系统无关的应用设计,如果你又采用了C++,那么在你关注现实应用之前,光C++语言本身就够你焦头烂额了,作为根本目的现实应用又在那里呢?这显然与你的初衷南辕北辙。

      第二,即使我们且抛开C++的复杂不说,假使我们已经通过艰辛的努力掌握了C++语言本身,那么是否当我们再次面对所有的应用时都游刃有余,从而高枕无忧了呢!答案同样令人失望:事实不是这样的!

      因为C++本身是为系统开发而生的,所以C++不可避免的必须能够直接访问内存地址,于是C++引入了指针概念。指针对C++来说真的是把双韧剑,真可以说“成也指针,败也指针”。指针给C++带来极大灵活性同时,也让C++付出了极大的代价,如果使用不当,轻则导致应用程序错误,重则导致系统崩溃!这样说吧,如果你是一个严谨的程序员,对你开发的程序有一份负责任的态度,那么在使用C++的过程中,你务必要小心翼翼,否则你会不断把你的程序垃圾抛给内存,从而使整个系统因你的程序越来越慢,最终崩溃!

      一句话,C++语言本身不是一个安全的语言,它的安全必须依靠程序员本身的素质来保证,这在大型的,可靠性要求极高的应用开发中是不可接受的!

      第三,不具有跨平台性。C++为系统而生,从而也严重的依赖于具体的系统,例如我们熟悉的MFC则仅仅对Win32系统有效,Linux,Unix则都有自己的语言框架,他们之间是不能直接移植的,这也就是我们常说的跨平台问题!跨平台也许在早前的桌面时代根本不能成为问题,因为这种需求实在太少了,可是在目前的网络时代,却成为一个关键问题,从而导致了C++的逐渐衰落!

      C++的三个致命缺点:语言本身太过庞杂,不安全的,不具有跨平台性。

      讲了这么多,你可能会觉得我完全是答非所问,事实并不是这样的。我为什么要在C++上絮絮叨叨说这么多呢!因为是我看到总是有这么多人大力推荐C++作为入门语言,而事实上,这完全是一种自我臆想,是一种不负责任的态度。下面我就具体的谈谈我的观点:“我们为什么可以不学C++”。

      推荐把C++作为入门语言的人一般都会说,学习了C++的人再来学java ,.NET那自然是手到擒来,非常轻松。坦率的说,我认为这种观点有一点道理的,毕竟C++相对来说是比较难的,如果你能跨过C++这道坎,那么至少在语法层面,java,.NET都不成问题!但是,在目前的形势下,Java,.NET早已成主流,很多人推荐C++仅仅是把C++作为一个跳板,掌握了C++之后再来学Java,.NET。就算我们承认这样是一种可行的学习方法,那么我再问你,你到底准备要用多长时间来学习C++,来完成这个过渡呢?1年还是2年?然而最不幸的是,即使你用了1到2年的时间来学习C++,你的C++依然是个皮毛!两年的时间,不够你掌握MFC,不够你了解操作系统,更别说开发中等规模的应用了。那么两年时间你到底掌握了什么呢?C++语法而已。唉,这又是何苦呢!

      也许还会有人说,我们学习C++不仅要掌握C++的语法,还要掌握C++的编程理念,从而融会贯通,在Java,.NET中自然也会轻车熟路。这真是一种天真的想法,如果你的既了解C++的编程思想,又精通Java,.NET的编程理念,你一定发现他们之间的差异实在太大了,有太多的东西不能互相借鉴。

    C++是曾经的王者,Win32时代的王者,桌面时代的王者。在win32时代,在桌面时代,不会使用C++,你可能确实不是一个真正的程序员,至少不是一个卓越的程序员。但现在不同了,现在是网络的时代,Java早已从早先的“玩具语言”成长为企业应用的当仁不让者,.NET也在微软的战略大旗下成为windows平台的首选工具,而且这种格局在vista的推出后更是既成定局!在现在,无论是你掌握了Java还是.NET,亦或是web技术,你都绝对可以独当一面,说自己是一个真正的程序员!

    有太多的人都推荐C++作为程序员的入门语言,或者认为C++是程序员的必备语言。如果我把这些推荐者都一股脑儿的归到“菜鸟”行列中,这是有失公允的。事实上,其中应该有相当比例的C++高手。我甚至认为“C++必备论”的始作俑者正是这些C++高手,而那些对 C++一知半解者,其实就连这样错误的观点他们也是提不出的,他们太单薄了,也缺乏相应的自信,只能是人云亦云。 可这些C++高手对C++是那么的了解,他们中的绝大多数人事实上也是业界的精英,他们为什么又会给出这么明显的错误观点呢!问题就在于他们对C++太了解,太有感情了!在国内软件业,目前的程序精英基本都集中30到40岁之间,再小的经验不足,再大的知识过于陈旧。而这些30到40岁之间的程序精英大都是抱着C++一路走过来,他们中的许多人即使现在转到了更主流的Java和.NET上,也想当然的认为他们只所以现在依然能够在Java和.NET上游刃有余,正是拜C++所赐,正是应了那句哲言:“你有什么思想,往往是因为你有什么样的生活”!他们的错误观点是因为他们不能跳出自我本身去思考问题,“不识庐山真面目,只缘身在此山中”呀!

      朋友,你得相信我:C++就是C++,Java就是Java,.NET就是.NET。如果你学习了某一门语言,那么只是因为你需要在学会以后去应用它,去进行实际的生产力开发。没有任何一门语言是应该作为“教学语言”存在的,他们只会存在于那些愚蠢的大学教材中。

      讲到这里,你也许会认为我今天在这里的目的只是为了贬低C++的意义。当然不是这样,我之所以针对C++说这么多,仅仅是想使你相信,我下面给你的建议绝不是人云亦云,我只是想在纠正一个“以讹传讹”的错误观点后,来引出我下面的学习意见。

      1.游戏:如果你有志于开发游戏,尤其是大型的PC游戏(无论是单机的还是网络的),那么C++和DirectX至少目前还是不二的选择。虽然在.NET中,已经有托管的DirectX版本,我也尝试过用C#开发一个简单3D游戏,但速度却相当令人失望。  当然现在也有很多用KJava编写的手机游戏,因为我在这方面没有实际的开发经验,我不能给你很确切的建议,如果我掌握的知识没错的话,你应该学习一下J2ME。

      2.企业级应用:目前的大型企业级应用基本上是J2EE一统天下,如果你有志于这方面,应该努力学习一下J2EE。

      3.WEB应用:目前的WEB应用以WEB2.0为标志,AJAX为典型技术,其中涉及到HTML,XML,CSS,JavaScript,asp.net(或者asp,PHP,jsp)等技术,你都应该详细掌握。

      我上面讲的都是具体的应用方向,但有些技术确是任何方向都应该掌握的技术基础,他们是:数据库,数据结构等。

      最后,我还是再想说一遍:千万不要相信这样的观点:学什么都必须以C++为先导,这真的是一个误人又误己的观点!选一个方向,努力学习,努力思考,努力练习,我向你保证,2年后你就可以达到企业应用水平,当然也会找到相应的工作,从而在实践中继续提高。  祝你好运!

    注:在国外很多著名大学的计算机专业,都是直接把Java和C#作为入门语言。因为从面向对象理念的传授上来说,无论是Java还是C#,都要比C++纯粹的多!


    最新回复(0)