Q「C++設計と進化(通称D&E)のどの辺りが名著なんですか?」

この記事の続き(?)になります。

まだハードウェアが貧弱だった頃に、どうやってPure C ⇒ 「Better C」 or 「C++」に移行してもらえる言語にするか?

様々な苦難と設計思想と歴史的経緯が載っております。

過去のC++のイカれ具合の一例

  • (falae == false)の真理値は真

  • (true == true)の真理値は偽の可能性が高い

現代の真理値型の仕様で考えたら「?????」となりますが、これにはちゃんと設計上の思想の上での仕様です。

過去のC++は

「真理値のリテラルのうち、falaeは整数の0、trueはそれ以外(未初期化値)」

というのがありました。

未初期化値は適当に拾ってきた数字のため・・・

(適当に拾ってきた数字A == 適当に拾ってきた数字B)

上記の比較式なことが分かれば、仕様通りの動作なことが分かりやすいですね。

なぜtrueだけ未初期化値なのか?

この仕様を納得して受け入れるためには、C++以前の言語に求められたものと、当時のハードウェア性能の考慮が必要です。

アセンブラ、Pure Cは、いかなる過酷な環境でも耐えるバイナリが求められます。

int x = 0;

「バグを防ぐためには、変数は必ず初期化しよう」とは、大抵の本には書いてあるベストプラクティスです。

しかし、変数の初期化文すらコードレビューで処刑される過酷な環境もあるわけです。

比較式に関して

今でこそ比較式は

if (bool値) {
    処理
} else {
    処理
}

とアッサリ書ける訳ですが、アセンブラで比較しようとしたら、レジスタ周りの処理が絡むわけです。

ここからはうろ覚えの記述になりますが・・・
0という数字のリテラルはCPU側で持っており、「0との比較」という専用の命令があったはずです。

下記のような処理より

比較値AをレジスタAに入れる
比較値BをレジスタBに入れる
レジスタAとBを比較してから諸々

下記の方が、省エネな訳です。

比較値AをレジスタAに入れる
レジスタAと0を比較してから諸々

(補足)マサカリが飛んできそうな記載ですが許してください・・・この辺は安易に踏み込むとSNSやコメント欄の治安が一瞬で下記画像のようになってしまいます。

画像引用元出典:漫画 北斗の拳

低級言語低レイヤ用言語周りの話は、下手なことを発信するとモヒカントゲトゲ肩パッドマサカリ勢力からの
可愛がりが発生するので要注意です

C++はこの辺の事情も加味し、Pure C使いの移行コストを踏まえてあえてtrueは未初期化値という仕様にした訳です(D&E出版の頃は)

こういった話はC++に留まらずに応用できる訳です。現状のユーザ情勢を加味した上での、プロダクトの仕様を決める際の考え方が身に付くわけです。

こういった側面から、D&Eは読者の年齢と共に深みが増す名著だと真剣に思います。

注意点

「for文の終了条件は、0との比較の方が省エネ」

といったものも、最近のコンパイラの最適化なら勝手にやってくれます。

ハードウェア依存の古代テクばかり覚えると、将来の末路はプログラマ ⇒ タダの言語オタクとなって社会的に死にます。

(2023年 15:57) 目撃範囲や経験談だけで、一般化した記載をするのは問題ありと考えて取消致しました。

細部にこだわりすぎるのは、リスクになりうるので程々にしよう(要件によりますが)

総論

時代で「正しさ(抽象的)」なんていくらでも変わります。これは西洋哲学を少し履修すれば何となく掴めると思います。

物凄い細部までこだわり抜いたコードを書くための知識も大事ですが、プロダクトの未来の姿を描くための知識も大事にしよう。


あと、他者にはなるべく優しくしましょう。言葉のマサカリ振り回して暴れていても、「正しい(抽象的)」のであれば許された時代は終わらせよう(提案)

変更履歴

2023年12月5日 16:01
 文言を修正
2023年12月5日 16:29
 情報工学における低級、高級言語は誤解を生みやすいため、低レイヤ用言語に調整しました。