我们知道,计算机只认识0和1(就是二进制),换句话说,不管我们在计算机上干了什么事情,运行了多么复杂的程序,从ps绘图,到qq聊天,再到听音乐,最终到了CPU的执行层面,其实就是 一串串的0和1组成的指令罢了。 当然,到了硬件层面,那就是与或非门的领域了。而编程语言和命令解释器是如何将程序和命令转换成机器能识别的二进制机器语言呢
处理流程编译型语言需要编译器处理,主要工作流程如下:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)
在这个工作流程中,编译器调用预处理器进行相关处理,将源代码进行优化转换(包括清除注释、宏定义、包含文件和条件编译),然后,通过将经过预处理的源代码编译成目标代码(二进制机器语言),再通过调用链接器外加库文件(例如操作系统提供的API),从而形成可执行程序,让机器能够执行。
在这个工作流程中,目标代码要和机器的CPU架构相匹配,库文件要和操作系统相匹配。
如果想在不同CPU的机器或者系统上运行C/C++语言的源代码,就需要针对不同的CPU架构和操作系统进行编译,这样才能够在机器上运行程序。
所以,编译型语言的缺点我们就看到了,它不适合跨平台。
而且,到这里大家应该能知道,为什么CPU一样,但是exe程序只能Windows中运行,而不能在Mac中运行了。
解释型语言源代码无需预先编译成可执行程序,如python、shell。
在程序执行时,解释器读取一句源代码之后,先进行词法分析和语法分析,再将源代码转换为解释器能够执行的中间代码(字节码),最后,由解释器将中间代码解释为可执行的机器指令。
解释型语言在不同的平台有不同的解释器,源代码跨平台的目的实现了,开发人员不用再考虑每个平台如何去编译,只需要关注代码的编写,编写完的代码在任何平台都能无需修改(或少量修改)就能正确执行。
例如,Linux系统中执行Python源代码时支持 fork()函数,而window系统中不支持这个函数,如果将运行在Linux系统中的源代码移植到Windows系统,这时就需要进行重构。
用解释器很方便,只需要直接“运行”就好了,不用像C那样有编译链接的工序。
为什么说这些语言是跨平台的?因为你写了程序以后,如果这个平台上有这种语言的解释器,只需要拿到这个平台上直接运行就可以了。你可以理解为:解释器是在“一边编译,一边运行”,它只是把以前程序员手工做的编译过程放在了运行程序的时候进行。
网友评论