見出し画像

Retro-gaming and so on

Cのスタイルとは一体何だろうか

あれから、C11/C17の望ましいコーディングスタイルは何なんだ、ってぇんで頑張って検索しまくった。どっかに指南がないのか、と。
結果、Reddit辺りまで探ったのだが、結論から言うと

「やっぱそんなモンは存在しない」

ということが分かったのだ(っつーか外人さんもそれを探してるのに「無い」事を嘆いていた)。
もう2021年なのに。2011年から10年も経ってるのに。それなのにC11/C17の「望ましいコーディングスタイル」なぞはまとまって提示されていない。
ヤバいんじゃないか、これ。
C言語はマジで激ヤバである。
\(^o^)/オワタ

個人的に言うと、C99は何とかなるのだ。
っつーか、たまにIBM DevelopperWorksにあがってるC言語に関する記事なんぞを読むと。既にANSI Cでなんかでは書かれていないのだ。最低でもC99で書かれている。
日本語のC関係の文章だと圧倒的にC90辺りで書かれてるのに。

「あ、こりゃ日本のC言語系サイト見ててもダメだ。」

って分かった。それからC系統で日本のサイトは参考に見ない事にしたのだ。苦CだろうがBohYoh.comだろうが、そっちの方面は当てにならない、と言うことである。C90に従ってる以上しょーがない。30年も前の書き方だしな。
結局、某英語サイトでC99は一応学んだ。そこまでは何とかなったのだ。
しかし、C11/C17での「望ましいスタイル」の提示はまだどこにも無いのだ。

ぶっちゃけ、プログラミング言語を学ぶ際、文法や構文よりも学ぶべきモノ、つまり鍵が何か、と言うと「スタイル」なんじゃないか、とか思っている。
要するに「こう書けばカッコイイ」と言うのが学ぶ際に一番重要な事柄なのではないか、と。そしてカッコ良さと明確さは通常、密接に関係しているのだ。

ところが、元々こういう「カッコよさ」と言うのがC言語には無い。
Cの「カッコよさ」と言うのはフツーの言語とは違い、むしろバッドノウハウと密接に関係があったりする。ポインタ演算の多用なんざがそれだ。配列を明示的に操作するほうが「明快」で「分かりやすい」筈なのに、ポインタ演算の方を使いたがる人の方が多いらしい。結果、Cだとホンマ、「カッコよさ」は明快さとは全く関係ない。そして配列でさえ

int a[] = {1, 2, 3, 4, 5};
printf("%d\n", 3[a]);

と書けてしまう言語なのである。
そもそもCは「悪い事をやろう」とすればやれる言語で、じゃあ望ましいスタイルのスタンダードが何なのか、と言うと「無い」のである。K&Rでさえバッドノウハウをヘーキで提示してたし。
見た目以外にも色々と、元々汚い言語なのである。

ANSI Common Lispなんかだと、例えば、人工知能の学者、ピーター・ノーヴィックみたいな人がいて、こういう人がオピニオンリーダーとして「綺麗なコードはこう書くのだ」と言うのを提示してくれている。ぶっちゃけ、ANSI Common Lispも割にバッドノウハウの塊ばっか出てくるような言語だけど、反面、ピーター・ノーヴィックみたいな「書法の伝道師」な人がいてくれるお陰で随分と助かっている。スタイルで迷わなくて良いのだ。
従って、ノーヴィック的に見て美しいか否か、と言うのと、そのコードが信頼に値するスタイルで書かれてるのかどうかと言うのはほぼ一致している。ポール・グレアムはノーヴィック的観点で見ると是、でもダグ・ホイトはダメだ、とか(笑)。まぁそういった事が分かるのだ。

ピーター・ノーヴィック:

ところが、Cだとそういうオピニオンリーダーがいねぇんだよな。そもそも、K&Rの二人、カーニハンとリッチーの二人がバッドノウハウの伝道師みてぇなカンジだし。
やべぇ、ホント「望ましいCのスタイル」を誰かもっと明確にした方がエエんちゃうか。うーむ(※)。

余談だけど、Cが元々美しくない、と言うのは、例えば略称stdio.hなんか見れば分かると思う。
Cはとにかく「端折れれば端折れるだけ正義」と言うプログラミング言語で、意味が結果分かりづらくなっても構わない、と言う思想が背景にあるのだ。
例えば平均を計算する関数を定義するとしよう。その関数をどう名付けるべきか。
昨今はあまり言われなくなったけど、元々Cが発明されたAT&T文化圏だと、例えば次のように関数名を定義する方が「良い」と言われてたのだ。

avg

反面、MIT派、と言われる流儀だと「名前が明確であるように」そのまま名付けるのを是としてた。

average

そう、AT&T文化圏だと「タイピングを節約するのが善」だったのだ。タイピング数さえ節約出来れば意味が分からなくなっても良い。
今のC言語の入門書だと後者の「MIT型」で関数を名付けろ、って指南する例が増えている。じゃあ何故AT&Tはとにかくタイピングを節約しようとしたのだろうか。
答えは、AT&Tの文化圏だと使用してるエディタが大した事無かったから、である。むしろラインエディタで必死こいてプログラムしてたのがAT&Tの文化圏だったのだ。
反面、MITでは60年代中頃から既に「補完機能アリ」のIDEみたいなスクリーンエディタを開発していた。だから長い関数名になろうと「自動補完」がある限りヘッチャラだったのだ。故に「明確な」関数名を付けるのを厭わない。
結局、C言語のヘッダファイルの分かりづらいstdio.hとか(これが一体「Standard input and output」の略だと誰が想像できるだろう)stdlib.hとか(当然Standard Library)言うクソみてぇな命名は、全て「AT&Tのヘナチョコな」開発環境に由来する。
つまり、Cはその出自や環境、それに由来する思想により、汚くて分かりづらくなる運命を最初っから背負っていた言語なのである。

※: ちなみに、この辺の「美しいスタイル」を提示しない例としては、サイエンス社のPascal関連の教科書なんかも同様である。ページの関係か、コードを圧縮して掲載する事のみにとらわれていて、「美しさ」の欠片もないコーディングスタイルを提示している。
それじゃあダメ、なのだ。

  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「プログラミング」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事