目录
程序运行环境
翻译环境和执行环境
从源代码到可执行程序的几个阶段
翻译环境的执行中的编译和链接
预编译
编译
汇编
链接
运行环境
程序运行环境 在学习c语言中我们是否有这样的困惑,我们平常写代码,但是我们一开始就会很好奇,通过程序员写的代码,然后经过编译器翻译就可以运行我们的程序得到我们的结果。我们写的代码是经过什么样的处理才能生成我们的可执行程序(.exe文件)呢?这篇文章就会告诉你答案。
翻译环境和执行环境 在c语言中我们每次运行一个程序进行编译的时候都会有两个环境,一个环境是翻译环境,一个环境是执行环境。翻译环境就是经过程序员写的源代码翻译成计算机能读懂的二进制指令也可以说机器指令。执行环境就是通过二进制指令或者机器指令来执行我们写的代码运行得到结果。
从源代码到可执行程序的几个阶段 这里以c语言为例,程序员会创建多个.c文件,这些.c文件会经过编译器处理会生成多个.obj的目标文件,最后这些目标文件与链接库经过链接器一起链接生成可执行程序。其实这也是很简便的说分为编译阶段和链接阶段最后生成可执行程序(.exe文件)。但是复杂的是编译又会分成三个阶段分别是预编译,编译,汇编。
翻译环境的执行中的编译和链接 预编译
在学习c语言中我们是否有这样的困惑,我们平常写代码,但是我们一开始就会很好奇,通过程序员写的代码,然后经过编译器翻译就可以运行我们的程序得到我们的结果。我们写的代码是经过什么样的处理才能生成我们的可执行程序(.exe文件)呢?这篇文章就会告诉你答案。
在c语言中我们每次运行一个程序进行编译的时候都会有两个环境,一个环境是翻译环境,一个环境是执行环境。翻译环境就是经过程序员写的源代码翻译成计算机能读懂的二进制指令也可以说机器指令。执行环境就是通过二进制指令或者机器指令来执行我们写的代码运行得到结果。
从源代码到可执行程序的几个阶段 这里以c语言为例,程序员会创建多个.c文件,这些.c文件会经过编译器处理会生成多个.obj的目标文件,最后这些目标文件与链接库经过链接器一起链接生成可执行程序。其实这也是很简便的说分为编译阶段和链接阶段最后生成可执行程序(.exe文件)。但是复杂的是编译又会分成三个阶段分别是预编译,编译,汇编。
翻译环境的执行中的编译和链接 预编译
这里以c语言为例,程序员会创建多个.c文件,这些.c文件会经过编译器处理会生成多个.obj的目标文件,最后这些目标文件与链接库经过链接器一起链接生成可执行程序。其实这也是很简便的说分为编译阶段和链接阶段最后生成可执行程序(.exe文件)。但是复杂的是编译又会分成三个阶段分别是预编译,编译,汇编。
预编译
过程:
我们预处理(也叫预编译)是通过gcc -E test.c -o test.i选项经过编译之后将预处理的结果放在test.i文件中。
结果:
在预编译的过程中主要进行头文件的包含,将注释删除(因为注释是给人看的,计算机不需要看),进行#define符号的替换。预编译阶段主要进行的是文本操作。
编译
过程:
编译过程主要使用 gcc -S test.c选项,经过编译之后将结果保存在test.s中
结果:
编译过程中主要是将c语言源代码转化为汇编代码,主要进行语法分析,词法分析,语义分析,符号汇总等。
汇编
过程:
汇编主要使用选项 gcc-c test.c ,最后将结果保存在test.o文件中
结果:
汇编过程主要将汇编代码转化成二进制指令或者机器指令。
链接
链接主要进行合并段表,进行符号表的合并和符号表的重定位。
运行环境
1、程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序 的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。 2、程序的执行便开始。接着便调用main函数。
3、开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程 一直保留他们的值。 4、终止程序。正常终止main函数;也有可能是意外终止。
首先程序要必须先载入到内存当中去,如果再有操作系统的环境下,这个操作就是由操作系统来完成,如果没有,就需要人工将程序载入到内存中或者可以将可执行代码载入到只读内存中。接着我们就开始执行main函数,这是程序就会使用一个运行时堆栈,存储函数的局部变量和返回地址,程序同时也可以使用static静态内存,存储在静态内存中的变量在程序中就会一直保留它们的值,最终就会结束程序,当然也可能是意外终止程序。