从小弟眼光分析几种编程语言的优缺点

liupanfei111 2010-07-03 06:08:06
从java到c#然后再到c++,我似乎是从派生类学到了基类,我一直同意那种说法,说java和c#其实都是c++的派生。当然,c++并不是纯粹的面向对象的语言,但是也必须说是面向对象的先驱。

为什么我没有在学了java和c#之后就停止,而去学习了c++,因为我是一个控制欲比较强的人,对于java和c#人家什么都帮我们做好了,我有点无法忍受,但是也不可否认java和c#的强大。哦,对了,忘了说我为什么一直把java和C#放到一起,我个人认为这两种语言的相似程度达到百分之八十,也就是说学了其中一门另一门也就会了百分之八十。

至于外界一直传言的c#是抄袭java的,我不否认,因为java的创始人确实来到了微软而创造了c#,但是我也不全认同,如果你完全认同,那么我问你,c++/clr是什么?我个人认为他就是c++朝c#过渡的一门语言(其实按方法和难度确实可以算一门新的语言),也就是说c#未出现之前,微软已经有这方面的考虑了,那么c#的应运而生也就理所当然,至于为什么和java如此相像,那么我只能说,殊途同归,条条大路通罗马。也就像玄幻小说中说的,无论你修仙还是修魔,还是练体,最终都是朝一个大道去的。

下面我来分析下,这两种半面向对象语言吧(c++算半种)。当然,大家都知道面向对象的三大特点:继承,封装,和多肽。当然这三种语言都存在继承,但是也不尽相同,vc++的继承为多继承,而java(后文只说java就不提c#了)是单继承和接口一起实现的。接口其实是一种变态的继承,也是面向对象语言发展的一种必然产物,其实本人对于是否应该存在多继承无所谓。

sun公司(现在为Oracle公司)为什么摒弃了这种多继承,大家都知道,派生类的实现是先从基类开始的,一个类定义了一个实体,那么将在内存中加载所有的基类,并且对于开发人员来说,比较复杂,所以sun公司就放弃了多继承而实现了接口。但是在这里我想问一下,为什么要有接口,因为他要实现这种功能,那么我觉得既然你要实现这种功能,那么何必在意是接口还是多继承,因为你要实现,就必须要实现这个借口,或者继承这个基类,c++程序员不会疯了没有要用这个方法或变量而继承基类。难道真的是为了效率考虑?既然是为了效率考虑,那么你为什么要放弃宏和指针?宏的好处是什么?这里简短说下,程序调用方法,必须要从程序所在的内存空间转移到函数所在的内存空间执行完后再回到程序所在的内存空间继续执行,在这期间,要求在转移前保留现场,并记录,从内存空间的开辟和时间方面的开销来说宏更占有优势。

现在说下接口,个人认为接口是一种特殊并且简单的抽象类,是不用使用abstract的抽象类,当然java和c++的抽象类都不能创建对象。c++中的抽象类是怎么形成的,是因为该类中有纯虚函数,那么虚函数是什么?虚函数和一般函数一样是可以实现的,即有双大括号"{}",如 virtual output(){},子类可以覆盖这个函数,java中叫重写(override)。那么为什么要有虚函数,方便子类指针调用该类覆盖的函数(有点拗口,大家懂吧?)。那么怎样形成抽象类,即有纯虚函数,纯虚函数即没有实现的函数如virtual output()=0;这样写。c++和java中抽象类的子类都必须实现该纯虚函数。但是c++中抽象类可以有非纯虚函数和一般函数,java中抽象类必须全部是纯虚函数。在这方面java就没有c++强大,便于掌控。

说了这么多,最后再说一下如果真的要说效率这三个语言还是c++效率最高,说方便c#最方便,但是java功能要比c#强大,各有优点吧。

像微软从c到c++到vc/mfc到vc/clr到c#这个从面向过程语言到面向对象语言转变的过程中,我最无法理解的就是clr,说效率没有c++高,说方便也赶不上c#,个人认为是微软为了实现.net计划硬加上去的(当然他也有他的好处)。我只能说按照我的想法c++如果难度是10,那么java是5,c#是4.5,clr我认为是15。难学不讨好啊。

好了,小弟对于这些语言还不能说精通,只能说会用,还要继续学习,我相信只要不是语言的创始者,都不能说自己是精通的。

最后再阐明一下小弟的观点,重要的是思想,而不是实现思想的工具,还是那句话,殊途同归,条条大路通罗马,不管你是修仙,还是修魔,甚至是练体... ...
...全文
168 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
coooliang 2010-07-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 liupanfei111 的回复:]
引用 7 楼 richard_2010 的回复:
引用 5 楼 liupanfei111 的回复:

还有最近传言微软的操作系统将取消java编程,不再认证java,取消微软的jvm,不知道是不是真的,如果是这样,那百分之六十windows xp系统的用户流失,将给Oracle当头一棒啊... ...
java程序员的前景也将令人担忧。



你这个传言传大了,我觉得你说的好多事情……
[/Quote]

学一门就够你用的了!哪有这么多时间呢?!~

时间!
liupanfei111 2010-07-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 richard_2010 的回复:]
引用 5 楼 liupanfei111 的回复:

还有最近传言微软的操作系统将取消java编程,不再认证java,取消微软的jvm,不知道是不是真的,如果是这样,那百分之六十windows xp系统的用户流失,将给Oracle当头一棒啊... ...
java程序员的前景也将令人担忧。



你这个传言传大了,我觉得你说的好多事情都没经过自己的思考而是大概听到什么就信什么,包括ja……
[/Quote]


额 这个我是看财经新闻看的 他是说有可能...
还有我马上要工作了,但是我还是有些疑问,到底是一门语言学的非常深,还是多接触几门语言...
richard_2010 2010-07-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liupanfei111 的回复:]

还有最近传言微软的操作系统将取消java编程,不再认证java,取消微软的jvm,不知道是不是真的,如果是这样,那百分之六十windows xp系统的用户流失,将给Oracle当头一棒啊... ...
java程序员的前景也将令人担忧。

[/Quote]

你这个传言传大了,我觉得你说的好多事情都没经过自己的思考而是大概听到什么就信什么,包括java之父创建c#

还有,lz不知道工作多久了还是在上学?等你工作几年后你将会发现,一切计算机语言都是浮云

richard_2010 2010-07-13
  • 打赏
  • 举报
回复
java中抽象类必须全部是纯虚函数

这个还是请lz考证一下再说,java抽象类中是可以有方法(java里面不叫函数了)的实现的,也可以没有抽象方法,也就是c++所谓的虚函数
liupanfei111 2010-07-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qqiuzaihui 的回复:]
引用楼主 liupanfei111 的回复:
......

至于外界一直传言的c#是抄袭java的,我不否认,因为java的创始人确实来到了微软而创造了c#,但是我也不全认同,如果你完全认同,那么我问你,……

楼主没记错么?
Java ==> java之父James Gosling
C# ==> 安德斯·海尔斯伯格, Turbo Pascal编译器的主要作者, Delphi……
[/Quote]


哦 这个我不太清楚 记得是以前上学的时候java老师讲的,说java设计师去了微软,还说微软的现代这种图形界面操作系统都是抄袭的,大概是野史吧... 真实性不得考证了。

还有最近传言微软的操作系统将取消java编程,不再认证java,取消微软的jvm,不知道是不是真的,如果是这样,那百分之六十windows xp系统的用户流失,将给Oracle当头一棒啊... ...
java程序员的前景也将令人担忧。
qqiuzaihui 2010-07-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 liupanfei111 的回复:]
......

至于外界一直传言的c#是抄袭java的,我不否认,因为java的创始人确实来到了微软而创造了c#,但是我也不全认同,如果你完全认同,那么我问你,……
[/Quote]
楼主没记错么?
Java ==> java之父James Gosling
C# ==> 安德斯·海尔斯伯格, Turbo Pascal编译器的主要作者, Delphi和.NET之父
liupanfei111 2010-07-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 budtang 的回复:]
楼主的观点我很认同 学计算机主要是学思想, 程序设计语言的思想 算法思想等
还有楼主说clr是微软的鸡肋, 这点我不太认同, clr不是一种给用户使用的语言, 而是一种平台,跟java的JVM类似, 有了JVM,java程序可以编译一次以后在各个平台上运行。 同样 VC C# VB等的程序或这几种混合编的程序在 clr 的平台上编译, 实际上 VC C# VB等的程序或这几种混合编的程序是编……
[/Quote]

恩 这些天也了解了
我同意您说的clr的重要性
但是budTang您说的也有点问题,clr其实和jvm--java virtual machine的原理还是不同的,
jvm在编译成字节码的时候是并没有编译成和平台相关的符号和语言而是保存在字节码中,在以后的具体平台再编译成机器码而实现了跨平台。
而微软是在自家的一些语言中,实现了一种中间语言,可以实现微软语言的交互,即跨语言,其实按照我的想法,跨语言要比跨平台更强大,微软不是不能实现跨平台,而是不需要,并且一定不会实现跨平台(因为微软必须要卖他的操作系统,何必为他人做嫁衣?)。

上面文章说的有一点错误了,不好意思误导大家了,java中的抽象类abstract类中可以存在非抽象函数。
budweiser 2010-07-04
  • 打赏
  • 举报
回复
楼主的观点我很认同 学计算机主要是学思想, 程序设计语言的思想 算法思想等
还有楼主说clr是微软的鸡肋, 这点我不太认同, clr不是一种给用户使用的语言, 而是一种平台,跟java的JVM类似, 有了JVM,java程序可以编译一次以后在各个平台上运行。 同样 VC C# VB等的程序或这几种混合编的程序在 clr 的平台上编译, 实际上 VC C# VB等的程序或这几种混合编的程序是编译成了 微软中间语言, 然后这种 中间语言可以在 clr 上编译成汇编码。这是实现了一种跨语言编程的机制
lookluuk 2010-07-04
  • 打赏
  • 举报
回复
确实,设计思想是非常重要的。学到后面语言这种东西就不那么重要了。精通一门语言就足够了,到时候如果需要可以很快的学习其他语言,因为精髓都在你脑子了,只不过换了一个平台。

3,405

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 设计模式
社区管理员
  • 设计模式
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧