发布至今18年,为什么SQLite一定要用C语言来开发?


SQLite 选择 C 语言的理由是?为什么不选择 Go 或者 Rust?

1C 语言是最好的

SQLite 在 2000 年 5 月 29 日发布,并一直使用 C 语言实现。C 语言一直是实现 SQLite 这类软件库的最佳语言,目前还没有计划使用其他编程语言重新开发 SQLite。

C 语言是实现 SQLite 的最佳语言,原因有四:性能、兼容性、低依赖性、稳定性。

性能

像 SQLite 这样低级库速度必须要快。确实,SQLite 的速度很快,甚至比文件系统要快上 35%。

C 语言非常适合用来开发这种对速度有要求的代码。C 语言有时被称为“可移植的汇编语言”。它让开发人员能够尽可能地靠近底层硬件,同时仍然可以保持跨平台可移植性。

有些语言声称自己“与 C 语言一样快”,但却没有一门语言敢声称在作为通用目的编程时比 C 语言快,因为真的没有。

兼容性

几乎所有系统都能够调用用 C 语言编写的库,但不一定都能调用使用其他语言实现的库。

例如,使用 Java 开发的 Android 应用程序也能调用 SQLite(通过适配器)。如果使用 Java 开发 SQLite,那么对 Android 来说可能会更加方便,因为接口会更简单。但是,在 iPhone 上,应用程序是用 Objective-C 或 Swift 开发的,它们都不能调用使用 Java 编写的库。因此,如果使用 Java 开发,SQLite 将无法在 iPhone 上使用。

低依赖性

使用 C 语言开发的库没有太多运行时依赖。SQLite 的最低配置只依赖标准 C 库的以下几个例程:memcmp()、strcmp()、memcpy()、strlen()、memmove()、strncmp()、memset()。

对于更完整的版本,SQLite 还使用了 malloc() 和 free() 之类的例程以及用于打开、读取、写入和关闭文件的操作系统接口。但即便如此,依赖项的数量仍然非常少。相比之下,其他“现代”语言通常需要加载数兆字节带有成千上万个接口的运行时。

稳定性

C 语言陈旧乏味,是一门众所周知且易于理解的语言。这正好契合了 SQLite 的要求。如果没有 C 语言这样的语言,开发一个小型、快速、可靠的数据库引擎是很困难的。



小编给大家推荐一个学习氛围超好的地方,C/C++交流企鹅裙:487875004适合在校大学生,小白,想转行,想通过这个找工作的加入。裙里有大量学习资料,有大神解答交流问题,每晚都有免费的直播课程


2为什么 SQLite 不使用面向对象语言来开发?

一些程序员无法想象怎么可以使用非“面向对象”的语言来开发像 SQLite 这样的复杂系统。那么为什么 SQLite 没有用 C++ 或 Java 来开发?

使用 C++ 或 Java 编写的库通常只能由以相同语言开发的应用程序使用。使用 Haskell 或 Java 开发的应用程序很难调用 C++ 库。反过来,用 C 语言编写的库可以在其他编程语言中调用。

面向对象是一种设计模式,而不是一种编程语言。你可以使用任何语言(包括汇编语言)实现面向对象编程,只是某些语言(例如 C++ 或 Java)让面向对象变成变得更容易而已。但你仍然可以用像 C 这样的语言进行面向对象编程。

面向对象并不是唯一有效的设计模式。很多程序员被教导使用纯粹的面向对象方式进行思考。对象通常是分解问题的好方法,但对象不是唯一的方法,而且不一定是分解问题的最佳方法。有时候,过程式的代码更容易编写,更易于维护和理解,并且比面向对象的代码运行地更快。

最初在开发 SQLite 时,Java 还只是一门年轻而不成熟的语言。C++ 比较成熟一些,但正在经历成长的痛苦时期,当时很难找到两种能够以相同方式工作的 C++ 编译器。所以,在当时 C 语言绝对是一个更好的选择。现在这种情况没有那么明显,但现在重新开发 SQLite 几乎没有任何好处。


3为什么 SQLite 不使用“安全”的编程语言来开发?

最近人们对像 Rust 或 Go 这样的“安全”编程语言很感兴趣。在使用这些编程语言时,不太可能或至少很难犯下常见的编程错误,如内存泄漏或数组溢出。因此,经常会有人问为什么 SQLite 不使用“安全”的语言来开发。

在 SQLite 出现后的头 10 年中,所谓的安全的编程语言并不存在。SQLite 可以使用 Go 语言或 Rust 重新开发,但这样做可能会引入更多的错误,并且也可能导致代码运行得更慢。

安全的编程语言解决了容易出现的问题:内存泄漏、use-after-free 错误、数组溢出等。安全语言在解决 SQL 计算结果这个问题上,不会比普通的 C 语言代码提供更多的帮助。

安全语言通常声称自己有助于防止安全漏洞。话是没错,但 SQLite 并不是一个对安全特别敏感的库。如果应用程序运行了不受信任且未经验证的 SQL,那么它已经存在更大的安全问题(SQL 注入),没有哪一门“安全”的语言可以修复这个问题。确实,应用程序有时会从不受信任的来源导入 SQLite 二进制数据库文件,这样可能会带来潜在的威胁。但是,SQLite 中的这种代码路径是很有限的,并且经过了良好的测试。SQLite 还为希望读取不受信任数据库的应用程序提供了预验证例程,帮助应用程序检测潜在的威胁。

一些“安全”语言(例如 Go 语言)不喜欢使用 assert()。但是使用 assert() 是保持 SQLite 可维护性的重要前提。

安全语言会插入额外的分支逻辑来执行其他一些操作,比如验证数组访问是否越界。而在正确的代码中,永远不会使用这些分支逻辑。这也意味着机器代码不会 100%被测试到,而这却恰好是 SQLite 质量策略的重要组成部分。

安全语言通常希望在遇到内存不足(OOM)时终止运行。SQLite 却被设计成能够从 OOM 中正常恢复。目前还不知道该如何在安全语言中实现这一特性。

现在所有的安全语言都是新生儿。SQLite 的开发人员对计算机语言研究人员努力开发更容易、更安全的编程语言表示赞赏,我们鼓励他们继续努力下去。但在实现 SQLite 时,我们对陈旧乏味的 C 语言更感兴趣。


SQLite 可能有一天会使用 Rust 重新开发。由于 Go 语言讨厌 assert(),因此不太可能使用 Go 语言。但使用 Rust 也只是一种可能性。如果要使用 Rust 重新开发 SQLite,需要满足一些先决条件:

Rust 需要变得更成熟,减慢演化速度,并且要变得更加陈旧乏味。

Rust 需要证明它可以用于构建能够在所有其他编程语言中调用的通用库。

Rust 需要证明它可以生成适用于嵌入式设备的代码,包括缺少操作系统的设备。

Rust 需要提供可以对二进制文件进行 100%分支覆盖测试的工具。

Rust 需要提供一种能够从 OOM 错误中优雅恢复的机制。

Rust 需要证明它可以完成 C 语言在 SQLite 中所做的各种工作而不会降低性能。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容