当你启动一个程序的时候,有没有想过这个程序是如何在硬件的支持下,不断与你交互,运行,直到完成任务,程序退出?它是如何在你点击图标或是运行一个命令就开始运行?一个程序是如何从简单的代码生成一个可执行文件的呢?
本文只是想对上面的疑问做一个简单的解释。
介于俺只对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),其中就是类零件的代码,也就是自己的处理逻辑与调用其它函数的接口。
阅读(661) | 评论(0) | 转发(0) |