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

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

时间:2024-02-21 19:44:51浏览次数:23  
标签:可执行文件 文件 EXE 代码 程序 源文件 编译器 源代码

一、代码
1、源代码完成后,就可以编译生成可执行文件了。负责实现该功能的是编译器
2、代码运行:计算机只能运行本地代码。
3、源代码和源文件:用某种编程语言编写的程序就称为源代码,保存源代码的文件称为源文件。
(这里的“源代码”用英文表示是“source code”。source有“原始的”的意思,因此所谓源代码,就是原始的代码。源代码有时也称为源程序。)
示例:转换成本地代码后就变成了同样的语言

对CPU来说,母语就是机器语言,而转换成机器语言的程序就是本地代码。即使是用不同编程语言编写的代码,转换成本地代码后,也都变成用同一种语言(机器语言)来表示了。
4、本地代码:计算机指令也是数值的罗列。这就是本地代码。
示例:本地代码的真面目是数值的罗列

二、编译器
1、编译器的含义:能够把C语言等高级编程语言编写的源代码转换成本地代码的程序称为编译器。每个编写源代码的编程语言都需要其专用的编译器。将C语言编写的源代码转换成本地代码的编译器称为C编译器。
2、编译器种类:因为编译器本身也是程序的一种,所以也需要运行环境。例如,有Windows用的C编译器、Linux用的C编译器等。此外,还有一种交叉编译器,它生成的是和运行环境中的CPU不同的CPU所使用的本地代码。
3、示例:同样的源代码可以转换成适用于不同处理器的本地代码

4、确定编译器种类的三个关键词:C语言、x86系CPU、Windows。
三、文件
1、文件的生成和运行:
编译器转换源代码后,就会生成本地文件。不过,本地文件是无法直接运行的。为了得到可以运行的EXE文件,编译之后还需要进行“链接”处理。下面,就让我们使用Borland C++Compiler5.5(以下称为Borland C++)来看一下编译和链接是如何进行的。

  Borland C++的编译器是bcc32.exe这个命令行工具。在Windows的命令提示符”中,运行下列命令后,由C语言编写的源文件Smaplel.c就会被编译。

  bcc32 -W -c Samplel.c

  “-W-c”是用来指定编译Windows用的程序的选项。选项是对编译器的指示。有时也称为“开关”。

①命令行工具指的是在Windows的命令提示符下使用的CUI程序。
②编译Samplel.c后,可能会出现WinMain的参数没有被用到的警告提示,不过这不会造成什么影响。由于警告并不是出错,因而也可以生成目标文件。
2、编译后生成的不是EXE文件,而是扩展名为“.obj”的目标文件“。Samplel.c编译后,就生成了Samplel.obj目标文件(目标文件(object file)中的object一词,指的是编译器生成结果的意思。和面向对象编程(object oriented programming)的object没有任何关系。面向对象编程的对象指的是数据和处理的集合体。)。虽然目标文件的内容是本地代码,但却无法直接运行。
把多个目标文件结合,生成1个EXE文件的处理就是链接,运行连接的程序就称为链接器(linkage editor或连结器)。Borland C++的链接器就是ilink32.exe的命令行工具。在Windows命令提示符下运行以下命令后,程序所需的目标文件就会被全部链接生成Samplel.exe这个EXE文件。
示例:链接器的错误信息

该错误消息表示的是无法解析Samplel.obj参照的外部符号。外部符号是指其他目标文件中的变量或函数。sprintf及MessageBoxA是目标文件中sprintf()及MessageBox()的名称。
3、Windows中的编译和链接机制

4、链接后的EXE文件的构造

四、程序加载时会生成栈和堆
1、EXE文件的内容分为再配置信息、变量组和函数组,除此之外还会额外生成两个组,那就是栈和堆。栈是用来存储函数内部临时使用的变量(局部变量”),以及函数调用时所用的参数的内存区域。堆是用来存储程序运行时的任意数据及对象的内存领域。
2、EXE文件中并不存在栈及堆的组。栈和堆需要的内存空间是在EXE文件加载到内存后开始运行时得到分配的。因而,内存中的程序,就是由用于变量的内存空间、用于函数的内存空间、用于栈的内存空间、用于堆的内存空间这4部分构成的。
示例:加载到内存的程序由4部分构成

①不管是什么程序,程序的内容都是由处理和数据构成的。大多数编程语言都是用函数来表示处理、用变量来表示数据。
②栈和堆的大小,可以由程序员任意指定。在高级编程语言中,编译器会自动生成指定栈和堆大小的代码,并将其附加到程序中。

标签:可执行文件,文件,EXE,代码,程序,源文件,编译器,源代码
From: https://www.cnblogs.com/Li204217/p/18026080

相关文章

  • 《程序是怎样跑起来的》第十章
    心得:了解了计算机和程序的实际运行方式知识点:1、汇编语言在各本地代码中,附带上表示其功能的英语单词缩写,这些缩写称为助记符。使用助记符的编程语言称为汇编语言。汇编语言的源代码转换成本地代码的方式,称为汇编。负责转换工作的程序称为汇编器。2、获得汇编语言源代码的方法......
  • 《程序是怎样跑起来的》第7章—— 程序是在何种环境中运行的
    一、运行环境1、运行环境是什么:运行环境=操作系统+硬件。操作系统和硬件决定了程序的运行环境。示例:2007MicrosoftOfficesytem的运行环境(这里省略了部分内容)同一类型的硬件可以选择安装多种操作系统。同样的AT兼容机”中,既可以安装Windows,也可以安装Linux等操作系统。不......
  • 《程序是怎样跑起来的》第六章
    第六章,亲自尝试压缩数据。首先6.1节文件是以字节为单位保存。在任何情况下,文件中的字节数据都是连续储存的。6.2节,RLE算法的机制。像这样,把文件内容用“数据乘以重复次数”的形式来表示的压缩方法称为RLE算法,它是一种很好的压缩方法。图像文本也可用此算法来压缩。在讲述了此算法......
  • 《程序是怎样跑起来的》第十章的读后感
    又到了读书分享的时候,本篇分享《程序是怎样跑起来的》第十章的读后感,通过汇编语言了解程序的实际构成。首先我了解到了助记符的含义,通过使用助记符的编程语言称为汇编语言。这样通过查看汇编语言编写的源代码就可以了解程序的本质。即使是用汇编语言编写的源代码,最终也必须要转换......
  • 《程序是怎么跑起来的》第十章
    阅读了程序集是怎么跑起来的第十章,我了解了通过汇编语言了解程序的实际构成,对于本章的总结我认为本章的前半部分讲的是CPU运行本地代码的关系,而后半部分则讲述的是局部变量和全局变量的不同。汇编语言和本地代码之间存在一一对应的关系。汇编语言是一种低级语言,它提供了一种与计......
  • 读《程序是怎样跑起来的》第五章有感
    第五章——内存和磁盘的亲密关系本章重点是在计算机系统中高速小容量的内存与低速高容量的磁盘如何协同作业。内存主要是指主内存(负责存储CPU中运行的程序指令和数据的内存),磁盘主要是指硬盘。不读入内存就无法运行存储程序方式:程序保存在存储设备中,通过有序地被读出来实现运......
  • 《程序是怎么跑起来的》第九章
    关于第九章的学习我了解到了“操作系统和应用之间的关系”对于第九章的学习,我们可以学习五个课时,本章讲述了在软件商城购买软件的注意事项,首先我们在购买时一定不要忘记了操作系统的使用,这也就要讲述到操作系统的作用。操作系统的功能在不断地演进和完善,以适应不断变化的计算机环......
  • 《程序是怎样跑起来的》第六章
    这一章不仅系统地介绍了内存的概念、种类和重要性,还详细阐述了程序是如何与内存进行交互的。我深刻感受到了内存管理对于程序运行的重要性。内存作为程序运行的基础,其分配、使用和回收直接影响着程序的性能和稳定性。合理的内存管理不仅可以提高程序的运行效率,还能有效避免内存泄......
  • 《程序是怎样跑起来的》——第八章读后感
    一:1.利源代码进行编译后可得到本机代码。2.通过编译和链接可得到EXE文件。3.对源文件进行编译可得到日标文件。例如,补源文件wempikes进行编译可得到目标文件sample.obj。日标文件的内容较是在机代码。4.链接器会从库文件中提取必要的目标文件并将它们拼接成。EXE文件。在程......
  • 《程序是怎么跑起来的》第八章
    今天沃阅读了程序是怎么跑起来的第八章,从源文件到可执行文件。本章分为九个课时,分别介绍了关于编码器,原代码和代码的执行方面的问题,且计算机只能运行本地的代码,虽然计算机通常只能直接运行本地代码,但通过虚拟机和解释器等技术,可以实现在计算机上运行非本地代码的需求。本地代码是......