1.C/C++程序的执行过程

1.1编译器

要理解一个程序的执行过程 ,首先要理解什么是编译器 。我们用C语言写的程序,计算机只能识别机器语言(二进制指令),计算机并不能理解。因此 ,必须 将C语言转换为机器语言。编译器就是用来实现这一功能的 。编译器将源代码文件按照一定的对应规则映射程计算机能够识别的二进制指令 。

1.2关于源文件、目标文件和可执行文件

  • 源文件:保存源代码的文件(.c, .cpp)
  • 目标文件:编译器根据源文件创建的机器语言指令成为目标代码 ,包含目标代码的磁盘文件即目标文件。
    一般为(
    .obj)文件,Linux下为(*.o)文件。
  • 可执行文件编译完源代码后生成的目标文件并不能直接执行 。一般我们编写的程序都会引用基本的库函数,因此在运行程序之前还要把库函用定义好的目标代码替换 ,这个过程称为链接。就是把自己写的源代码的目标文件与库函数的目标文件组合起来,生成最终的可执行文件。链接由链接器完成 。

一般程序的执行过程:

  • 文本文件:

程序先由程序员编辑创建并保存在硬盘上,源程序在机器上表现为0 、1组成的位序列 ,8个位一个字节,每个字节表示一个文本字符,它是以ascii码的形式表示的。只由ascii字符组成的文件叫做文本文件 ,所有其他的叫做二进制文件。

​ 为了让机器能够识别并运行程序,每条语句必须被转为低级机器语言指令,然后将指令按照可执行目标程序的格式打包 ,并以二进制磁盘文件的形式存放起来 。以c程序为例,转换过程大致分为预处理,编译 ,汇编 ,链接四个步骤。下面进行详细解释。

​ 1. 预处理器根据以字符#开头的命令修改原始的c程序,比如#include<stdio.h>告诉预处理器读取系统头文件stdio.h的内容,并把它直接插入程序文本中 ,将#define的变量替换等等,结果得到了另一个c程序,通常以.i作为文件扩展名 。

​ 2. 编译器将文本文件hello.i翻译成hello.s ,它包含了一个汇编语言程序。汇编语言程序中的每条语句都以一种标准的文本格式确切的描述一条低级机器语言指令。

​ 3. 汇编器将汇编程序翻译为机器语言指令,把这些指令打包成可重定位目标程序(relocateble object program)的格式,并把结果保存在hello.o中 。hello.o文件是二进制文件 ,因为他的字节编码是机器语言指令而不是ascii码 。如果用文本编辑器打开hello.o会看到一堆乱码。

​ 4. 链接阶段,比如hello中用到了printf函数,这是标准c库的函数 ,存在于一个名为printf.o的单独编译好的目标文件中,这个文件必须以某种方式合并到我们编译好的的目标文件中。链接器(ld)程序负责处理这种合并,结果得到hello文件 ,它是可执行目标文件 ,可以被加载到内存中,由系统执行 。

2. Java程序执行过程

2.1 流程

  1. 编写:是指在 Java 开发环境中进行程序代码的输入,最终形成后缀名为 .java 的 Java 源文件。
  2. 编译:是指使用 Java 编译器对源文件进行错误排査的过程 ,编译后将生成后缀名为 .class 的字节码文件,不像C语言那样生成可执行文件。
  3. 运行:是指使用 Java 解释器将字节码文件翻译成机器代码,执行并显示结果 。

2.1 概述

字节码文件:是一种和任何具体机器环境及操作系统环境无关的中间代码。它是一种二进制文件 ,是 Java 源文件由 Java 编译器编译后生成的目标代码文件。编程人员和计算机都无法直接读懂字节码文件,它必须由专用的 Java 解释器来解释执行,因此 Java 是一种在编译基础上进行解释运行的语言 。

Java 解释器:负责将字节码文件翻译成具体硬件环境和操作系统平台下的机器代码 ,以便执行。因此 Java 程序不能直接运行在现有的操作系统平台上,它必须运行在被称为 **Java 虚拟机(JVM)**的软件平台之上。

Java 虚拟机(JVM):是运行 Java 程序的软件环境,Java 解释器是 Java 虚拟机的一部分 。在运行 Java 程序时 ,首先会启动 JVM,然后由它来负责解释执行 Java 的字节码程序,并且 Java 字节码程序只能运行于 JVM 之上。这样利用 JVM 就可以把 Java 字节码程序和具体的硬件平台以及操作系统环境分隔开来 ,只要在不同的计算机上安装了针对特定平台的 JVM ,Java 程序就可以运行,而不用考虑当前具体的硬件平台及操作系统环境,也不用考虑字节码文件是在何种平台上生成的。JVM 把这种不同软、硬件平台的具体差别隐藏起来 ,从而实现了真正的二进制代码级的跨平台移植 。JVM 是 Java 平台架构的基础,Java 的跨平台特性正是通过在 JVM 中运行 Java 程序实现的 。Java 的这种运行机制可以通过图 2 来说明。

Java 程序通过 JVM 可以实现跨平台特性,但 JVM 是不跨平台的。也就是说 ,不同操作系统之上的 JVM 是不同的,Windows 平台之上的 JVM 不能用在 Linux 平台,反之亦然 。

3. python程序执行过程

3.1 过程概述

当我们执行Python代码的时候 ,在Python解释器用四个过程“拆解”我们的代码,最终被CPU执行返回给用户。

  1. 首先当用户键入代码交给Python处理的时候会先进行词法分析,例如用户键入关键字或者当输入关键字有误时 ,都会被词法分析所触发,不正确的代码将不会被执行。

  2. Python会进行语法分析,例如当“for i in test: ”中 ,test后面的冒号如果被写为其他符号 ,代码依旧不会被执行 。

  3. 下面进入最关键的过程,在执行Python前,Python会生成**.pyc文件** ,这个文件就是字节码,如果我们不小心修改了字节码,Python下次重新编译该程序时会和其上次生成的字节码文件进行比较 ,如果不匹配则会将被修改过的字节码文件进行覆盖,以确保每次编译后字节码的准确性。

字节码文件在Python虚拟机程序里对应的是PyCodeObject对象。.pyc文件是字节码在磁盘上的表现形式 。简单来说就是在编译代码的过程中,首先会将代码中的函数、类等对象分类处理 ,然后生成字节码文件。有了字节码文件,CPU可以直接识别字节码文件进行处理,接着Python就可执行了。

4. 总结:

  • 从三种不同语言的代码执行的整个过程 ,看出C/C++是一种编译型语言,它更接近底层 。python是一种解释型语言。而java这是一种先编译后解释的语言。
  • 简单来说,C/C++的执行过程是编译—>连接—>运行 ,java的执行过程是编译—>交给虚拟机—>运行 ,而python则是解释—>运行 。
本文版权归趣快排SEO www.SeogurUblog.com 所有,如有转发请注明来出,竞价开户托管,seo优化请联系QQ▶61910465