第一篇笔记的主题是讨论Hello World程序的生命周期,程序是最简单的hello world程序,使用高级C语言编写。

先介绍整个生命周期中涉及到的几个部分以及相应的概念,然后总结整个生命周期,最后是几个零散的知识点。

程序

#include<stdio.h> int main(){ printf("Hello World!\n"); system("pause"); return 0; }

编译系统

基于以下的几个疑问,我们有必要了解编译器如何工作:

  1. 优化程序性能 : 例如 一个switch语句是否比一串if-else语句高效?一个函数调用的开销有多大?while循环和for循环,哪个更有效?
  2. 理解链接时出现的错误 :链接器报告它无法解析一个引用,这是什么意思?静态变量和全局变量的区别是什么?
  3. 避免安全漏洞 :缓冲区溢出错误如何产生?

下面针对Hello World程序,介绍一下编译系统如何工作。

  • 预处理阶段:预处理器(cpp)根据以字符#开头的命令,修改源程序;#include<stdio.h>告诉预处理器读取系统头文件stdio.h的内容,并把它直接插入到源程序中,生成的文件以.i为扩展名。
  • 编译阶段  :编译器(ccl)将.i文件翻译成.s文件,这是一个汇编语言程序。汇编语言为不同高级语言的不同编译器提供了通用的输出语言。
  • 汇编阶段  :汇编器(as)将.s文件翻译成机器语言指令,并打包成可重定位目标程序,也就是.o文件。.o文件是二进制文件,它的字节编码是机器语言指令而不是字符。
  • 链接阶段  :链接器(ld)。printf函数是一个C标准函数,单独存在于一个预编译好的printf.o目标文件中,链接器将其合并到hello.o文件中,生成可执行文件,然后载入内存,等待运行程序。

此时,hello.c源程序已被编译系统翻译成了可执行目标文件hello,存放于磁盘上。需要运行时,用命令解释器(外壳(shell))运行。

计算机的几个相关硬件

  • 总线     :贯穿整个系统的一组电子管道,负责携带信息并在各个部件之间传递信息。传送定长的字节块(字),每个字的字节数(字长)因系统而异。
  • I/O设备:负责系统与外部进行信息交互。上图示例有四个I/O设备:鼠标键盘(用户输入)、显示器(用户输出)和磁盘(存储程序和数据)。每个I/O设备通过一个控制器或适配器与I/O总线相连,负责在两者之间传递信息。
  • 主存    :一个临时存储设备,在处理器运行程序时负责存放程序和程序处理的数据。
  • CPU   :负责解释(或执行)主存中的指令。处理器的核心是一个字长的存储设备(或寄存器),称为程序计数器(PC,注:PC区分“个人计算机”)。任何时刻,PC都指向主存中某条机器语言指令,即PC中存放该指令的地址。从系统通电开始,到系统断电为止,处理器就一直在执行PC指向的指令。执行完之后更新PC,在指向下一条指令,值得一提的是这里的下一条指令并非物理意义上的下一条,也即不一定与上一条指令相邻。这样的简单操作并不多,且围绕着主存、寄存器文件和算数/逻辑单元(ALU)进行,寄存器文件是一个小的存储设备,由一些1字长的寄存器组成,每个寄存器都有唯一的名字;ALU负责计算新的数据和地址。

CPU执行的操作

  • 加载:把一个字节或者字从主存复制到寄存器,并覆盖寄存器原来的值。
  • 存储:把一个字节或者字从寄存器复制到主存的某个位置,病覆盖掉主存该位置原来的值。
  • 操作:把两个寄存器的内容复制到ALU,ALU对这两个内容做算术运算,将结果存放到一个寄存器中,并覆盖掉原来的值。
  • 跳转:从指令本身中抽取一个字,复制到PC中,并覆盖掉PC中原来的值。

现在总结一下运行hello程序的整个过程:

  • 开始时我们先通过键盘鼠标等用户输入设备将高级语言源程序写入电脑,这些程序代码存储在磁盘上。
  • 然后编译系统将高级语言程序代码经过预编译、编译、汇编和链接等操作将C语言代码翻译成机器语言指令,存放在磁盘上。
  • shell等待我们输入一个指令,当我们从键盘输入字符串“./hello”后,shell将字符串逐一读入寄存器,然后存储到存储器。现在主存放着“hello”命令。如下图所示:
  • 当我们输入回车时,shell知道命令输入结束。然后执行一系列操作加载可执行的hello文件,将hello目标文件中的代码和数据从磁盘复制(操作)到主存,利用直接存储器存取(DMA)技术(后续讨论),数据可以从磁盘直接到达主存。现在主存放有运行程序的命令和运行程序所需的机器语言代码。如下图所示:
  • hello的代码和数据加载到主存后,处理器开始执行hello程序的main程序中的机器语言指令,这些指令将结果字符串“Hello World\n”以字节的形式从主存复制到寄存器,然后再复制到显示设备,最后我们在屏幕上看到”Hello World“。过程如下图所示:

以上就是hello world程序整个软硬件配合从输入到输出的整个过程。下面罗列几点上面用到的知识点。

  • 源程序实际上就是一个由值0和1组成的位序列。8个位组成一个字节,每个字节表示程序中的某个文本字符。hello.c程序以字节序列的方式在文件中进行存储。
  • 大部分的现代系统使用ASCII标准来表示文本字符,这种方式实际上使用一个字节表示一个字符。
  • 像hello.c这样只由ASCII字符构成的文件称为文本文件,其他的所有文件均称为二进制文件。
    以此类推:系统中所有的信息都是由一串位表示的,事实上的确如此。区分这些数据的唯一方式是读取这些数据时的上下文。
  • 从上面的过程可以看出,系统很多的时间花费在了信息转移传递的过程:hello程序的机器指令最初是在磁盘上的,当程序加载时,它们被复制到主存;当处理器运行程序时,它们又被复制到处理器。
  • 计算机系统是由硬件和系统软件组成的,他们共同工作来运行应用程序。

最后附上源程序的ASCII码图

转载于:https://www.cnblogs.com/hitfredrick/p/6403020.html

深入理解计算机系统(1)--hello world程序的生命周期相关推荐

  1. Android中级教程之--------Android应用程序的生命周期(一定要理解,面试会问的哦!)

    Android的应用程序的生命周期,我相信这在以后的Android面试一定是经常考的题目,所以大家一点要重视哦!下面我将图文双线程,希望对大家有一点帮助! 首先我们看一下Android应用程序的生命周 ...

  2. 教你理解微信小程序的生命周期和运行原理

    写微信小程序,他的生命周期不能不知道,不知道小程序就会出现各种bug而无法解决.小助君公众号带你学习小程序的生命周期和运行原理. 小程序由两大线程组成:负责界面的线程(view thread)和服务线 ...

  3. 小程序生命周期_来,简单说说小程序的生命周期?

    简单说说小程序的生命周期? 在小程序中生命周期分为三大类 应用生命周期 页面生命周期 组件生命周期 应用生命周期 onLaunch(){ console.log('onLaunch监听小程序初始化') ...

  4. 从HelloWorld看iphone程序的生命周期

    做iphone开发首先第一件就是得知道iphone程序的生命周期,说白点就是当点击程序图标启动程序开始到退出程序整个使用运行过程中底下的代码都发生了什么,只有理解了这个才能游刃有余的掌握Iphone程 ...

  5. asp.net MVC 应用程序的生命周期

    首先我们知道http是一种无状态的请求,他的生命周期就是发出请求开始,到得到响应结束.那么MVC应用程序从发出请求到获得响应,都做了些什么呢? 本文我们会详细讨论MVC应用程序的生命周期和一个请求,从 ...

  6. android应用程序的生命周期,Android应用程序的生命周期.doc

    Android应用程序的生命周期.doc Android应用程序的生命周期 描述:程序的生命周期是在Android系统中进程从启动到终止的所有阶段,也就是Android从启动到停止的全过程.==程序的 ...

  7. iOS 应用程序的生命周期浅析

    做ipone开发有必要知道iPhone程序的生命周期,说白了就是点击应用图标启动程序到到退出程序,在这个运行的过程中底下的代码到底发生了什么,只有理解生命周期,有利于我们开发人员开发出更好的应用. 当 ...

  8. 深入理解iPhone委托模式兼谈iPhone生命周期

    深入理解iPhone委托模式兼谈iPhone生命周期(手把手教你iphone开发 - 基础篇) 作者:孙东风 2009-11-23(请尊重作者劳动成果,转载务必注明出处)   每个iPhone应用程序 ...

  9. c语言程序的生命周期(编写、预处理、编译、汇编、链接、执行)

    目录 程序的生命周期 一.引言 二.程序经历的六个阶段 1.阶段一:编辑(Edit) 2.程序编译系统(Programs Compilation System) 阶段二:预处理(Preprocess) ...

  10. 移动应用程序开发_移动应用程序开发生命周期-从开发到应用程序商店的应用程序之旅

    移动应用程序开发 Lately, app stores have witnessed a meteoric rise in the number of apps available to them. ...

最新文章

  1. 小心DataAdapter陷阱
  2. 计算机无法打开文档,电脑txt文件打不开怎么办-修复电脑中无法打开txt文档的方法 - 河东软件园...
  3. android5.1 xposed,Xposed框架oppo下载
  4. Windows 计算机的快捷键大全
  5. python程序设计实用教程答案_Python程序设计实用教程
  6. 成都理工大学计算机类中外合办,成都理工大学代码
  7. RPC框架的使用场景
  8. C++ 九阴真经之线程安全单例类
  9. 微信无法显示好友头像
  10. 在Unity3D中使用泛型(上)
  11. 基于Java的快递管理系统(LMS)设计与实现 毕业论文+项目源码及数据库文件
  12. 垃圾回收之如何判断对象可以回收、四种引用以及实际案例操作
  13. 详解GaussDB(DWS) 资源监控
  14. html/template 和 text/template区别
  15. 十二星座的12种风味咖啡,最后一个能让你上瘾
  16. 【论文阅读】Squeeze-and-Attention Networks for Semantic Segmentation(CVPR2020)
  17. 十级孤独你能承受几级?
  18. Dubbo系列之框架概括(一)
  19. Nginx 使用letsencrypt在Docker上配置Https
  20. 谈谈FRID 门禁系统

热门文章

  1. c编程连接mysql
  2. centos安装python3_CentOS安装Python3-阿里云开发者社区
  3. qwidget设置背景颜色_Python+PyQt编程示例:设置窗口背景色及分割条颜色
  4. idea创建maven工程_maven创建父子工程 springboot自动配置
  5. 成熟的Richardson模型
  6. [渝粤教育] 重庆电子工程职业学院 信息技术与人工智能基础 参考 资料
  7. 【渝粤教育】国家开放大学2018年秋季 1117t机电控制与可编程序控制 参考试题
  8. [渝粤教育] 西南科技大学 材料力学 在线考试复习资料
  9. 【NeurIPS 2019】最大熵的蒙特卡洛规划算法
  10. Unity编辑器扩展之RequireComponent等详解