在学生时代,我用过C语言编程也用过JAVA语言编程,工作之后都还给老师了,但是基本的概念还是知道一些。
C语言和JAVA语言同样是高级语言,但是还是不同的,C语言要更低级一些,对硬件的控制更加直接,JAVA语言的运行需要使用JAVA虚拟机。下面分别对C语言和JAVA语言说一说。
C语言
C语言是我大学时的必修课,记得那时还是用的谭浩强老师的C语言教材,现在回想起来历历在目;
C语言更加接近机器语言,可以使用指针等直接对内存的地址进行操作;
C语言是面向过程的编程语言,说的直白点儿,使用C语言编程,脑海中首先得有一个流程图,第一步干什么、第二步干什么,直到把这个事情做完;
C语言需要使用编译器编译成机器语言,然后就可以运行了,不需要运行在虚拟机上,JAVA是运行在虚拟机上的,所以运行速率有点儿慢,但是跨平台效果好。
JAVA语言
JAVA是面向对象的高级语言,说直白点儿就是,编程时,首先要把所有的东西抽象成类,这个类包含了各种属性和方法,然后封装起来,更加接近人类世界;
JAVA的运行需要解释器,转换成字节码,然后在JAVA虚拟机上运行,相比与C语言是不需要的虚拟机的,编译成机器语言,直接在硬件上运行。
单片机为什么用c语言而不用JAVA
单片机的性能一般不是很好,CPU、内存可以说是“寸土寸金”,要省着点而用;
假如单片机使用JAVA语言,那么首先需要运行一个JAVA虚拟机,性能不是很好的单片机是“跑”不起来的;
单片机使用C语言就不一样了,c语言编译后直接转换成机器语言,直接对硬件进行控制,效率要高很多,而且很节省CPU和内存空间。
因为C语言的语言特性更适合跟硬件打交道,所以选择C而不是Java。那具体为什么呢,下面详细说一下。
首先明白什么是单片机,单片机说白了可以理解为一个微电脑,它上面集成了ROM(可以理解为电脑硬盘)、RAM(理解为内存条)、CPU以及IO端口、串口、SPI IIC等板载总线,一些高级单片机还集成了USB、LCD以及以太网接口,看上去是不是很像一个微型电脑。当然专业点讲,单片机从51到ARM从8位到32位种类很多,性能也千差万别,根据具体应用选择型号。所以说到底操作单片机和操作一台没有操作系统的裸机是很类似的(也有区别)。
那好了,搞明白了什么是单片机再来说一下编程语言的历史。早期操作cpu是用的机器语言,机器语言就是只有0和1的一串数字编码,CPU通过执行机器语言进行相关的操作。后来觉得机器语言不好记,就发明了汇编语言,汇编语言可以理解为,把机器语言差不多一对一翻译成英文字符,这样方便记忆,写代码快啊。
后来又发现不同的CPU使用的机器语言不一样,自然对应的汇编也就不同,给一个CPU写的程序在另一个cpu上不能用,于是又把汇编抽象了一下就有了C语言,对不同的CPU只需要用对应的编译器编译一下就可以了,为了适应汇编语言便于编译,C语言保留了许多汇编的特性,比如对内存地址的操作(指针),那时候C语言算是高级语言,但它仍然距离硬件非常近。
再后来人们开发的软件逐渐庞大起来,C语言让程序员很为难,在开发大型软件的时候C语言开发效率太低。于是就有了面向对象的语言C++ JAVA 等。这些面向对象的语言编译起来比较复杂,在形成可执行语言的时候容易出现问题,因为编译器也是软件也会有BUG,所以在底层使用的时候尽量使用简单的语言,如C语言。面相对象的语言让程序员轻松了,但是代码效率却下降了,越高级抽象的语言执行效率越低,低效率的程序直接运行在硬件层是一件很可怕的事情。另外JAVA还不同于C++,JAVA不是直接被编译成机器代码的,而是编译成字节码,运行在虚拟机上的(这部分内容这里就不谈了),直接理解就是它本身需要别的软件支持,不能直接运行在硬件层。
最后说C语言的指针可以让程序员直接操作内存地址以及CPU的寄存器,这是使用C语言操作单片机的最根本的原因。它既避免了汇编语言的不可跨平台,又提高了编程效率,还能保持和汇编差不多的执行效率。JAVA是做不到的