Cが最高です
101日前原文(sqlite.org)
概要
- SQLiteはC言語で実装されている理由の解説
- パフォーマンス・互換性・依存性の低さ・安定性が主な理由
- オブジェクト指向言語や「安全な」言語で実装しない理由も説明
- Rustなど新しい言語への移行条件も記載
- 今後もC言語での開発継続予定
SQLiteがCで実装されている理由
- C言語はSQLiteのようなソフトウェアライブラリ実装に最適
- 2000年5月29日から一貫して汎用Cで実装
- 他言語への移行計画なし
主な理由
-
パフォーマンス
- 頻繁に利用される低レベルライブラリには高速性が必須
- Cは「移植可能なアセンブリ言語」と評される
- 他の言語も「C並みの速さ」とは言うが、「Cより速い」とは主張しない
-
互換性
- ほぼ全てのシステムがCで書かれたライブラリを呼び出し可能
- Javaで書かれた場合、Androidでは便利でもiPhoneでは利用不可
- Cで書くことで多様なプラットフォーム対応が可能
-
依存性の低さ
- Cで書かれたライブラリはランタイム依存が非常に少ない
- SQLiteの最小構成で必要な標準Cライブラリ関数はごくわずか
- 他のモダン言語は巨大なランタイム依存や多数のインターフェースが必要
-
安定性
- Cは「古くて退屈」な言語であり、仕様や挙動が安定
- 実装言語の仕様変更リスクが少なく、信頼性重視の開発に最適
なぜオブジェクト指向言語で実装しないのか
- C++やJavaで書かれたライブラリは同言語以外からの利用が困難
- Cならどんな言語からも呼び出し可能
- オブジェクト指向は設計パターンであり、Cでも実現可能
- オブジェクト指向だけが最良の設計手法ではない
- SQLite開発当時、Javaは未熟、C++は互換性問題が多発
- 現在も他言語への移行メリットはほぼなし
なぜ「安全な」言語で実装しないのか
- RustやGoなどの「安全な言語」はSQLite誕生から10年以上存在しなかった
- 安全な言語での再実装は新たなバグやパフォーマンス低下リスク
- 安全な言語は実行時検証による分岐追加があり、完全なテストが困難
- SQLiteはメモリ不足時も優雅に復旧する設計だが、安全な言語は通常abort
- Rustのような新言語は成熟・安定・移植性・ツール類がまだ十分でない
- Goは**assert()**の扱いがSQLiteの方針と合わないため移行は非現実的
Rustへの移行のための条件
-
Rustの成熟度・安定性の向上
-
他言語からの汎用ライブラリ呼び出し実現
-
組込み機器やOS非搭載デバイスでの動作実績
-
100%分岐カバレッジテスト対応ツールの整備
-
OOM(メモリ不足)時の優雅な復旧機構の実装
-
C並みの速度でSQLiteの処理を実現できること
-
Rustコミュニティからの提案や働きかけも歓迎
まとめ
- SQLiteはC言語による実装を今後も継続予定
- パフォーマンス・互換性・安定性・依存性の低さを重視
- 新言語への移行は慎重に検討される方針