Linuxカーネルのプログラミングスタイル

6549 ワード

Linuxカーネルのプログラミングスタイル
http://www.linuxforum.net/forum/gshowflat.php?Cat=&Board=program&Number=393381&page=7&view=collapsed&sb=5&o=all&fpart=
 
原文は/usr/src/linux/Dcumentation/CodingStyleに会います。
		Linux      
この短い文書はLinuxカーネルプログラミングにおいて推奨されるプログラミングスタイルを記述するために使われます。プログラミングのスタイルはとても個人的です。
私の考えを変えたくないです。押し付けがましい誰にでもあげますが、これは私が守らなければならないコードの中で守られています。
他の部分のコードも守られるように勧めます。せめてここの観点を考えてください。
まず、GNUコードのタイプをお勧めします。それを読むのではなく、燃やしました。
いい姿勢です
もういいです。次はLinuxカーネルのプログラミングスタイルです。
タブ(tabs)は8文字ですので、インデントも8文字です。一部の異端運動は4文字を使いたいです。
(2文字まで)の字下げは、PI(円周率)を3にするのと同じです。
インデントの基本目的は、制御ブロックの開始位置を明確に識別するためである。特にあなたがじっと見ていると
スクリーンを見ながら20時間ぐらい見たら、もっと長いインデントのメリットが分かります。
現在は、8文字をインデントするとコードが右側に偏りすぎて、80文字の端末を使うと
読みにくいです。答えは3階以上のインデントが必要なら、もう終わりました。変更すべきです。
あなたのプログラムです
簡単に言えば、8文字の字下げはコードを読むのを容易にし、深さを詰めたときに提出します。
警告します。このような警告を心がけるべきです。
括弧の位置の問題はCプログラミングのスタイルでよく出されます。インデントのサイズと違い、括弧の位置の選択
技術的な理由は多くないですが、個人の好みがもっと多いです。例えばKernighanとRitchの
弟子達は左括弧を一行の最後に置いて、右括弧を一行の初めに置く。

if (x is true) {
we do y
}
しかし、関数が特殊な場合、関数の左括弧は次の行の初めに置かれます。

int function(int x)
{
body of function
}
世界中の異端者がこのような不一致のやり方を指摘しています。
確かな人は知っています。(a)K&Rは_です。対ひのK&Rは正しいです。そして、関数は確かに特殊です。
で関数を入れ子できませんでした)。
右括弧が完全に単独の一行を占めていることに気づきました。ない限り後に未完成の文があります。例えば、doです。
ステートメントの「while」またはif文の「else」は、このようにしたいです。

do {
body of do-loop
} while (condition);

if (x == y) {
..
} else if (x > y) {
...
} else {
....
}
理由:K&R
また、このような括弧のレイアウト方法は、空白の行(またはほぼ空行)の数も減少していることに注目してください。
しかも、小さくて読みやすいです。あなたのスクリーンの空行は資源を回収できないからです。
これにより、コメントを追加するための空行が多くなります。
Cはスパルタ式の言語ですから、あなたの命名方法も同じです。を選択します
Modula-2はPascalプログラマと違って、Cプログラマは使用しません。
ThisVarable IsATEMporaryCounterというかわいい名前です。Cプログラマは変数を一つずつ返します。
「tmp」という変数名のほうが書きやすいし、理解するのも難しくないです。
_。でもね、大きさや文字が入り混じっている名前に眉をひそめますが、大域変数名は必須です。管理する
大域関数の一つは「foo」と言います。わざと間違いを探すのです。
_。全体変数(本格的に_が必要な時だけ使う)には説明性の強い名前が必要です。
関数は同じです。アクティブなユーザをカウントする関数があれば、赤ちゃんはそれを呼びます。
「countuctiveuusers()」ではなく、「cntusr()」です。
関数の種類を名前に入れる(いわゆるハンガリー命名法)は脳損傷の表現であるコンパイラです。
タイプを知っていて、それを検査することができます。このネーミングはプログラマ自身がめまいを起こすだけです。マイクロソフトが作るのも無理はないですね
バグだらけのプログラムをたくさん作りました。
_。局部変数は短くして要約するべきです。ランダムな整数サイクル変数があるなら、それを「i」と呼んだほうがいいかもしれません。
これを「loop ucounter」と呼ぶのは効率が悪いので、混淆が起こらない場合です。類型的に、
「tmp」は、任意の種類の一時値を格納する変数に使用できます。
あなたの局所変数を混同することを心配するなら、もう一つの問題があります。いわゆる関数膨張オランダです。
不均衡症候群になりました。次の章を見てください。
関数は小さくて甘いはずです。そして一つのことしかできません。彼らは一つ二つのスクリーンしか使わないべきです。
ISO/ANSI標準画面サイズは80 x 24です。一つのことだけをして完成させることができます。
関数の最大長さは関数の複雑さとインデントレベルと逆比例しなければならない。だから、もしあなたが一つだけあったら
長い(簡単ですが)case文の関数は、多くのcaseにいくつかの少ない操作をします。
この関数は長くても大丈夫です。
しかし、複雑な関数があれば、中ぐらいの知能の高い学生は理解できないかもしれません。
じゃ、最大限の長さ制限をもっと厳しく守るべきです。説明された名前のヘルプ関数を使います。
コンパイラin-lineこれらのヘルプ関数を使用して、性能が重要だと思うなら、コンパイラはおそらく
あなたより上手になります。
関数の他の指標は局所変数の数で、局所変数の数は5-10を超えてはいけません。
どこかに問題があります。この関数をもっと小さく分解します。人の脳は普通です
7つの違うものを同時に追跡できます。7つを超えると料理に酔います。あなたは頭がいいですが、たぶんあなたは頭がいいです。
二週間前に書いたコードを理解したい時があります。
注釈はいいものですが、過剰な注釈がある危険があります。永遠にコメントでコードを説明しないでください。
どのように仕事をしますか?もっと良い方法は仕事の方式の明らかなコードを書き出して、悪いコードを説明するのは波です。
時間がかかる
普通、コメントはコードが何をしているかを説明するべきです。そして、コメントはつけないでください。
関数本体:関数が複雑すぎて、各部分に注釈をしなければならない場合、再
第四章を読みに行きます。いくつかの短いコメントを入れて、頭のいいところを注意したり、警告したりすることができます。
やり方はいいですが、過ぎないようにしてください。より良い選択は、注釈を関数の頭に置いて、関数が何をしているかを説明します。
なぜ作ったのかも含まれているかもしれません。
大丈夫です。私たちは全部会ったことがあります。古いUnixユーザーからGNU emiacsは自動的に
Cソースコードを揃えますが、デフォルトの設定はあまりよくないです。
GNUを使っている猿の群れは、いつまでも綺麗な手続きをしません)。
だから、あなたはGNU emaacsを徹底的に捨てたり、より理性的な設定を採用したりします。後者を選ぶなら、あなたは
下のコードをあなたのものに加えることができます。emaacsファイル:

(defun linux-c-mode ()
"C mode with adjusted defaults for use with the Linux kernel."
(interactive)
(c-mode)
(c-set-style "K&R")
(setq c-basic-offset 8))
これはM-x linux-c-modeコマンドを定義します。Linuxモジュールを作成すると、文字列を「-*」とします。
linux-c-*-"はファイルの最初の2行において、このモードは自動的にアクティブになります。そして、もしあなたが
編集/usr/src/linuxディレクトリでソースファイルを作成する際に、linux-c-modeが自動的にアクティブになります。
emaacsファイルに参加する必要があります。
(setq aut-mode-alist(cons'('/usr/src/linux.*/*.*.''.''.ch').linux-c-mode)
aut-mode-alist)
でも、emaacsが使えなくても、世界の終わりではありません。「indent」も使えます。
また、GNU indentはGNU emaacsと同じ脳死亡設定を使用しています。
コマンドラインのオプションがあります。でも、これはあまり悪くないです。GNU indentの作者達も意識していますから。
K&Rの権威(GNUの人間も悪魔ではないので、彼らはこのことについて誤解されているだけです)。
を選択します。
「indent」には多くのオプションがあります。特にコメントレイアウトの部分は、そのまんがマニュアルを見てみたいかもしれません。しかし
「indent」は悪いプログラムを修正できないと覚えてください。
設定オプション(arch/xxx/config.in、およびすべてのConfig.inファイル)は少し違っています。
インデント方式
コードには3文字のインデントが使われています。config-オプションでは2文字のインデントを使って依存関係を識別します。
後者はbook/tristatのオプションにのみ適用されます。他のオプションに対しては最適なインデント方式を採用します。
これでいいです。例えば:

if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
tristate 'Apply nitroglycerine inside the keyboard (DANGEROUS)' CONFIG_BOOM
if [ "$CONFIG_BOOM" != "n" ]; then
bool ' Output nice messages when you explode' CONFIG_CHEER
fi
fi
一般的には、すべての不安定なオプションは、CONFIGuEXPERIMENTALと表記します。
のオプションを「DANGEROUS」と表記し、他の試験オプションを「EXPERIMENTAL」と表記します。
マルチスレッド用のデータ構造は参照カウントを採用しなければなりません。カーネルでは、
ゴミ回収は存在しません。
これは引用数を使用しなければならないという意味です。
参照カウントの使用はロックの使用を避けることができ、異なるユーザがデータ構造を並列に使用できるようにする。
睡眠で構造が突然消えてしまうことが心配です。
加錠_は_参照カウントの代替物ではないことに注意してください。加錠はデータ構造の完全性を保証するために使用されます。参照してください。
カウントはメモリ管理技術です。通常は二つとも必要です。何か紛らわしいところがあってはいけません。
いくつかのデータ構造は、2つの層の参照カウントを使用することができ、異なるクラスに対してすべて使用される場合には、サブ。
クラスのカウントは、すべてのサブクラスのユーザー数を統計し、サブクラスのカウントがゼロの場合は、カウント全体に対して1つだけ減少します。
この「多層参照カウント」の例は、メモリ管理コード(「struct mmustruct」:
mmuusersとmmuucoutとファイルシステムコード
sual ctiveで見つけました。
覚えてください。他のスレッドがあなたのデータ構造を見ることができますが、参照カウントを使っていません。
ほぼ確実にバグが存在します。