"Hello World " —— 深入理解程序从编译到运行

Struggling-Snail 2014-04-17 10:16:54
对于C语言编写的Hello World程序(如下),对于程序员来说肯定如雷贯耳,就是这样一个简单的程序,你真的了解她吗?

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


对于下面这些问题,你脑子里能够马上反映出一个清晰、明显的答案吗?

1、程序为什么要被编译器编译之后才可以运行?

2、编译器在把C语言程序转换成可以执行的机器码的过程中做了什么?怎么做的?

3、最后编译出来的可执行文件里面是什么?除了机器码还有什么?他们怎么存放的?怎么组织的?

4、#include <stdio.h>是什么意思?把stdio.h包含进来意味着什么?C语言库又是什么?它怎么实现的?

5、不同的编译器(Microsoft VC、GCC)和不同的硬件平台(x86、SPARC、MIPS、ARM),以及不同的操作系统(Windows、Linux、UNIX、Solaris),最终编译出来的结果一样吗?为什么?

6、Hello World程序是怎么运行起来的?操作系统是怎么装载它的?他从哪里开始执行?到哪儿结束?
main函数之前发生了什么?main函数结束之后又发生了什么?

7、如果没有操作系统,Hello World可以运行吗?如果要在一台没有操作系统的机器上运行Hello World需要什么? 应该怎么实现?

8、printf是怎么实现的?他为什么可以有不定数量的参数?为什么它能够在终端上输出字符串?

9、Hello World程序在运行时,它在内存中是什么样子的?

如果每个问题你都很清楚的知道答案,恭喜你!你已经是一个大牛了!

欢迎到博客留言讨论:http://blog.csdn.net/wangyuling1234567890/article/details/23964415
...全文
1171 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
k_badboy 2014-05-03
  • 打赏
  • 举报
回复
以前搞到多少情侣分手,夫妻离婚的农场,在很多程序员眼里,不屑一敝,对它的评论就是:无聊到极点的人才玩的游戏。 如果你需要套套,就去买一些好了,难道一定要自己造?
可爱的小灵儿 2014-04-30
  • 打赏
  • 举报
回复
我是掌握魔法的大师!
Hope_f 2014-04-30
  • 打赏
  • 举报
回复
全部都知道也只能是水牛
mousestuman 2014-04-19
  • 打赏
  • 举报
回复
大体上知道,不过我不是大牛
zhengnan2012 2014-04-18
  • 打赏
  • 举报
回复
完全不懂。 楼上的编译还要编成汇编语方吗? 不是目标代码吗?
  • 打赏
  • 举报
回复
oldmtn 2014-04-18
  • 打赏
  • 举报
回复
1、程序为什么要被编译器编译之后才可以运行? 机器只能执行二进制文件,因此需要编译成二进制再执行。 2、编译器在把C语言程序转换成可以执行的机器码的过程中做了什么?怎么做的? 高级语言-->汇编-->0100101010 3、最后编译出来的可执行文件里面是什么?除了机器码还有什么?他们怎么存放的?怎么组织的? 。。。。。。。。。。。。 4、#include <stdio.h>是什么意思?把stdio.h包含进来意味着什么?C语言库又是什么?它怎么实现的? 使用C库,C调用系统底层汇编。 5、不同的编译器(Microsoft VC、GCC)和不同的硬件平台(x86、SPARC、MIPS、ARM),以及不同的操作系统(Windows、Linux、UNIX、Solaris),最终编译出来的结果一样吗?为什么? 不太一样,字节长度可能不同。 6、Hello World程序是怎么运行起来的?操作系统是怎么装载它的?他从哪里开始执行?到哪儿结束? main函数之前发生了什么?main函数结束之后又发生了什么? main之前需要包含头文件,链接库,创建线程。释放线程及其资源给系统。 7、如果没有操作系统,Hello World可以运行吗?如果要在一台没有操作系统的机器上运行Hello World需要什么? 应该怎么实现? 。。。。。。。。。。。。。。。 8、printf是怎么实现的?他为什么可以有不定数量的参数?为什么它能够在终端上输出字符串? 。。。。。。。。。 9、Hello World程序在运行时,它在内存中是什么样子的? 。。。。。。。。。。
百曉生 2014-04-18
  • 打赏
  • 举报
回复
# include <stdio.h>
# include <windows.h>

int main(void)
{
	system("mkdir F:\helloworld\\dd");//在F盘新建一个helloworld文件夹,在这个文件夹下新建一个名为dd的文件夹

	return 0;
}
HymanLiuTS 2014-04-18
  • 打赏
  • 举报
回复
橘色的喵 2014-04-18
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
xiaosong8584 2014-04-18
  • 打赏
  • 举报
回复
1、程序为什么要被编译器编译之后才可以运行? 机器只能执行二进制文件,解释执行的运行效率没有编译后的高。 2、编译器在把C语言程序转换成可以执行的机器码的过程中做了什么?怎么做的? 编辑 -> 编译 - > 连接 - > 执行. 怎么做的?楼下怎么看? 3、最后编译出来的可执行文件里面是什么?除了机器码还有什么?他们怎么存放的?怎么组织的? 分段组织的, 数据段, 代码段, 信息段. 除了机器码还有说明信息, 可以裁减掉. 4、#include <stdio.h>是什么意思?把stdio.h包含进来意味着什么?C语言库又是什么?它怎么实现的? 引用标准输入输出库, 预编译的库文件, 机器码. 5、不同的编译器(Microsoft VC、GCC)和不同的硬件平台(x86、SPARC、MIPS、ARM),以及不同的操作系统(Windows、Linux、UNIX、Solaris),最终编译出来的结果一样吗?为什么? 不同, 字节序, 字长, 指令集都不一样, 怎么可能一样. 6、Hello World程序是怎么运行起来的?操作系统是怎么装载它的?他从哪里开始执行?到哪儿结束? 不清楚要看书. __main??? 是入口. 7、如果没有操作系统,Hello World可以运行吗?如果要在一台没有操作系统的机器上运行Hello World需要什么? 应该怎么实现? 不能, 自己实现IO资源分配, 内存管理. 至少得有个dos吧?否则不知道怎么下手. 8、printf是怎么实现的?他为什么可以有不定数量的参数?为什么它能够在终端上输出字符串? 变长参数宏. 默认使用的标准输出. 9、Hello World程序在运行时,它在内存中是什么样子的? 完全没有概念.
sicofield 2014-04-18
  • 打赏
  • 举报
回复
1、程序为什么要被编译器编译之后才可以运行? 机器只能执行二进制文件,因此需要编译成二进制再执行。 2、编译器在把C语言程序转换成可以执行的机器码的过程中做了什么?怎么做的? 词法检测——语法检测——生成语法树——语义检测——源代码优化——汇编——目标代码优化 3、最后编译出来的可执行文件里面是什么?除了机器码还有什么?他们怎么存放的?怎么组织的? 代码段、数据段、段表、重定位表、符号解析表 4、#include <stdio.h>是什么意思?把stdio.h包含进来意味着什么?C语言库又是什么?它怎么实现的? #inlcude 在预编译的时候载入包含的文件。C语言库是编写好的一些函数,可能用到系统调用,可能不用 5、不同的编译器(Microsoft VC、GCC)和不同的硬件平台(x86、SPARC、MIPS、ARM),以及不同的操作系统(Windows、Linux、UNIX、Solaris),最终编译出来的结果一样吗?为什么? 大体一样,,具体哪不一样,我还不懂 6、Hello World程序是怎么运行起来的?操作系统是怎么装载它的?他从哪里开始执行?到哪儿结束? main函数之前发生了什么?main函数结束之后又发生了什么? 系统先分配资源,之后开启进程,进程调用_main(),开始执行main()函数,main函数退出后,进程调用_exit()退出 7、如果没有操作系统,Hello World可以运行吗?如果要在一台没有操作系统的机器上运行Hello World需要什么? 应该怎么实现? 需要能够创建进程来执行程序,如果没有操作系统,我不知道怎么运行。 8、printf是怎么实现的?他为什么可以有不定数量的参数?为什么它能够在终端上输出字符串? printf封装了系统IO调用。 9、Hello World程序在运行时,它在内存中是什么样子的? 代码段---数据段—等等一些和操作系统内存分配相关的内容
ameyume 2014-04-17
  • 打赏
  • 举报
回复
坐等答案来找我~~~~

662

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧