《程序员的自我修养》中以 hello,world 引出的问题你知道几个?

hen_hao_ji 2012-03-24 09:15:52

#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, Solar), 最终编译出来的结果一样吗?为什么?

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

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

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

9. Hello World程序在运行时,它在内存中是什么样子的?
...全文
2777 64 打赏 收藏 转发到动态 举报
写回复
用AI写文章
64 条回复
切换为时间正序
请发表友善的回复…
发表回复
cwh5635 2012-04-12
  • 打赏
  • 举报
回复
1. 程序为什么要被编译器编译了之后才可以运行?
因为cpu只能执行2进制代码.它只认识01.而我们写入的文字也是在内存中的01,不过解析的不同.
2. 编译器在把C语言程序转换成可以执行的机器码的过程中做了什么,怎么做的?
编译器预处理然后分析词法,语意,词义.最后解析出规定的语法里面你写入的到底是什么意思.最后依据自己的规则生成中间语言(不是必须的).最后优化而成。最后生成的机器码是存放在文件里面的。
3. 最后编译出来的可执行文件里面是什么?除了机器码还有什么?它们怎么存放的,怎么组织的?
编译出的文件里面有:数据段大小。符号表。其他的段。以及真正的汇编代码
4. #include<stdio.h>是什么意思?把stdio.h包含进来意味着什么?C语言库又是什么?它怎么实现的?
把stdio.h的所有内容全部copy到这个unit。c语言运行库是一个跨平台地库,2个部分,一个是.h 一个是真正的2进制文件。你不用关系2进制文件怎么实现,只需要知道它里面声明了神马。如果你用过gcc,你应该知道-l。
5. 不同的编译器(Microsoft VC, GCC)和不同的硬件平台(x86, SPARC, MIPS, ARM),以及不同的操作系统(Windows,Linux, UNIX, Solar), 最终编译出来的结果一样吗?为什么?
不一样的。。。不同的硬件平台好理解,因为汇编不一样。必须不一样。不同的编译器由于细节或者优化不一样,也会不同的。windows用的是PE文件,linux用的Elf文件格式。所以他们也是不一样的。虽然他们都是coff的孩纸
6. Hello World 程序是怎么运行起来的? 操作系统是怎么装载它的? 它从哪儿开始执行,到哪儿结束?main函数之前发生了什么? main函数结束以后又发生了什么?
helloworld程序运行的时候是这样:操作系统打开这个2进制文件。loader装载程序以及必须的运行库。大概就是把文件读取出来放到内存中。然后通过OS下的运行起始点运行。然后初始化全局变量。这步完成之后再由运行库吧命令行参数传给程序。main函数结束后。释放资源哈。。。。其他的说太细了我小菜鸟不知道,也说不完
7. 如果没有操作系统,Hello World可以运行吗?如果要在一台没有操作系统的机器上运行Hello World需要什么?应该怎么实现?
c语言其实有2部分。一部分是跨平台的函数(就像printf),一部分是更小的子集,不垮平台的c语言.如果在一台没有操作系统的机器上运行这个程序。简单的说。操作系统就是控制硬件的。如果你需要做这个helloworld的事,而为了运行它提供的环境不把它叫做OS的话,确实是可以的。首先你需要提供控制显示的类。然后需要控制磁盘。然后支持文件格式。并且提供一个符合这个文件格式的二进制文件,最后你需要一个loader...。
8. printf是怎么实现的?它为什么可以有不定数量的参数?为什么能够在终端上输出字符串?
c库里面有个头文件:stdarg.h他里面有几个东西:Va_开头的宏,依据这个来提供不定数量参数。
9. Hello World程序在运行时,它在内存中是什么样子的?
不同的OS,内存形式不同。。。。这个要讲完估计得写本书。。。。
Joyfulmath 2012-03-29
  • 打赏
  • 举报
回复
看的你的问题我还在想,潘汉民写过一本,跟2个浙大的,仔细看些就是你说的这本,汗一个。

2年前看过,忘的差不多了。
看不同的人吧,对于很多程序员来说用处不是很大
ForestDB 2012-03-29
  • 打赏
  • 举报
回复
给自己打个广告。
hello的真实故事
mijiyucen 2012-03-28
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

英语也是一门计算机语言的说。

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
hen_hao_ji 2012-03-28
  • 打赏
  • 举报
回复
不能让它沉下去。。
Fergon 2012-03-28
  • 打赏
  • 举报
回复
回答这些问题要做到有条理、简洁明了;没有相当实力,还真是无法做到。
hen_hao_ji 2012-03-28
  • 打赏
  • 举报
回复
64楼很强大啊。。
hen_hao_ji 2012-03-28
  • 打赏
  • 举报
回复
太感谢了!
[Quote=引用 64 楼 的回复:]
1. 程序为什么要被编译器编译了之后才可以运行?

C/C++ code


没啥,计算机比较笨,看不懂用高级语言写出来的程序


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

C/C++ code


请看编译原理。内容太多了,好几部书了


3. 最后编译出来的可执行文件里面是什么?除了机器码还有什么?它们怎么存放的,怎么组织的……
[/Quote]
Athenacle_ 2012-03-28
  • 打赏
  • 举报
回复
听说过《程序员的自我修养》,但是没看过,,等待拜读中。。。。
Athenacle_ 2012-03-28
  • 打赏
  • 举报
回复
1. 程序为什么要被编译器编译了之后才可以运行?

没啥,计算机比较笨,看不懂用高级语言写出来的程序

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

请看编译原理。内容太多了,好几部书了

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

一些文件头,全局变量,资源文件,重定向文件,机器码。
怎么存放与组织请看Windows PE格式或Linux ELF 格式,
然后自己写个解析器

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

stdio.h是个C运行库的一个头文件,包含着一些函数,全局变量的声明。
C语言运行库是C语言运行的时候的一些必备函数,什么printf之类的。也是一种可重用的代码
C语言的运行库是由C语言或汇编语言实现的。当然自己也可以写啊,,什么strcpy之类的

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

额。。当然不一样了。。。不说跨平台的(跨平台的连基本结构都改了)。。就连同一个编译器,同一个源代码,不同的编译选项也会有完全不同的结果出现

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

一般可执行文件的头信息里有机器码的入口地址,计算机就是从这里运行第一条语句,直到结束。
当然C/C++约定从main函数开始,但是只要给连接器一个信息,也就可以从任何地方开始,就是修改程序入口地址而已。
main函数之前发生了什么,要看你的环境了。像VC的运行库,在main函数之前之后有很多的处理工作,
但如果用TC,就直接从main函数开始。main函数结束。

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

当然可以啊。。
机器启动时直接jmp到helloworld函数入口地址就可以了。。(此时没有加载任何一个OS)
不过有很多的局限,请看《自己动手写操作系统》,里面有个hello world的实现
[/code
8. printf是怎么实现的?它为什么可以有不定数量的参数?为什么能够在终端上输出字符串?
[code=C/C++]
不定量的参数是由语言支持的。
请看<stdarg.h>头文件
在终端上显示字符串那2a8e40506848.png就是汇编级的工作了。。
无非调用一个中断显示字符而已,,
但也有很深的内容,请google一个printf的源代码。。

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


大体都是差不多的
hen_hao_ji 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 62 楼 的回复:]
引用 51 楼 的回复:
哦?我灵魂比身体先到了。(^_^)


^o^你未到,就有人把你的魂先摆了摆!

############################################

勉励几句!

楼主爱发问精神可嘉,保持住,不要听道庭胡说!

难得培养出来一个好苗子,有问题总是好的!

努力去解决自己的想出问题无论简单还是困难,幼稚还是成熟,只要敢想敢……
[/Quote]

ORZ, 谢谢。
一根烂笔头 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 51 楼 的回复:]
哦?我灵魂比身体先到了。(^_^)
[/Quote]

^o^你未到,就有人把你的魂先摆了摆!

############################################

勉励几句!

楼主爱发问精神可嘉,保持住,不要听道庭胡说!

难得培养出来一个好苗子,有问题总是好的!

努力去解决自己的想出问题无论简单还是困难,幼稚还是成熟,只要敢想敢做,未来可能你就是领跑者!

像疯子(爱因斯坦)在高中时候就开始想“光跑光”——以光速追光的问题了!——直到上完大学工作很久之后才解决!——这就是相对论的光速不变原理!
hen_hao_ji 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 60 楼 的回复:]
引用 59 楼 的回复:

引用 58 楼 的回复:
说明教育不够


怎么说?
有些地方能够买到便宜的绫罗绸缎, 只是看起来跟真的一样, 其实不然, 登不了大雅.
然后, 街上带着程序员帽子的也不少.
[/Quote]

什么才叫真真的程序员?
Dobzhansky 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 59 楼 的回复:]

引用 58 楼 的回复:
说明教育不够


怎么说?
[/Quote]有些地方能够买到便宜的绫罗绸缎, 只是看起来跟真的一样, 其实不然, 登不了大雅.
然后, 街上带着程序员帽子的也不少.
hen_hao_ji 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 58 楼 的回复:]
说明教育不够
[/Quote]

怎么说?
Dobzhansky 2012-03-28
  • 打赏
  • 举报
回复
说明教育不够
hen_hao_ji 2012-03-28
  • 打赏
  • 举报
回复
不能沉。。。
CSharp_XinBing 2012-03-27
  • 打赏
  • 举报
回复
来围观一下,你提的问题如果不对语言很了解是很难回答的。

  • 打赏
  • 举报
回复
你的很多问题应该是和操作系统、硬件、编译器等有关的,有些细节会因平台的不同而有差异,问这些问题也应该看自己现在所处的位置,若是刚入门的程序员何必问这么清楚,就算有人讲清楚了,过两天可能也就忘了,若果自己已经不是菜鸟了,这些问题在工作中应该都已经遇到了,慢慢不就明白了吗。。。
BadPattern 2012-03-27
  • 打赏
  • 举报
回复
嗯,<程序员的自我修养>这本书我也看了一点点,对于这些问题我也有疑问,我也很感兴趣,无奈非科班出身,计算机功底不够,目前正在看<深入理解计算机系统>打打功底
加载更多回复(44)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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