程序环境——翻译环境与执行环境
本篇重点:
- 程序的翻译环境和执行环境
- 详解翻译环境中的 编译+链接
程序的翻译环境和执行环境
在ANSI的任何一种实现中,存在两个不同的环境。
- 翻译环境,在这个环境中源代码被转换为可执行的机器指令。
- 执行环境,它用于实际执行代码。
1、翻译环境
^ 组成一个程序的每个源文件通过编译过程分别转换成目标文件(object code)
^ 每个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序(.exe)。
^ 链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中。
编译+链接
我们把翻译环境分为两个部分,分别是编译和链接。而编译部分又可分为三个部分,分别是预编译、编译和汇编。
接下来我们就分别来看看这几个阶段。(Linux操作系统下演示)
预处理 (gcc test.c -E > test.i)
看这段代码:
经过预处理后变成了这样:
本来只有几行的代码变成了几百行,是哪里变了呢?
1. #include包含的函数stdio.h显示出来了。
2. 注释被删除了。
3. #include符号替换了。
这些就是预编译阶段所完成的内容。
编译 (gcc test.i -S)
经过编译之后,代码已经成这样了:
已经把C语言代码转换为汇编代码。
在转换的过程中还要经历下面这几个内容:
1.语法分析:
例
若是源代码写成这样 #define MAX = 100,那么编译时会报错,报错如下
2.词法分析:判断源程序中单词符号的合法性。
3.语义分析:检测例如类似于for循环有没有使用错误。
4.符号汇总:(本例)g_val Add main 。 (后面来介绍符号汇总有什么用)
汇编 (gcc test.s -c)
把汇编代码转换成机器指令。
转换过程中的内容:
形成符号表(readelf test.o -s):给每个汇总的符号一个地址。
链接
我们把源文件中的Add函数改成extern int Add(int x, int y),然后再创建一个新的源文件sum.c,内容如下图,汇编后,Add会有一个地址。
我们假设 sum.c中 Add地址是 0x100
test.c中 Add 0x000 (无意义地址)
g_val 0x200
main 0x300
printf 0x400
每个目标文件由链接器捆绑在一起,形成一个单一而完整的可执行程序。所以Add也将合并在一起,用有效的地址。即
所以链接过程中主要的操作有以下两点:
1.符号表的合并和重定位。
2.合并段表。
以上就是翻译环境的主要内容,为了方便记忆,给大家一幅图来帮助记忆。
2、执行环境
程序执行的过程:
1. 程序必须载入内存中。在有操作系统的环境中:一般这个有操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
2. 程序的执行开始。接着便调用main函数。
3. 开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储在静态内存中的变量在程序的整个执行过程一直保留他们的值。
4. 终止程序。正常终止main函数;也有可能是意外终止。
程序环境——翻译环境与执行环境相关推荐
- Intel 64/x86_64/IA-32/x86处理器基本执行环境 (2) - 64位执行环境
64-Bit Execution Environment 64位模式的执行环境与32位执行环境类似.不同点如下所述: 地址空间 – 程序/任务运行在64位模式下,可以访问最高2^64字节(受制于规范寻 ...
- Intel 64/x86_64/IA-32/x86处理器基本执行环境 (1) - 32位执行环境概述
Basic Execution Environment Overview IA-32处理器提供了一套完整的资源,在处理器上运行的程序/任务可以执行指令,存储代码,数据以及状态信息.这些资源(如下简要的 ...
- JavaScript执行环境 + 变量对象 + 作用域链 + 闭包
闭包真的是一个谈烂掉的内容.说到闭包,自然就涉及到执行环境.变量对象以及作用域链.汤姆大叔翻译的<深入理解JavaScript系列>很好,帮我解决了一直以来似懂非懂的很多问题,包括闭包.下 ...
- 转换环境与执行环境、宿主环境与独立环境、宿主实现与独立实现
文章目录 1 转换环境与执行环境 1.1 转换环境与执行环境的概念 1.2 为什么要区分转换环境和执行环境 2 宿主环境和独立环境 2.1 宿主环境 2.2 独立环境 3 宿主实现.独立实现 3.1 ...
- html代码在线运行环境,ES5/可执行代码与执行环境
可执行代码类型 一共有三种 ECMA 脚本可执行代码: 全局代码是指被作为 ECMAScript Eval 代码是指提供给 eval 内置函数的源代码文本.更精确地说,如果传递给 eval 内置函数的 ...
- JavaScript中执行环境和栈
在这篇文章中,我会深入理解JavaScript最根本的组成之一 : "执行环境(执行上下文)".文章结束后,你应该对解释器试图做什么,为什么一些函数/变量在未声明时就可以调用并且他 ...
- 执行环境及作用域分析
:点上面关注免费学习前端知识! 执行环境(execution context,为简单起见,有时也称为"环境")是JavaScript中最为重要的一个概念.执行环境定义了变量或函数有 ...
- js中执行php语句_重温JS中的执行环境和作用域链
说明:以下代码说明和原理都是基于ES5和非严格模式进行 执行环境和作用域链 执行环境定义了变量或函数有权访问的其他数据.每个执行环境都有与之关联的变量对象,一般情况下我们无法访问变量对象,解析器会在我 ...
- 隐私计算中可信执行环境的一知半解
隐私计算是使数据"可用不可见"的技术,它包括了密码学.人工智能.安全硬件等众多领域交叉的学科体系.对于隐私计算而言,业界通常分为三大路径技术:以安全多方计算为代表的密码学路径.以可 ...
- 作用域、执行环境、作用域链
作用域,之前有介绍过,JavaScript无块级作用域,只有函数作用域,简单点说就是JavaScript的作用域就是函数作用域.因为有函数作用域,所以我们有全局作用域和局部作用域的说法. 执行环境是什 ...
最新文章
- GAN最新进展:8大技巧提高稳定性
- 169. Majority Element
- 【小白学习tensorflow教程】四、使用 tfhub中的模型EfficientDet-Lite2 进行对象检测
- Linux shell脚本编程(一)
- linux的bash脚本
- golang调用c++的dll库文件
- 杭电1085(多重背包求解)
- 快手视频伪原创 电脑视频md5修改器
- 国外硕博论文下载网址
- C语言中getchar
- get inkey、get input中,7 bit default 字符与ucs2字符的差异
- 也谈谈我对腾讯“抄袭”的认识
- Cookie存储购物车
- vSphere web client 虚拟机生成模板快速部署
- 【原创】从头开始,使用安卓系统WebView做一个功能强大的Epub阅读器(二)
- Tekton之二:如何使用 Tekton 创建 CICD 流水线
- AUTOSAR DiagnosticLogAndTrace DLT(三)-- 消息的发送、DLT命令的发送与接收
- 无锡做大做强“中国芯” 华虹功不可没
- 用electron做一个浏览器
- 2015年,写下“世界那么大,我想去看看”的女教师,终被现实打败
热门文章
- 无符号数的减法_C++核心准则ES.107:不要使用无符号数下标,使用gsl::index更好
- docker镜像启动后端口号是多少_14,Docker容器必知必会,你会了吗?
- cmd命令行导出的txt文本文档编码格式转换
- 微星笔记本电脑恢复出厂或者一键还原图文流程
- GCC对C++标准的实现情况
- mysql怎样循环插入数据_你向 Mysql 数据库插入 100w 条数据用了多久?
- 八叉树 java_java简单实现八叉树图像处理代码示例
- 21天学通python第4章课后题答案_人工智能教程习题及答案第4章习题参考解答
- 8uftp如何创建php,从零搭建php环境-php8
- crontab 时间参数解释