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
情報工学における低級、高級言語は誤解を生みやすいため、低レイヤ用言語に調整しました。