首页  

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

主要原因 

性能
兼容性
低依赖性
稳定性


1、性能
像 SQLite 这类库要求速度必须要快。
SQLite 速度很快,比文件系统快 35%
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 语言易于理解 

为何不使用面向对象的语言

a、用 C++ 或 Java 编写的库通常只能由以相同语言编写的应用程序使用。
  Java 编写的应用程序很难调用用 C++ 编写的库
  用 C 语言编写的库可以从任何编程语言调用
b、面向对象是设计模式,而不是编程语言。 
可以使用任何所需语言(包括汇编语言)进行面向对象编程
某些语言(例如:C++ 或 Java)可以使面向对象更容易
但仍然可以用像 C 这样的语言进行面向对象的编程。
c、面向对象不是唯一有效的设计模式。

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

d、SQLite 进行开发时,Java 还不是一门成熟的语言,
C++ 会成熟一点,但当时要找到两种能以 相同方式工作的 C++ 编译器比较困难。
相比之下,C 语言是个不错的选择 

为什么 不使用"安全"语言编写?
 使用“安全”语言不易发生内存泄露、数组溢出等的安全问题。  Rust 和 Go 等
a、SQLite 出现后的 10 年时间里,所谓的“安全”语言还不存在。
   虽然 SQLite 可以用 Rust 或者 Go 重新编写,但这样可能会引入更多难以修复的 Bug,进而会影响编码速度。

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

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

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

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

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

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

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

上一篇     下一篇
go程序设计语言前言

go程序设计语言01_01入门之hello

GO各版本新特性

go程序设计语言01_02入门之命令行参数

C程序设计语言笔记_00_序及引言

Go by Example