本篇重点:

  1. 程序的翻译环境和执行环境
  2. 详解翻译环境中的 编译+链接

程序的翻译环境和执行环境

在ANSI的任何一种实现中,存在两个不同的环境。

  1. 翻译环境,在这个环境中源代码被转换为可执行的机器指令。
  2. 执行环境,它用于实际执行代码。

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函数;也有可能是意外终止。

程序环境——翻译环境与执行环境相关推荐

  1. Intel 64/x86_64/IA-32/x86处理器基本执行环境 (2) - 64位执行环境

    64-Bit Execution Environment 64位模式的执行环境与32位执行环境类似.不同点如下所述: 地址空间 – 程序/任务运行在64位模式下,可以访问最高2^64字节(受制于规范寻 ...

  2. Intel 64/x86_64/IA-32/x86处理器基本执行环境 (1) - 32位执行环境概述

    Basic Execution Environment Overview IA-32处理器提供了一套完整的资源,在处理器上运行的程序/任务可以执行指令,存储代码,数据以及状态信息.这些资源(如下简要的 ...

  3. JavaScript执行环境 + 变量对象 + 作用域链 + 闭包

    闭包真的是一个谈烂掉的内容.说到闭包,自然就涉及到执行环境.变量对象以及作用域链.汤姆大叔翻译的<深入理解JavaScript系列>很好,帮我解决了一直以来似懂非懂的很多问题,包括闭包.下 ...

  4. 转换环境与执行环境、宿主环境与独立环境、宿主实现与独立实现

    文章目录 1 转换环境与执行环境 1.1 转换环境与执行环境的概念 1.2 为什么要区分转换环境和执行环境 2 宿主环境和独立环境 2.1 宿主环境 2.2 独立环境 3 宿主实现.独立实现 3.1 ...

  5. html代码在线运行环境,ES5/可执行代码与执行环境

    可执行代码类型 一共有三种 ECMA 脚本可执行代码: 全局代码是指被作为 ECMAScript Eval 代码是指提供给 eval 内置函数的源代码文本.更精确地说,如果传递给 eval 内置函数的 ...

  6. JavaScript中执行环境和栈

    在这篇文章中,我会深入理解JavaScript最根本的组成之一 : "执行环境(执行上下文)".文章结束后,你应该对解释器试图做什么,为什么一些函数/变量在未声明时就可以调用并且他 ...

  7. 执行环境及作用域分析

    :点上面关注免费学习前端知识! 执行环境(execution context,为简单起见,有时也称为"环境")是JavaScript中最为重要的一个概念.执行环境定义了变量或函数有 ...

  8. js中执行php语句_重温JS中的执行环境和作用域链

    说明:以下代码说明和原理都是基于ES5和非严格模式进行 执行环境和作用域链 执行环境定义了变量或函数有权访问的其他数据.每个执行环境都有与之关联的变量对象,一般情况下我们无法访问变量对象,解析器会在我 ...

  9. 隐私计算中可信执行环境的一知半解

    隐私计算是使数据"可用不可见"的技术,它包括了密码学.人工智能.安全硬件等众多领域交叉的学科体系.对于隐私计算而言,业界通常分为三大路径技术:以安全多方计算为代表的密码学路径.以可 ...

  10. 作用域、执行环境、作用域链

    作用域,之前有介绍过,JavaScript无块级作用域,只有函数作用域,简单点说就是JavaScript的作用域就是函数作用域.因为有函数作用域,所以我们有全局作用域和局部作用域的说法. 执行环境是什 ...

最新文章

  1. GAN最新进展:8大技巧提高稳定性
  2. 169. Majority Element
  3. 【小白学习tensorflow教程】四、使用 tfhub中的模型EfficientDet-Lite2 进行对象检测
  4. Linux shell脚本编程(一)
  5. linux的bash脚本
  6. golang调用c++的dll库文件
  7. 杭电1085(多重背包求解)
  8. 快手视频伪原创 电脑视频md5修改器
  9. 国外硕博论文下载网址
  10. C语言中getchar
  11. get inkey、get input中,7 bit default 字符与ucs2字符的差异
  12. 也谈谈我对腾讯“抄袭”的认识
  13. Cookie存储购物车
  14. vSphere web client 虚拟机生成模板快速部署
  15. 【原创】从头开始,使用安卓系统WebView做一个功能强大的Epub阅读器(二)
  16. Tekton之二:如何使用 Tekton 创建 CICD 流水线
  17. AUTOSAR DiagnosticLogAndTrace DLT(三)-- 消息的发送、DLT命令的发送与接收
  18. 无锡做大做强“中国芯” 华虹功不可没
  19. 用electron做一个浏览器
  20. 2015年,写下“世界那么大,我想去看看”的女教师,终被现实打败

热门文章

  1. 无符号数的减法_C++核心准则ES.107:不要使用无符号数下标,使用gsl::index更好
  2. docker镜像启动后端口号是多少_14,Docker容器必知必会,你会了吗?
  3. cmd命令行导出的txt文本文档编码格式转换
  4. 微星笔记本电脑恢复出厂或者一键还原图文流程
  5. GCC对C++标准的实现情况
  6. mysql怎样循环插入数据_你向 Mysql 数据库插入 100w 条数据用了多久?
  7. 八叉树 java_java简单实现八叉树图像处理代码示例
  8. 21天学通python第4章课后题答案_人工智能教程习题及答案第4章习题参考解答
  9. 8uftp如何创建php,从零搭建php环境-php8
  10. crontab 时间参数解释