Recently, I planned to write a database project to improve my ability. It’s hard to start because I knows little about the structure of SQL, so first, I learnt SQLite. I write this article to steady what I‘ve learnt.
本来想用英语写,但是写到一半又改变主意,觉得还是中文吧,毕竟是笔记,中文我自己看起来更方便。唉、
SQLite是一个可以嵌入的数据库,但是它最基本的是可以在Terminal运行,使用命令行的方式,可交互的运行,就像python一样,SQLite也是一样,输入一行SQL语句,就执行一行SQL语句。
那么当我输入了一个SQL语句后,会发生如下的过程:
首先会有词法分析器将SQL语句分解成一堆词,然后语法分析器模块会将那些词变成语法树。此过程中需要产生更为简单的字节码。字节码就是相当于汇编代码(并不等用,只是用来理解)。
以上这些都是前端,用来处理SQL语句。下面说的都属于后端。
然后,生成的语法树再传给虚拟机模块(这里的虚拟机不是那个虚拟硬件的虚拟机),虚拟机的作用就是执行这些字节码。比如,
1 | string command = "mul" |
这就叫做虚拟机。
之前我被这个虚拟机的概念迷惑住好久,我一直以为字节码就是等同于汇编,然后字节码可以自己定义,那就不就得在硬件上再实现一套认识自己的字节码的东西吗?
后来才明白,你只要用高级编程语言里判断,遇到什么命令就去进行进行什么操作,而这些操作也是用编程语言写的,比如C++,到了最后,C++的编译器会帮你把它编译成汇编语言,不用自己翻译。
后端具体存储一般就是管理磁盘存储,而磁盘存储一般都是B树结构来方便查询。
还有就是页缓存功能,来负责页面的读写和缓存。
综上所述,一个数据库大概主要的模块包括:词法分析器、语法分析器、字节码生成器、虚拟机(执行字节码)、B树、页缓存。
下一篇文章,根据本次所学内容,列一个详细的模块结构图。