机器码的特点是与CPU架构强绑定:不同架构如x86、ARM、RISC-V的CPU指令集不同,同一段机器码在x86处理器上能执行,在ARM处理器上可能全效。此外,机器码可读性极差,人类几乎法直接编写或修改,需依赖工具生成。
目标代码:编译的“半成品” 目标代码是编译器对源代码编译后生成的产物,是与特定机器架构相关的二进制代码。 以C语言为例,源代码.c文件经编译器如GCC编译后,会生成目标文件.o或.obj文件,即目标代码。目标代码的特点是需经链接器处理才能成为可执行文件:它包含了函数、变量的二进制实现,但可能引用了外部库或其他目标文件的符号如函数名、变量名,需链接器将多个目标代码及库文件合并,析符号引用,最终生成机器码可执行文件如.exe、ELF文件。目标代码仍依赖具体硬件架构,法跨平台直接运行。
字节码:跨平台的“语言” 字节码是一种跨平台的代码,由虚拟机VM释或即时编译JIT为机器码执行。 它通常以字节为单位,语法和指令集独立于硬件,典型代表如Java的.class文件、Python的.pyc文件、WebAssembly的.wasm文件。字节码的核心价值是实现“一次编写,到处运行”:源代码编译为字节码后,可在安装了对应虚拟机的任何硬件平台上运行。例如,Java字节码由JVM析,JVM会根据底层硬件架构将字节码动态翻译为机器码;WebAssembly字节码则由浏览器引擎处理,实现跨浏览器、跨设备的一致执行。
三者的关系与协作 源代码需通过编译或释转化为可执行形式:对于C、C++等编译型语言,编译器直接生成目标代码,经链接后成为机器码;对于Java、Python等语言,源代码先编译为字节码,再由虚拟机将字节码转为机器码执行。机器码是最终执行的“硬件指令”,目标代码是编译过程的“桥梁”,字节码是跨平台执行的“通用媒介”,三者共同支撑了程序从抽象逻辑到硬件动作的转化。