受 SQLite 多年青睐,C 语言到底好在哪儿?

王练
 王练
发布于 2018年08月31日
收藏 19

SQLite 近日发表了一篇博文,解释了为什么多年来 SQLite 一直坚持用 C 语言来实现,以下是正文内容:

C 语言是最佳选择

从2000年5月29日发布至今,SQLite 一直都是用 C 语言实现。C 一直是实现像 SQLite 这类软件库的最佳语言。目前,还没有任何计划要采用另外一门语言对 SQLite 进行重新开发。

为什么 C 语言是实现 SQLite 的最佳选择?原因主要体现在这几个方面:

  • 性能

  • 兼容性

  • 低依赖性

  • 稳定性

1、性能

像 SQLite 这类库要求速度必须要快。SQLite 的速度就很快,它比文件系统快 35%(详情可以参考这两个示例:Internal Versus External BLOBs 和 35% Faster Than The Filesystem)。

而 C 语言就能实现快速编写代码。C 语言通常被描述为“可移植性的汇编语言”。它使开发人员能够尽可能靠近底层硬件进行编码,同时仍然可以跨平台保持可移植性。

平常,我们可能会看到有人描述某种语言“像 C 语言一样快”,却不会看到有人说,作为通用目的编程时,会有一门语言“比 C 语言快”,因为这种语言真的不存在。

2、兼容性

几乎所有系统都能调用 C 语言编写的库,但其他语言就不尽然。例如,用 Java 编写的 Android 应用能够调用 SQLite(通过适配器)。 如果用 Java 编写 SQLite,那么对 Android 来说可能会更方便,因为这会使接口更简单。但在 iPhone 上,应用程序是用 Objective-C 或 Swift 编写的,它们都不能调用用 Java 编写的库。 因此,如果用 Java 编写,SQLite 将无法在 iPhone 上使用。

3、低依赖性

用 C 语言编写的库对运行时没有很强的依赖。SQLite 的最低配置也只要求 C 库中的这些方法:

  • memcmp()

  • memcpy()

  • memmove()

  • memset()

  • strcmp()

  • strlen()

  • strncmp()

在更完整的构建中,SQLite 也使用诸如 malloc() 和 free() 之类的库例程以及用于打开,读取,写入和关闭文件的操作系统接口。 但即便如此,依赖的数量也很少。

4、稳定性

C 语言易于理解,契合了 SQLite 的要求,适合 SQLite 的开发。

为什么 SQLite 不使用面向对象的语言?

开发人员可能无法想象用“非面向对象”来开发一个像 SQLite 这样复杂的系统会是什么样子。所以 SQLite 为什么不使用 C++ 或者 Java 来开发呢?

1、用 C++ 或 Java 编写的库通常只能由以相同语言编写的应用程序使用。 使用 Haskell 或 Java 编写的应用程序很难调用用 C++ 编写的库。 另一方面,用 C 语言编写的库可以从任何编程语言调用。

2、面向对象是设计模式,而不是编程语言。 你可以使用任何所需语言(包括汇编语言)进行面向对象编程。 某些语言(例如:C++ 或 Java)可以使面向对象更容易,但你仍然可以用像 C 这样的语言进行面向对象的编程。

3、面向对象不是唯一有效的设计模式。对象通常是分解问题的好方法。 但不是唯一的方法,也不总是分解问题的最佳方法。 有时好的旧程序代码更容易编写,更易于维护和理解,并且比面向对象的代码更快。

4、SQLite 进行开发时,Java 还不是一门成熟的语言,C++ 会成熟一点,但当时要找到两种能以 相同方式工作的 C++ 编译器比较困难。相比之下,C 语言是个不错的选择。虽然,这种情况现在有所改善,但为此对 SQLite 重新开发并没有什么好处。

为什么 SQLite 不使用"安全"语言编写?

使用“安全”语言不易发生内存泄露、数组溢出等的安全问题。最近,许多人好像对 Rust 和 Go 这样的“安全”语言感兴趣。但 SQLite 为什么不使用呢?

1、SQLite 出现后的 10 年时间里,所谓的“安全”语言还不存在。虽然 SQLite 可以用 Rust 或者 Go 重新编写,但这样可能会引入更多难以修复的 Bug,进而会影响编码速度。

2、“安全”编程语言解决简单的问题:像内存泄露、数组溢出等。在解决 SQL 计算结果这类的问题上,并不如 C 语言好用。

3、“安全”语言可防止安全漏洞,但 SQLite 并非一个对安全敏感的库。如果应用运行了不受信任的 SQL,那它可能已经存在更大的安全问题,而这是“安全”语言无法修复的问题。

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

5、“安全”语言会插入额外的机器分支来执行其他操作。但在正确的代码中,这些分支并不会被采用。所以机器代码不能 100% 被测试到,可这恰恰是 SQLite 质量检测的重要组成部分。

6、“安全”语言会在内存不足(OOM)时请求终止,而 SQLite 的设计是遇到 OOM 时能重新恢复。目前,还不知道如何利用“安全”语言实现这一点。

7、现有的“安全”语言都比较新,SQLite 开发员对它们的出现表示赞赏,但依然认为 C 语言更适合目前的开发工作。

文章最后表示,SQLite 可能会考虑使用 Rust 重新开发,但不太可能使用 Go 语言,因为它对 assert() 不友好。但其实 Rust 目前的条件并不足以对 SQLite 进行重新开发,它还需要继续发展,详情请查看原文

编译自:SQLite

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 开源中国社区 [http://www.oschina.net]
本文标题:受 SQLite 多年青睐,C 语言到底好在哪儿?
加载中

精彩评论

kardashian
kardashian
造句开始。受 WordPress 多年青睐,PHP 语言到底好在哪儿?
久永
久永
真是英雄所见略同。
比某些单位招聘时候讲起来侃侃而谈,实际上一知半解的CTO好多了去了。
NickWilde
NickWilde
sqlite 多是提供接口,这类面向过程的编程用 c 语言很合适啊。
小果汁儿
小果汁儿

引用来自“乌龟壳”的评论

说到 rust 的时候,回答的是啥啊~~~
至少 rust 的思想已经是超越 c 的了,至于实际能做到什么程度只能等时间检验了
狗屁。lisp了解一下,从上世纪50年代至今,编程语言连现有的轮子都没造完,更别说什么超越了。C活到现在,并不是因为思想没人超越。
乌龟壳
乌龟壳
说到 rust 的时候,回答的是啥啊~~~
至少 rust 的思想已经是超越 c 的了,至于实际能做到什么程度只能等时间检验了

最新评论(31

x
xzvbc
找马甲包上架开发者,想赚外快的来,IOS、安卓平台都有,有意者联系qq:1072454343
s
scorpion91

引用来自“乌龟壳”的评论

说到 rust 的时候,回答的是啥啊~~~
至少 rust 的思想已经是超越 c 的了,至于实际能做到什么程度只能等时间检验了
超越c?你有用过c语言?瞎说
eechen
eechen

引用来自“linux工人”的评论

sqlite 多是提供接口,这类面向过程的编程用 c 语言很合适啊。

引用来自“eechen”的评论

人家SQLite作者在这篇文章里说得已经很明白了:
面向对象是一种设计,跟语言无关.
开发者可以使用任何语言(包括汇编语言)进行面向对象编程.

别一提面向对象,就以为非C++/Java之流莫属,这是病,得治.
估计,这也是为什么SQLite作者要在SQLite官网写这篇文章的原因.

引用来自“linux工人”的评论

你懂不懂什么是面向过程,面向对象?喷过了哈。
就喜欢看SQLite作者这类大神怼那些C++/Java/Go/Rust粉.
NickWilde
NickWilde

引用来自“linux工人”的评论

sqlite 多是提供接口,这类面向过程的编程用 c 语言很合适啊。

引用来自“eechen”的评论

人家SQLite作者在这篇文章里说得已经很明白了:
面向对象是一种设计,跟语言无关.
开发者可以使用任何语言(包括汇编语言)进行面向对象编程.

别一提面向对象,就以为非C++/Java之流莫属,这是病,得治.
估计,这也是为什么SQLite作者要在SQLite官网写这篇文章的原因.
你懂不懂什么是面向过程,面向对象?喷过了哈。
eechen
eechen

引用来自“linux工人”的评论

sqlite 多是提供接口,这类面向过程的编程用 c 语言很合适啊。
人家SQLite作者在这篇文章里说得已经很明白了:
面向对象是一种设计,跟语言无关.
开发者可以使用任何语言(包括汇编语言)进行面向对象编程.

别一提面向对象,就以为非C++/Java之流莫属,这是病,得治.
估计,这也是为什么SQLite作者要在SQLite官网写这篇文章的原因.
robortly
robortly

引用来自“robortly”的评论

#C#语言爱好者 ,微软粉丝 # 路过....:bowtie:

引用来自“小果汁儿”的评论

哈哈,先学好.net core再说。
C# 大法好, .NET Core 也是未来的一个大趋势。
冰鸟
冰鸟

引用来自“句龙胤”的评论

好在历史遗留问题。
生态链太大,做什么东西都能全平台移植,从手机到太空飞行器。
语言本身比特朗普还不靠谱,烂的没有哪一处符合语言理论。
其他的语言输给C不是因为那语言不好,而是因为生态链。
语言只是工具,重点在于是否适用。C本来就是作为最接近机器码的高级语言设计的,甚至被很多人称为中级语言,和你说的语言理论背道而驰并不奇怪。另外提醒你的一点是,C在被设计出来的时候,你说的语言理论根本就只有点初步概念而已。
Raymin
Raymin

引用来自“乌龟壳”的评论

说到 rust 的时候,回答的是啥啊~~~
至少 rust 的思想已经是超越 c 的了,至于实际能做到什么程度只能等时间检验了

引用来自“小果汁儿”的评论

狗屁。lisp了解一下,从上世纪50年代至今,编程语言连现有的轮子都没造完,更别说什么超越了。C活到现在,并不是因为思想没人超越。

引用来自“Raymin”的评论

Lisp:学术圈自娱自乐的玩具,实战的不行!

引用来自“小果汁儿”的评论

别尼玛扯了,lisp早就用在生产中了,只是现在不流行而已。现在还有大型项目在用lisp,真是坐井观天。
动不动拿 Lisp 说事儿,就像动不动搬四大发明!
都啥年代了?产生了多少对社会产生深远影响的新技术?
只会翻无人问津的故纸堆,是另一种形式的坐井观天。
奉劝一句:无论新旧都有好东西,不要沉迷于任何之一,放开眼界多学习。
Raymin
Raymin

引用来自“乌龟壳”的评论

说到 rust 的时候,回答的是啥啊~~~
至少 rust 的思想已经是超越 c 的了,至于实际能做到什么程度只能等时间检验了

引用来自“小果汁儿”的评论

狗屁。lisp了解一下,从上世纪50年代至今,编程语言连现有的轮子都没造完,更别说什么超越了。C活到现在,并不是因为思想没人超越。

引用来自“Raymin”的评论

Lisp:学术圈自娱自乐的玩具,实战的不行!

引用来自“小果汁儿”的评论

别尼玛扯了,lisp早就用在生产中了,只是现在不流行而已。现在还有大型项目在用lisp,真是坐井观天。

引用来自“redfortress”的评论

你这句话正好证明了lisp实战不行了。

引用来自“小果汁儿”的评论

autuCAD没听过,Emacs没听过?你的见识是有多低啊,见识少就不要出来丢人现眼。

引用来自“chenzhengxi”的评论

有本事再举一例子
知名的应用真的不多了,别为难人家。

爱上一门语言是程序员最大的错!

多学几门儿,长长见识,就不会这样了。
Action_-_
Action_-_

引用来自“kardashian”的评论

造句开始。受 WordPress 多年青睐,PHP 语言到底好在哪儿?

引用来自“极品渣子”的评论

能介绍一下还有比php更简便开发和部署web的言语吗?
真没有...
返回顶部
顶部