LoginSignup
3

C Puzzle Bookの有り難み5つ、C言語規格及びCコンパイラの特性を認識

Last updated at Posted at 2018-01-21

C Puzzle Book, Alan-R-Feuer
https://www.amazon.co.jp/dp/4877830294/ 第二版翻訳
https://www.amazon.co.jp//dp/4871487733/ 初版翻訳

Cパズルブック
改訂版, Alan R. Feuer/アラン・R. フューアー 2000-12
51QQZNVK6JL._SX374_BO1,204,203,200_-3.jpg

<この項は書きかけです。順次追記します。>

有り難み1 コンパイル可能なソース

C Puzzle Bookは、C言語規格ができる前から、C言語の理解困難性と、C言語のCPUの発展を阻害しないという姿勢を教えてくれる貴重な教材でした。
断片的なプログラムでは、C言語処理系(Compiler)およびC言語規格の実態を理解しないまま、空論に振り回されることがあります。

C/C++の国際規格案の例題をコンパイルするときの課題7つ。
https://qiita.com/kaizen_nagoya/items/5f4b155030259497c4de

C言語規格ができても、未定義、未規定、処理系定義という、大事な約束が続いています。C言語規格の断片プログラムでは分かりにくいことを、C Puzzle Bookの方式でコンパイルできる形にすると、最終的にコンパイルエラーにしかならない断片なのか、ある特定の条件では価値のあるソースなどかを確認するよい訓練になりました。

規格で定義しないということを決めている未定義。定義してしまったら、CPUの発展を阻害するかもしれない。
未規定は、複数の定義のうち、どれでなきゃいけないかということは規定しないという、これもCPUの発展と、既存のプログラムの振る舞いを制限しないという姿勢。
処理系定義は、そうはいっても、一つの処理系、一つのOSであれば、一つの定義でないと、ライブラリ等の整合性が取れなくなるため、一つはその処理系で決めて、利用者(programmer)には教えてねという要請。

有り難み2 出力

C Puzzle Bookのありがたみは、値を出力するプログラムだということです。

値を出力するプログラムまで到達すれば、なぜ、途中で未定義や未規定や処理系定義のことがあってもいいかとか、出力の違いが未定義や未規定や処理系定義に起因することが確認できることがあります。

作用、副作用を考える場合に、計算機内部の値の計算だけでは、副作用の必要性が明確にならないことがあります。しかし、出力しようとした途端に副作用なしに設計・実装することができないかもしれない事態に遭遇します。

有り難み3 16bitと32bitのint

16bit CPU用コンパイラと、32bit CPU用コンパイラの両立性(compatibility)は、長い間のC言語の課題でした。

今でも、16bit CPU用コンパイラの課題を確認するには、Open Watcomを利用するとよいでしょう。
http://www.openwatcom.org

はC Puzzle Bookのソースコードがこれだけの量なのに、網羅的であることに驚きました。

最近では、ほとんどの処理を32bitCPUで行い、16bit CPUとの価格差がなくなると、16bitで処理する必要性が省電力くらいになっているかもしれません。

もし、すべての処理を32bit CPUで行うのであれば、16bitと32bitの違いを意識する必要はなくなるのかもしれません。逆に64bitと32bitの違いを整理しておく必要があるでしょう。

有り難み4 権威づけ

著者は、Programming Language Cを書いたK&Rや、
C Traps and Pit Falls(Cプログラミングの落とし穴)Koenigと同様AT&TのBell Lab.の方です。C puzzle bookを含めた3冊を読んで、コンパイルすると、C言語の立体的な視点が身につきます。文法、落とし穴、コンパイルできるソースで考えるという。なので、次の教育的効果があるのです。文法だけ、あら探しだけじゃなく、動くものを作る習慣。これがCプログラマに必要な素養だと。

翻訳も初版がIPv6で著名な村井純(ipv6)さん、第二版がmrubyで著名な田中正明が翻訳されている。

The KAME project
http://www.kame.net

NPO 軽量Rubyフォーラム
http://forum.mruby.org

有り難み5 教育効果

本書を、C言語教育の際には、すべてのプログラマの人に、事前に出力を想定し、
複数のコンパイラ、複数のCPU、複数のOSでコンパイルして実行してみて、想定とすべてあっていたら、商品を差し上げることを約束してきました。
これまで、自分を含めて、数百人の方が挑戦され全問正解は一人もいません。

複数のコンパイラは、Visual C++とclangとか、gccとOpen watcomのように、時代、対象CPUの違い、16ビット32ビットの違い、OSの違いなど、複数の要因の違うものを推奨しています。

SWESTでも、何度もMISRA Cの講演、演習を実施しています。
その際に、C Puzzle bookのように出力するプログラムで検討することの大事さを説明しています。

そして何よりも、C Puzzle bookを翻訳された田中和明さんがSWESTの実行委員にいることが鍵かも。

misra_c.h
#include <stdio.h>
...

Lode Runner

C puzzle Bookがすぐにできて、Cコンパイラ写経まではできそうにない場合は、ゲームの写経をお勧めしています。

Lode-Runnerで学ぶ実践C言語-ビー・エヌ・エヌ企画部
51JaGIOM+4L._SL500_SX351_BO1,204,203,200_.jpg

人生で影響を受けた本100冊。

80. Cパズルブック

改訂版, Alan R. Feuer/アラン・R. フューアー 2000-12
51QQZNVK6JL._SX374_BO1,204,203,200_-3.jpg

C言語教育の際に、このパズルブックを必ず解いてもらっている。
サンプルを見て、結果が何になるかを予測しれもらい、
実際にコンパイルして結果を見て、なぜ、予測と違うかを確かめてもらっている。
全問正解したのは、いまだに誰もいない
#include
つまり、C言語の間違えやすいところを、パズル形式で解説しているため、
C言語の初心者から、上級者と自分では思っている人まで、
幅広く利用するとよい本である。
ポインタ、構造体の間違えやすい点を示すよい教材であると考え、
10年以上、紹介してきて評判もよい。
仕事でC言語を利用することがあるなら、1度は解いてみてください。

Cパズルブック 

<この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。>

参考文献

日本のプログラマが世界で戦える16分野・事例。仮説(53)統計と確率(25)

コンパイラを書くのは難しいか。仮説(175)

C言語(C++)に対する誤解、曲解、無理解、爽快。

人生で影響を受けた本100冊

ISO/IEC 9899

SWESTのまとめ

<この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。>

文書履歴(document history)

ver. 0.01 初稿  20180112
ver. 0.02 参考文献追記 20221023

最後までおよみいただきありがとうございました。

いいね 💚、フォローをお願いします。

Thank you very much for reading to the last sentence.

Please press the like icon 💚 and follow me for your happy life.

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3