Fork me on GitHub

C语言入门

前言

  计算机程序是一组计算机能识别和执行的命令。

  计算机语言经历了三个发展阶段:(1)机器语言;(2)符号语言;(3)高级语言。

  计算机直接识别和接受二进制代码称为机器指令。

  机器语言是计算机最原始的语言,直接使用二进制(0和1)编写的语言,是机器指令的集合。

  符号语言是用人类容易记忆的语言和符号来表示一组0和1的代码。

  高级语言不依赖于具体机器,用它写出的程序对计算机都使用,语言功能很强。

  高级语言经历了不同的发展阶段:(1)非结构化的语言。(2)结构化语言。(3)面向对象的语言。

C语言简介

  最初的C语言只是为了描述和实现UNIX操作系统提供一种工作语言而设计的。

  C语言主要特点是(1)语言简洁、紧凑,使用方便、灵活;2)运算符丰富;(3)数据类型丰富;(4)具有结构化的控制语句;(5)语法限制不太严格、程序设计自由度大;(6)C语言允许直接访问物理地址,能进行位操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作(7)C语言程序可移植性好;(8)生成目标代码质量高,程序执行效率高。

   一个C语言程序的结构特点如下:

    (1)一个程序由一个或多个源程序文件组成。其中,一个源程序文件由预处理命令、全局声明、函数定义组成。

    (2)函数是C程序的主要组成部分。函数是C程序的基本单位。

    (3)一个函数包括两部分:函数首部和函数体。其中,函数体分为声明部分和执行部分。

    (4)程序总是从main函数开始执行。

    (5)程序对计算机的操作是由函数中的C语句完成。

    (6)每个数据声明和语句的最后必须有一个分号。

    (7)程序应当包含注释。

  C语言程序编译过程分为四个步骤:预处理(Preprocessing)、编译(Compilation)、汇编(Assemble)、链接(Linking)。即如下图

  

          

   人生若只如初见,我们总是怀念第一次相见的感觉。正如学习C语言时所接触的第一个程序(万能的hello world)。本文以linux下环境下,编辑源程序(helloword.c)如下:

1 #include<stdio.h>
2 
3 int main(void)
4 {
5   printf("Hello World!\n");
6   return 0;        
7 }

  预处理:用于处理将所有的#include头文件以及宏定义替换成其真正的内容,并处理所有的条件编译指令。

# gcc -E helloworld.c -o helloworld.i

   编译:把高级语言翻译成机器语言的过程,即经过预处理后的程序转换成特定的汇编代码的过程。编译的过程实质上对预处理的程序做了:(1)词法分析;(2)语法分析;(3)语义分析;(4)优化后生成响应的汇编代码。

# gcc -S helloworld.c -o helloworld.s

   此处为该汇编代码如下:

 1 .file    "helloworld.c"
 2     .text
 3     .section    .rodata
 4 .LC0:
 5     .string    "Hello World!"
 6     .text
 7     .globl    main
 8     .type    main, @function
 9 main:
10 .LFB0:
11     .cfi_startproc
12     pushq    %rbp
13     .cfi_def_cfa_offset 16
14     .cfi_offset 6, -16
15     movq    %rsp, %rbp
16     .cfi_def_cfa_register 6
17     leaq    .LC0(%rip), %rdi
18     call    puts@PLT
19     movl    $0, %eax
20     popq    %rbp
21     .cfi_def_cfa 7, 8
22     ret
23     .cfi_endproc
24 .LFE0:
25     .size    main, .-main
26     .ident    "GCC: (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0"
27     .section    .note.GNU-stack,"",@progbits

  汇编:把汇编代码转换成机器语言,并产生目标文件(二进制格式)。

# gcc -c helloworld.s -o helloworld.o

   链接:把多个目标文件以及所需的库文件链接成为最终的可执行文件。

# gcc helloworld.o -o helloworld

  运行:直接运行可执行程序,如图下:

# ./helloworld

  综上所述,C语言编译过程经过预处理、编译、汇编、链接、运行,即可。很多时候,若源文件很多,则可以忽略一些中间过程,直接生成可执行文件,如下:

# gcc helloworld.c -o helloworld
# ./helloworld

结语

  通过深入分析C语言编译过程,能加深对C语言编译过程的预处理、编译、汇编、链接的理解,同时,增加对C语言程序调试时对问题的判断和修改,有助于提高自己的C语言编码能力。最后,每一次总结,总会有些感悟和理解,希望借此激励自己一点点进步。

 

参考文献

1.https://www3.ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html

 

posted @ 2018-11-23 22:09  lwei2  阅读(325)  评论(0编辑  收藏  举报