03.03 同样是高级语言为什么C语言可以编写51单片机程序,JAVA却不能编写?

星沉大海3


从事嵌入式开发多年,C语言和Java两种编程语言都拿来做过项目,凡是没有那么绝对,不同的编程语言适用于不同的编程场景,对于单片机来讲运行个操作系统就已经是很奢侈的事情,再让运行java的虚拟机还让人玩不,一旦涉及到操作系统或者java的虚拟机基本上已经超乎单片机的范畴了,单片机再次扩展化就是嵌入式开发了,运行个操作系统或者java虚拟机也不是什么很难的事情。

术业有专攻,对于单片机而言应用场景非常简单,用最小的开支控制硬件电路,只要是单片机在的地方,软件要求都不是太强大,但性能要求非常高,成本普遍比较低,常见一些小的控制设备基本上都是单片机完成,前天部门一个做单片机开发的程序员还在抱怨在嵌入式linux上写的代码直接平移到单片机上没法用,占用内存太厉害,相同的功能只好重新写一遍,系统资源特别是内存资源必须要考虑的事情,又不能增加做太多外围的扩展毕竟成本有限制,基于以上种种原因,单片机能跑个操作系统都是一件很难的事情更何况是Java,任何公司开发产品都需要从实际情况出发。

java目前主流语言里面的第一编程语言受众最多,相关从业人数也是最多的,主要在应用级开发以及后台服务器开发方面有比较大的优势,可用类库非常多,所以开发一个功能只要思路确定功能实现起来非常迅速,大部分的基本功能已经封装成类库,而且由于受众比较多,简单的功能直直接在网上就能搜到然后复制粘贴出来,修改下就能使用,这也是强大的生态链支持。

Java也是可以直接调用底层硬件的,通过jni方式只是一个通道而已。在开发安卓框架的时候,有个同事做了多年的java,想转行做底层的软件开发,结果搞了三个月坚持不下去了,最后又回归到java开发去了,不仅仅是语法方面的差异主要是编程方式以及编程思想差异太大,本质上还是面向对象和面向过程的差异,现在的程序员特别是刚入行的喜欢拿比较各种编程语言的差异,更夸张还有鄙视链。

C语言和java几点区别?

1.C语言属于面向过程的编程语言,java面向对象语言,编程思路有差异

2.C语言主要用在操作系统,通讯行业,驱动开发等底层语言开发,java主要在app以及后端服务器开发,现在大数据领域应用场景也很多。

3.编程语言发展正在向着集成化发展像java这种在编程领域会越来越受到重视,C语言这种底层语言会越来越走向后台,并不意味着落伍,只不过从前台走向了后端,而且从业的门槛也提升了,但重要程度不会因此降低。

术业有专攻任何一种编程语言都不是万能的,能在合适的场景下解决问题就够了,没有必要在一些无关的选择上浪费太多的时间。

希望能帮到你。


大学生编程指南


根据我所知道的回答一下这个问题。


在学生时代,我用过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语言和JAVA语言的使用区别,大家有什么看法呢,欢迎在评论区,留言讨论。

如需更多帮助,请私信关注,谢谢。


Geek视界


这两种语言的运行机制不一样。

C语言是直接编译成二进制格式的机器可运行代码。比如在windows平台上的exe文件,双击可直接运行。

而JAVA不同,JAVA是运行在各种版本的JAVA虚拟机之上的。JAVA虚拟机,可以理解为运行在各个平台之上的可执行文件,这个程序负责给windows等各个平台翻译编译后的JAVA语言。

举个例子,C语言就好比你精通各国语言,直接和老外交流,而JAVA则是带个翻译(JAVA虚拟机)来和系统交流的。执行效率肯定是C语言更高一些了。

51单片机,机器运行资源相对比较紧凑,在上面跑个JAVA虚拟机的话开销有些大。另外,JAVA官方也没有提供51平台的虚拟机。

另外,C可以直接操作内存,可以调用汇编指令,操作起来更加灵活。而JAVA受虚拟机功能限制,可完成的工作就比较局限了。

从JAVA语言诞生之日起,JAVA就是为了大规模开发应运而生的。C则擅长直接和硬件打交道。所以,从各方面看,JAVA都不适合开发单片机程序。


自由编程


作为985院校的本硕毕业生以及BAT的Java开发工程师来回答这个问题。

因为同为高级语言的C语言是编译型语言,而Java是解释型语言。

解释型语言与编译型语言

也许你早就好奇了,什么是解释型语言,那什么是编译型语言?

我们最开始说C/C++是编译型语言,原因是相对于java这样的解释性语言,C/C++需要通过编译器,把源代码编译成中间文件,然后通过连接器和汇编器生成机器码,即一系列基本操作序列,可以直接让计算机执行。

而java程序从源代码到被计算机执行,也要经历上述步骤。不同的地方在于,C/C++会把那些从源代码“变”来的机器码保存起来,而java直接将这些生成的基本操作序列指令丢给java虚拟机,也就是我们常说的JVM(java virtual machine),执行然后产生动作了。这就是我们所说的解释型语言。

所以我们看到的现象是,编译型语言要先编译再运行,而解释性语言直接“运行”源代码。

单片机

单片机其实就是一个微型电脑,除了功能和性能上比我们家用电脑弱很多,其他内部重要构造一应俱全,用来做一些控制家用电器的工作足够了,比如洗衣机,微波炉什么的。

单片机程序通常都是用C/C++编写的。因为他们生成的exe文件,是可以直接放在单片机内部运行的。而像Java,作为解释型语言,它编译后的产生的文件是要放在java的虚拟机中才能运行的,直接交给单片机,根本无法运行。

如果一定用Java写单片机程序,也不是不可以,就是比较麻烦,需要把它的解释器写进单片机内部。但是这样做简直就是自找麻烦,第一占用单片机有限的空间资源,第二会影响执行速度。我想所有人都不想点击洗衣机的开始按钮之后,过了十秒钟,才开始加水吧。

以上是我的浅见,如果对你有所帮助,欢迎点赞留言与我交流。

我是苏苏思量,来自BAT的Java开发工程师,每日分享科技类见闻,欢迎关注我,与我共同进步。


一个存在感小透明


本人5年自由职业程序员一枚,我来回答一下这个问题。

C语言和JAVA的区别

C语言是由汇编语言编写而成,在使用时,C语言先编译成机器码,然后芯片或者计算机直接执行机器码。JAVA语言作为一种高级语言比C语言更抽象,JAVA是由C语言和汇编语言编写而成,执行时不用先编译成机器码,而是先编译成一个中间码,然后由一个虚拟机把中间码翻译成各大平台所需要的机器码,这样在不同架构的硬件之间JAVA都可以运行,这也就是JAVA最大的特点跨平台。但是由于有一个虚拟机的存在,JAVA编写的软件运行是所需要的资源要比C语言多得多,而且增加了许多C语言没有的高级语法特性。

为什么不能用JAVA编写单片机

51单片机是一个功能非常简单的芯片,没有电脑CPU那么强大,存储空间也非常小,如果使用JAVA首先得安装一个虚拟机,但是这个虚拟机程序就有几百M,51单片机只有几K,根本装不下,性能也完全跟不上。对于性能很低的51单片机来说,JAVA太重了。使用C语言可以直接运行硬件所需要的机器码,需要的资源很少。


低吟浅笑


不是绝对不可以,但的确不合适,原因:1、单片机通常是x86或arm架构的,8位或16位,内存较小,指令精简,完成专用领域的控制及处理任务,通常直接运行汇编程序,或者c程序,而不会采用java之类的高级编程语言,这是由机器硬件特性决定的 2、从运行机制原理及语言特点来讲,汇编指令种类基本固定有限,并且c程序通常可以操作数、操作位、操作内存地址,函数可映射寻址汇编代码,系统功能调用也可对应汇编子程序代码,c程序编译后可直接运行于单片机,而java就不适合了,类及对象分配不方便直接对应操作数、操作位、操作内存地址,方法也不能直接寻址汇编代码,并且java编译生成中间字节码,不能运行于单片机,需要安装虚拟机环境,而对应cpu架构指令是不通用的,只适合i386及以上,不适合单片机,综上所述,c或汇编语言适合单片机开发,而java不适合


红尘匆匆过客梦


一直从事单片机和嵌入式方面的软硬件设计。这个问题其实跟容易搞明白。先说一下答案吧,因为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是做不到的


HeloneTech


1、C语言宝刀不老的优势就是:代码简洁且与单片机关系密切。

2、玩单片机就是用C语言,别整别的幺蛾子。你搞别的会被人笑话。

3、C语言入门其实很快的,多学一门编程语言没坏处。

4、JAVA是基于C的,最后转换成机器代码比C繁琐(汇编语言转换更快,但写起来麻烦,500行汇编代码用C语言100行就够了)。

5、单片机的各种库基本都是C语言(我说的是基本都是,不是全是),一些系统底层的程序也基本都是C语言写的(STM32单片机启动程序有汇编文件)。要是把这些东西全用JAVA写好那也行,但没人懒得开发。

6、单片机写程序用的主流软件Keil、IAR、Arduino,基本都是用C语言写程序;现在还没听说过哪个软件将单片机和JAVA联系在一起的。

7、高手都是会4种以上编程语言的,只会一种,算不算高手。


苏更宇


我就呵呵了,题主刚学的java吗,这门语言最初就是用来搞硬件开发的,做烤箱冰箱手机等等,后来因为发展过快,虚拟机和软件包越来越庞大,普通的家电存储器小处理器频率低再用这么庞大的语言已经有些浪费,适合运行精炼速度快的程序,所以还在沿用c,但并不表示java不可以开发硬件。所以说c小有他的好处,可以用最原始的方法实现想要的系统功能,用太多别人的包不知会出啥问题。java大当然更好,虽然效率会有所降低,但是可以轻松开发应用,不然安卓不会选java做壳。


人生还要什么


因为java是用c写的,在c的基础上扩充了很多方便程序员快速实现代码的东西,而c就是一条线下来无法写重用方法,就是顺序型而不是对象型。java有很多特性都是为了让程序员节省时间的,比如跨平台,多态等。这样生产周期短,成本低,非常适合商业,那当然会越来越多的人选择java。至于单片机不是不可能,Java其实有操作系统,这就属于在裸机上运行,这需要更多的工作,而这些工作实际还是要依据c做为基础,那么为什么不直接用c?所以java操作系统如果有非常大的优势,那么将来java可以顺利的实现单片机。


分享到:


相關文章: