第一章:计算机的软硬件基本结构—Q&A
第一章:计算机的软硬件基本结构—Q&A
1.1 从hello World说起
问题
程序为什么要被编译了以后才可以运行?
A:
编程语言是程序员的语言,但是不是计算机能够理解的语言,计算机能够理解的语言只有机器码,也就是二进制的0和1。所以程序需要被编译才能运行。
编译器在把C语言程序转换为可以执行的机器码的过程中做了什么,怎么做的?
A:
编译分为四个步骤,分别是预处理,编译,汇编,链接。预处理首先对以#开头的预编译命令处理。删除所有注释。编译会经过一系列的词法分析,语法分析,语义分析,优化后产生相应的汇编代码文件。汇编负责将汇编文件转换为机器可以执行的指令。链接负责将我们程序里引用的库函数和我们写的程序进行链接。
最后编译出来的可执行文件里面是是什么?除了机器码还有什么?他们怎么存放的,怎么组织?
A:
这个问题不太会,等学完后来填坑。
#include<stdio.h>是什么意思?将stdio.h包含进来意味着什么?C语言库又是什么?它怎么实现的?
A:
#include<stdio.h>是将stdio.h这个库函数给引入进来。include的效果为,在编译时把被包含的文件中的内容,放到被编译的c文件对应位置。后面的问题不太会,等学完后来填坑。
不同的编译器(Microsoft VC,GCC)和不同的硬件平台(X86,SPARC,MIPS,ARM),以及不同的操作系统(Windos,linux,UNIX),最终编译出来的结果一样吗?为什么?
A:
结果不一样,因为不同的文件的结构是不一样的,windos的PE文件的结构和linux下的ELF文件还是有较大差别的,而且对与不同的硬件平台使用的汇编架构也是不一样的,不同的编译器对与程序的优化也是不一样的。
Hello World程序是怎么运行起来的?操作系统是怎么装载的?它从哪开始执行,到哪结束?main函数之前发什么了什么?main函数结束后发生了什么?
A:
将 hello 目标文件中的代码和数据从磁盘复制到主存。数据包括最终会被输出的字符串“Hello World\n”,一旦目标文件中的代码和数据被加载到主存,处理器就开始执行 hello 程序的 main 程序中的机器语言指令。这些指令将“Hello World\n” 字符串中的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上。后面的问题不太会,等学完后来填坑。
如果没有操作系统,Hello World可以运行吗?如果要在一台没有操作系统的机器上运行Hello World需要什么?应该怎么实现?
A:
可以运行,但是需要修改代码,因为操作系统提供了对底层硬件的处理的接口,让我们可以不考虑不同硬件的区别来写程序,但是如果没有了操作系统,那么我们就需要根据底层的硬件来编写程序。
printf函数是怎么实现的?它为什么可以有不定数量的参数?为什么他能够在终端上输出字符串。
A:这个问题不太会,后面来解决。
Hello World程序在运行时,它在内存中是什么样子?
A:这个问题不太会,后面来解决。