以Linux下hello.c为例

  1. //hello.c
  2. #include <stdio.h>
  3. int main()
  4. {
  5. printf("hello, world\n");
  6. }

编译系统

1.png

  1. 预处理(preprocess)阶段:cpp.h头文件直接插入程序文本,得到hello.i文件,并且移除注释(comments)
  2. 编译(compile)阶段:ccl把hello.i翻译成hello.s,其中包含汇编程序
  3. 汇编(assemble)阶段:as把hello.s翻译成机器指令打包成目标文件hello.o
  4. 链接(link)阶段:ld把需要的外部函数所在.o文件合并进当前hello.o,得到可执行文件,能加载到内存

中间文件顺序:ciso


程序执行

在linux下完成编译后用户输入./hello可执行程序,实际上有下列三步

  1. 接收用户输入: 从键盘接收输入后shell程序把字符读入寄存器,再放入主存,当敲下回车,shell判断输入完毕,执行指令加载可执行文件hello

2.png

  1. 加载hello到主存: Shell指令把磁盘中的hello复制到主存,其中包含要输出的”hello,world\n”

3.png

  1. 输入至显示器:当程序加载到主存后,CPU开始执行机器指令,将”hello,world\n”对应字节复制到寄存器,再从寄存器输出至显示器

4.png


选择题知识点

  1. VC++Project中包含Files
  2. VC++中win32 console程序是:VC++可生成的最简单程序
  3. 计算的抽象级别排序: C++ code > C code

    机器码 > 逻辑门

  4. 以下代码

    1. unsigned int x; int y;
    2. cin >> x >> y;
    3. cout << x + y;

    当x,y都是正数,打印结果不一定为正数,unsigned int和int运算无显式说明时进行无符号加法,得到无符号数
    举例:
    令x=1,y=-4,此时执行无符号加法,结果fffffffd全被当作数据位,得到4294967293
    1.png
    2.png
    当x定义为int时
    3.png
    此时执行补码加法,结果fffffffd的补码00000003,符号位f,答案-3

  5. IDE使得很难混合和匹配来自不同来源的工具:不好,因为没有一个供应商可能是所有最好工具源

  6. C代码和机器码可以描述相同的算法
  7. 关于debugger(调试程序)
    作用:①编译compiler生成的机器指令②中断程序的执行,但debugger本身不能发现error
    使用:可能需要重复执行多次代码才能定位错误behavior