计算机语言发展史
第一代语言:机器语言
第二代语言:汇编语言
第三代语言:高级语言
汇编语言对计算机底层的控制和操作能力强大,但是其难度大,需要记忆的语句命令多,学习成本大,效率较低,已经不作为重点教程。
高级语言
C、C++、Java、C#、Python、PHP、JavaScript …
大体上分为:面向过程与面向对象两大类
C语言是面向过程语言的一种代表。面向过程的语言也称为结构化程序设计语言,是高级语言的一种。
在面向过程程序设计中,问题被看作一系列需要完成的任务,函数则用于完成这些任务,解决问题的焦点在函数。所以说C语言的基本单位也是函数,适合模块化设计。一个程序可以分解为多个函数,通过函数调用过程,使得可以用一条函数调用语句实现复杂运算。可以将一个复杂问题的解决过程分解为较为简单的几个子问题的解决过程。模块化设计的语言,很难对开发出来的系统进行调整或者调整的工作量会很大。
C++、Java都是面向对象语言,OOP(Object-Oriented Programming),是一类以对象作为基本程序结构单位的程序设计语言。
C++ 支持多继承,会引发不确定性。
C++ 支持指针,指针直接对内存底层操作,效率高,危险系数亦高,比如通过一个程序给指针随机赋值,能够获取到访问不属于本程序执行空间的其他空间的权限。
Java 是由 C++发展而来,在 C++ 的基础上移除了指针,增加了引用。
在 C++ 中,假如你写同样一个程序,在 Java 里面会报错,而在 C++ 语言里面是不会报错的。为什么?因为 C/C++ 语言设计的思想是:你想怎么写程序就怎么写,只要你的这种写法错得不是很离谱,就认为你这么写有特殊的含义,可以通过。但 Java 不行:只要你这么写有歧义,或者说这样写不太好,那么它都会报错。
比如 C++ 中你可以将一个浮点型数据赋给一个整型变量,编译时只会警告,因为会丢失精度,但是在 Java 中这样写就会报错,它在语法上就禁止你这样写。这就是不同的语言对同样一个问题有不同的理解和处理方式。
Java的特点:
Java 没有指针的概念。
Java 不支持多重继承,但允许一个类实现多个接口。
Java 是完全面向对象的语言,并且还取消了 C/C++ 中的结构和联合,使编译程序更加简洁。
Java 自动进行无用内存回收操作,不再需要程序员进行手动删除。
Java 不支持操作符重载,操作符重载则被认为是 C++ 的突出特征。
Java 允许预处理,但不支持预处理器功能,所以为了实现预处理,它提供了引入语句(import),但它与 C++ 预处理器的功能类似。
Java 不支持缺省参数函数,而 C++ 支持。
C 和 C++ 不支持字符串变量,在 C 和 C++ 程序中使用“Null”终止符代表字符串的结束。在 Java 中字符串是用类对象(String 和 StringBuffer)来实现的。
goto 语句是 C 和 C++ 的“遗物”,Java 不提供 goto 语句,虽然 Java 指定 goto 作为关键字,但不支持它的使用,这使程序更简洁易读。
Java 不支持 C++ 中的自动强制类型转换,如果需要,必须由程序显式进行强制类型转换。
java是解释性语言,java程序在运行时类加载器从类路经中加载相关的类,然后java虚拟机读取该类文件的字节,执行相应操作.而C++编译的 时候将程序编译成本地机器码.一般来说java程序执行速度要比C++慢10-30倍.即使采用just-in-time compiling (读取类文件字节后,编译成本地机器码)技术,速度也要比C++慢好多。
Java程序有要从网络上加载类字节,然后执行,这也是导致java运行速度慢的原因。
在程序运行过程中,Java虚拟机要检测数组是否越界,在C++中则不检测。
Java中所有的对象都创建在堆中,没有对象被创建在stack中,而C++有的对象和变量是创建在stack中的。
Java在运行过程中检测对象的引用是否为空,如果引用指向都空指针,且执行某个方法时会抛出空指针异常。
Java运行时对类型检测,如果类型不正确会抛出ClassCastException异常。
Java的垃圾回收机制较C++由程序员管理内存效率更低。
Java中的原始数据类型在每个操作系统平台长度都是相同,而C++这些数据类型长度是随操作系统的不同而不同,所以Java在不同操作系统上执行时有个转化过程。
在Java中String 是UNICODE.当Java要操作一个 ASCII string 时,比C++效率上相对要低一些。
Java中采用的是动态链接。