一、C语言的起源
- 时间/地点:1972年,贝尔实验室。
- 设计者:丹尼斯·里奇(Dennis Ritchie)与肯·汤普逊(Ken Thompson)。
- 背景:为开发UNIX操作系统而设计。
- 前身:在汤普逊发明的B语言基础上,增加了数据类型等特性,发展出C语言。
二、选择C语言的理由
- 设计特性
- 融合了计算机科学理论与实践的精华。
- 支持自顶向下的规划、结构化编程和模块化设计。
- 高效性
- 生成的目标代码紧凑、运行速度快,接近汇编语言效率。
- 可移植性
- 程序稍作修改或无需修改即可在不同平台编译运行。
- 强大而灵活
- 许多编译器和解释器本身就用C语言编写。
- 常用于操作系统、嵌入式系统等底层开发。
- 面向程序员
- 允许直接访问硬件、操控内存中的位和地址。
- 提供了丰富的运算符和控制结构。
- 缺点
- 指针操作复杂,容易引发内存错误。
- 某些运算符优先级不易记忆,需要编码时谨慎。
三、C语言的应用范围
- UNIX/Linux 操作系统:内核与大量系统工具。
- 嵌入式系统:单片机、家电、汽车电子等。
- 计算机游戏:游戏引擎、高性能核心模块。
- 机器人工程:运动控制、传感器处理。
- PC应用:办公软件、图形图像处理工具等。
- 计算机语言实现:很多高级语言的编译器和解释器由C开发。
四、计算机能做什么(基础概念)
- CPU的工作:不断从内存中获取指令并执行。
- 内部小工作区:由若干寄存器组成,用于暂存数据和地址。
- 一切皆数字:计算机中的数据和指令均以二进制数字形式存储和处理。
- 指令的存放:加载到寄存器的指令同样是数字形式。
五、高级语言与编译器
- 高级语言
- 用更抽象的方式描述程序行为,不直接依赖于特定CPU或指令集。
- 编译器的作用
- 将高级语言程序(源代码)翻译成计算机可直接执行的机器语言指令。
- 选用合适的编译器或编译器集合,可以把同一份高级语言代码转换成适合不同CPU的机器语言程序。
六、C语言标准
UNIX实现提供的C库逐渐成为事实上的“标准库”,随后由官方标准化:
- ANSI/ISO C 标准(C89/C90)
- 首次正式定义了C语言语法和C标准库。
- C99 标准
- 新增了行注释、可变长数组、内联函数等特性。
- C11 标准
- 增加了多线程支持、匿名结构体/联合体等。
七、使用C语言的7个步骤
- 定义程序目标:明确程序要完成什么功能,需求是什么。
- 设计程序:用流程图、伪代码或结构图规划程序架构。
- 编写代码:在编辑器中将设计转换为C语言源文件。
- 编译与链接
- 编译器将源代码转为机器码,检查语法有效性。
- 链接器合并目标代码、标准启动代码和库函数,生成可执行文件。
- 运行程序:在目标系统上执行生成的可执行文件。
- 测试与调试程序:验证程序逻辑正确性,排除语义错误和运行时错误。
- 维护与修改代码:根据需求变化或发现的缺陷进行迭代改进。
八、编程机制:编译与链接详解
8.1 目标文件、可执行文件与库
- C实现的流程:源代码经过编译和链接两步生成可执行程序。
- 目标文件(
.o或.obj):包含机器语言代码,但不可直接运行。 - 启动代码:充当程序与操作系统的接口,负责初始化环境后调用
main函数。 - 链接器:将目标代码、系统的标准启动代码和所需的库函数代码合并,形成完整的可执行文件。
8.2 在UNIX系统上的编译与处理
- 编辑源代码(如
prog.c)。 - 使用
cc命令编译:cc prog.c - 链接器生成可执行文件(通常为
a.out),并自动删除中间目标文件(.o)。
8.3 GNU编译器集合(GCC)与LLVM项目
- GNU项目:致力于开发大量自由软件的集合,GCC是其核心产物之一。
- GCC:支持多种硬件平台和操作系统,可通过
-std=c99、-std=c11等选项指定C标准。 - LLVM项目:与编译器相关的开源软件集合,前端工具
clang可编译C代码,同样支持多标准。 - 两者均可在类UNIX及Windows(通过MinGW等)下使用。
8.4 Linux系统中的C编译
Linux系统原生支持GCC,编译过程与UNIX类似:
gcc source.c -o program8.5 PC命令行编译器
- 在Windows下可通过MinGW或Cygwin获得GCC命令行环境。
- 使用
gcc命令编译源文件,生成.exe可执行程序。
8.6 集成开发环境(IDE)
- Windows常用IDE:Visual Studio、Code::Blocks、Dev-C++ 等。
- IDE内部封装了编辑、编译、链接、调试等工具,提供图形化界面,简化开发流程。
8.7 Macintosh中的C
- Xcode:macOS上的主要开发环境,集成了编辑器、
clang/gcc编译器和调试器。 - 也可通过终端直接调用
clang或gcc命令进行编译。
总结
C语言凭借其高效、灵活和可移植等优势,历经数十年仍在系统编程、嵌入式等领域占据重要地位。理解其起源、标准化历程、编译链接机制以及开发步骤,是学好C语言、写好C程序的坚实基础。