首页 > 编程语言 >《程序是怎样跑起来的》第八章——从源文件到可执行文件

《程序是怎样跑起来的》第八章——从源文件到可执行文件

时间:2024-02-26 21:55:40浏览次数:25  
标签:可执行文件 文件 EXE 代码 程序 第八章 源文件 编译器

  • 编译(Compilation):首先,程序员使用文本编辑器编写源代码,然后通过编译器将源代码转换为目标代码。编译器会进行词法分析、语法分析、优化和代码生成等步骤,最终生成可执行文件或库文件。

  • 链接(Linking):如果程序包含多个源文件或库文件,链接器会将这些文件中的目标代码连接在一起,形成最终的可执行文件。链接器还会解决符号引用、符号重定位等问题,确保程序能够正确运行。

  • 加载(Loading):当用户要运行一个程序时,操作系统会负责将程序的可执行文件加载到内存中,并为程序分配所需的资源。加载程序到内存后,操作系统会启动程序的执行。

  • 执行(Execution):CPU根据程序的指令集架构(如x86、ARM等),逐条执行程序的机器码指令。程序的执行过程涉及到指令的获取、解码、执行以及数据的读写等操作。操作系统会管理进程的资源、线程的调度和程序的运行环境,确保程序能够正确执行。

  • 运行时(Runtime):程序在运行过程中可能会调用系统函数、库函数或其他外部资源,操作系统会提供相应的支持和服务,确保程序能够正常运行并与外部环境交互。

上一章说过,我们通过各种编程语言编写的代码称为源代码,源代码编写完成之后通过编译器编译之后再"链接"生成可执行文件之后才可以运行。本章主要就是讲述代码从源文件到可执行文件的需要经过的流程以及可执行文件加载到内存上的运行机制。还有对运行时堆栈内存进行说明。

上章提到计算机只能运行本地代码,对CPU来说它的母语就是机器语言,而转换成机器语言的程序就是本地代码,不论用什么语言来编写程序,转换为本地代码后,也都变成机器语言了,所以本地代码不论在任何CPU中都可以运行。

EXE文件中的代码使用的就是本地代码,所以有时我们会遇见在使用记事本打卡EXE文件后,看起来就像是一团乱码,却是可以运行的,这就是本地代码,很显然我们人类是不可能懂得本地代码的。但是我们把EXE文件的内容Dump一下(dump:把文件中的每个字节用二位十六进制数来表示)之后,他就显出了他的真面目。

计算机就是把所有信息作为数值的集合来处理的。

我们之前说过要把源代码编译之后转换为本地代码。这需要通过编译器,编译器中有源代码的对照表,再经过语法解析,句法解析,语义解析等才能生成本地代码。另外,编译器也是程序的一种也需要运行环境,但也有一种交叉编译器,可生成不同运行环境中的本地代码。

编译之后得到本地代码,但也不是可执行文件,毕竟编写程序的目的是运行,那么为了运行,在编译过后还需要进行"链接"处理,链接将生成的多个目标文件结合之后生成一个EXE文件,这个操作就是"链接"。

在链接的过程中会使用一些库和函数来简化这一过程。  注:不通过源代码而是通过库文件形式和编译器一起提供的,这样的函数称为标准函数。

Windows以提供函数的形式为应用提供了各种功能,这些函数称为API,在Windows中API 的目标文件并不存储在库文件中,而是存储在DLL文件的特殊库文件中(DLL文件是程序运行时动态结合的文件)。

可执行文件运行时的必要条件:在EXE文件中变量和函数的内存地址的是,如何表示?答案就是在EXE文件中给变量奇函数分配了虚拟的内存地址,在程序运行时,虚拟的内存地址会转换为实际的内存地址。链接器会在EXE文件的开通,追加转换内存地址所必须的信息,这个信息就是再配置信息。这个再配置信息就成为了变量和函数的相对地址。

如上图,EXE文件的内容分为再配置信息,变量组和函数组,但在加载到内存之后会额外生成两个组,就是栈和堆。栈是用来存储函数内部临时使用的变量(局部变量),以及函数调用时所用的参数和内存区域。堆是用来存储程序运行时的任意数据及对象的内存领域。两者的共同点在于都是在程序运行时申请分配的,不同的是,在内存使用方法上有些许不同,栈中对数据进行存储和清理的代码由编译器自动生成使用的内存空间自动申请和释放,但是堆得内存空间则需要根据程序员编写的程序,来明确申请分配和释放。

此外本章后还有一段问答,可以看看,本章知识很多。

 

标签:可执行文件,文件,EXE,代码,程序,第八章,源文件,编译器
From: https://www.cnblogs.com/wcpp/p/18032960

相关文章

  • 《程序是怎样跑起来的》第八章
    上一章提到了源代码,源代码在任何情况下都能够编译和显示,但它并不能直接运行,因为CPU只能够解释和执行的代码叫做本机代码,所以使用源代码时都会转换成本机代码被CPU理解后运行。我们对EXE程序进行转储后,可以得知本机代码的本质就是数值序列其中的每个值都代表某个指令和数据。其中......
  • 《程序是怎样跑起来的》第八章读后感
    在阅读《程序是怎样跑起来的》这本书的第八章后,我对面向对象编程(OOP)这一重要的编程范式有了更深入的理解。作者通过清晰的解释和丰富的示例,让我领会到了OOP的核心思想:将复杂的程序分解为相对简单的对象,通过这些对象之间的交互来实现程序的功能。本章首先介绍了类和对象的概念,让我......
  • 第八章 从源文件到可执行文件
    第八章主要讲述了从源文件到可执行文件的转换过程,即程序的编译和链接。以下是该章节的总结:编译和链接的操作需要使用编译器何链接器来完成,所以本章重点讲述编译器和链接器的功能,介绍了程序从编写到运行的整个过程。计算机只能执行本机代码:源代码是不能直接运行的,因为CPU能直接解......
  • 《程序是怎样跑起来的》第八章读后感
    本章主题是从源文件到可执行文件。上章也有讲到源代码(sourcecode),源代码就是用编程语言编写的程序,也称为源程序,用源代码保存的文件叫源文件。在第七章中也有提到,CPU只能解释自身固有的机器语言,机器语言的程序叫本地代码,本地代码的内容其实就是各种数值的罗列,所以要将源代码转换为......
  • 《程序是怎样跑起来的》第八章读书笔记
    用某种语言编写的程序就称为源代码,保存源代码的文件称为源文件。能把C语言等高级编程语言编写的源代码转换成本地代码的程序称为编译器。每个编写源代码的编程语言都需要其专用的编译器,将C语言编写的源代码转换成本地代码的编译器称为C编译器。编译器首先读入代码的内容,然后再把源......
  • 《程序是怎样跑起来的》第八章读后感
    从源文件到可执行文件的过程涉及到编译和链接两个主要步骤。这个过程大致如下:预处理:预处理器处理源代码中的预处理指令,例如#include、#define等。预处理后的文件通常被称为“预处理文件”或“PP文件”。编译:编译器(compiler)将预处理文件转换成目标文件(objectfile)。在这个过程中,......
  • 《程序是怎样跑起来的》第八章观后感
    我是计应232的学生张凯源,今天来分享《程序是怎样跑起来的》第八章观后感。这一章讲了源文件与可执行文件及其转换,用某种编程语言编写的程序就称为源代码,保存源代码的文件称为源文件,计算机只能运行本地代码,我们输入的源代码,计算机无法直接运行,需要运用编译器转换成本地代码才能运......
  • 《程序是怎样跑起来的》读后感——第八章 从源文件到可执行文件
    在读了本章后我受益颇深。因为CPU能,直接解析并运行的不是源代码,而是本地代码,所以计算机只能够直接运行本地代码。由书可知,用某种编程语言编写的程序称为源代码,保存源代码的文件称为源文件,用C语言编写的源文件的拓展名通常是“.c”。Windows中EXE文件的程序内容,使用的就是本地代码......
  • 第八章
    在第八章中主要讲述了源文件与可执行文件及其转换,内容有下:计算机只能运行本地代码,程序员键入的源代码,计算机无法直接识别运行。编译器负责转换源代码,每个编写源代码的编程语言,都需要其专用的编译器。编译器首先读入代码的内容,再把源代码转换成本地代码。根据cpu类型的不同,本地代......
  • 程序是怎么跑起来的第八章
    本章学习了从源文件到可执行文件的发展G的目标文件内容是本地代码在程序运行时,用来主动动态申请分配的数据和对象的内存区域形式称为堆CPU可以解析和运行的程序形式为本地代码,机器语言代码通过编译和链接可以得到1xe文件元旦版完成后就通过可以编译生成可执行文件这个负责实现该功......