Chinaunix首页 | 论坛 | 博客
  • 博客访问: 886727
  • 博文数量: 380
  • 博客积分: 3495
  • 博客等级: 中校
  • 技术积分: 3996
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-02 09:35
文章分类

全部博文(380)

文章存档

2015年(2)

2014年(5)

2013年(9)

2012年(9)

2011年(67)

2010年(103)

2009年(182)

2008年(3)

我的朋友

分类: C/C++

2009-10-22 16:10:43

   当你启动一个程序的时候,有没有想过这个程序是如何在硬件的支持下,不断与你交互,运行,直到完成任务,程序退出?它是如何在你点击图标或是运行一个命令就开始运行?一个程序是如何从简单的代码生成一个可执行文件的呢?
   本文只是想对上面的疑问做一个简单的解释。
   介于俺只对C语言与JAVA有些研究,所以以下的说明只是C与JAVA进行说明。
1.程序生成
  一个常用的C程序通常是如下的吧。
用任何文本编辑器都可以,直接把下面的内容保存成一个hello.c文件。

#include
#include
 
/* main */
int main(int argc, char * argv[])
{
    printf("Hello World!");
}

  随后就是
  Step1.编译                               <-----这一步发生了什么?
gcc -c hello.c -o hello.o
  Step2.链接                               <-----这里又发生了什么?
gcc hello.o -o hello
  Step3.运行                               <-----这里怎么输出的"Hello World!"
./hello

下面就分别看一下吧。希望我们能揭开相应的幕后故事。
Step1的幕后故事,它就像采矿一样,会把大块岩石切割成小块,然后挑出有价值的,有含金量的小块,随后再把它们熔炼成零件。
首先是对程序进行TOKEN化,也就是上面的逐个字符处理成指令,也就是按语言规范定义的指令单位。如
#include 会分成, #, include, <, stdin.h, >
int main(int argc, char* argv[])会分成,int main, (, int, argc, char, *, argv, [, ], )
/* main */ 则可能是,/, *, main, *, /,
随后就是各种过滤,如注释去掉了,无意义的空格去掉了。
有用的东西,慢慢的再组合成语法树,进行语法与语义的检查。
检查完成,如果没有错误就会用相应的文件生成目标文件(OBJ),其中就是类零件的代码,也就是自己的处理逻辑与调用其它函数的接口。




阅读(602) | 评论(0) | 转发(0) |
0

上一篇:关于view的性能实测

下一篇:程序

给主人留下些什么吧!~~