CPU与编译器概论(读书笔记)

     对于非计算机行业的程序猿来说,在编写C代码时无法可能写出来的代码没有那么高效,对编译器及计算机处理数据和指令的操作流程都不是很了解。下面我们就走进编译器和计算机的世界,去了解他们是怎么运作的。以下内容很多来自《深入理解操作系统》及《C性能优化》

  1、  编译器是如何运作的 

      下面就以简单的“hello world\n"为例子

#include 

int main()
{
    printf("hello world\n");
    return 0;
}

    在里linux系统上,完成由源文件hello.c到可执行文件hello的转化是由编译器完成的。翻译的过程分为4个阶段预处理、编译、汇编、链接一起构成了编译系统(compilation system)。


  预处理阶段

gcc -E hello.c -o hello.i
或者
cpp hello.c main.i      
主要作用:1、头文件全部展开写到源程序中
                         2、宏定义替换
                         3、不对程序语法作检查
   生成的hello.i文件可以自己打开看看!

  编译阶段

gcc -S hello.i -o hello.s
或者
cc1 hello.i hello.c -02 -o hello.s    
  作用: 1、检查语法的合法性
                   2、编译器将hello.i文件翻译成汇编文件hello.s

 汇编阶段

gcc -c hello.s -o hell.o
或者
as-o main.o main.s             
汇编器将汇编文件翻译成机器指令,这是打开文件,看到是一些乱码。

链接阶段

gcc hello.o -o hello
或者
ld -o hello hello.o
 生成可执行代码 hello
   file hello  查看属性
hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped


系统硬件组成(此部分来自深入理解操作系统)


CPU是如何运作的

      上面简单地介绍了编译器系统从源文件生成机器语言的过程,下面再就介绍下CPU是如何执行机器语言的。 CPU能够执行什么样的指令,或者说CPU所具备的指令集,称为CPU的指令集架构。指令集架构师规定程序设计如何使用失灵的规范,它包括寻址模式和寄存器的构成、中断、异常处理等。几乎所有的CPU都具备以下几个指令:

1、算术运算指令

2、逻辑运算指令

3、移位指令

4、条件比较指令

5、寄存器与内存之间的传送

6、跳转指令

    高效编程的的一个重要手段就是掌握CPU高效执行指令的方法。那么如何执行指令。分为下面几个步骤:

1、从内存中读取指令(读取)

2、解析所读取的指令(解码)

3、提前操作目标的数据(读取数据)

4、执行计算和条件对比等指令(执行指令)

5、输出数据

我们购买计算机的时候一定会参照CPU的主频来确定其性能,比如主频为3.2GHZ,1秒中能经历32亿个时钟周期。CPU内的个单元可以通过获取时钟信号来进行同期运作。

hello 运行程序

    上面的图简单介绍计算机硬件的几个部分,下面介绍在硬盘输入 ./hello程序后,计算机是怎么处理的!






   当我们在键盘上敲回车键时,外壳程序已经知道我们输入完毕,然后外壳程序执行一系列的程序加载可执行文件到内存中,然后由处理器去执行程序main,然后将字符串有内存中复制到寄存器,再显示到显示器上,

高速缓存

  主存储器存取速度相当缓慢,比CPU要慢上数十倍甚至数百倍,在于CPU所处的同一芯片内设计有高速的小容量内存,他们的工作就是频繁复制使用中的主存储器,单体主存储器工作,我们将他们叫做高速缓存。

  CPU在执行指令时徐璈从内存上读取数据,此时CPU首先会在缓存中查找相应的数据,在缓存中没有的情况才回去读取主存储器上的数据,看下面的图:

  

  关于缓存的一些机制在博客中 http://blog.csdn.net/jsh13417/article/details/8394157 页面置换中!

以上是堆本章节内容的节点介绍,欢迎各位指点,共同学习!

你可能感兴趣的:(【C深度剖析-个人篇】,CPU,编译器概论)