51 张图片带你了解整个计算机科学技术栈(建议收藏~~)
这几天在网上发现了一份很有价值的文章,用可视化的方式带你了解整个计算机科学技术栈,分享给一起学习进步的你。
计算机科学的教学方式常常是将一系列互不相干的事实罗列出来,而它本应是将各种理念层层叠加起来。
我们将通过一些简单的图表,带领大家进行一次计算机科学全栈的可视化之旅,从而解决这个问题。这些图表将创建思维模型,希望这些模型能伴随您整个职业生涯。
文章很长,建议收藏起来慢慢看,也可当做备忘录随时温习。
好了,话不多说,我们直接开始吧!
1. 逻辑门(Logic Gates)
你操作的每台电脑的最底层都隐藏着一个出奇简单的东西。它是一个只有两种状态的开关:开和关。
在计算机中, 晶体管就像一个微型电子开关,可以根据电流是否流过它,每秒开关数十亿次。
这两种状态表示二进制信息,其中“开”状态表示二进制 1,“关”状态表示二进制 0。
多个晶体管组合在一起即可构成逻辑门(Logic gates)。 这些电路对二进制输入执行基本的布尔运算,并产生一个二进制输出。
共有七种基本逻辑门:
缓冲门(Buffer gate) 通常与这些门电路配合使用,它接收输入信号并原封不动地输出。缓冲门用于信号放大或隔离。

逻辑门进一步组合并集成到单个芯片(集成电路,或 IC)上,可以执行更复杂的功能。
通用逻辑门是指可以用来构建任何其他逻辑门的逻辑门。
属于这一类别的逻辑门有两种:

这意味着任何计算机,无论多么复杂,仅使用这些门电路就可以构建。
这岂不是很疯狂吗?
一个有趣的事实:用于导航阿波罗登月任务的阿波罗制导计算机 (AGC) 几乎完全由简单的 3 输入或非门集成电路构成。
2. 中央处理器(The Central Processing Unit, CPU)
计算机的中央处理器(CPU)是由实现逻辑门电路的集成电路组合而成的。
它由以下部分组成:
CPU 利用这些组件每秒可以执行数十亿条指令,充当计算机的大脑。

3. 图灵机(Turing Machine)
在深入探讨物理层(硬件)之上的其他层之前,我们需要了解计算在理论方面的含义。
1936 年, 艾伦·图灵描述了一种理论机器,称为图灵机,它由以下部分组成:
虽然纯粹是理论上的(因为没有无限长的物理磁带),但图灵机的概念告诉我们,任何复杂的问题都可以通过一系列逻辑运算来解决。
此外, 丘奇-图灵论题指出,任何可计算的问题都可以用图灵机计算,并且,只要有足够的时间和内存,任何通用计算机都可以解决这个问题。
丘奇-图灵论题(Church–Turing thesis)是关于可计算函数本质的论题 。它指出,定义在自然数上的函数能够被有效方法计算,当且仅当它能够被图灵机计算。该论题以美国数学家阿隆佐·丘奇和英国数学家艾伦·图灵的名字命名。在可计算函数的精确定义出现之前,数学家们经常使用非正式术语 “有效可计算” 来描述那些能够通过纸笔方法计算的函数。——维基百科

每一台现代计算机本质上都是图灵机的实用和有限版本。
4. 编程语言、编译器和解释器
由于直接处理二进制信息很困难,因此在其基础上构建了额外的抽象,即编程语言。
这些语言会被翻译成 CPU 可以执行的二进制机器指令。这一过程是通过编译器和解释器的程序完成的。
编译器将编程语言的整个源代码翻译成 CPU 可以直接运行的二进制可执行文件。C、C++、Rust 和 Go 都是编译型语言的例子。
这些程序可以生成速度很快的可执行文件,因为翻译在运行时之前只进行一次,但需要注意的是,必须为每个平台(Windows、Mac、Linux)重新编译代码,并且每次代码更改后都要重新编译。

解释器的工作方式与此不同。它们读取源代码,解析它,并立即执行指令,无需生成单独的可执行文件。
这样一来,代码就可以立即执行,相同的代码可以在任何地方运行。缺点是,由于在执行过程中需要进行代码转换,因此它们通常比编译后的代码速度慢。
Python、JavaScript 和 Ruby 都是解释型语言的例子。

5. 数据结构(Data Structures)
数据结构是组织数据的一种方式,以便程序能够高效地使用数据。
你必须了解的一些最重要的数据结构包括:
1. 数组(Array)
数组将数据元素存储在连续的内存空间中。它允许通过索引访问元素,但调整数组大小或在中间插入元素会消耗大量资源。

2. 链表(Linked list)
链表将数据元素存储为节点,节点之间通过指针连接。这使得插入和删除操作效率很高,但元素访问速度较慢。

3. 栈(Stack)
栈遵循后进先出(LIFO)原则来插入和删除数据元素。
这意味着栈中的元素移除顺序与插入顺序刚好相反。

4. 队列(Queue)
队列遵循先进先出(FIFO)原则来插入和删除数据元素。
这意味着先插入的元素会先被删除,后插入的元素必须等到所有较早的元素都被删除后才能被删除。

5. 哈希表(Hash Table)
哈希表使用哈希函数存储键值对数据。这使得它可以实现接近恒定时间的元素查找、插入和删除操作。

6. 树(Tree)
图将数据元素存储为节点和边,从而对它们之间的关系、网络、依赖关系和连接进行建模。

7. 图(Graph)
树是一种连通的、 无环的图, 其中任意两个顶点之间都只有一条路径。
它有一个被指定为根节点的节点,其余每个节点都恰好有一个父节点和零个或多个子节点。

8. 堆(Heap)
堆是满足堆性质的完全二叉树 ,以下是两种类型的堆:

6. 算法(Algorithms)
算法是解决问题的一段分步操作过程或序列。
它通过操作数据结构来解决问题。

算法的运行与实现它的编程语言或硬件无关。
一个好的算法应具备以下特点:
下面介绍计算机科学中的一些重要算法。
1. 递归算法
递归是指函数调用自身来解决同一问题的更小实例。每次递归调用都处理更简单的实例,直到达到可以直接解决的基本实例。
可以用递归解决的一些问题:

2. 排序算法
排序算法将元素按特定顺序(升序或降序)排列。

3. 二分查找
该算法通过不断将搜索区间减半,在已排序数组中查找目标值。
这使得它比逐个将目标值与数组中的每个元素进行比较来搜索目标值( 线性搜索 )效率更高。

7. 大 O 符号(Big-O Notation)
时间复杂度衡量运行时间如何随输入规模的增长而增长。
空间复杂度衡量的是内存使用量如何随输规模的增长而增长。
大 O 符号用于描述算法的时间复杂度和空间复杂度。这使我们能够了解当使用特定算法时,系统的性能将如何扩展。
以下是一些常用操作和算法的常见大 O 时间复杂度:
以下是一些常用操作和算法的常见大 O 空间复杂度:

8. 编程范式(Programming Paradigms)
编程范式是定义程序结构和解决方案表达方式的编程模型。
编程范式主要有两种类型:命令式和声明式。
1. 命令式编程
命令式程序通过逐步指令来明确控制流程和状态。
这些程序的重点是告诉计算机如何解决问题。
# 以命令式风格找出所有偶数的和total = 0for num in range(1, 7): if num % 2 == 0: total += num # 显式修改状态
2. 声明式编程
声明式程序则是指定目标结果,并让系统自己找出实现步骤。
这些程序的重点在于告诉计算机我们想要什么结果,而不是如何得到这个结果。
# 以声明式风格找出所有偶数的和total = sum(x for x in range(1, 7) if x % 2 == 0)
命令式编程还包括:
过程式编程:这种方法将代码组织成对数据进行操作的过程(函数)。

面向对象编程(OOP):这种方法将代码组织成对象,对象将数据和行为捆绑在一起。
了解面向对象编程的四大支柱非常重要,它们分别是:
(我用 “A PIE” 这个助记词来记住它们)

声明式编程包含一个称之为函数式编程的子类型, 值得了解一下。
函数式编程的关键原则包括:

9. 软件设计模式(Software Design Patterns)
构建现代系统不仅仅是编写能够运行的代码,更重要的是编写运行良好的代码,这意味着代码要易于维护、可扩展且灵活。而这正是软件设计模式发挥作用的地方。
设计模式是可重用的解决方案,它提供了以结构化方式解决常见软件工程问题的模板。

这些模式经常在面向对象编程 (OOP) 的背景下进行讨论,并分为三类:
创建型模式:这些模式侧重于对象是如何被创造出来的


结构型模式:这些模式侧重于对象的组织方式


行为型模式:这部分侧重于对象之间的交互方式


稍事休息
如果你觉得这篇文章对你有帮助,推荐你系统学习我正在持续更新的 《Python 设计模式(Design Patterns)》系列专栏。
这个专栏完整讲解 23 个 GoF 经典设计模式,并且:
很多程序员都听过设计模式,但真正能在项目中用出来的人并不多。这套专栏的目标就是:让你真正理解设计模式,并能在代码中用出来。
如果你希望提升代码架构能力、写出更优雅的 Python 项目,这个合集会非常适合你。
👉 专栏更新已接近尾声,23 个模式完整体系,一次学习,长期受益。
10. SOLID 原则
SOLID 原则是编写简洁易维护的面向对象编程代码的另一套重要设计原则。
SOLID 原则的 5 个要点如下:
前面描述的软件设计模式都遵循 SOLID 原则来实现其目标。

11. 数据库(Databases )
除了程序执行之外,计算机系统中的数据还必须存储起来以便日后检索。这就是数据库的作用所在。
一种常用的分类方法将数据库分为两类:
关系型/SQL 数据库: 这类数据库将数据组织成具有预定义模式的表格,并使用 SQL(结构化查询语言)进行查询。例如,PostgreSQL 和 MySQL。

非关系型/NoSQL 数据库: 这类数据库不依赖于固定的表结构,而是以灵活的方式存储和查询数据。例如,MongoDB、Redis 和 Cassandra。

关系型/SQL 数据库使用 ACID 事务来维护严格的数据完整性和关系。
ACID 这个缩写代表:

另一方面,NoSQL 数据库使用 BASE 事务来放宽一致性要求,从而实现高可扩展性和高性能。
BASE 这个缩写代表:

12. 网络(Networking)
现代系统由多台计算机组成,这些计算机可以相互高效地通信,而这正是网络概念发挥作用的地方。
开放系统互连(OSI)模型将网络通信标准化为七层,每一层都有其特定的功能。

TCP/IP 是另一种网络通信模型,它将 OSI 模型简化为四个实用层:

13. 使用并发和并行进行多任务处理
随着系统的发展,它们不仅需要完成一项任务,而且还必须同时执行多项任务才能有效地处理传入的负载。
这就涉及到多任务处理的概念,其中包括两个重要概念:
1. 并发(Concurrency)
这涉及到同时管理多个任务。这些任务可以通过上下文切换在单个 CPU 核心上交错执行,也可以在多个 CPU 核心/处理器上并行运行。

2. 并行(Parallelism)
这涉及到使用多个 CPU 核心或处理器同时执行多个操作。
并行是并发的一个子集。

虽然多任务处理效率很高,但也存在一些挑战。
由于多个线程或进程访问和操作共享数据,这可能会导致结果不一致甚至失败。
同步原语有助于解决这个问题,其中你必须了解的两种是:


14. 网络安全(Cybersecurity)
构建大型互联系统会增加数据被未经授权甚至恶意方访问的风险。
身份验证、授权和加密有助于防止这种情况发生。
身份验证(Authentication):验证个人身份的过程,可能涉及使用密码、指纹、一次性密码等。

授权(Authorization):指确定一方可以访问哪些数据或拥有哪些权限的过程。

加密(Encryption) 是将信息编码,使其只有授权方才能访问的过程。它涉及使用密钥通过加密算法对明文消息进行处理,从而生成密文。
解密则是使用正确的密钥来逆转这一过程。
加密算法大致可分为以下几类:
对称密钥加密(Symmetric key cryptography):这类算法使用相同的密钥进行加密和解密。例如,高级加密标准(AES)。

非对称加密或公钥加密(Asymmetric or Public Key Encryption):这些算法使用公钥进行加密,使用私钥进行解密。例如,RSA(Rivest-Shamir-Adleman)密码系统。

15. 新兴技术(Emerging Technologies)
除了传统的计算机技术栈之外,还有三种技术正在拓展计算机的运算能力。下文将对此进行探讨。
1. 人工智能(Artificial Inteligence)
人工智能使计算机能够在无需显式编程的情况下从数据中学习。
而机器学习(Machine Learning)则是人工智能的一个分支,它主要分为三大类:
监督学习(Supervised Learning):从已标记的数据样本中进行学习。例如,图像分类。

无监督学习(Unsupervised Learning):在未标记数据中发现模式。例如,聚类分析。

强化学习(Reinforcement Learning):通过反复试错进行学习。例如,训练机器人对杂货进行分类。

2. 区块链(Blockchain)
区块链是一种分布式、不可篡改的账本,用于记录跨多台计算机的交易。区块链中的每个区块都包含交易记录、时间戳以及指向前一个区块的加密链接。
区块链通过确保以下特性,实现分布式系统中的信任:

3. 量子计算(Quantum Computing)
量子计算机是计算机科学领域最雄心勃勃的项目之一,它利用量子力学来执行经典计算机无法进行的计算。

经典计算机使用比特(0 或 1)工作,而量子计算机使用量子比特或量子位,量子比特具有两个重要特性。

这些特性使得创建可在量子计算机上运行的各种算法成为可能。
量子计算机一旦建成,不会取代传统计算机,但能以指数级速度解决特定问题,从而带来以下结果:
更快的化学和药物发现
高效解决目前难以解决的优化问题,例如前面讨论过的旅行商问题。
破解现有加密方法
Ok,今天的分享就到此结束啦!
从晶体管的开关到量子比特的叠加态,我们已经探索了整个计算机科学体系,每一层都建立在下一层的基础上。
理解这些基础知识将帮助你把计算机看作是优雅的分层抽象系统,并成为一名更优秀的软件工程师。
Thanks for your reading!
Enjoying coding, my friends! 🧑💻🧑💻🧑💻💯💯💯
推荐阅读👇👇👇
🌟 如果你觉得这篇文章对你有帮助,并且愿意支持我的话,你可以: 🌟
• 👍 点赞,让文章获得系统推荐 • ⤴️ 分享,把内容传递给身边的伙伴 • ❤️ 推荐,让文章影响到更多人 • 👏 欢迎留言交流,一起拓展技术的边界

👇👇👇 Follow me,获取更多高质量干货分享,我们下期再见!


评论