为什么编译机器码
『壹』 高级语言编译成的机器码和汇编成的机器码有什么不同,为什么高级语言可以通用而汇编的不可以
高级语言来编译生成的机器码总源体来说是冗长、效率低些;由汇编语言汇编生成的机器码总体说是简洁、高效。
所谓的通用是源程序的可移植性,高级语言的源程序对于不同的体系结构的计算机是基本一致的,只需用相应的编译器重新编译下就可以运行;而汇编语言源程序是直接与cpu的体系相对应的,要在别的体系结构的机器上运行,需要重新编写源程序。
『贰』 小白求助,编译是什么,为什么需要编译
人与机器交流(即人让计算机按照人的意愿做事)依赖于语言
语言的层次是:自然语言->高级编程语言->汇编语言->机器码
人最熟悉的肯定是自然语言(就是你平时说的话)。
而计算机的cpu只认识二进制的机器码,机器码指导计算机做什么操作(如逻辑运算)。
高级编程语言跟自然语言的关系更近些,对人来说相当于自然语言的白痴版,如java中的对象与类的概念可能对应于现实世界的某种事物,如C语言中的函数可能对应了一个功能,比如打印文件,经过简单的训练,人也能大概的读懂。
汇编语言和机器码更接近些,每个汇编指令一般都会对应一条机器码,而高级编程语言中的一个语句(如if else什么的)可能会对应多条汇编指令,汇编指令一般就是算术运算(如add)、逻辑运算(如and)、数据传送(如mov)、条件判断、跳转等,只能用这些简单功能的汇编指令组合来完成一个复杂的功能。人看懂汇编就很吃力了,更别提用汇编来完成想要的功能,太吃力,这个过程还是交个编译器比较好。
而机器码对于一般的程序员来说,就是天书,也基本没人愿意去看。
自然语言最容易表述人们的要求,当用户用自然语言表述了需要的功能后,从自然语言到高级语言的转换过程由程序员来完成,而由高级编程语言到汇编、由汇编到机器码的过程都由编译器来完成,由编译器完成的这个过程也就是编译了。
高级编程语言的代码经过编译阶段成为汇编代码,汇编代码经过汇编阶段变成机器码,机器码文件经过链接阶段变成可执行文件(.exe)。一般编译是指的编译阶段和汇编阶段的组合,编译器的工作一般是编译和链接。
这就是我的理解,希望你帮到你。
『叁』 请问c语言的源程序被编译后的代码是机器码吗
严格来讲没有机器码这种说法,与机器直接打交道的底层语言是二进制代码,C语言和版java语言编译后的文件都是权二进制代码,即可执行代码。
可执行代码的运行需要一个环境,这就是操作系统,它管理计算机所有的资源,你所说的机器实际上是指机器的资源。
『肆』 C语言代码编译成的是机器码,那么怎么实现可移植性呢
C语言的来可移植性不是源体现在生成的2进制文件上面,而是体现在源代码级别的,只要重新编译就能运行。
一是,因为大部分系统都实现了C的标准运行库。
二是,它对机器指令进行了抽象。用if,for等语句代替了多条机器指令。
像汇编这种就不太可移植的,它一条语句对应一条机器指令,不同CPU支持的指令集是不完全一样的。
『伍』 Android 程序为什么不直接编译成机器码
编译单元无法确定要访问的逻辑地址,也就无法转为机器码,
必须由链接过程分配地址。 先编译后链接,
应该是易于编译器的实现和扩展并且能够增加灵活性和多文件项目的编译效率
『陆』 为什么程序代码被编译成机器码就不能跨平台运行
首先机器码实际上就是一串的CPU的指令,比如说,把内存地址A的东西移到内存地址B,递增一下回地址B的的东西。又或者说,把某个地址C的内容拷贝至某寄存器。所以实际上就是内容移动+少量的数值运算,全是基于内存进行的。
----------------------------------
那么之所以同一套机器码不能在不同的操作系统下运行的原因是:
不同的操作系统管理内存的方法不一样咯。计算机开机时,内存是空的,操作系统决定了如何摆放内存。比如操作系统A可能把自己的Runtime内核放在地址的答前面XXXMB里。操作系统B可能愿意把自己的内核放在别的地方。就算哪怕不同的操作系统把内核放在同一个位置,内核里头的memory摆放也不一样的。
所以同一套内容移动的机器码,在不同的操作系统下自然产生了不同的效果。
『柒』 C语言编译到机器码的过程求详细解说,不胜感激
从编码到生成可执行的binary文件是有好几个过程的:(默认已完成编码)
1, 预编译(预处理), 也就是替换工作, 先把代码中的宏做替换, 条件编译等会做处理,为编译做作准备;
2,编译,包括了语法的检查,汇编代码等中间代码的生成,代码优化,obj文件(也算是目标代码)的生成,已经是有机器码了;
3.库的合成,这个不一定有,不是必须的;
4.链接, 连接器会按照一定的规则,比如根据连接脚步,把code组织起来,生成elf文件(elf可能不是一个所有通用的格式),这个时候已经可以执行了,里面的可以执行的机器码;
5,裁剪, 可以把elf文件中的非必需的段 strip,生成一个更精简的elf文件;
6,binary的生成,obj命令可以把elf文件转换成binary文件,binary文件烧录到存储器中可以直击运行。
『捌』 java编译后产生 字节码,还是 机器码能不能简单解释一下
Java编译后是字节码,C/C++以前全都是是机器码。
电脑只能运行机器码。版Java在运行的时候把字节码变权成机器码。
C/C++在编译的时候直接编译成机器码。
不过现在微软的Visual Studio C++ 2005以后的C++也可以编译成字节码,用CLR运行是转换成机器码(和Java差不多)。
『玖』 各种语言被编译成机器码,但是为什么执行效率会不一样
由于翻译器不一样, 所以 同样功能的不同语言,翻译出来的机器码也是不一样的。
除了汇编外, 任何语言都会产生冗余的,不可避免。
有的翻译出来的冗余机器码多一些,效率就低。有些高一些,效率就高。
简单类比一下,同样的英文, 在不同人翻译后,得到的中文也可能是有区别的。
『拾』 操作系统是和CPU打交道的,那么编译器写的程序为什么还需要编译。操作系统不能直接翻译成机器码么
操作系统同抄cpu打交道用的是机器码,但是对我们来说他用的是自然语言即所说的高级语言,编译器是的程序就是我们用高级语言写的,要执行的时候还需要把他翻译回机器码,这个过程就是编译。由于操作系统自身不带有这种翻译的功能,因此不能直接翻译成机器码,而且高级语言也分好多种,每种语言对应的翻译方式也不一样。