Computer-System Structures八大思想

简介: 编程指北-公众号的一段话很有感触:编译原理遇见算法

David Wheeler

All problems in computer science can be solved by another level of indirection

“计算机科学中遇到的所有问题都可通过增加一层抽象来解决”


侯捷老师所言:「学习需要明师。但是明师可遇不可求,所以退而求其次你需要好书,并尽早建立自修的基础。迷时师渡,悟了自渡,寻好书看好书,就是你的自渡法门。」


《计算机组成原理:硬件/软件接口》书中说的计算机系统结构的八个伟大思想:

image.png

看某篇拿了一堆offer的大佬说:

后面学习不论是计算机网络,还是操作系统,都对这几个思想印象深刻,感觉都是这几个思想的具体化实现,类似于 cache 或者 Redis 这样的技术,我认为实际上就是利用了加速大概率事件,和存储器层次的思想去进行设计和加速


编程指北-公众号的一段话很有感触:

编译原理遇见算法

当你学完有限状态机以后,你会发现以前觉得很牛逼正则表达式似乎自己也能用 DFA、NFA 实现一下了。状态机的思想在编程中很多地方都用得上。


比如解析 HTTP 协议,如果没学过状态机思想,你可能会一行行的 if/else 去做解析,这里最麻烦的地方在于,if/else 需要提前将 HTTP 头部字段都接收到再来判断,而我们知道 HTTP 基于 TCP,而 TCP 是流式传输,所以你很有可能是几个字符一组组接收到的,这个时候用 if/else 写出来就很难看了。


而用状态机编写起来代码就会非常优雅。状态的转移是由规则驱动的,接收到一个字符就判断一个,非常的方便。


继续学完语法分析,你会掌握递归下降分析这样非常重要的思想,你可以使用递归下降快速的实现四则运算计算器。


如果不用递归下降你可能需要先中缀表达式转后缀,然后求值,这是我们大一数据结构课写的,当时用栈写的,有点麻烦。后来学完编译原理,又用递归下降重写了一遍,区区几十行代码遍搞定。


还有一类场景在实际开发中的用的很多,比如淘宝、京东这样的电商,它们的营销规则有很多,比如满减、直减、跨店等等,这样的规则是不可能写死在代码里的。


那是怎么做的呢?


一般会实现一个配置系统,并设计一个DSL(领域特定语言)来表达这些规则,将规则直接配置到系统中,这样可以非常方便的修改,那么如何在代码里去解析 DSL 定义的规则呢?这就需要为 DSL 写一个语法解析器,这里就会用到语法分析的方法。


DSL(Domain Specific Language),它是一种用于某个特定领域的程序设计语言。这种特定于某个领域是相对于 C、C++、Python 这种通用语言而言的,通用语言可以在各个领域使用,我们熟悉的大多数程序设计语言都是通用语言,它们都是图灵完备的。


像我们平常经常使用的 JSON、SQL、HTML 这些都算是一种 DSL,你甚至可以尝试用递归下降去写一个 JSON、XML 解析器,这比写电商网站更有价值的。


继续往下学你会了解到抽象语法树 AST 如何生成、如何转化为中间代码、如何对中间代码优化、最终又是怎么生成机器指令的。


你会看到贪心算法在寄存器分配中的应用,也会看到图论中的可达性分析又是如何实现死代码消除。


相关文章
|
5月前
|
数据可视化 算法 Go
【博士每天一篇文献-实验】Exploring the Morphospace of Communication Efficiency in Complex Networks
这篇论文探讨了复杂网络中不同拓扑结构下的通信效率,并使用"效率形态空间"来分析网络拓扑与效率度量之间的关系,得出结论表明通信效率与网络结构紧密相关。
53 3
|
6月前
|
C++ 开发者
C++一分钟之-概念(concepts):C++20的类型约束
【7月更文挑战第6天】C++20引入了Concepts,提升模板编程的精确性和可读性。概念允许设定模板参数的编译时约束。常见问题包括过度约束、不完整约束及重载决议复杂性。要避免这些问题,需适度约束、全面覆盖约束条件并理解重载决议。示例展示了如何定义和使用`Incrementable`概念约束函数模板。概念是C++模板编程的强大力量,但也需谨慎使用以优化效率和代码质量。
130 0
|
7月前
|
算法 程序员 编译器
C++一分钟之概念(concepts):C++20的类型约束
【6月更文挑战第30天】C++20的Concepts革新了模板编程,允许更清晰地表达类型要求,提升代码可读性和编译错误反馈。本文探讨Concepts基础、应用场景、易错点及避免策略,展示如何通过概念定义如Iterable、Addable,创建更健壮的泛型代码,强调了理解和利用编译器错误信息的重要性,以及概念与类型别名的区别。Concepts现已成为现代C++程序员的关键技能。
191 0
|
机器学习/深度学习 人工智能 算法
第二周:神经网络的编程基础(Basics of Neural Network programming)
第二周:神经网络的编程基础(Basics of Neural Network programming)
195 0
第二周:神经网络的编程基础(Basics of Neural Network programming)
|
网络架构 Java Go
带你读《计算机体系结构:量化研究方法(英文版·原书第6版)》之一:Fundamentals of Quantitative Design and Analysis
本书堪称计算机系统结构学科的“圣经”,是计算机设计领域学生和实践者的必读经典。本书系统地介绍了计算机系统的设计基础、存储器层次结构设计、指令级并行及其开发、数据级并行、GPU体系结构、线程级并行和仓库级计算机等。本书内容丰富,既介绍了当今计算机体系结构的研究成果,也引述了许多计算机系统设计开发方面的实践经验。另外,各章结尾还附有大量的习题和参考文献。
|
算法 数据库
线性一致性与全序广播------《Designing Data-Intensive Applications》读书笔记12
上一篇聊了聊构建分布式系统所面临的困难,这篇将着重讨论构建容错分布式系统的算法与协议。构建容错系统的最佳方法是使用通用抽象,允许应用程序忽略分布式系统中的一些问题。
1502 0
|
存储
分布式系统的烦恼------《Designing Data-Intensive Applications》读书笔记11
使用分布式系统与在单机系统中处理问题有很大的区别,分布式系统带来了更大的处理能力和存储容量之后,也带来了很多新的"烦恼"。在这一篇之中,我们将看看分布式系统带给我们新的挑战。
1290 0
|
存储 数据库 索引
数据分区------《Designing Data-Intensive Applications》读书笔记9
进入到第六章了,我们要开始聊聊分布式系统之中的核心问题:数据分区。分布式系统通常是通过大规模的数据节点来处理单机没有办法处理的海量数据集,因此,可以将一个大型数据集可以分布在多个磁盘上,查询负载可以分布在多个处理器上。
1359 0
|
XML JSON 数据格式
编码与模式------《Designing Data-Intensive Applications》读书笔记5
进入到第四章了,本篇主要聊的点是编码(也就是序列化)与代码升级的一些场景,来梳理存储之中涉及到的编解码的流程。目前主流的编解码便是来自Apache的Avro,来自Facebook的Thrift与Google的Protocolbuf,在本篇之中,我们也会一一梳理各种编码的优点与痛点。
1322 0