机器语言和c,机器语言和程序的区别

kodinid 12 0

大家好,今天小编关注到一个比较意思的话题,就是关于机器语言和c的问题,于是小编就整理了5个相关介绍机器语言和c的解答,让我们一起看看吧。

  1. C语言、汇编语言、机器指令、CPU之间是怎么联系起来的?
  2. 机械专业是学C语言还是C++,有哪些好的建议吗?
  3. 有人说c语言开发效率比java低是哪些因素导致的?
  4. 学Java好还是C语言好?哪个以后的发展会更好呢?
  5. 单片机为什么还在用C语言编程?

C语言、汇编语言、机器指令、CPU之间是怎么联系起来的?

CPU中包含无数微型cmos开关单元,由无数0或1的电信号控制输出0和1的信号,这就是机器语言。c语言转换汇编语言,再转换成机器指令控制开关,开关输出的机器语言经逻辑运算后控制各声光设备,输出结果

CPU的全称是中央处理单元,是计算机进行运算的核心,根据使用技术不同,CPU又分为X86,X64,ARM、DSP、单片机等不同的体系结构。在每种CPU上都有一套特定的指令集,这就是人们常说的机器指令,直接使用机器指令编写程序就是机器语言程序

机器语言和c,机器语言和程序的区别-第1张图片-安济编程网
图片来源网络,侵删)

理论上来说,是可以通过机器语言直接编写任何程序的(早期都是直接使用机器语言编程,那时程序相对比较简单),并且编写的程序可以直接运行,但是使用机器语言编程程序员要求极高,代码无法移植且不便于人直接阅读,于是人们发明了一组符号,用来表示这些机器指令,这就是汇编语言。汇编语言编写的程序计算机无法直接运行,需要一个叫做汇编器的程序转换为机器语言才可以在特定机器上运行。

而C语言是比汇编语言更高级的语言,使用C语言编写的程序也是无法在计算机上直接运行的,它需要编译器将C语言代码转换为机器语言,这个过程又分为几个子步骤,见下图

为了使题主的问题更加完善,在这里补充两个概念,链接器与反汇编。

机器语言和c,机器语言和程序的区别-第2张图片-安济编程网
(图片来源网络,侵删)

在大型程序中,往往会将任务分解为许多不同的子任务,每个子任务对应一个源文件,在C语言中就是多个C文件编译器将每个C文件编译成一个目标文件(一般windows中是obj文件,Linux中是

.o

文件),这些目标文件也是机器指令,但是缺少一些必要的信息,无法直接运行,需要链接器将这些文件链接起来,再加上一些库文件与可执行文件头信息,成为一个可执行文件(Windows是PE格式,Linux是ELF格式)。

通常,在查看一个二进制文件时(目标文件或者可行性文件),不会直接显示机器指令,而是以汇编语言显示,这是因为此过程中有一个反汇编程序,将机器指令转换为汇编语言,它的功能刚好与汇编过程相反。

谢邀。

机器语言和c,机器语言和程序的区别-第3张图片-安济编程网
(图片来源网络,侵删)

简单说说这几者的关联吧。

通常,C语言程序可被C编译器翻译成汇编语言编写的汇编程序,汇编程序被汇编器翻译成可执行代码,而可执行代码主要包括机器指令及其使用的数据

举例子吧:

C语言代码:

可被C编译器翻译成汇编代码(以x86 CPU为例):

可以看出,第一行C代码被翻译成两行汇编代码,第二行C代码被翻译成一行汇编代码。C代码和汇编代码没有一一对应关系。

***如你设计一个数字电路,包括一个加法器和一个乘法器。

你希望根据需要,有时对输入数据做加法,有时对输入做乘法,该怎样做呢?最早的计算机,是靠手工连线的,与其说是计算机,不如说是巨型面包板。直到冯洛伊曼的edvac计划存储器引入计算机。

***设加法器和乘法器都具有使能端,两个使能端为01,就是加法器工作,是10,就是乘法器工作。

然后为了让电路根据要求的顺序做加法和乘法,你把一系列01、10存储起来,当你要做加法,加法,乘法,加法时,存储的就是01011001。你增加了一个时序电路,每次读出两个位,把高低电平加在两个使能端上,替代你的手工接线。01和10这两个数码能控制电路的行为,起名叫机器码

然而这样二[_a***_]的东西并不好记忆。于是你给01起了个名字,叫add,10起名叫mul。你的这组运算就记为add,add,mul,add。

add,mul这种助记符,就叫代码,具体说是汇编代码;你会找一个悲催的助手,帮你把代码替换成01,10这种机械码。当然总有一些助手认为这个活动太没有人生价值,于是不甘心当花瓶的女助手葛丽丝·霍普(Grace Murray Hopper)设计了将代码翻译成机器码的代码,这个活儿以后就由机器来做,编译器出现了。

因此所谓cpu认识代码,是一种拟人化的修辞,偏文艺了。cpu只是一种根据高低电平输入,产生特定的高低电平输出的机器。代码不过是助记符。

后来你觉得add,add,add,add,add这类写法太烦,于是发明了五连加,7连乘之类的写法——高级语言代码诞生了。葛丽丝·霍普搞了cobol,约翰·巴科斯(John Warner Backus)搞了FORTRAN等等。

但是相对来说第一批的高级语言写起来比较烦,比如FORTRAN语言,子程序用function开头,用end。相信用过python的人都会觉得FORTRAN太学究气息了。

所以后来丹尼斯·里奇(Dennis Ritchie )在开发unix系统的同时,顺便设计了语法简单的c语言。main()可比function main()end简便多了。

机器语言 也就是我们看到的二进制指令,二进制指令在电路中代表高电平低电平。它是可以在CPU中直接进行运算的。而汇编语言是属于低级语言。他需要通过汇编器连接器将汇编代码转换为二进制机器语言。这个转换过程,我们称之为编译。同理,c语言也有它的编译器。编译器会将c语言代码编译成二进制机器语言。举个很形象的例子。我们和外国人打交道,有时候我们的语言水平可能他们正常沟通是有问题的,但是呢,如果中间有一个翻译人员,就可以通过翻译人员的翻译进行沟通。而这个翻译人员就相当于编程语言中的编译器。我们就相当于编程语言。这个外国人就相当于CPU。

机械专业是学C语言还是c++,有哪些好的建议吗?

先搞清楚学c或者C++你是用来做什么,这样才更好定义哪个用的最多。我印象中机械专业应该也有单片机之类的课程,所以我想学编程更多也是用来开发单片机进行自动控制。那么就很明了了,目前单片机大多数还是用c开发的,虽然很多已经支持了c++进行开发。所以强烈建议从c入手,如果你没学过c,在c++里面的对象继承多态等等这些概念一定会很难理解。当你熟练掌握了c,再用c++也是小菜一碟

建议学c语言,因为对于机械相关专业,c和具体硬件控制联系紧密,并且是模块化编程,而工程中用到的PLC也是模块化的。我做了一些c语言学习相关视频,有兴趣可以一起学习,祝顺利。

如果不知道以后要干什么,那么建议你先把C语言的课程过了,然后去学python,python的各种工具包很丰富,可以用来做很多事情而不需要你对计算机硬件有什么理解。如果你打算读研究生,并且要从事机械电子、机器人、装备智能化、测量大数据、工业iot等交叉学科研究的话,那么你上面那的问题就不是选择题了。此时C、C++、python、Matlab基本上是必备工具,它们都有各自用途。就算想精简一点的话起码要会c和python。总之偷懒的想法不要有,学就是了,都不会白学。

如果是应届毕业生我建议你考研究生,跨考自动化、计算机或者电子科学之类的。最好有兴趣在编程方面。如果不打算考研或者毕业多年,可以自学或者培训班,但是处于你的专业不是对口的,这两种方式不一定能找到好工作。为什么要读研,因为,你可以花两年或者三年学习所有的技术,还可以跟随导师做项目实践,最后还可以以应届生的身份优势找到好工作。

至于说学习C还是C++,不重要,为什么?因为一个合格的工程师需要懂好几门编程语言,如果想从事偏硬件的工作(单片机、嵌入式等)还要学习硬件操作、看/画电路图、操作系统等,如果想从事软件互联网方面的还要懂通信数据库、高并发等,学习的东西很多。

最后建议一开始学C语言,期间要做项目联系,实践出真知。然后学习C++,这时候只要学习面向对象的部分就行了,再后面想学啥编程语言都很快了,一通百通。期间还要兼顾学习数据结构、数据库、操作系统等。

跨学科学习要有足够的毅力,坚持就是胜利,我也是这样过来的,祝你好运。

有人说c语言开发效率java低是哪些因素导致的?

因为标准的c语言没有提供针对操作系统的内容,如果要开发针对系统的应用程序就要使用系统提供的API,比如微软系统就是mfc,用起来很繁琐还不能跨平台,但是Java虚拟机运行,只要用虚拟机提供的类库完成应用程序就可以,不用再去研究系统API了,只要这个操作系统支持JAVA虚拟机就行,可以很方便的跨平台,还有就是封装效率的问题,J***a提供的类库用起来比较简单方便这是相对c++的mfc来说,之外还有开发环境的方面,用VC6.0开发windows应用反正在c++环境下我觉得真还不是所见即所得,它那个组织结构你要深究起来还是挺费时间的,但是J***a那个环境简单的多,最后单从语言上来说c不支持面向对象J***a支持,但我觉得这不是重点,因为J***a你要是不用提供的类自己从头构建也不必c方便

看开发什么呢,各自擅长领域不一样;C语言偏向底层算法开发,如果做应用层面,代码量很大;J***a偏向企业级应用开发,有成熟的库,开发应用擅长。

基本上所有编程语言,都是基于c语言开发的虚拟机运行。没有了c语言大部分语言就是空中楼阁,可看不可用。

就事论事,你说开发效率那肯定是j***a开发效率高。

j***a是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此J***a语言具有功能强大和简单易用两个特征。J***a语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。

C语言是一门面向过程的计算机编程语言,与C++、J***a等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言描述问题比汇编语言迅速、工作量小、可读性好、易于调试修改和移植,而代码质量与汇编语言相当。C语言一般只比汇编语言代码生成的目标程序效率低10%~20%。因此,C语言可以编写系统软件。

面向对象具有以下优点:

易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护 

因此,j***a语言比c语言开发效率高。

由于JIT技术的进步,纯计算上J***a和C差距很小,但是J***a和C的代码不可能完全等效,因为两者内存管理的机制不同,C可以完全控制内存管理,而J***a主要靠JVM的GC功能,这导致J***a的运行效率比较稳定,而C的运行效率和代码质量密切相关。高质量的C会比高质量的J***a快,但低质量的C很可能回比低质量的J***a更慢。其实单纯比速度并不是特别公平,因为J***a天生有多线程(JIT和GC),而且内存使用量一般J***a明显要多。

我认为主要有以下几个原因:

1.C语言直接操作内存,没有内存回收机制。而j***a有成熟的内存回收机制。

2.C语言面向过程编程,而J***a面向对象,在开发大型项目上,面向对象有优势。

3.C语言相关类库、成熟框架不如J***a丰富。

学J***a好还是C语言好?哪个以后的发展会更好呢?

作为过来人,我来谈谈我的看法,所谓的编程语言并不是有什么优劣之分。不同的语言适用的范围不同。

我一开始是学习C/C++的,但是在我的第二份工作入职后不久,就需要做一个J***a的计费项目,当时项目缺人,只能让我C++的上,我对J***a可以说是一无所知,一开始并不顺利,但是经过两三天的恶补加百度,很快我就上手并且完成了制定的目标。但是,你让一个搞J***a的人去做C++的项目,上手并不那么容易。

所以,由我的经验来看,如果你掌握了C/C++,想要转其它语言,其实是相对比较容易的。但是目前不得不承认J***a在薪资水平和职位需求量上要比C++高的。

如果你是在校[_a1***_],我建议你多学一些C/C++以及操作系统的东西,如果你的程序出现了问题,即使仅凭一个内存出错地址,也是能够很快定位到问题的,而学J***a的就不一定了。即使你以后不做C/C++,转到其它语言也是游刃有余的,这就好比C/C++是武侠中的内功,内功深厚,学任何招式都不成问题。

如果你是在职,想要快速上手挣钱,我更推荐J***a,J***a的集群分布式第三方库的易用性都不是C++所能匹敌的,你也永远不用跟内存死磕,可以把更多的精力放到业务上。

猴哥技术站,专业解答计算机互联网类问题!

很多人都有这样的问题,想要学习一门编程语言不知道选哪种好,一是担心就业,二是担心难度,三是担心未来的可用性!其实,从我身边多年从事软件开发的同事来看,没必要纠结这个问题,你该关注的应该是选哪门编程语言更适合你,更容易让你入门,这才是重点!

初学者适合自己的才是最好的

学习编程语言刚开始,没有所谓的“好不好”,告诉你好的那是别人的认知角度,不一定适合你,告诉你不好的,说不定你学起来反而轻松自在,所以学习哪一种,重在你自己探究,比如通过一天两天的书本学习,你就可以知道哪门语言适合你这样的初学者而不是用别人的建议强加给你这样的初学者!

为什么说入门才是重点?

我身边同事从事C/C++开发的年限最高近20年,现在在他们眼里,没有什么编程语言是难的,因为C/C++是公认的最复杂最难学的语言,你想,一个拥有20年C/C++使用经验的人去学哪一种编程语言会有难度?虽说C/C++是世界公认的最难语言,但是入门编程C确实是最简单的!所以,任何一门语言只要你入门了,你后面再去学习其他语言都会更简单,更快速,因为所有的编程语言路数都差不多,你只有入门了,你才更容易知道其他编程语言怎么学

哪种编程语言以后的发展会更好?

作为技术出身,我想说哪种语言发展好都和你关系不大,跟你关系紧密的只有你的技术水平高低!很多人告诉你J***A应用广泛,发展前景好,当然这个我不否认,但你能保证你建议的这个人适合学习J***a吗?你不能!我想说的是任何一门语言,只有精通,学透你到哪里,哪里对你来说发展都是好的!

你说C语言被淘汰了,我分分钟能给你找一个30万C语言的岗位,只不过水平要求很高而已!你要说J***A***价了,我分分钟也能给你找一个50万的岗位,只不过同样也是要求很高而已!技术上,没有什么发展好不好,只有你的水平高不高,你的水平高,哪里都是好前景!完了!

肺腑之言,码字不容易,喜欢的请点个赞!

就目前开发市场的就业情况来看,j***a开发技术人才的需求量还是比较多的,相对来说要比C语言的要好点,这只是我的个人观点,当然还得看小伙伴自己的选择,哪个更适合自己,不是吗?

j***a开发招聘

C++招聘

小伙伴想要成功入行j***a开发,需要更为系统的去学习j***a开发技术知识,对于零基础小伙伴来说,选择培训班来学习是比较不错的,如果小伙伴要选择培训机构进行学习的话,我建议你去了解一下尚硅谷还是比较不错的,老师都很负责任,开发实战经验也是很丰富的。

从发展前景、未来主导看,C语言更有前途一些。因为C语言是继机器码、汇编之后第一个底层的与自然语言接近的语言,兼顾高效率与易理解,

所以做底层的主流语言C的地位永远不会改变。j***a是面向对象的高级语言,主要目的是容易理解和编写代码,那么将来肯定会出现更加人性化

的高级语言来取代它。这个结论从C语言出现的几十年但一直居于编程语言排行榜的前三名就可以证明。从优势和就业来看,j***a目前好一点,

j***a是面向对象的高级语言,所以应用软件主要使用它,相比较C擅长的底层开发,应用软件的市场更大一些,所以也更容易就业一些,但是如果C学的非常好的话,就业非常容易。

单片机为什么还在用C语言编程?

在裸机状态下你想操纵硬件,不用汇编和C你用什么?汇编虽然效率最高,但可读性和可移植性较差,C语言是最好的选择,可读性和可移植性强,还兼顾运行效率,无疑是单片机开发的最佳选择。

单片机为什么还在用C语言编程?答案是:C语言是最适合单片机编程的高级语言。

这个问题的意思应该是:现在有很多很好用的高级语言,如j***a,python,VC等等,为什么这些语言不能用来编写单片机程序呢?那么这个问题的答案就是:不能不能,而是不合适。

对单片机编程来说,首先要考虑的是单片机的程序空间和数据空间都是有限的,所以要让程序尽量短小精悍,以节省程序占用的存储空间。

第二、单片机编程的一个主要对象是对单片机的端口和内部寄存器的操作和配置,这个需要比较精确的时序控制。

第三、单片机算法运算中,尽量使用加法、减法、移位运算,因为乘法和除法运算会非常费时间,尤其是除法,会耗费很多时间,这对于速度本身就有限制的单片机来说,是一个很大的负担。

高级语言可以实现更为优化的算法,更为方便的执行方案,但是,高级语言对程序存储空间的占用要比汇编和C语言多很多。这是最致命的一点,单片机有限的存储空间需要靠精打细算来设计程序,根本经不起高级语言臃肿的代码体积。

高级语言无法实现精确的时序控制。

其实用C语言开发单片机也是一个折中方案,因为最适合单片机开发的编程语言实在太过晦涩难懂,并且每一种单片机的汇编指令有很大区别,所以想把一个程序从这种单片机移植到另一种单片机简直是痴心妄想,还不如重新写一遍程序。

单片机***有限,最好使用汇编,但是汇编移植性差,跳转要写标号,有时一段代码跳转条件多了,写标号名称要想半天,换平台后修改麻烦,不亚于重新写,而c语言移植性好,换个平台修改寄存器相关配置就可以重新使用了,节省时间,一般经常用的比如除法乘法运算用汇编写,c语言直接嵌入,可以提高效率,加快运行速度。

我认为现在单片机用C语言来主要有以下几个原因:1.单片机IO口很有限,大量的操作都是针对位的运算,C语言相对有优势点。2.单片机主频比较低,储存空间小,用其他高级语言写的代码,代码大,执行率低,不能很好发挥单片机的能力。3.C语言易学,容易看懂,方便移植,结构化,模块化强。是除汇编外执行效率最高的语言,但汇编不容易看懂,移植很不方便,所以C语言更适合单片机。

目前单片机常用开发语言也就汇编语言和C语言。 汇编语言虽然有着优化程度高,可控性更好的优点,但是由于不同单片机***用不同的汇编指令,导致汇编编程学习难度大,易读性差,可移植性差的缺点。

C语言则避免了这些缺点。由于C语言已基本与汇编指令无关,所以对于同一功能的实现,你只需要了解寄存器的不同,更容易移植。并且,由于C语言***用模块化编程,易读性大大提高。

到此,以上就是小编对于机器语言和c的问题就介绍到这了,希望介绍关于机器语言和c的5点解答对大家有用。

标签: 语言 单片机 C++