受 SQLite 多年青睐,C 语言到底好在哪儿?
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
https://www.oschina.net/news/99485/why-is-sqlite-coded-in-c?p=3
受 SQLite 多年青睐,C 语言到底好在哪儿?的更多相关文章
- sqlite嵌入式数据库C语言基本操作(1)
sqlite嵌入式数据库C语言基本操作(1) :first-child{margin-top:0!important}img.plugin{box-shadow:0 1px 3px rgba(0,0, ...
- C语言到底怎么了?
自2015年11月开始,所有C语言系列都呈现出衰落之势.在超过15年的时间里,C语言在编程语言排行榜中的占比一直有15%-20%,但今年却突然急转直下,目前占比已不足10%,且目前看来回天乏力. 那么 ...
- sqlite嵌入式数据库C语言基本操作(2)
:first-child{margin-top:0!important}img.plugin{box-shadow:0 1px 3px rgba(0,0,0,.1);border-radius:3px ...
- 最受Java开发者青睐的Java应用服务器 —— Tomcat
Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选.今天,就一起来了解下 Tomcat. Java 应用服务器 Tomc ...
- 学了 C 语言到底能做什么, 能从事什么工作?
前言 经常有小伙伴问我,你是做C/C++的,那学C语言可以做什么呢?尤其是还在学校的同学,感觉自己学了很久,什么也做不了,一度怀疑自己是不是不适合程序员这个方向. 开始我都是直接说可以开发嵌入式啊,做 ...
- XtraFinder到底好在哪里(标签、隐藏文件、路径拷贝与显示、从这里启动)
类似Chrome的标签 自定义工具栏可添加一个快速显示与隐藏当前目录隐藏文件的功能 拷贝路径 cd 到当前目录这个功能跟PathFinder7类似 当然还有其他很多功能,比如这个返回上级目录,
- C语言到底怎么分配空间
程序分为:代码区.数据区.bss区.堆区.栈区.平时常用区分的是代码区.堆区.栈区.下面加上例子区分一下. 3 代码区顾名思义就是存放代码的,里面的内容是不可以修改的.例如你定义了一个变量char * ...
- hibernate的通配符比拼接sql到底好在哪?
Hibernate对于刚接触的人来说,通配符只是提供了另一种组合sql的方式.接触的久了,熟悉之后,才能够真正理解通配符在Hibernate中起到的作用 主要作用有两点: 1,避免sql注入 hibe ...
- python爬虫随笔(2)—启动爬虫与xpath
启动爬虫 在上一节中,我们已经创建好了我们的scrapy项目,看着这一大堆文件,想必很多人都会一脸懵逼,我们应该怎么启动这个爬虫呢? 既然我们采用cmd命令创建了scrapy爬虫,那就得有始有终有逼格 ...
随机推荐
- ArrayList、Vector和LinkedList的区别
ArrayList.Vector和LinkedList类均在java.util包下,均为可伸缩数组,即可以动态改变长度的数组 ArrayList和Vector都是基于存储元素的Object[] arr ...
- Xposed那些事儿 — xposed框架的检测和反制
之前看到有人发了关于使用xposed屏蔽抖音检测xposed的思路(https://www.52pojie.cn/thread-684757-1-1.html),贴出了部分伪代码,但觉抖音写的蛮有意思 ...
- linq的教程
http://www.cnblogs.com/lifepoem/archive/2011/12/16/2288017.html
- YCbCr to RGB and RGB toYCbCr
RGB => YCbCr: Y = 0.299R + 0.587G + 0.114BCb = -0.1726R - 0.3388G + 0.5114B + 128Cr = 0.5114R - 0 ...
- hdu4081 Qin Shi Huang's National Road System 次小生成树
先发发牢骚:图论500题上说这题是最小生成树+DFS,网上搜题解也有人这么做.但是其实就是次小生成树.次小生成树完全当模版题.其中有一个小细节没注意,导致我几个小时一直在找错.有了模版要会用模版,然后 ...
- (转载)TNSPING命令
Oracle Net 工具(命令)tnsping,是一个OSI会话层的工具,它用来: 1)验证名字解析(name resolution,当然是oracle自己的网络服务名) 2)远程的listener ...
- dotnetnuke7.3.3 下弹出对话框(dnnConfirm())的使用
今天用dnn做一个列表里边有一个删除操作,就想做个对话框确定是否删除? 正常理解马上想到js的confirm("")函数,但是发现Dnn把这个函数给重写啦,弹出的对话框竟然是英文的 ...
- H3C三层交换机S5500初始配置+网络访问策略
DHCP中继配置命令 dhcp relay address-check enable 命令用来使能DHCP 中继的地址匹配检查功能. undo dhcp relay address-check ena ...
- Java常用类(I)-时间和日期
java开发中,常涉及到时间的处理,这里就做一个总结,同样也是一个笔记. 相关类及概念 1. java.util.Date:表示特定的瞬间,精确到毫秒.由于API 不易于实现国际化,日期和时间字段之间 ...
- 【disconf】环境搭建【linux】
1.搭建disconf需要安装的配置. 安装Linux:CentOS7 安装Zookeeper:zookeeper-3.4.6 安装Redis:redis-3.0.0 安装N ...