0%

一、总论

内存管理的本质是资源管理,也就是很多程序最为重要的功能。

但是不同于 Python 或者 Java 这样有着很好内存抽象和比较大条的内存管理方式(动不动就在堆上分配空间),C++ 在更加“荒蛮”的内存上进行更加精细化的甚至还很有 C 特色的内存管理(并非 C++ 希望如此,只不过脱胎于 C 必然受到 C 的影响),是一件非常难的事情。

所以 C++ 内存管理看上去总是呈现一种“似乎解决了一个根本不会在 Java 中发生的问题”的模式。

二、RAII

Read more »

一、总论

我们常听一个说法“在语法上,C++ 是 C 的超集”,这句话的意思是说,C++ 继承并发展了 C 。这是十分有道理的事情,但是这个说法往往造成两个常见的误解:

  • C++ 继承 C 最重要的东西就是 C 的语法
  • C++ 是完全兼容 C 的

这两点其实并不正确。C++ 作为一门独立的语言,虽然起源于 C ,但是在设计思想上和 C 可以说是截然不同,但是又因为起源于 C ,在设计时又不可避免的带上了 C 的烙印,本文希望探讨一下 C++ 与 C 的继承和发展关系,故起名为“滥觞”。

这章可以看作是“CPP设计-寸步难行”的姊妹篇,这章介绍了 C 和 C++ 的不同,“寸步难行”介绍了 C 和 C++ 的相同之处。

Read more »

很像数学

lisp 真的很像数学,或许这就是 lisp 的特征。它像是一个从计算器程序变成的计算机一样有趣。而 C 则更像是一种由内存驱动变成的计算机。

另外一个很像数学的点就是,lisp 试图用最少的基本结构(可能是数据结构,也可能是过程结构)来描述最多的复杂结构,就像数学在用最少的公理来推导最多的定理一样。

数学家会详细研究房子着火之后的救火步骤,当房子安然无恙时,他们则会将房子点燃,然后心安理得地救火。

语言是什么

Read more »

一、再次回顾启动流程

1.1 stage 1

在学 OS 的时候我就已经写过一篇介绍启动流程的文章了,在我忙了一上午以后重新学了一遍,发现其实之前就已经学的十分详细了,属于是自己造自己的轮子了。不过再次回顾,尤其是结合了自己开发操作系统的经验,还是发现很多重点的,所以再来回顾一遍。

首先是关于启动最初,bios,MBR 和 grub 的区别

Read more »

一、总论

当我们提起 git 的时候,我们总说它是版本控制工具。但是版本控制工具到底是什么?我觉得是一种特化的数据库,我们根据版本号去查询对应的项目内容,这种特殊数据库用于进行代码管理。而对于 git,我愿意定义它为“分布式、并发、无锁数据库”。

Git 是 Linus 写出来的版本控制工具,其诞生的直接原因是原来为 Linux 进行版本控制的工具 BitKeeper 不再免费了。也就是说,git 的直接需求是 Linux 的版本控制,而 Linux 是世界上最复杂的开源项目之一,所以 git 的设计是较为彪悍的,它支持最为复杂的分布式并发开发,并且可以促进这种集市一般的开发文化。

正因为如此,我个人觉得 git 并不用户友好,它迫使每一个希望更好地利用 git 的用户,都需要去了解 git 的底层实现理解和 git 面临的现实需求。光是“指针分离”这一个常见的现象,如果希望合理的解释,那么就必须深入 git 的底层实现,在了解了指针引用,版本快照,追踪分支和版本快照等一系列实现知识后,还需要了解频繁切换分支,生成分支,并行开发,分布式开发等多个版本管理需求,才可以明白它为啥不把这种直接暴露底层实现的功能更好的封装一下。

总的来说,git 不够友好,不够简洁,并不是开发者的开发水平不行,而是其需求过于强了,所以不得不将工具设计得这么复杂。而如vscode 或者 IDEA 将 git 封装成更为易用的状态,但是这种方式往往限制了 git 的功能,其本质其实是限制了需求的强度。而一旦面对更高强度的需求,不得不承认 git 做得已经很“友好简洁”了。

Read more »

一、总论

如何熟悉工具呢?我觉得最为重要的是理解工具被设计和使用时的理念或者概念或者抽象,只要理解了工具中蕴含的理念是什么,对于具体的操作,就可以抄文档了。

linux 下的常见命令行工具有什么特点呢?这些常见的,简单的命令行工具,本质是 GNU/Linux 生态的一部分,他们的很多概念,本质是 Linux Kernel 的概念的延续和拓展。

GNU/Linux 的伟大真的是难以形容啊。


Read more »