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

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

时间:2024-02-29 13:26:49浏览次数:26  
标签:可执行文件 文件 第八章 源文件 编译器 源代码 链接

本章作者首先详细描述了从编写源代码到生成可执行文件的过程,为我们展现了一个程序从无到有的诞生之旅。

首先,作者提到了源文件,(用某种编程语言编写的程序就称为源代码,保存源代码的文件称为源文件)也就是我们通常编写的代码文件,如C、C++、Python等语言编写的文件。这些文件只是我们思想的载体,是告诉计算机应该做什么的指令集合。然而,计算机并不能直接理解这些源文件(CPU能直接解析并运行的不是源代码而是本地代码的程序),它只能理解机器语言,也就是二进制代码。

那么,如何将这些源文件转化为计算机可以理解的机器语言呢?这就需要编译器的介入。编译器的作用是将源文件转化为机器语言。具体来说,编译器首先会将源文件转化为中间代码,这是一种与平台无关的、更为通用的代码。接着,编译器再将中间代码转化为目标代码,也就是机器语言(每个编写源代码的编程语言都需要其专用的编译器)。

最后,编译器将生成的目标代码、所需的库文件和其他资源通过链接器(链接器的主要任务是将各个编译单元(如不同的源文件或库文件)链接在一起,形成一个完整的可执行文件。链接器会处理各个编译单元之间的符号引用关系,确保程序在运行时能够正确地找到所需的函数和数据。)打包为一个可执行文件。这个可执行文件就包含了程序运行所需的所有信息,可以被计算机直接执行。链接器还有一个作用那就是在程序运行时,虚拟的内存地址会转换成实际的内存地址。链接器会在EXE文件的开头,追加转换内存地址所需的必要信息。这个信息称为再配置信息。此外,当程序加载到内存后,额外生成两个组,那就是栈和堆。栈是用来存储函数内部临时使用的变量(局部变量 ),以及函数调用时所用的参数的内存区域。堆是用来存储程序运行时的任意数据及对象的内存领域。
在本章的末尾,作者针对新手对本章中的一些技术做了解释,如下:
编译器和解释器有什么不同?
编译器是在运行前对所有源代码进行解释处理的。而解释器则是在运行时对源代码的内容一行一行地进行解释处理的。

“分割编译”指的是什么?
将整个程序分为多个源代码来编写,然后分别进行编译,最后链接成一个EXE文件。这样每个源代码都相对变短,便于程序管理。

“Build”指的是什么?
根据开发工具种类的不同,有的编译器可以通过选择“Build”菜单来生成EXE文件。这种情况下,Build指的是连续执行编译和链接。

使用DLL文件的好处是什么?
DLL 文件中的函数可以被多个程序共用。因此,借助该功能可以节约内存和磁盘。此外,在对函数的内容进行修正时,还不需要重新链接(静态链接)使用这个函数的程序。

不链接导入库的话就无法调用DLL文件中的函数吗?
通过使用LoadLibrary()及GetProcAddress()这些API,即使不链接导入库,也可以在程序运行时调用DLL文件中的函数。不过使用导入库更简单一些。

“叠加链接”这个术语指的是什么?
将不会同时执行的函数,交替加载到同一个地址中运行。通过使用“叠加链接器”这一特殊的链接器即可实现。在计算机中配置的内存容量不多的MS-DOS时代,经常使用叠加链接。

和内存管理相关的“垃圾回收机制”指的是什么呢?
垃圾回收机制(garbage collection)指的是对处理完毕后不再需要的堆内存空间的数据和对象 进行清理,释放它们所使用的内存空间。这里把不需要的数据比喻为了垃圾。进行该处理时,C语言用的是free()函数,C++用的是delete运算符。在C++的基础上开发出来的Java及C#这些编程语言中,程序运行环境会自动进行垃圾回收。这样就可以避免由于程序员的疏忽(忘了记述内存的释放处理)而造成内存泄露了。
总的来说,第八章为我们详细展示了从源文件到可执行文件的转化过程,让我们对程序的生成和运行有了更深入的理解。

标签:可执行文件,文件,第八章,源文件,编译器,源代码,链接
From: https://www.cnblogs.com/xunxinlu/p/18043448

相关文章

  • 读《程序是怎样跑起来的》第八章有感
    第八章——从源文件到可执行文件1.源文件如何通过编译转换成可执行文件1)计算机只能运行本地代码某种编程语言编写的程序就称为源代码,保存源代码的文件称为源文件。源代码无法直接运行原因:CPU能直接解析并运行的不是源代码而是本地代码的程序。2)本地代码的内容Dump:每个字节用2位十......
  • 程序是怎样跑起来第八章观后感
    第八章深入讲解了源代码和计算机程序的编译过程,让我们对编程有了更细致的理解。所谓源代码,其实就是我们用诸如C、Java等高级编程语言编写的原始程序代码。在实际操作中,当我们按照教材编写练习题时,那些敲击键盘完成的代码就是源代码。在这一章节里,提到了源代码与源文件(包含了源代......
  • 计算复杂性(第八章)
    第八章交互式证明什么是一个好的证明系统天生必须具备的性质?所有正确的能被证明;所有错误的不能被证明;证明者的证明过程和计算量可以很大,但是验证者所需的工作量不应该太大。——Goldwasser,Micali,Rackoff1985什么是交互式证明?可以先假定它指的是一个证明系统,......
  • 从源文件到可执行文件
    在阅读了“从源文件到可执行文件”后,我更加了解了代码,8.1计算机只能运行本地代码,即使是用不同编程语言编写的代码,转换成本地代码后,也都变成用同--种语言(机器语言)来表示了。8.2本地代码的内容,本地代码的真正面目是数值的罗列。8.3编译器负责转换源代码,详细介绍了编译器。8......
  • 程序是怎样跑起来的第八章读后感
    我认识到了内存管理对于程序的重要性。不合理的内存使用可能导致程序性能下降、崩溃甚至出现安全漏洞。通过学习本章内容,我了解到了不同的内存分配方式,如静态分配、动态分配和堆内存分配等,以及它们各自的适用场景和优缺点。此外,本章还介绍了内存泄漏和内存溢出的......
  • 《程序是怎样跑起来的》第八章
    文章主要讲的是从源文件到可执行文件。源代码就是用某种编程语言编写的程序,将源代码保存成一个文件,就称为源文件。编写好源文件之后,对源文件进行编译和链接,就可以生成可执行文件了,编译和链接的操作需要使用编译器和链接器来完成。CPU能直接解释和执行的只有本机代码CPU是计算机的......
  • 程序是怎样跑起来的第八章读后感
    读完第八章关于从源文件到可执行文件的内容,我了解到第八章关于编译器的内容尤其令人印象深刻。这一章清晰地展示了编译器如何将高级语言编写的代码转化为机器语言,从而使计算机能够理解和执行。计算机只能运行本地代码,用某种编程语言编写的程序,就称为源代码,保存源代码的文件称为源......
  • 程序是怎样跑起来的(第八章)
    用某种编程语言编写的程序称为源代码,将源代码保存成一个文件就称为源文件。C语言的源文件扩展名约定为“.C”。代码清单的源代码是不能直接运行的,因为CPU能直接解释和执行的只有本机代码。CPU是计算机的大脑,他只能理解本机代码形式的程序。不同编程语言所编写的源代码翻译成本机代......
  • 《程序是怎样跑起来的》第八章读后感
    《程序是怎样跑起来的》第八章主要讲了从源文件到可执行文件,其中包括计算机只能运行本地代码,本地代码的内容,编译器负责转换源代码,仅靠编译是无法得到可执行文件的,启动及库文件,DLL文件及导入库,可执行文件运行时的必要条件,程序加载时会生成栈和堆,有点难度的Q&A九个章节,其中我学到CPU......
  • 《程序是怎样跑起来的》第八章读后感
    读完《程序是怎样跑起来的》第八章,我对计算机的工作原理和程序的执行过程有了更深入的理解。这一章节详细介绍了程序在计算机中的运行机制,包括指令的执行、数据的处理和内存的管理等方面。通过阅读这一章,我不仅了解了计算机的基本工作流程,还对编程语言的本质有了更深刻的认识。首......