① 为什么程序代码被编译成机器码就不能跨平台运行
首先机器码实际上就是一串的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文件烧录到存储器中可以直击运行。
③ delphi编译出来是机器码吗还是虚拟机执行的
delphi 编写的程序代码,根据选择平台的不同,会编译生成相应平台的机器码,不是虚拟机执行。
④ java程序编译后会产生字节码还是机器码
Java编译后是字节码,C/C++以前全都是是机器码。
电脑只能运行机器码。Java在运行的时候把字节码变成机器码。
C/C++在编译的时候直接编译成机器码。
不过现在微软的Visual Studio C++ 2005以后的C++也可以编译成字节码,用CLR运行是转换成机器码(和Java差不多)。
⑤ C语言代码编译成的是机器码,那么怎么实现可移植性呢
C语言写的代码编译成了机器码,与编译器有关,与当前的电脑的CPU没有关系
有个概念叫交叉编译,我们做嵌入式的,就靠这个工作了
也就是在PC上编译的机器码,下载到其他的芯片里面,让它在这个芯片里运行
只要其他的电脑也支持同样的编译器产生的机器码,就可以一致到它上面
⑥ 请问c语言的源程序被编译后的代码是机器码吗
首先语言和被编译成的代码没有直接关系。有把Java编译成机器码的编译器也有把C语言编译成Java字节码的编译器。
机器码只是CPU直接认读的编码,不等于和硬件打交道的。操作硬件是你通过程序操作CPU做到的。操作系统只不过是别人写的程序而已,说到底还是程序。
⑦ 高级语言编译成的机器码和汇编成的机器码有什么不同,为什么高级语言可以通用而汇编的不可以
高级语言编译生成的机器码总体来说是冗长、效率低些;由汇编语言汇编生成的机器码总体说是简洁、高效。
所谓的通用是源程序的可移植性,高级语言的源程序对于不同的体系结构的计算机是基本一致的,只需用相应的编译器重新编译下就可以运行;而汇编语言源程序是直接与cpu的体系相对应的,要在别的体系结构的机器上运行,需要重新编写源程序。
⑧ 程序编译后的机器码是在内存,还是硬盘
程序编译后,机器码是存在硬盘。
在执行时,机器码,被操作系统,读入内存。
⑨ 编译时选择机器码,能反编译出来吗
可以说绝大部分的程序是不能反编译的,因为同样的机器码,可以由多种不同的高级语言的程序代码生成,所谓殊途同归,不管外表看起来多么不同的代码,编译后生成的机器码也可能完全一样的