透过历史聊聊C、C++和Java之间的那点事

发表于:2020-1-10 09:34  作者:泰斗贤若如   来源:泰斗贤若如

字体: | 上一篇 | 下一篇 |我要投稿 | 推荐标签: java Java

  一、编程语言哪家强,先看历史长不长
  当今世界,JavaPython、C++等编程语言横行于互联网,各界程序员日夜奔忙,为改变世界的程序梦拼搏奋斗。这些高级语言如今如此之地位,不得不让我们惊叹。
  自1946年2月14日世界上首款计算机问世,第一代计算机语言“机器语言”便诞生了,当时的“机器语言”使用的是最原始的穿孔卡片,这种卡片上使用的语言只有那些真正的专家才能理解,这种“机器语言”是否容易理解看那个年代专家的秃顶就知道了。
  “机器语言”本质上是计算机能识别的唯一语言,而人类却很难理解,岂一个“难”字了得。后来那些语言大师们为了能让人们更容易理解,于是便有了第二代的“汇编语言”,相比机器语言,汇编语言还是有所改良的,尽管它还是太复杂,人们在使用时很容易出错误,但毕竟许多数码已经开始用字母来代替,这也算一大进步了。简单的“0、1”数码谁也不好理解,但字母是人们能够阅读和拼写的。虽然第二代计算机语言仍然是“面向机器”的语言,但它已注定成为机器语言向更高级语言进化的桥梁。
  当计算机语言发展到第三代时,就进入了“面向人类”的语言阶段。你可以阅读、并直接用人类的语言来输入。对我们汉语来说,目前还不能用中文汉字来输入指令,这主要是因为中文的输入还没有一个非常好的手段。第三代语言被人们称之为“高级语言”。高级语言是一种接近于人们使用习惯的程序设计语言。它允许用英文写计算程序,程序中所使用的运算符号和运算式子,都和我们日常用的数学式子差不多。高级语言容易学习,通用性强,书写出的程序比较短,便于推广和交流,是很理想的一种程序设计语言。
  二、Java的诞生
  Java是SUN公司推出的一种计算机语言,先说说Java这个名字的来历吧。
  Java名称来源于太平洋一个名叫Java的小岛,该岛出产一种味道非常美妙的咖啡。当地人非常喜欢咖啡,Java的发明者Gosling在这个小岛上受到了当地人“特殊”的照顾,让他如痴如醉般喜欢上了咖啡的美味。Gosling认为他发明的计算机语言是非常好的东西,起初他把他发明的语言起名为“OaK”,但是SUN公司的人发现已经存在一门叫做OaK的计算机语言了,而现在尝着如此美味的咖啡,从咖啡的灵感中索性起名为“Java”,流传至今。
  说实际的吧,SUN公司于1995年正式推出新一代面向对象的程序设计语言Java。看到面向对象,我们知道面向对象语言(OOP, Object-Oriented Programming)是一类以对象作为基本程序结构单位的程序设计语言。Java 是面向对象编程中的一种代表性语言,但除了Java,还有C++等编程语言也是面向对象编程的代表,我们研究Java的发展历史,肯定摆脱不了它的“竞争对手”C++,而C++又摆脱不了C语言,索性把它们三个放一起描述。先看下面这张描述C、C++、Java的时间历程图:
  单从时间上看,1973年C语言问世,然后在C的基础上,1983年C++问世,C++问世的时候已经在C语言的基础上添加了面向对象的思想,而Java是在1995年才出世的,单从C++和Java所共有的“面向对象”这个思想上,我们也会相信它们之间肯定有故事,我们先去探索它们之间的故事吧。
  三、C、C++还有Java,你们之间到底有什么故事
  自1973年C语言问世后,在之后的很长一段时间,很多程序员都在用C语言,C语言很受程序员的欢迎,因为它给当时的程序员们编程提供了极好的便利,C语言贴近硬件、运行极快、效率极高,这些便利条件,让当时的程序员们用C语言开发了很多系统级软件、编译器、数据库操作系统、网络系统等。但世间万物有利必有弊,C语言的弊端就在于指针和内存管理。
  虽然指针无比强大,能直接操作内存,但是没有给工具做越界的检查,导致很多新手程序员轻易犯错。至于内存管理,更是让人无语,自己分配的空间,必须自己去释放。C语言最让人头疼的是前面这些问题在编译器发现不了,只有在程序运行时才会突然暴露,这总会让程序员猝不及防,手忙脚乱,总是昏天黑地地去调试。你想啊,程序员们大量的时间和宝贵的精力都浪费在小心翼翼的处理指针和内存分配上,程序员怎能忍受。还有一点,C语言所谓的可移植性欺骗了好多程序员,它宣称在一个机器上写的程序,只要在另外一个机器上编译就可以了,但实际上不是这样,C语言要求程序员们要用标准的C函数库。其次,如果遇到了一些针对特定平台的调用,需要对每个平台都得写一份,如果有一点点的小错误,就会导致编译失败。这些算是C语言的一些弊端吧。
  到了1983年,贝尔实验室推出了一门新的编程语言C++,添加了面向对象的功能,兼容C,有静态类型检查,性能也很好。 其实最早,C++ 相对于C语言的基础上就添加了面向对象和模块的思想,这也可以理解成 C++ 中两个加号的来历。然而,C++ 在面向对象上做的并不是太好,比如 C++ 支持多继承,多继承会引发不确定性。
  再如,C++ 还支持指针,指针直接对内存底层操作,虽然效率高,危险系数却非常高。例如,一个简单的病毒程序就可以靠指针完成:你通过一个程序的中给指针随机赋值,能够获取到访问不属于本程序执行空间的其他空间的权限,那么这也就是一个计算机病毒。(当然,真正的病毒不可能那么简单,但这是基本特性)。所以后来的 Java 在 C++ 的基础上移除了指针,增加了引用,提高了安全性。
  说穿了,C++只不过是C语言的升级版,但C语言中存在的弊端在C++中依旧存在,直到后来,1995年,Java被SUN公司正式推出,Java的一些特性很受程序员们的欢迎,比如再也没有C语言那样的指针,再也不用考虑内存管理,而且还有真正的可移植性,编写一次,到处运行,为了实现跨平台,Java中在操作系统和应用程序之间增加了一个抽象层叫Java虚拟机。用Java写的程序都跑在虚拟机上,除非个别情况,都不用看到操作系统。
  刚才提到了一个专业术语叫跨平台,我来解释一下:跨平台概念是软件开发中一个重要的概念,是指即不依赖于操作系统,也不信赖硬件环境。在一个操作系统下开发的应用,放到另一个操作系统下依然可以运行。
  Java的跨平台是相对于其他编程语言而言的,通过Java语言编写的应用程序在不同的系统平台上都可以运行。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。比如在前文中提到的C语言,在Windows系统上编译的C语言程序,在Linux系统上是不能运行的,而Java语言在不同平台上运行时不需要重新编译。
  Java跨平台的原理:java的跨平台是通过Java虚拟机(JVM)来实现的。
  Java源程序想象成我们的C源程序,Java源程序(.java)编译后生成的字节码(.class)就相当于C源程序编译后的二进制可执行文件。JVM虚拟机相当于计算机系统(操作系统+硬件环境),Java解释器相当于CPU。
  exe文件直接在Windows操作系统下运行,在CPU上运行的是机器码(.exe文件)
  class字节码文件是运行在JVM虚拟机下的,在Java解释器上运行的是Java字节码文件。
  Java解释器相当于运行Java字节码的CPU,但该CPU不是通过硬件实现的,而是用软件实现的。Java解释器实际上就是特定的平台下的一个应用程序。只要实现了特定平台下的解释器程序,Java字节码就能通过解释器程序在该平台下运行,这是Java跨平台的根本。当然,并不是在所有的平台下都有相应的Java解释器程序,这也是Java并不能在所有的平台下都能运行的原因,它只能在已实现了Java解释器程序的平台下运行。
  还有,在C++ 中,假如你写同样一个程序,在 Java 里面会报错,而在 C++ 语言里面是不会报错的。为什么?
  因为 C/C++ 语言设计的思想是:你想怎么写程序就怎么写,只要你的这种写法错得不是很离谱,就认为你这么写有特殊的含义,可以通过。但 Java 不行:只要你这么写有歧义,或者说这样写不太好,那么它都会报错。
  比如 C++ 中你可以将一个浮点型数据赋给一个整型变量,编译时只会警告,因为会丢失精度,但是在 Java 中这样写就会报错,它在语法上就禁止你这样写。这就是不同的语言对同样一个问题有不同的理解和处理方式。
  由于 C++ 中大大小小的问题会导致不安全性,所以就在 C++ 的基础上,取其精华,去其糟粕,便形成了早期的 Java 语言。直到现在,Java 又多了很多新的特性,比如说集合,反射,泛型,Lambda 表达式等等。
  正因为从C语言到C++,最后再到Java 的发展历史,使得 Java 在一定程度上继承了多数C语言的语法,但又有一定的改变,而这些改变就是很多程序员喜欢Java的原因。
  以上就是C语言、C++和Java之间的故事,要相信万物一切皆有因果,学习要求因求果。

     本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理

【福利】填问卷 送2019精选测试大礼包+接口测试实战课程!

评 论

论坛新帖

顶部 底部


建议使用IE 6.0以上浏览器,800×600以上分辨率,法律顾问:上海瀛东律师事务所 张楠律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2020, 沪ICP备05003035号
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪公网安备 31010102002173号

51Testing官方微信

51Testing官方微博

扫一扫 测试知识全知道