程序员的自我修养(一)

  程序员的自我修养,最开始看这本书是在学校的图书馆,当时翻了几下,发现这本书内容还真挺特别的。是浙大几个老师写的,就更感觉亲切了,所以自己买了一本书来看看,这也是我到研究生之后买的第一本书了,哈哈,平时都是pdf啥的,其实pdf真不好看。

言归真正,讲讲昨天看到的

从一个HelloWorld程序开始讲起

#include<stdio.h>

 int main()
 {
   printf("helloworld")
   return 0;
 }

 从高级语言到操作系统可以执行的语言,这里有几个步骤1)预编译 2)编译 3)汇编 4)链接

1)预编译

主要做以下几个事情: 将宏指令展开,#define 展开到全文,比如将#include指令展开,这是递归进行的; 将条件预编译展开,比如#if #ifdef #else之类的 ; 删除所有注释;加入行号,文件名,主要是在编译错误警告时候显示;保留所有#pragma指令;

2)编译

将源代码编译成汇编代码,源代码==>>汇编文件

编译有一个工具,就是ccl(c语言),cclplus(C++语言),jcl(java)。gcc只是这些后台程序的包装,它会根据不同的语言,选择编译程序ccl,汇编器as,连接器ld

3)汇编

汇编是把汇编文件按照汇编指令和机器指令一一对应的关系,把汇编文件会变成目标文件。汇编文件==>>目标文件,这一步由汇编器as来完成

4)链接

链接文件是指把目标文件和静态类型结合起来链接起来形成可执行文件,(链接文件,静态文件)==>可执行文件。

这就是一个程序从源文件到可执行文件的四个步骤。

对于第二步,编译是怎么做的呢?我们详细讨论一下第二点

a,首先是将源代码扫描成Token(把一个语句分隔成若干个Token)

b,然后将Token形成语法树(Syntax Tree)(以表达式为节点的树)

c,然后将语法书分析标记,给每一个结点一个记号,然后形成标有语义的语法数目

d, 中间代码生成,将语法分析树转换成中间代码,形成三地址码语言,在三地址代码语言层面上做一个优化,比如t1=2+6;t2=index+4;t3=t2*t1;array[index]=t3;

在三地址代码做如下转换: t2=index+4;t2=t2*8;array[index]=t2;(中间代码把编译过程分成前端和后端,前端和平台无关,后台与平台有关)

e,目标代码生产和优化

这里主要目标代码生成和目标代码优化

movl index,%ecx;add $4,%ecx;mul $8,%ecx;mobl infdex,%ecx;mov %ecx,array(,eax,4)

对上面目标代码进行优化;

以上这五步就完成了编译的第二步,形成了汇编语言。

程序员的自我修养(一),布布扣,bubuko.com

时间: 2024-10-18 13:50:32

程序员的自我修养(一)的相关文章

一个程序员的自我修养

在网上看到一篇程序员的自我修养,深以为然,不禁摘录一些,勉励自己 一个好的开发人员,应该能够全面.高效.严谨的去处理任何软件程序和业务问题,成为一个好的开发,是一个很有意思的话题,不过无论这个话题如何开展,基础两个字必不可少,虽然代码量是衡量开发能力的重要指标,但仅能够熟练的进行代码编写是不够的,更要能深刻的理解技术原理和业务逻辑,扎实的个人基础和技术基础往往会促进代码的编写,更游刃有余的解决问题. 下面说的一些基础,可能绝大部分开发人员都不会在意甚至忽略,但恰恰这些才是开发大厦的基石. 1.科

程序员的自我修养:(1)目标文件

程序员的自我修养:(1)目标文件 1.目标文件 1.1 编译与链接 在使用像Visual Studio或Qt Creator等IDE时,通常有一个叫做"构建"的按钮.当编辑完成要运行和测试时点一下它,程序就能跑起来了,所以我们很少关心编译和链接.其实,编译和链接合并在一起就称为 构建(Build).简单的一次按键,实际背后却是异常复杂的过程: 预编译(Preprocessing) 编译(Compilation) 扫描:算法类似有限状态机(FSM),将字符转换成Token. 语法分析:分

程序员的自我修养 学习笔记(1)

本文源自在学习<程序员的自我修养>中的心得体会. 对于底层系统程序开发者来说,硬件平台可以抽象为三个主要部件,CPU.内存.I/O控制器. 早期的计算机没有复杂的图形功能,CPU和内存之间的频率差异不大,它们都是连接在同一个bus上面的.其他I/O设备,诸如显示设备.键盘.磁盘等速度比内存.CPU慢很多.为了IO设备与CPU.内存之间的协调通讯,一般每个IO设备商都有相应的IO控制器,早期的硬件结构图如下: 随着技术的进步,CPU的频率越来越高,内存跟不上CPU的速度,他们之间就需要一个转换机

读《程序员的自我修养》感受

这书不错,链接-装载-库 我觉得是很底层的东西.比如很多人闭着眼睛都能写出来的hello world(当然不包括brianfuck,如果你会,你真的闹残了吗= =), 其实链接编译器做了很多,不然就哪来的printf,这IO初始化也是CRT(c runtime)库完成的.堆栈的初始化,还有系统装载让程序运行等等.涉及很多. 书里后面就讲了一个CRT库,自己写一个,感觉不错,学了很多.比如malloc,free的实现,话说还是跨平台的.当然库很小,功能不多,不过写这个也可以学学算法.内存的分配,这

程序员的自我修养 学习笔记(4)

可执行文件只有装载到内存以后才能被CPU执行.程序就将是菜谱,CPU就像是厨师,计算机的其他硬件就像是厨具,整个炒菜的过程就是一个进程.同样的一份菜谱,不同人可以做出来不同的味道.这个类比真是巧妙. Linux下面,进程最大使用3G的虚拟空间 Windows下面,进程最大使用2G的虚拟空间 现在计算机,配置超过4G的内存的电脑已经不是不可能了,在这种情况下,32位CPU能够访问到大于4G的空间吗?如果此空间指的是虚拟地址空间,由于32位CPU的指针只能是32位,最大寻址范围是0~4GB.如果此空

《程序员的自我修养》 第二章——编译和链接

摘自http://blog.chinaunix.net/uid-26548237-id-3839979.html <程序员的自我修养>第二章——编译和链接 2.1 被隐藏了的过程    C语句的经典,“Hello World”程序几乎是每个程序员闭着眼睛都能写出的,编译运行一气呵成,基本成了程序入门和开发环境测试的默认标准. #include <stdio.h> int main() { printf("Hello World\n"); return 0; 在L

《程序员的自我修养》第三章学习笔记

1,  编译器编译源代码生成的文件叫做目标文件. 从结构上说,是编译后的可执行文件,只不过还没有经过链接 3.1 目标文件的格式 1,可执行文件的格式: Windows下的PE  和   Linux下的ELF 2,从广义上说,目标文件与可执行文件的格式几乎是一样的,所以广义上可以将目标文件与可执行文件看成是一种类型的文件. 3,可执行文件,动态链接库,静态链接库都按照可执行文件格式存储(Windows下是 PE-COFF格式,Linux下是ELF格式). 4,Linux下命令: $: file 

一、《程序员的自我修养》笔记-前言

引子:在linux上写了三年多的c了,平时遇到一些编译和链接的问题仍然很是头痛,感觉很无力,好基友推荐<程序员的自我修养>,趁着周末,速速围观. 先记录下作者在书中抛出来的问题 1.为啥程序是从main函数开始执行? 2.PE/ELF文件存的是啥? 3.如何写一个直接跑在未安装os裸机上的程序? 4.目标文件是啥?链接是啥? 5.链接为啥报错? 6.句柄到底是啥? 7.普通c/c++代码如何被编译成牧宝文件及程序在目标文件中如何存储? 8.目标文件如何被链接器链接到一起,并形成可执行文件? 9

程序员的自我修养

本书主要介绍系统软件的运行机制和原理,涉及在Windows和Linux两个系统平台上,一个应用程序在编译.链接和运行时刻所发生的各种事项,包括:代码指令是如何保存的,库文件如何与应用程序代码静态链接,应用程序如何被装载到内存中并开始运行,动态链接如何实现,C/C++运行库的工作原理,以及操作系统提供的系统服务是如何被调用的.每个技术专题都配备了大量图.表和代码实例,力求将复杂的机制以简洁的形式表达出来.本书最后还提供了一个小巧且跨平台的C/C++运行库MiniCRT,综合展示了与运行库相关的各种