C言語
コンパイラ
32bit
16bit
名古屋のIoTは名古屋のOSで

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

C Puzzle Book, Alan-R-Feuer

https://www.amazon.co.jp/dp/4877830294/ 第二版翻訳

https://www.amazon.co.jp//dp/4871487733/ 初版翻訳


有り難み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>

...


参考文献

ISO/IEC 9899

http://www.open-std.org/jtc1/sc22/wg14/

SWESTのまとめ

https://qiita.com/drafts/62e56ae151554d6200c0/edit