文件中的魔数

操作系统
跟 Windows 不同,在 Linux 中的文件扩展名仅仅是方便用户肉眼判断类型而已,将扩展名换掉并不会影响使用。 本质上,所有文件的内容都是以二进制保存的。程序之所以能将文件识别成不同的类型,无非就是不同类型的文件内容有区别于其他类型的特征。举个简单的例子,现在有一个系统,文件类型只有两种,那我 …...
Read more →

栈实现的表达式求值

编译原理 算法与数据结构
后进者先出,先进者后出,这就是数据结构中的"栈"。栈是一种相当简单的数据结构,但应用十分广泛,例如编程语言中的函数调用栈、浏览器的前进后退功能。本文讲的是栈的另一个常见应用场景,编译器利用栈实现表达式求值。初次见到这种实现思路的时候,我不禁叫绝,一个简单的栈还能玩出花。 例如,一 …...
Read more →

cbc 编译器

编译原理
cbc 编译器是《自制编译器》中实现的。由于 cbc 编译器是在 32 位机器上工作的,而现在大部分都是 64 位,即使按照官方文档进行处理,编译时也会出现各种错误,因此想到了用 docker 搭建 32 位的系统。 $ docker run -d -ti --name cbc -v …...
Read more →

远程 coding 实现

工具
出于现实的考虑,不得不使用多台性能不怎么样的电脑一起玩耍,主要还是为了分摊机器的内存。最先考虑到的是 docker,毕竟现在运行环境都是用 docker 部署的,我想通过docker run -v 远程目录:容器目录 image一条命令来实现,果真是图样图森破,sometime …...
Read more →

词法分析

编译原理
一个简单的词法分析程序如下: 开始; 调用识别器; 判断是否为关键字或标识符,如果是,跳转到步骤 4;如果否,跳转到步骤 5; 查关键字表(KT表,keyword table),如果是关键字则记录该标记该值为K.TOKEN;否则查填标识符表(IT表,identifier table),识别该值为 …...
Read more →