C语言是最好的

\\

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语言这样的语言,开发一个小型、快速、可靠的数据库引擎是很困难的。

\\

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

\\

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

\\

  1. 使用C++或Java编写的库通常只能由以相同语言开发的应用程序使用。使用Haskell或Java开发的应用程序很难调用C++库。反过来,用C语言编写的库可以在其他编程语言中调用。\\t
  2. 面向对象是一种设计模式,而不是一种编程语言。你可以使用任何语言(包括汇编语言)实现面向对象编程,只是某些语言(例如C++或Java)让面向对象变成变得更容易而已。但你仍然可以用像C这样的语言进行面向对象编程。\\t
  3. 面向对象并不是唯一有效的设计模式。很多程序员被教导使用纯粹的面向对象方式进行思考。对象通常是分解问题的好方法,但对象不是唯一的方法,而且不一定是分解问题的最佳方法。有时候,过程式的代码更容易编写,更易于维护和理解,并且比面向对象的代码运行地更快。\\t
  4. 最初在开发SQLite时,Java还只是一门年轻而不成熟的语言。C++比较成熟一些,但正在经历成长的痛苦时期,当时很难找到两种能够以相同方式工作的C++编译器。所以,在当时C语言绝对是一个更好的选择。现在这种情况没有那么明显,但现在重新开发SQLite几乎没有任何好处。\

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

\\

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

\\

  1. 在SQLite出现后的头10年中,所谓的安全的编程语言并不存在。SQLite可以使用Go语言或Rust重新开发,但这样做可能会引入更多的错误,并且也可能导致代码运行得更慢。\\t
  2. 安全的编程语言解决了容易出现的问题:内存泄漏、use-after-free错误、数组溢出等。安全语言在解决SQL计算结果这个问题上,不会比普通的C语言代码提供更多的帮助。\\t
  3. 安全语言通常声称自己有助于防止安全漏洞。话是没错,但SQLite并不是一个对安全特别敏感的库。如果应用程序运行了不受信任且未经验证的SQL,那么它已经存在更大的安全问题(SQL注入),没有哪一门“安全”的语言可以修复这个问题。确实,应用程序有时会从不受信任的来源导入SQLite二进制数据库文件,这样可能会带来潜在的威胁。但是,SQLite中的这种代码路径是很有限的,并且经过了良好的测试。SQLite还为希望读取不受信任数据库的应用程序提供了预验证例程,帮助应用程序检测潜在的威胁。\\t
  4. 一些“安全”语言(例如Go语言)不喜欢使用assert()。但是使用assert()是保持SQLite可维护性的重要前提。\\t
  5. 安全语言会插入额外的分支逻辑来执行其他一些操作,比如验证数组访问是否越界。而在正确的代码中,永远不会使用这些分支逻辑。这也意味着机器代码不会100%被测试到,而这却恰好是SQLite质量策略的重要组成部分。\\t
  6. 安全语言通常希望在遇到内存不足(OOM)时终止运行。SQLite却被设计成能够从OOM中正常恢复。目前还不知道该如何在安全语言中实现这一特性。\\t
  7. 现在所有的安全语言都是新生儿。SQLite的开发人员对计算机语言研究人员努力开发更容易、更安全的编程语言表示赞赏,我们鼓励他们继续努力下去。但在实现SQLite时,我们对陈旧乏味的C语言更感兴趣。\

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

\\

  1. Rust需要变得更成熟,减慢演化速度,并且要变得更加陈旧乏味。\\t
  2. Rust需要证明它可以用于构建能够在所有其他编程语言中调用的通用库。\\t
  3. Rust需要证明它可以生成适用于嵌入式设备的代码,包括缺少操作系统的设备。\\t
  4. Rust需要提供可以对二进制文件进行100%分支覆盖测试的工具。\\t
  5. Rust需要提供一种能够从OOM错误中优雅恢复的机制。\\t
  6. Rust需要证明它可以完成C语言在SQLite中所做的各种工作而不会降低性能。\

英文原文:https://sqlite.org/whyc.html

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

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

    SQLite 近日发表了一篇博文,解释了为什么多年来 SQLite 一直坚持用 C 语言来实现,以下是正文内容: C 语言是最佳选择 从2000年5月29日发布至今,SQLite 一直都是用 C 语言 ...

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

    SQLite 近日发表了一篇博文,解释了为什么多年来 SQLite 一直坚持用 C 语言来实现,以下是正文内容: C 语言是最佳选择 从 2000 年 5 月 29 日发布至今,SQLite 一直都是 ...

  3. mac sqlite可视化工具_Navicat for SQLite 12 for mac(强大数据库管理及开发工具)

    Navicat for SQLite 12 Mac版是Mac平台上的一款专为SQLite设计的强大数据库管理及开发工具,Navicat for SQLite 12 Mac版可以用于版本2或3的SQLi ...

  4. RDBMS之SQL:SQL语言的各种方言的简介(MySQL/Hive SQL/PQL/OracleSQL/SQLite影响力排序)、主流语言的对比之详细攻略

    RDBMS之SQL:SQL语言的各种方言的简介(MySQL/Hive SQL/PQL/OracleSQL/SQLite影响力排序).主流语言的对比之详细攻略 目录 SQL语言的各种方言的简介 1.My ...

  5. 华为鸿蒙OS 2.0 发布,18点18分开放源代码

    作者 | 罗燕珊.赵钰莹.蔡芳芳 9 月 10 日,在华为开发者大会 2020 上,华为消费者业务 CEO 余承东宣布推出鸿蒙 OS 2.0 版本(HarmonyOS 2.0).据 InfoQ 向华为 ...

  6. android sqlite 打包 xe,C++ Builder XE10快速开发关于sqlite数据库APP应用发布小结

    因为C++ Builder XE10资料一直较少,所以作为C++ Builder业余fans,有必要为这冷门提供一些技术支持,与小伙伴们一起成长! 本视频系列,主要是讲解C++ Builder XE1 ...

  7. 迅雷发布了自主研发的TCFS协议,有意转型区块链开发的必看

    一直以来,人们都在说区块链会成为互联网的第二时代.但至少在短期内,还看不到区块链取代现行互联网的苗头.其中一个重要原因是,区块链自身的很多基础设施都还没完善起来,整个系统很多地方还磕磕绊绊,一些应用甚 ...

  8. 就在刚刚,百度重磅发布《深度学习中文教程实战版》,对外免费开发!

    很多小伙伴在后台给我留言,深度学习对零基础技术小白太不友好了-确实,晦涩的理论.冗长的代码.复杂的调试.鱼龙混杂的资料...搞懵了不少同学- 有办法吗?个人认为还是有的,比如大可不必一上手就选择难啃的 ...

  9. 在元宇宙里怎么交朋友?Meta发布跨语种交流语音模型,支持128种语言无障碍对话...

    来源:AI前线 本文约1500字,建议阅读5分钟 本文为你介绍 XLS-R--一套用于各类语音任务的新型自监督模型. 改名 Meta 之后,Facebook 的元宇宙愿景正在一点点实现.这一次,Fac ...

最新文章

  1. 提交响应后无法调用sendredirect_微服务的那些事(三),微服务的远程调用方式。RPC和HTTP...
  2. Java自带的常用工具
  3. JavaScript版代码执行
  4. MySQL 获得当前日期时间 函数
  5. 【操作系统】—进程同步和进程互斥
  6. 转:Patch打补丁学习笔记
  7. 易班应用开发教程php,易班 开发 java开发入门教程
  8. 二代测序方法:DNA测序之靶向重测序
  9. Python学习-if语句
  10. Zabbix监控通过企业微信报警
  11. HBase的regionServer
  12. SCI论文发表的流程是怎样的?
  13. 交联型金属卟啉基聚酰亚胺PPBPI-H)PPBP-Mn;PBP-Fe;PPBPI-Fe-CR;PPBPI-Mn-CR产品-齐岳供应
  14. 笃行致远,人大金仓荣获“2021年度卓越表现数据库”
  15. java毕业设计 springboo疫情温度打卡健康评测系统 (3)系统后台管理功能
  16. linux更新网卡驱动
  17. Sql SqlServer 脏读、 不可重复读和幻读
  18. matlab 保存当前图像,Matlab保存图像的方法总结
  19. CALayer之anchorPoint分析
  20. windows安装Cygwin教程

热门文章

  1. UA OPTI570 量子力学2 物质波与物质粒子
  2. UA MATH567 高维统计IV Lipschitz组合4 对称群上的均匀分布
  3. 认识mongodb文档的动态模式
  4. 首次使用Cesium加载3D数据成功
  5. 初次使用CxImage类库、VC6配置UNICODE的方法
  6. 【BZOJ5335】【TJOI2018】—智力竞赛(floyd传递闭包+二分图匹配)
  7. WPF 自定义控件的坑(蠢的:自定义控件内容不显示)
  8. 如何认识TOS----DSCP 对照表
  9. PXE自动化装机(4)
  10. redis常用数据结构解析