【IT】Linuxを生み出したリーナス・トーバルズが考える「優れたコード」とは何か?

1 : 2020/12/09(水) 22:10:29.77 ID:CAP_USER

プログラミングをする上で、コメントをきちんと残したり、わかりやすい変数名をつけたりして「読みやすいコード」を目指す作業は重要です。しかし、「読みやすいコード」と「優れたコード」の間には、時として構造上の大きな違いがあるのも事実。そんな「優れたコード」に対するLinuxの開発者リーナス・トーバルズ氏の考え方について、エンジニアのmkirchner氏が説明しています。

トーバルズ氏は2016年のTEDインタビュー内で「連結リストの実装方法」を例とし、自身の「優れたコード」に対する考えを説明しています。連結リストはデータを線形につなげたリストのことで、データを扱う構造のひとつ。具体的には「4」や「12」といった値そのものと「次の値」を示すポインタで構成される「ボックス」を順番につなげたものが連結リストです。
レス1番の画像サムネイル

連結リストをC言語で実装したコードは以下。値そのものである「value」と次の値を示すポインタ「next」で「IntListItem」構造体が作られており、IntListItem構造体からボックスが生成されます。「IntList」構造体はリストの先頭を表す変数「head」を持っています。
レス1番の画像サムネイル

この連結リストからあるボックスを消去する処理について、スタンフォード大学の計算機科学講義「Computer Science 101(CS101)」で紹介されていたコードが以下とのこと。
レス1番の画像サムネイル

上のコードが行っている処理はこんな感じ。まずはコードの以下の部分で「消去したいボックス」をリストの先頭から探索します。連結リストはリストの先頭からしか値をたどることができないので、まずリスト先頭のボックスのアドレスを「cur」ポインタに格納し、「prev」ポインタはNULLで初期化。curポインタが消去したいボックスのアドレスと一致するまで、curポインタを次のボックスのアドレスへと移しながら照合していきます。
レス1番の画像サムネイル

先ほどの処理のイメージを図で表したものが以下。ちょうどprevポインタとcurポインタがリスト後部のボックスへスライドしていくようなイメージです。
レス1番の画像サムネイル
以下ソース
https://gigazine.net/news/20201208-linked-list-good-taste/

2 : 2020/12/09(水) 22:18:15.40 ID:RTL5tQs5
あんまり条件分岐を作っちゃいけないんだな。それは解る。
4 : 2020/12/09(水) 22:25:15.90 ID:WntZ5Pi0
>>2
サイクロマティック数ってやつだな
3 : 2020/12/09(水) 22:24:08.28 ID:eXttlEXM
かと言ってメンテ性より効率性に拘りすぎたソースは逆に使いにくい
集団でコーディングする場合は
5 : 2020/12/09(水) 22:29:50.24 ID:KsAvao0z
この人が亡くなったらLinuxどないなるんやろね
7 : 2020/12/09(水) 22:39:50.63 ID:LT0kIIel
>>5
Linux EoLになる
Linusはもう何もやってない
10年以上前から広報担当しかしてない
KernelのメンテナンスはRedHatがやってるし、非採用バージョンもRedHatがブランチを出してる
そもそも、debianが超優秀なのでLinusは用済み
12 : 2020/12/10(木) 00:10:26.19 ID:DRrDxoyR
>>7
『debianが超優秀なのでLinusは用済み』ってどういうこと?
debianはカーネルよりも上の層という理解なんだけど、違うの?
Linusさんて、カーネルよりも上の層の開発とかもやっていたの?
8 : 2020/12/09(水) 22:56:39.27 ID:lalfKSee
NULLPO
9 : 2020/12/09(水) 22:59:29.34 ID:q3ulBKbX
>>8
ガッ(ベージコレクション)!
10 : 2020/12/09(水) 23:16:38.33 ID:3IvtsZB0
Gコード(´・ω・`)
11 : 2020/12/09(水) 23:35:57.63 ID:IA5LH6VM
ポインタのポインタ
14 : 2020/12/10(木) 00:20:04.45 ID:SCHSpxjk
carとcdr
20 : 2020/12/10(木) 01:09:03.94 ID:+nAR4sQk
>>14
そうで コンス
26 : 2020/12/10(木) 01:34:46.27 ID:5E63aR78
>>20
Lispだっけ?
16 : 2020/12/10(木) 00:45:47.58 ID:/1StOwEX
童貞・学歴・免許スレは伸びるのにこういうスレは全然伸びないな
テレビと大差ない
18 : 2020/12/10(木) 00:54:23.74 ID:O7Ah3Gqc
優れたコードは、複雑な処理と考えガチなものを見方を変えてシンプルにする。

つまり、refactor(因数分解)って感じだねー

まーしらんkど

19 : 2020/12/10(木) 01:02:22.22 ID:tGsCzTXv
変数名がpじゃなかったら完璧
21 : 2020/12/10(木) 01:15:50.61 ID:J3xH0wAA
C言語ではポインタの比較ってしちゃいけないんじゃなかった?
x86みたいなセグメントつきのアドレスだとおかしな事になる。
22 : 2020/12/10(木) 01:16:38.48 ID:JpU5m4mP
たまには変数名 x,y,z,zz,zzzとか言うのをデバッグしてみろ
23 : 2020/12/10(木) 01:24:31.06 ID:Fzxl3UKe
ポインタのポインタは昔一部の界隈でハンドルって言ってた。
28 : 2020/12/10(木) 02:07:18.53 ID:smidZUMs
>>23
Win32APIでハンドルって単語がやたら出てきたのはそのことだったのか
24 : 2020/12/10(木) 01:28:54.63 ID:fwJx6gro
NULLぽしてるから優れたコードではない
25 : 2020/12/10(木) 01:29:00.92 ID:9kfzNoak
「優れた」の基準が明らかじゃないとな
Cとアセンブリ言語でカツカツにチューンしたコードが速いのは間違いないし
高級言語で読みやすいコードが引き継ぎやすいのには変わりないからな
27 : 2020/12/10(木) 01:51:37.22 ID:O/kczejv
そんなことより、スペースでのインデントとか、コードブロック開始時の
{ をいちいち改行して1行費やす書き方に辟易している。
コードの文字数や行数で金貰っているのが多いのか?
29 : 2020/12/10(木) 02:09:02.59 ID:kFAZ8Rs4
>27
自分はそれで脱落したけど
頭いい人は逆に分かりやすいのかな…
30 : 2020/12/10(木) 02:45:00.68 ID:/iUNfJqw
最初は環境依存Unixをdos/v用にリサイズしただけなんじゃないんか?

カーネルの主要部しか作ってないんじゃないのけ?リーナスさんは

31 : 2020/12/10(木) 06:31:47.63 ID:IVydVJrD
2つのポインタを連動させて矛盾なく参照先をずらす処理と、
ポインタのポインタを使った二重の間接参照と、
どっちが「優れている」とも言い難い気がするがのう。

“イディオム”として見慣れているかどうかの問題な気が。
もちろん「どっかから動くコード断片をコピーしてくればいい」とは違う話。

コメント

タイトルとURLをコピーしました