受 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 進行重新開發,它還需要繼續發展

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280257.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280257.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280257.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

為什么 Random.Shared 是線程安全的

在多線程環境中使用 Random 類來生成偽隨機數時,很容易出現線程安全問題。例如,當多個線程同時調用 Next 方法時,可能會出現種子被意外修改的情況,導致生成的偽隨機數不符合預期。為了避免這種情況,.NET 框架引入了 Ra…

(3)Python3筆記之變量與運算符

一、變量 1). 命名規則: 1. 變量名不能使用系統關鍵字或保留關鍵字 2. 變量區分大小寫 3. 變量命名由字母,數字,下劃線組成但不能以數字開頭 4. 不需要聲明變量類型 是 a 1 非 int a 1 5. 查看變量內存地址 id(a), id(b) 6…

some demos

import ../css/detail.css;// 找到字符串中重復次數最多的字符 function findMax(str) {let maxChar ;let maxValue 1;if (!str.length) return;let arr str.replace(/\s/g, ).split();let obj {};for (let i 0; i < arr.length; i) {if (!obj[arr[i]]) {obj[arr[i]] …

WPF 實現視頻會議與會人員動態布局

WPF 實現視頻會議與會人員動態布局控件名&#xff1a;SixGridView作 者&#xff1a;WPFDevelopersOrg - 驚鏵原文鏈接[1]&#xff1a;https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用.NET40&#xff1b;Visual Studio 2019;接著上一篇是基于Grid實現的視頻查看感…

漢三水屬國(北地屬國、安定屬國)

漢三水屬國&#xff08;北地屬國、安定屬國&#xff09; 兩漢&#xff08;西漢、東漢&#xff09;400年中&#xff0c;由于各種原因&#xff0c;經常有成批的匈奴歸附漢朝&#xff0c;兩漢政府對他們采取了較為妥善的安置政策&#xff0c;其中最主要的措施是為他們設立專門的居…

《爆發》作者:大數據領域將有新贏家

本文講的是《爆發》作者&#xff1a;大數據領域將有新贏家,全球復雜網絡研究專家日前到訪中國&#xff0c;為其新作《爆發》作宣傳。他在接受國內媒體采訪時表示&#xff0c;未來可能有新公司取代谷歌、Facebook等公司&#xff0c;成為大數據領域的贏家。 《爆發》一書是一本討…

chromebook刷機_如何獲取Android應用以查看Chromebook上的外部存儲

chromebook刷機Android apps are a great way to expand the sometimes limited capabilities of Chromebooks, but they can be a problem if you store most of your data on an external medium—like an SD card, for example. Android應用程序是擴展Chromebook有時有限功能…

Stream流與Lambda表達式(四) 自定義收集器

一、自定義SetCustomCollector收集器 package com.java.design.Stream.CustomCollector;import java.util.*; import java.util.function.BiConsumer; import java.util.function.BinaryOperator; import java.util.function.Function; import java.util.function.Supplier; im…

ModelState.IsValid忽略型別的檢查錯誤

Web Api在Int或DateTime如果傳空值的話會自動幫忙設預設值&#xff0c;但是在ModelState.IsValid的時候&#xff0c;卻會出現型別上的錯誤.解決方式把Model改成正確&#xff0c;也就是預設允許可以為nullpublic class DemoModel { …

android 指紋添加_如何將手勢添加到Android手機的指紋掃描儀

android 指紋添加So you have a shiny new Android phone, equipped with a security-friendly fingerprint scanner. Congratulations! But did you know that, while useful on its own, you can actually make the fingerprint scanner do more than just unlock your phone…

關于前端性能優化

常用的優化有兩部分 第一&#xff1a;面向內容的優化 減少 HTTP 請求減少 DNS 查找避免重定向使用 Ajax 緩存延遲載入組件預先載入組件減少 DOM 元素數量切分組件到多個域最小化 iframe 的數量不要出現http 404 錯誤第二&#xff1a;面向 Server 縮小 Cookie針對 Web 組件使用域…

前端工程化:圍繞Jenkins打造工作流的過程

背景 1年前入職時&#xff0c;公司前端部門的靜態代碼部署都是用ftp工具拖拽部署&#xff0c;沒有記錄&#xff0c;沒有關聯&#xff0c;經常造成許多困擾的問題&#xff0c; 比如&#xff1a;今天有沒有其他人在我要部署的路徑上工作&#xff1f;我的代碼為啥被蓋掉了&#xf…

業務id轉密文短鏈的一種實現思路

業務場景&#xff1a; 買家通過電商app下單后&#xff0c;會受到一條短信&#xff0c;短信內容中包括改訂單詳情頁面的h5地址連接&#xff0c;因為是出現在短信中&#xff0c;所以對連接有要求&#xff1a;1.盡量短&#xff1b;2.安全性考慮&#xff0c;訂單在數據庫中對應的自…

百度高管:問心無愧

1月23日下午消息&#xff0c;今天下午&#xff0c;百度召開百家號2019內容創作者盛典&#xff0c;百度副總裁沈抖出席并發布演講。 就在前一天&#xff0c;一篇名為《搜索引擎百度已死》的文章刷屏&#xff0c;文中提到百度搜索有一半以上會指向百度自家產品&#xff0c;尤其百…

Vuex 學習筆記

Vuex 是什么&#xff1f; Vuex 是一個專為 Vue.js應用程序開發的狀態管理模式。由于SPA應用的模塊化&#xff0c;每個組件都有它各自的數據&#xff08;state&#xff09;、視圖&#xff08;view&#xff09;和方法&#xff08;actions&#xff09;&#xff0c;當項目內容越來越…

xdf文檔怎么轉換為pdf_如何將PDF文件和圖像轉換為Google文檔文檔

xdf文檔怎么轉換為pdfYou probably know you can create and edit documents with Google Docs, but you can edit more than just .doc files. Google Drive can also convert any PDF, JPG, PNG, or GIF into a document with fully editable text. Here’s how. 您可能知道可…

在現代 Windows 上使用經典 Windows 2000、XP、Vista 任務欄

你好&#xff0c;這里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;實用的工具和組件&#xff0c;希望對您有用&#xff01;前言您第一次使用的 Windows 是哪個版本的&#xff1f;我最早使用的 Windows XP&#xff0c;然后再經過 XP、7、8/8.1 、Windows 10&a…

oracle sys可以登錄,system權限不足,解決方法

今天在自己電腦上安裝了oracle 11g&#xff0c;安裝成功后發現 sys 可以正常登錄。system 無法登錄&#xff0c;顯示 ORA-01031: insufficient privileges(權限不足) select * from v$pwfile_users; 查看有sysdba權限的用戶 grant sysdba to system; 給system 授權sysdba權限…

airdroid黑屏_如何使用AirDroid從PC控制Android設備

airdroid黑屏AirDroid for Android replaces your USB cable for connecting to your PC. Transfer files back and forth, send text messages, play music, view your photos, and manage applications using a web browser or a desktop client. 適用于Android的AirDroid取代…