mirror of
https://github.com/Aexiar/c.git
synced 2024-10-22 14:05:45 +02:00
c
This commit is contained in:
parent
fc44215fff
commit
e2b32dccbe
@ -327,7 +327,8 @@ int main() { // 定义主函数
|
||||
|
||||
> [!IMPORTANT]
|
||||
>
|
||||
> 不同类型(CPU 架构,如:x86_64、arm 等)的处理器有不同的机器语言指令集,指令集架构(ISA)决定了机器语言的具体形式;换言之,机器语言与特定硬件架构紧密相关,机器语言程序几乎没有可移植性。
|
||||
> * ① 不同类型(CPU 架构,如:x86_64、arm 等)的处理器有不同的机器语言指令集,指令集架构(ISA)决定了机器语言的具体形式。
|
||||
> * ② 换言之,机器语言与特定硬件架构紧密相关,机器语言程序几乎没有可移植性。
|
||||
|
||||
### 2.3.2 汇编语言(相当于人类的青铜&铁器时代)
|
||||
|
||||
@ -339,7 +340,8 @@ int main() { // 定义主函数
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> 汇编语言,目前仍然应用于工业电子编程领域、软件的加密解密、计算机病毒分析等。
|
||||
> * ① 汇编语言,目前仍然应用于工业电子编程领域、软件的加密解密、计算机病毒分析等。
|
||||
> * ② 汇编语言是编程语言的拓荒年代,它非常底层,直接和计算机硬件打交道,开发效率低,学习成本高。
|
||||
|
||||
### 2.3.3 高级语言(相当于人类的信息时代)
|
||||
|
||||
@ -353,7 +355,11 @@ int main() { // 定义主函数
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> 普遍使用的高级编程语言,有:C、C++、Java、Python、C#、JavaScript、Go、SQL 等。
|
||||
> * ① 普遍使用的高级编程语言,有:C、C++、Java、Python、C#、JavaScript、Go、SQL 等。
|
||||
> * ② C 语言是“[面向过程](https://zh.wikipedia.org/wiki/%E8%BF%87%E7%A8%8B%E5%BC%8F%E7%BC%96%E7%A8%8B)”的编程语言,已经脱离了计算机硬件,就可以设计和开发`中等`规模的程序。
|
||||
> * ③ Java、C++、Python、C# 等都是“[面向对象](https://zh.wikipedia.org/wiki/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1)”的编程语言(它们在“[面向过程](https://zh.wikipedia.org/wiki/%E8%BF%87%E7%A8%8B%E5%BC%8F%E7%BC%96%E7%A8%8B)”的基础上又增加了很多概念),就可以设计和开发`中大型`规模的程序。
|
||||
>
|
||||
> 总结:C 语言出现的时候,已经度过了编程语言的拓荒年代,具备了现代编程语言的特性,但是这个时候还没有出现“[软件危机](https://zh.wikipedia.org/wiki/%E8%BD%AF%E4%BB%B6%E5%8D%B1%E6%9C%BA)”,人们没有动力去开发更加高级的语言,所以也没有太复杂的编程思想;而之后出现的“[面向对象](https://zh.wikipedia.org/wiki/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1)”的编程思想解决了一部分在“[软件危机](https://zh.wikipedia.org/wiki/%E8%BD%AF%E4%BB%B6%E5%8D%B1%E6%9C%BA)”上的窘境。
|
||||
|
||||
### 2.3.4 总结
|
||||
|
||||
@ -413,6 +419,15 @@ int main() { // 定义主函数
|
||||
* `科学应用`:C 用于开发科学应用程序,例如:仿真软件和数值分析工具。
|
||||
* `金融应用`:C 用于开发股票市场分析和交易系统等金融应用。
|
||||
* ③ C 语言能够直接对硬件进行操作、管理内存以及和操作系统对话,这使得它是一种非常接近底层的语言,非常适合`写需要和硬件交互、有极高性能要求`的程序。
|
||||
|
||||
> [!NOTe]
|
||||
>
|
||||
> * C 语言毕竟诞生的时间非常早(20 世纪 70 年代),属于 70 后了,有点落后于现在的时代,虽然执行效率高,但是开发效率低。
|
||||
> * 随着时间的推移,人们在 C 语言的基础上增加了面向对象的机制([软件危机](https://zh.wikipedia.org/wiki/%E8%BD%AF%E4%BB%B6%E5%8D%B1%E6%9C%BA)),形成了一门新的编程语言,它的名字是 C++ 。
|
||||
> * 但是,C++ 的特性实在是太多了(因为 C++ 兼容 C,并增加了很多自己独有的特性,可以是当今最复杂的编程语言,没有之一),于是人们在 C++ 的基础上,删减了一些非必要的特性,就形成了 Java 和 C# ,也可以认为 Java 和 C# 是 C++--。
|
||||
> * 当然,近年来,Go 语言也很火,它的设计者之一就是 `Unix` 操作系统的的开发者`肯·汤姆森`(Ken Thompson),Go 诞生的背景据说是`肯·汤姆森`(Ken Thompson)在 C++ 委员会在为其演讲 C++ 新特性的时候,觉得 C++ 新特性太多太复杂,于是就开发了 Go 语言;所以,Go 语言中有很多 C 语言的身影。
|
||||
> * 其实,在 C 语言之后的许多编程语言,或多或少都参考了 C 语言;所以,编程界流传了一句话:汇编生 C ,C 生万物。
|
||||
|
||||
* ④ `学习 C 语言有助于快速上手其他编程语言`,如:C++(原先是 C 语言的一个扩展,在 C 语言的基础上嫁接了面向对象编程思想)、C#、Java 等,这些语言都继承或深受 C 语言的影响和启发。
|
||||
* ⑤ C 语言长盛不衰。`C 语言至今,依然是最广泛使用、最流行的编程语言之一`,包括很多大学将 C 语言作为计算机教学的入门语言,拥有庞大而活跃的用户社区,这意味着有许多资源和库可供开发人员使用。
|
||||
|
||||
@ -449,23 +464,6 @@ int main() { // 定义主函数
|
||||
* 版本 6(C23):2023 年发布,计划进一步增强安全性,消除实现定义的行为,引入模块化语言概念等新特性,使 C 语言在安全和可靠性方面有重大提高。
|
||||
* ……
|
||||
|
||||
## 3.5 C 语言的优缺点
|
||||
|
||||
* C 语言的优点:
|
||||
* ① 高效:C 语言生成的代码非常高效,执行速度快,这使得其非常适合用于操作系统、嵌入式系统等需要高性能的场景。
|
||||
* ② 灵活性和低级控制:C 语言允许直接操作内存和硬件,可以进行位操作、指针运算等底层编程,非常适合开发需要直接硬件控制的应用。
|
||||
* ③ 广泛的硬件和平台支持:C 语言几乎可以在所有的计算机平台上运行,从微处理器到超级计算机,几乎所有的硬件平台都支持 C 语言。
|
||||
* ④ 标准库丰富:C 语言有一个标准库(C Standard Library),提供了大量常用的函数,涵盖了文件操作、字符串处理、内存管理等多种功能。
|
||||
* ⑤ 语言简洁:语法规则相对简单,没有过多的复杂特性,使得语言本身比较容易学习和掌握。
|
||||
* C 语言的缺点:
|
||||
* ① 缺乏高级特性:和现代编程语言相对,C 语言缺乏一些高级特性,如:面向对象编程、垃圾回收机制等,这使得某些类型的应用程序开发可能会更加复杂。
|
||||
* ② 安全性问题:C 语言允许直接操作内存,可能会导致缓冲区溢出、空指针引用等安全漏洞。如果不小心处理,容易产生难以调试的错误和安全隐患。
|
||||
* ③ 手动管理内存:C 语言需要程序员手动管理内存,即:分配内存和释放内存,这增加了内存泄露和悬空指针等问题的风险。
|
||||
* ④ 错误调试困难:由于 C 语言的底层操作特点,调试和排查错误可能比较困难,尤其是在处理复杂指针和内存操作的时候。
|
||||
* ⑤ 标准库有限:虽然 C 语言的标准库涵盖了很多基本功能,但相比现代编程语言的标准库,功能相对有限,尤其是在网络编程、多线程编程等方面。
|
||||
|
||||
* 总而言之,C 语言的高效性和灵活性使其在系统级编程和嵌入式系统中占据重要地位,但其缺乏高级特性和内存管理上的挑战也使得开发过程可能更加复杂和容易出错。对于需要高性能和底层控制的应用,C 语言依然是不可替代的选择。
|
||||
|
||||
|
||||
|
||||
# 第四章:C 语言的学习技巧
|
||||
@ -495,15 +493,14 @@ int main() { // 定义主函数
|
||||
> * ① 很多编程语言都自带`标准库`(语言本身提供的,开箱即用),如:Java、Go 等。
|
||||
> * ② 很多编程语言都有自己的`包管理器`(用于管理第三方库)解决方案,如:Java 中的 Maven、Gradle、Go 中的 go modules ,JavaScript 的 npm 等。
|
||||
>
|
||||
> 遗憾的是,C 语言的`标准库`非常简单,只有`输入输出`、`文件操作`、`日期时间`、`字符串处理`、`内存管理`,对于`网络编程`、`GUI`、`数据库`、`并发`等`需要`大量的`第三方库`来扩展 C 语言的功能(Java 语言、Go 语言等其他的现代化高级编程语言,都是直接将这些常见的开发场景内置到标准库中,极大的降低了软件开发的难度)。C 语言的`第三方库`也非常稀少,更别提缺少自己的包管理器。
|
||||
> 遗憾的是,C 语言的`标准库`非常简单,只有`输入输出`、`文件操作`、`日期时间`、`字符串处理`、`内存管理`,对于`网络编程`、`GUI`、`数据库`、`并发`等`需要`大量的`第三方库`来扩展 C 语言的功能(Java 语言、Go 语言等其他的现代化高级编程语言,都是直接将这些常见的开发场景内置到标准库中,极大的降低了软件开发的难度)。C 语言的`第三方库`非常稀少,更别提缺少自己的包管理器。
|
||||
>
|
||||
> 不过,现在 C 语言社区也开始诞生了一些包管理器,如:Conan 和 vcpkg ;也有自己的项目构建工具,如:cmake 、xmake 等。
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> JavaScript 的作者 Brendan Eich(布兰登·艾奇) 曾经这么说:“与其说我爱 JavaScript,不如说我恨它。它是 C 语言和 Self 语言一夜情的产物。十八世纪英国文学家约翰逊博士说得好:"它的优秀之处并非原创,它的原创之处并不优秀。"”
|
||||
> JavaScript 的作者 Brendan Eich(布兰登·艾奇) 曾经这么说:“与其说我爱 JavaScript,不如说我恨它。它是 C 语言和 Self 语言一夜情的产物(致敬 C 语言)。十八世纪英国文学家约翰逊博士说得好:"它的优秀之处并非原创,它的原创之处并不优秀。"”
|
||||
>
|
||||
> 汇编生 C ,C 生万物!!!
|
||||
|
||||
## 4.2 项目构建工具和包管理器
|
||||
|
||||
@ -515,42 +512,47 @@ int main() { // 定义主函数
|
||||
|
||||
* `项目构建工具`是用于`自动化编译、测试、打包、部署`等一系列任务的软件工具。它们帮助开发者简化和管理整个软件开发生命周期中的各个步骤,尤其是在构建过程中的复杂性管理上。
|
||||
* 其功能有:
|
||||
* **编译代码**:自动编译源代码(如 :`.java`、`.c` 等)为可执行文件或中间文件(如:`.class` 文件)。
|
||||
* **运行测试**:集成单元测试、集成测试,自动运行测试用例并生成报告。
|
||||
* **打包**:将编译后的代码、依赖库、资源文件等打包成可分发的格式(如:JAR、WAR、可执行文件等)。
|
||||
* **依赖管理**:自动下载、更新和管理项目所需的第三方库(这部分功能有时与包管理器重叠)。
|
||||
* **部署**:将打包后的应用程序自动部署到测试环境、生产环境等。
|
||||
* **任务自动化**:除了基本的构建流程外,还可以自动化执行一些常见任务,如:代码检查、文档生成等。
|
||||
* 编译代码:自动编译源代码(如 :`.java`、`.c` 等)为可执行文件或中间文件(如:`.class` 文件)。
|
||||
* 运行测试:集成单元测试、集成测试,自动运行测试用例并生成报告。
|
||||
* 打包:将编译后的代码、依赖库、资源文件等打包成可分发的格式(如:JAR、WAR、可执行文件等)。
|
||||
* 依赖管理:自动下载、更新和管理项目所需的第三方库(这部分功能有时与包管理器重叠)。
|
||||
* 部署:将打包后的应用程序自动部署到测试环境、生产环境等。
|
||||
* 任务自动化:除了基本的构建流程外,还可以自动化执行一些常见任务,如:代码检查、文档生成等。
|
||||
* 常用的项目构建工具:
|
||||
* **Maven(Java)**:一个流行的构建工具和依赖管理工具,广泛用于 Java 项目。
|
||||
* **Gradle(Java、Kotlin、Groovy)**:一个灵活的构建工具,支持声明式的构建脚本和多种语言。
|
||||
* **Make(C/C++)**:一个经典的构建工具,使用 `Makefile` 来定义构建规则和依赖关系。
|
||||
* ~~**Ant(Java)**:早期流行的 Java 构建工具,通过 XML 配置文件定义构建过程。~~
|
||||
* **CMake(C/C++)**:一个跨平台的构建系统,帮助生成标准的构建文件,如:Makefile 或 Visual Studio 项目文件。
|
||||
* Maven(Java):一个流行的构建工具和依赖管理工具,广泛用于 Java 项目。
|
||||
* Gradle(Java、Kotlin、Groovy):一个灵活的构建工具,支持声明式的构建脚本和多种语言。
|
||||
* Make(C/C++):一个经典的构建工具,使用 `Makefile` 来定义构建规则和依赖关系。
|
||||
* ~~Ant(Java):早期流行的 Java 构建工具,通过 XML 配置文件定义构建过程。~~
|
||||
* CMake(C/C++):一个跨平台的构建系统,帮助生成标准的构建文件,如:Makefile 或 Visual Studio 项目文件。
|
||||
|
||||
### 4.2.3 包管理器
|
||||
|
||||
* `包管理器`是用于`自动化安装、更新、配置`和`管理软件包及其依赖关系`的工具。它主要关注于获取和管理项目所需的第三方库或工具包,并确保它们正确地集成到项目中。
|
||||
* 其功能有:
|
||||
* **依赖管理**:根据项目配置文件(如:`package.json`、`requirements.txt`)自动下载和安装项目所需的依赖包。
|
||||
* **版本控制**:管理包的版本,允许开发者指定某个特定版本或版本范围,确保项目中的库版本一致性。
|
||||
* **包的发布和共享**:开发者可以通过包管理器发布自己的库,并且共享给社区或组织内部的其他项目使用。
|
||||
* **环境隔离**:有些包管理器提供虚拟环境功能,可以将不同项目的依赖隔离开,避免版本冲突。
|
||||
* **更新和卸载**:包管理器可以自动更新依赖包到最新的兼容版本或卸载不再需要的包。
|
||||
* 依赖管理:根据项目配置文件(如:`package.json`、`requirements.txt`)自动下载和安装项目所需的依赖包。
|
||||
* 版本控制:管理包的版本,允许开发者指定某个特定版本或版本范围,确保项目中的库版本一致性。
|
||||
* 包的发布和共享:开发者可以通过包管理器发布自己的库,并且共享给社区或组织内部的其他项目使用。
|
||||
* 环境隔离:有些包管理器提供虚拟环境功能,可以将不同项目的依赖隔离开,避免版本冲突。
|
||||
* 更新和卸载:包管理器可以自动更新依赖包到最新的兼容版本或卸载不再需要的包。
|
||||
* 常见的包管理器:
|
||||
* **npm(Node.js)**:用于管理 JavaScript 和 Node.js 项目的包和模块。
|
||||
* **pip(Python)**:用于安装和管理 Python 的软件包。
|
||||
* **Composer(PHP)**:用于管理 PHP 项目的依赖库。
|
||||
* **NuGet(.NET)**:用于管理 .NET 平台上的包和库。
|
||||
* **RubyGems(Ruby)**:用于管理 Ruby 的库和工具包。
|
||||
* **Cargo(Rust)**:Rust 编程语言的包管理器和构建工具。
|
||||
* **Yarn(JavaScript)**:是 npm 的替代品,提供更快和更可靠的包管理体验。
|
||||
* **Homebrew(macOS)**:用于 macOS 系统下的命令行工具和库的管理。
|
||||
* npm(Node.js):用于管理 JavaScript 和 Node.js 项目的包和模块。
|
||||
* pip(Python):用于安装和管理 Python 的软件包。
|
||||
* Composer(PHP):用于管理 PHP 项目的依赖库。
|
||||
* NuGet(.NET):用于管理 .NET 平台上的包和库。
|
||||
* RubyGems(Ruby):用于管理 Ruby 的库和工具包。
|
||||
* Cargo(Rust):Rust 编程语言的包管理器和构建工具。
|
||||
* Yarn(JavaScript):是 npm 的替代品,提供更快和更可靠的包管理体验。
|
||||
* Homebrew(macOS):用于 macOS 系统下的命令行工具和库的管理。
|
||||
|
||||
### 4.2.3 注意事项
|
||||
|
||||
* 对于 `Java` 项目中的 `Maven` 或 `Gradle` 而言,其不仅是`项目构建工具`也是`包管理工具`。
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> * ① Gradle 也支持原生项目的开发,如:C 和 C++ 。
|
||||
> * ② 不过,业界开发 C/C++ 项目的项目构建工具和包管理器,通常使用 Cmake 和 Conan 。
|
||||
|
||||
|
||||
|
||||
# 第五章:附录
|
||||
|
@ -782,7 +782,7 @@ int main() {
|
||||
|
||||
|
||||
|
||||
# 第三章:二进制
|
||||
# 第三章:进制
|
||||
|
||||
## 3.1 概述
|
||||
|
||||
|
@ -296,7 +296,7 @@ int main() {
|
||||
>
|
||||
> 下文中提及的`指针`都是`指针变量`,不再阐述!!!
|
||||
|
||||
> [!WARNING]
|
||||
> [!IMPORTANT]
|
||||
>
|
||||
> 如果你观察仔细的话,你可能会发现`指针变量`和`普通变量`在内存中占据的存储空间是不一样的,那么到底是什么原因造成这样的结果?
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user