From 29925c1ceab01259ea798d34cf3ddfc903bd4eb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E5=A4=A7=E4=BB=99?= <1900919313@qq.com> Date: Tue, 13 Aug 2024 15:06:00 +0800 Subject: [PATCH] c --- docs/notes/01_c-basic/00_xdx/index.md | 116 ++++++++++++++++++++++++-- 1 file changed, 109 insertions(+), 7 deletions(-) diff --git a/docs/notes/01_c-basic/00_xdx/index.md b/docs/notes/01_c-basic/00_xdx/index.md index 905d359..bb49521 100644 --- a/docs/notes/01_c-basic/00_xdx/index.md +++ b/docs/notes/01_c-basic/00_xdx/index.md @@ -3,6 +3,10 @@ > * ① C 语言是一门`面向过程`的`编译型`的`编程语言`,其最大特点在于 `运行速度极快`,仅次于`汇编语言`,这使得 C 语言在需要高性能的场景中得到广泛应用,如:操作系统、硬件驱动程序和嵌入式系统。然而,`开发效率较低`也是 C 语言的一大特点,程序员需要手动管理内存和处理低级别的操作,这对编程能力要求较高。 > * ② C 语言不仅仅是一门`编程`语言,更是计算机行业的`核心`语言。它是计算机专业的基础课程,无论是操作系统的构建、硬件驱动的开发,还是数据库系统的实现,都离不开 C 语言的支持。`学习 C 语言` 不仅是掌握编程技能的必经之路,也是深入理解计算机底层原理的关键。如果忽视了 C 语言的学习,将难以深入理解计算机系统的工作原理,也很难在计算机行业中取得长远的发展。 +> [!NOTE] +> +> 总结就是一句话:C 语言重要(赞),很重要(大赞),非常重要(非常赞),绝对重要(无敌赞),史无前例的重要(一赞到底)!!! + # 第一章:计算机组成原理 @@ -392,18 +396,45 @@ int main() { // 定义主函数 # 第三章:初识 C 语言 -## 3.1 C 语言的由来 +## 3.1 C 语言究竟是一门怎样的编程语言? + +* 对于绝大多数程序员而言,C 语言是学习编程的第一门语言,很少有不了解 C 语言的程序员。 + +> [!NOTE] +> +> 许多著名编程语言的创造者和计算机科学领域的大佬都有学习和使用过 C 语言,如:詹姆斯·高斯林(James Gosling,Java 之父),比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup,C++ 之父),吉多·范罗苏姆(Guido van Rossum,Python 之父),林纳斯·托瓦兹(Linus Torvalds,Linux 之父)等。 + +* C 语言除了能让我们了解编程的相关概念,带领我们走进编程的大门,还能让我们明白程序的运行原理,如: + * ① 计算机的各个部件是如何协同工作的? + * ② 程序在内存中是一种怎样的状态? + * ③ 程序在计算机中到底是如何执行的,以及它的生命周期是什么? + * ④ 操作系统和应用程序之间,又有着怎样的爱恨情仇? + * ⑤ ... + +* 这些底层知识决定了我们的发展高度,也决定了我们的职业生涯。如果我们希望能在计算机行业中长远的发展,就必须学习这些相关的底层知识。 + +> [!IMPORTANT] +> +> 这些底层知识,包括不限于:数据结构和算法、计算机组成原理、操作系统、计算机网络、设计模式以及编译原理(了解即可)。 + +* C 语言的概念少,词汇少,只包含了基本的编程元素,相对比较简单。对于初学者来说,学习 C 语言的时间短,成本小。 + +> [!NOTE] +> +> 很多人之所以觉得 C 语言难,就是因为栽倒在 C 语言的指针那边(相对比其他的现代化编程语言而言,C 语言的指针确实足够底层和麻烦,需要掌握的细节很多);但是,一旦有所突破,学习之路就会一马平川。 + +## 3.2 C 语言的由来 * 1969 年,美国贝尔实验室的`肯·汤姆森`(Ken Thompson)和`丹尼斯·里奇`(Dennis Ritchie)一起开发了 Unix 操作系统。Unix 最初是使用`汇编语言`编写的,依赖于计算机硬件。为了程序的`可读性`和`可移植性`,它们决定使用高级语言重写。但是。当时的高级语言无法满足他们的要求,`肯·汤姆森`就在 BCPL 语言的基础上发明了 `B` 语言。 * 1972 年,`丹尼斯·里奇`(Dennis Ritchie)在 `B` 语言的基础上重新设计了一种新的语言,这种新语言取代了 `B` 语言,即 `C` 语言。 ![](./assets/20.png) -* 1973 年,`整个 Unix 系统都使用 C 语言重写`。 +* 1973 年,`整个 Unix 系统都使用 C 语言重写(重构)`,大大增强了 Unix 在不同硬件平台的可移植性,这标志着 Unix 的初步成熟,也标志着 C 语言的初步成熟(因为 C 语言可以用于大型项目开发了)。 > [!NOTE] > -> C 语言最初是作为 Unix 系统的开发工具而发明的。 +> C 语言最初是作为 Unix 系统的开发工具而发明的,它的初衷非常简单,就是被设计成一种非常高效的、可以操作硬件的系统级编程语言,然后帮助团队开发 Unix 操作系统。 * 此后,这种语言快速流传,广泛用于各种操作系统和系统软件的开发,如:Unix、MS-DOS、Microsoft Windows 以及 Linux 等。 @@ -411,7 +442,7 @@ int main() { // 定义主函数 * 1988 年,美国国家标准协会(ANSI)正式将 `C 语言标准化`,标志着 C 语言开始稳定和规范化。 -## 3.2 为什么要学习 C 语言? +## 3.3 为什么要学习 C 语言? * ① `C 语言具有可移植好、跨平台的特点`:用 C 语言编写的代码可以在不同的操作系统和硬件平台上编译和运行。 @@ -442,8 +473,9 @@ int main() { // 定义主函数 * ④ `学习 C 语言有助于快速上手其他编程语言`,如:C++(原先是 C 语言的一个扩展,在 C 语言的基础上嫁接了面向对象编程思想)、C#、Java 等,这些语言都继承或深受 C 语言的影响和启发。 * ⑤ C 语言长盛不衰。`C 语言至今,依然是最广泛使用、最流行的编程语言之一`,包括很多大学将 C 语言作为计算机教学的入门语言,拥有庞大而活跃的用户社区,这意味着有许多资源和库可供开发人员使用。 +* ⑥ C 语言`容易学习`,适合入门。和 Java、C++、Python 等更加现代化的高级编程语言相比,C 语言涉及的概念少,附带的标准库小,整体比较简单,容易学习,非常适合初学者入门。 -## 3.3 计算机语言排行榜 +## 3.4 计算机语言排行榜 * [TIOBE](https://www.tiobe.com/tiobe-index/) 是一个流行编程语言排行,每月更新。排名权重基于世界范围内工程师数量,Google、Bing、Yahoo! 、Wikipedia、Amazon、Youtube 和百度这些主流的搜索引擎,也将作为排名权重的参考指标。 @@ -453,9 +485,77 @@ int main() { // 定义主函数 ![](./assets/23.png) -## 3.4 C 语言的版本选择 +## 3.5 C 语言到底能做什么? -* 随着微型计算机的日益普及,出现了许多 C 语言版本(标准): +### 3.5.1 概述 + +* 我们知道,这个世界上的编程语言太多太多。其中,最流行的编程语言就是 [TOBIE](https://www.tiobe.com/tiobe-index/) 榜单上的前 50 名。 +* 从应用的范围上来讲,编程语言大致可以分为以下两类,如下所示: + * ① `通用型编程语言`:这些语言设计的目的是能够用于开发多种类型的应用程序,不局限于某个特定领域。它们通常拥有丰富的库和框架支持,可以应用于系统编程、应用开发、Web开发、数据分析等多个领域。 + * ② `专用型编程语言`:这些语言是为了解决特定领域的问题而设计的,通常在该领域中表现出色。虽然它们可以在一定程度上用于其他领域,但其核心设计和优化是针对某个特定应用场景的。 + +* 常见的`专用型编程语言`,如下所示: + +| 专用型编程语言 | 描述 | +| -------------- | ------------------------------------------------------------ | +| SQL | 专门用于数据库查询和管理,尽管可以嵌入其他编程语言中,但其主要应用是数据库操作。 | +| R | 主要用于统计分析和数据可视化,广泛应用于数据科学和研究领域。 | +| MATLAB | 主要用于数值计算、算法开发和数据可视化,广泛应用于工程和科学领域。 | +| VHDL/Verilog | 用于硬件描述和数字电路设计,主要应用于电子工程领域。 | + +* 常见的`通用型编程语言`,如下所示: + +| 通用型编程语言 | 描述 | +| -------------- | ------------------------------------------------------------ | +| Python | 广泛应用于Web开发、数据科学、自动化脚本、人工智能等。 | +| Java | 用于企业级应用、移动应用开发(Android)、Web 开发等。 | +| C++ | 可用于系统编程、游戏开发、嵌入式系统等多个领域。 | +| JavaScript | 最初用于 Web 前端开发,现在也广泛用于服务器端(Node.js)、桌面应用开发(Electron)等。 | + +> [!NOTE] +> +> C 语言是一门通行型的编程语言,并没有针对某个领域进行优化。但是,也有几个领域是 C 语言使用最多的地方。 + +### 3.5.2 C 语言的常见应用领域 + +* C 语言的常见应用领域,如下所示: + * ① 单片机或嵌入式开发:单片机通常是一个集成度较高的微控制器,资源有限,如:家电控制、自动化设备、传感器数据采集、智能玩具、汽车电子。嵌入式系统是一个计算机系统,嵌入在更大设备中,用来执行专门的任务。它通常包含硬件和软件两部分,具有专用性、实时性、资源受限等特点,如:消费电子(如智能手机、智能手表)、医疗设备、工业控制系统、汽车电子系统(ECU、ABS)、物联网设备等。 + * ② ~~上位机开发(桌面软件开发)~~:其实,这部分的市场已经被其它编程语言蚕食了,如:C++ 的 QT、GTK,Java 的 Swing 、JavaFx,Dart 的 Flutter ,因为 C 语言太过于底层,本身不直接支持跨平台,而且没有丰富的库和框架支持。 + * ③ 系统组件开发: + * 基础组件,如:文件系统等。 + * 核心算法,如:加密/安全算法(MD5、SHA、AES、RSA、SSL)等。 + * 硬件驱动,如:声卡驱动、显卡驱动、网卡驱动等。 + * 通信协议,如:TCP/IP协议族(UDP、DNS、路由选择)、HTTP/HTTPS 等。 + * ④ 开发操作系统:这是 C 语言的初衷,它就是为开发操作系统而生的。 + * ⑤ 开发其它编程语言: + * 有些编程语言的编译器(解释器)和标准库就使用 C 语言开发,如: Python、PHP、Rust、Perl。 + * 有些编程语言是在 C 语言的基础上进行的扩展,如: C++、Objective-C、Swift。 + * ⑥ 信号处理:C 语言在电气工程领域也有很多用途,它可以使用信号处理算法来管理微处理器、微控制器等集成电路。 + * ⑦ 音视频处理:C 语言的速度非常快,能够快速地对音频和视频数据进行处理。音频和视频数据通常比较大,需要高效的算法和数据结构来处理,而C语言运行速度非常快,能够及时处理这些数据。C 语言提供了丰富的底层库和工具,如:FFmpeg、OpenCV 等,这些库和工具可以方便地对音频和视频数据进行编码、解码、剪辑、处理和转换等操作。 + * ⑧ 数据库开发:数据库是软件领域的基础设施,它的性能直接影响整个应用程序的运行效率,所以必须使用一种高效的语言进行开发。使用 C 语言开发的数据库有:MySQL、SQLite、PostgreSQL 等。 + * ⑨ ... + +> [!IMPORTANT] +> +> 虽然 C 语言的开发场景貌似看起来很多;但是,使用 C 语言的场景几乎就是:底层/系统开发 + 关键组件/模块的开发 + 贴近硬件的开发,这些开发场景非常关注运行效率,或者响应时间,或者硬件资源。 + +## 3.6 不学 C 语言,行吗? + +* C 语言实在是太老了,如果不打算搞嵌入式开发,即便学了,一时半会也用不上。但是,几乎所有大学的计算机/软件专业都将 C 语言作为必修课,这又是为什么呢? +* 其实,是因为 C 语言是一门基础语言,很多其它的课程都依赖 C 语言。如果你不了解 C 语言,很多课程你是理解不了的,如下所示: + * ① 编译原理课程通常以 C 语言为例讲解,因为 C 语言的编译过程相对简单、规范和透明,适合教学。 + * ② 数据结构课程通常使用 C 语言编程,因为 C 语言比较底层,能够让大家看到数据结构的各种细节。另外,数据结构是一种被频繁调用的组件,必须要追求效率,C 语言再合适不过了。 + * ③ 学习操作系统原理(内存、进程、线程、通信等)也要具备 C 语言基础,否则是学不明白的。 +* C 语言是一门面向计算机的语言,它能帮助我们快速了解底层。而其它的高级语言(Python、Java、C# 等)是面向用户的,它能让我们快速上手,搞出点实用的工具来,比如:桌面软件、网站、APP 等。 +* 借助 C 语言学习原理,相当于修炼内功。使用其它语言开发程序,相当于精通招式。一个既有扎实“内功”又精通“招式”的程序员,无疑能够更好地应对各种编程挑战。 +* 从整体上讲,计算机软件大概可以分为两种: + - 一种是基础设施,如:操作系统、数据库、浏览器、云计算系统、大数据系统、编译器/编程语言、通信协议、区块链、标准库/运行库、算法实现等。 + - 一种是应用软件,如:桌面软件、APP、网站、小程序等。 +* 内功不扎实的话,开发一般的应用软件是没问题的。但是,如果想要开发高性能的软件,或者开发基础设施,那是绝对是不行的。 + +## 3.7 C 语言的版本选择 + +* 随着微型(个人)计算机的日益普及,出现了许多 C 语言版本(标准): * 版本 1(K&R C):K&R C 指的是 C 语言的原始版本。1978年,C 语言的发明者布莱恩·柯林(Brian `K`ernighan)和丹尼斯·里奇(Dennis `R`itchie)合写了一本著名的教材《C 编程语言》(The C programming language)。 @@ -480,6 +580,8 @@ int main() { // 定义主函数 # 第四章:C 语言的学习技巧 + + ## 4.1 如何学习 C 语言? * 对于大部分的初学者, 学习 C 语言的目的可能是为了成为一名合格的程序员,开发出优秀的软件。但是,在学习了 C 语言的基本语法后,却发现只能在`控制台`(`黑底白字`)上玩玩,没有漂亮的用户界面以及人性化的交互。于是,开始学习数据结构、算法、数据库、操作系统,越陷越深,越来越迷茫,不知道学习 C 语言能做什么,认为学习编程很难,开始怀疑自己,直到放弃!!!