Hatena::ブログ(Diary)

モメないためのメモ

2014-12-10

Learning PostgreSQL from README

この記事は、PostgreSQL Advent Calendar 2014の12/10分の記事です。

前口上

12/5はPostgreSQLカンファレンス2014講演をさせていただきました。ニッチな内容にもかかわらずたくさんの方に聞いていただいて、本当にありがとうございました。その後、懇親会では「Learning English from PostgreSQL」というタイトルのLTを4分50秒という完璧タイムに納めたにもかかわらず、パイ×2を味わってきました。

このLTは「PostgreSQLからDBじゃないことを学んだって良いじゃないか」という当日の思いつきだったんですが、PostgreSQLの詳細な作りやいろんな仕様はやっぱりちゃんと学ばないとね、ということで、この記事ではソフトウェアにつきものの「READMEファイル」に着目してみます。

README とは

Wikipediaで「README」を検索すると、以下のような説明が出てきます。

リードミー(Readme)とは、ソフトウェアを配布する際の添付文書のひとつ。配布物の一般的な情報を記載したファイルである。多くの場合、そのソフトウェアインストールし使用する前に読むべきものとされている。

「read me」ってくらいなので、「まずはこれを読め!質問はそれからだ!」ですよね。いきなりソフト使って使い方分からないと不平を言うよりも、進んでREADMEを読みましょう。最近流行のGitHubなんかでは、READMEをマークダウンで書いておくとリポジトリメインページでフォーマットして表示してくれたり、ややリッチな傾向もありますが、PostgreSQLのREADMEは硬派にプレーンテキストです。

PostgreSQLのREADMEファイル

PostgreSQLのソースを展開して(またはgit cloneなどで)できたディレクトリに入り「find . -name 'README*'」などとしてREADMEを探すと、ちょうど64個みつかりました。全部で1万行を超えていて、ちょっとしたプログラムよりも全然大きいですね。以下の表に、READMEファイルのパスと内容を整理してみました。

No.ファイル名内容行数
1READMEPostgreSQLの概要27
2README.gitgitリポジトリにINSTALLファイルがない説明14
3contrib/READMEcontribツールの概要(詳細はドキュメントに移管)28
4contrib/start-scripts/osx/READMEOS X用の起動スクリプト3
5doc/src/sgml/README.linksSGML文書のリンク46
6src/backend/access/gin/READMEGINインデックス379
7src/backend/access/gist/READMEGiSTインデックス419
8src/backend/access/hash/READMEHASHインデックス467
9src/backend/access/heap/README.HOTヒープのHOT更新499
10src/backend/access/heap/README.tuplockヒープのタプルロック139
11src/backend/access/nbtree/READMEB-Treeインデックス622
12src/backend/access/spgist/READMESP-GiSTインデックス373
13src/backend/access/transam/READMEトランザクション管理802
14src/backend/catalog/READMEシステムカタログ111
15src/backend/executor/READMEエグゼキュータ202
16src/backend/libpq/README.SSLlibpqSSL接続60
17src/backend/nodes/READMEノードシステム(PostgreSQL自前のOOP的機構)80
18src/backend/optimizer/READMEオプティマイザ816
19src/backend/optimizer/plan/READMEプランナ158
20src/backend/parser/READMEパーサ30
21src/backend/port/darwin/READMEDarwin依存のコード36
22src/backend/regex/README正規表現298
23src/backend/replication/READMEレプリケーション99
24src/backend/snowball/READMEワードステミング49
25src/backend/storage/buffer/README共有バッファ管理282
26src/backend/storage/freespace/README空き領域マップ196
27src/backend/storage/lmgr/README内部レベルのロック機構(LWLockやスピンロックなど)639
28src/backend/storage/lmgr/README-SSISSI TX分離レベル629
29src/backend/storage/lmgr/README.barrierメモリバリア199
30src/backend/storage/page/READMEページ管理63
31src/backend/storage/smgr/READMEストレージマネージャ58
32src/backend/utils/fmgr/READMESQL関数呼び出し機構556
33src/backend/utils/mb/READMEマルチバイト文字関連ソースの説明20
34src/backend/utils/mb/conversion_procs/README.euc_jpエンコード変換関数の追加方法83
35src/backend/utils/misc/READMEGUCパラメータ実装295
36src/backend/utils/mmgr/READMEメモリアロケータ431
37src/backend/utils/resowner/READMEリソースオーナによるクリーンアップ機構86
38src/bin/pgevent/READMEWindowsイベントログ用DLL20
39src/interfaces/ecpg/README.dynSQLECPGの動的SQL11
40src/interfaces/ecpg/preproc/README.parserECPG特有のパース処理42
41src/interfaces/ecpg/test/connect/README接続テストの説明9
42src/interfaces/libpq/READMEディレクトリの内容3
43src/interfaces/libpq/test/READMElibpq用テストスイート7
44src/pl/plperl/READMEPL/Perl10
45src/pl/plpython/expected/READMEPL/Pythonのバージョン別テスト予想結果ファイル11
46src/pl/tcl/modules/READMEPL/Tcl18
47src/port/README環境差吸収用ライブラリlibpgport32
48src/test/isolation/READMEテストツールTX分離性)117
49src/test/locale/READMEテストツールロケール28
50src/test/locale/de_DE.ISO8859-1/READMEテストツール(de_DE.ISO8859-1ロケール4
51src/test/locale/gr_GR.ISO8859-7/READMEテストツール(gr_GR.ISO8859-7ロケール4
52src/test/locale/koi8-to-win1251/READMEテストツール(koi8-to-win1251ロケール6
53src/test/mb/READMEテストツール(マルチバイト文字)10
54src/test/regress/READMEテストツールスレッド3
55src/test/thread/READMEテストツールロケール54
56src/timezone/READMEタイムゾーン42
57src/timezone/tznames/READMEタイムゾーン略名31
58src/tools/findoidjoins/README開発用ツール(findoidjoins:OID列の結合調査)208
59src/tools/ifaddrs/README開発用ツール(ifaddrs:IPv4/6アドレス調査)12
60src/tools/make_diff/README開発用ツール(make_diff:diff一括取得)39
61src/tools/msvc/README開発用ツールMS VCビルド103
62src/tools/pginclude/README開発用ツール(pginclude:#includeクリーンアップ55
63src/tools/pgindent/README開発用ツール(pgindent:インデント整形)110
64src/tutorial/READMESQLチュートリアル16
Total 10,299

最大のREADMEはsrc/backend/optimizerの816行で、次点はsrc/backend/access/transam/READMEの802行です。やはりプラン生成とトランザクション管理はそれだけで仕様も実装も大変ということですね。また、src/backend/storage/lmgr以下に合計1268行分のREADMEがあります。PostgreSQLが内部的に使用しているロック機構がいかに複雑で難しいか、こんなところからも分かります。

これらのREADMEはほとんどが英語で書かれているので、きちんと理解するには

PostgreSQLの知識
アーキテクチャや機能、用語は全ての基本ですね。
英語力
文学的な文章ではないので、技術用語に慣れればそれほど難しくないです。
一般的なC言語プログラミングスキル
C言語でのデーモンプログラム作成やIPCに関する知識があると理解しやすいかと。
RDBMS一般の知識
トランザクションや結合、SQL仕様などはやはり前提知識として必要です。

といったものが必要になります。src/backend/executor/READMEやsrc/backend/optimizer/READMEなどは個人的に和訳したものもあるので、「他は大体分かるんだけど英語がな〜」という方向けに機会を見て公開できればと思っています(他が分かる人は英語もできそうな気もしますが)。

まとめ

PostgreSQLの詳細な実装を知りたい場合、最終的にはソースコードを読むことになるのですが、その背景にある理論や仕様、実装変遷の経緯などまでソースコードから読み解くのはとても大変です。もしその機能/ツールにREADMEがある場合は、一度その中身を 読んでみることをお勧めします。

明日は、nuko_yokohamaさんです。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/s87/20141210/1418203870
リンク元