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