LoginSignup
54
66

はじめに(forward)

C言語を理解するとはCコンパイラが書けるようになって、C言語の拡張、縮小ができるようになることでどうでしょうと言うお話です。

英語もプログラミング言語も文法から教える方々がお見えになることは存じ上げています。

最初のTwitterは、実話に少し手を加えたものです。C言語の12日間の研修で、Cコンパイラの写経をしてコンパイラを書けるようになるのが一番早道だと説明した際の話です。文法は覚える必要がないことを言い添えて。 

カーニハン、リッチーの「Cプログラミング言語」という本は一切使いません。この文章をお読みいただく際には、文法をお忘れいただくか、ソースコードのコンパイルを先にお願いします。

プログラミング言語教育のXYZ。 仮説(52)

コンパイルエラーを取るのに文法を知らなくてもとれることを経験してもらうことがねらいです。

12日間の研修は、毎週1日、3ヶ月かけるもので、ちょうど、3ヶ月あれば、コンパイラが書けるようになるという説明をしました。

WEBをやっているから、C言語は関係ないとお思いの方もおみえかもしれません。C言語さえやっておけば、HTMLも、CSSも、JAVAも、PHSも、Rubyも、Pythonも、ありとあらゆる言語を自動生成できるかもしれません。

私が一番得意な言語はアセンブラです。 Cコンパイラはアセンブラも自動生成してくれます。(あたりまえとおもわないで)

アセンブラへの道 

アセンブラの自動生成もできます。それコンパイラやん!

目次(content)

はじめに(forward)
目次(content)
背景(back ground)
写経の意義
1. Cコンパイラの写経
・portable C compilerとMatlab
・CPU, OS, 言語
・未定義(undefined)、未規定(unspecified)
・CPU(論理回路)とverilog HDL
2.Lode Runnerの写経 
・エラー(コンパイル、リンク、実行)
・・1) 入力誤り 
・・2) 版違い 
・・3) ライブラリ違い。
・・4) OS違い(Windows, macOS, Linux, OSEK/VDX等) 
・・5) CPU違い 
・・6) コンパイラの提供元の違い
3.The C puzzle bookの写経
・MISRA
・CERT
まとめに代えて 
・自己関連記事
・蛇足
・参考資料(reference)
・連携(link)
文書履歴(document history)

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

背景(back ground)

私がC言語でコンパイラの書き方を覚えたのは1990年頃です。電総研(現在の産総研)の言語システム研究室に研修生として3ヶ月おじゃましていた際に、コンパイラの書き方を覚えました。最初は写経です。

電総研:電子技術総合研究所
産総研:産業総合研究所

C言語の文法を覚えるつもりはありません。御免なさい。 

プログラム初心者が知らなくてもいいこと。仮説(63)

最初に覚えるプログラミング言語は何がいいですか?

当時は、Small Cという本のCソースコードを1ヶ月でコンパイルし、次の1ヶ月は、Pascalで書かれたコンパイラをC言語に書き直しました。Pascalのプログラム経験ゼロでした。最後の1ヶ月は、LISPで書かれたOBJという抽象データ型言語のsyntax checkerをC言語で書きました。

使ったコンパイラはSunOS上のSUNのコンパイラだったり、GNU Cコンパイラだったりしました。 

C Puzzle Bookをコンパイルした時には、東芝の16Bit CPUのUnixだったり、HPのUnixだったりしました。PCのTurbo-c, Lattice C, MSCなどでもコンパイルしました。

Cコンパイラをコンパイルしていると、ソースコードのコンパイラとコンパイルしているコンパイラの違いがよくわかるようになるかもしれません。

smallc.png

この後yacc lexでcコンパイラ書こうとしました。じつさいにはbisom(gnuのyacc)とべた打ちのCでCコンパイラを書いて拡張を試みていました。

その後、20年以上が過ぎ、オープンソースのCコンパイラも増えました。C言語を習う人のCコンパイラの写経は、だいた3週間でできるようになりました。あ、もともと4週間で写経して、その後の2ヶ月は応用問題だったから、元々写経自体は4週間だった。

C言語教育で3段階を想定します。

写経の意義 

写経は、文法理解ではなく、意味理解を中心とする手法と唱える人がいます。 写経しながら文法のことを考えていけないという規則があるわけではありません。文法のことを考えながら何度も何度も写経をしてもいいです。文法のことを考えずにひたすら膨大な量の写経をしてもいいです。後者は母語方式という言語習得の試みです。 

写経をせずに、写経について語る自由はあります。写経をしない人に写経の意味を語らない自由もあります。 

やればわかることをやらない人に、説明する時間を無駄時間と呼ぶ人がいるかもしれません。

1. Cコンパイラの写経

3週間かけられるときはCコンパイラの写経をお願いしています。 

半分くらいのC言語の仕事は、コンパイラがかければ、自動生成でおきかえることができる気がするからです。 

半分くらいは、コンパイラを書いただけでは解決しない課題かもしれないと思い、別の方法を推奨しています。 

portable C compilerとMatlab

C言語は、UNIXと同様に、アメリカの通信会社の研究所であるBell研究所に由来しています。Portable C Compilerの作者Stephen C. Johnsonがいました。のちにMatLabのコンパイラを書いたり、Mathworksに転職したことを長らく知らずにいました。やっぱりね、Cコンパイラかければ、いろんな会社で重宝される。いろんなツールの心臓部になれる。

A history of MATLAB

Stephen C. Johnson and Cleve Moler. 1994. Compiling MATLAB. In Proceedings of the USENIX Symposium on Very High Level Languages (VHLL). USENIX Association, Berkeley, California, USA (Oct.), 119–127.

CPU, OS, 言語

写経する対象のCコンパイラと、写経したCコンパイラをコンパイルコンパイラが同じものだという前提には立っていません。Cコンパイラを書いたら、そのCコンパイラのソースをコンパイルして、さらにそのソースをコンパイルしたコンパイラでコンパイルするという作業は、コンパイラの自己試験として大事です。 
 
ここでは写経した対象のコンパイラが大事なのではなく、そのソースコードをコンパイルするコンパイラになれるためにコンパイルする場合もあることにお気づきでしょうか。 
 
コンパイラの違い、CPUの違い、OSの違い、版(version)の違いなどによるコンパイルエラーを経験することにより、言語設計のあり方について考えるきっかけになればよいでしょう。 

C言語には、Freestanding環境とHosted環境の2種類あることをご存知でしょうか。Freestanding 環境は、OSのないまたはPOSIX対応OSでないOSとともに用いるC言語です。
割り込み処理があるCPUを示します。。
 
C言語は直接CPU叩くことも可能です。割り込みがあるCPUであれば、割り込みを呼び出すのも手でしょう。

posixc.png

C言語規格はPOSIX規格と相互関係を持った規格だという印象が伝われば十分です。

どういうOSを設計するか。
どういう言語を設計するか。 
どういうCPUを設計するか。
この3つの課題を一体的に検討するのがC言語です。 

個々の文法は時々のCPU、OSの設計に依存し変遷していきます。

OSは、通信規約と対で使うと便利です。TCP/IP, Ethernetなら、Unix/Linux/Posix。 
CANならOSEK/VDXという感じです。

ethernet. TCP/IPをハードウェアでどこまで実現するかは課題かもしれません。

posixcether.png

CANとOSEK/VDXの場合は、OSの機能を使わない割り込み処理(ISR: Interrupt service routine)を分類(category)1という名称をつけています。 

osekc.png

この図差し替え予定

文法よりも、C言語を使う環境の違いを調べられないと、コンパイルエラーは取れないかもしれません。C言語で書いたプログラムのコンパイルエラーを撮るための資料のうち、文法はほとんど、限りなく小さいことが推測できるでしょうか。

未定義(undefined)、未規定(unspecified)

C言語規格で、CPUの発展の妨げにならないように定義しない事を定義している画期的定義が、未定義(undefined)です。

複数の定義が可能な仕様でCPUの性能を発揮するのに選択できる画期的仕組みが未規定(unspecified)です。

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

CPU(論理回路)とverilog HDL

verilog-HDLは論理回路を記述する言語です。HDL(Hardware description Langauge)ではソースコードを書くことが設計(design)、コンパイル以降の配置配線(ソフトウェアでいえば連携(link)と配置(location)が実装(implementation)といいます。

programの本質は計画だ。programは設計だ。

2.Lode Runnerの写経 

2週間くらいしか時間がなく、コンパイラがひょっとしたら必要ないかもしれない仕事の場合には、Lode Runnerの写経を勧めることがあります。

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

エラー(コンパイル、リンク、実行)

写経しているとビルド(コンパイル・リンク)エラーに遭遇します。 
ほとんどのエラーは文法を覚えていなくても解決できるかもしれません。

1) 入力誤り 

大文字小文字の違い、
spelling mistaken、いわゆるtypo.
記号の間違い。. , ;
1バイト、2バイト文字の勘違い。空白2バイトが一番みつけにくいかも。

コンパイルエラーがなくなっても、リンクエラーが出ることがあります。リンクエラーがなくなっても、たまたま間違えた関数、変数、定数が存在して、実行時エラーがでることがあります。そして、最後に実行時エラーがなくなっても、期待する動きをしないときの治し方です。

空間が問題か、時間が問題かを切り分けます。 
空間が問題の場合には、期待する値のassert文を入れたり、printfデバッグしたりします。 
時間が問題の場合には、順番を出力するprintfデバッグしたり、時刻を表示するprintfデバッグしたり、profilerを使って、時間がかかりすぎている関数で、なにか不穏な動きがあるかを確かめます。

2) 版違い 

新しい言語仕様ではコンパイルエラーになる。 
古い言語仕様だとコンパイルエラーになる。 
一緒にコンパイルするソースのバージョン違いを含む。

3) ライブラリ違い。

リンクするライブラリが違い、リンクエラーになる。
ライブラリだけでなく、一緒にコンパイルするソースが違う場合も含む。

4) OS違い(Windows, macOS, Linux, OSEK/VDX等) 

バージョン違いの一種かもしれない。 
POSIX系OSであっても、個々のOSごとにPOSIX対応がすごく違うことを知った。 

PCTS:151-2, POSIX Test Suite

Windows(cygwin), macOS, Linuxの3種類の結果をもとに、ソフトウェア品質指標の分類に基づいて分析し、世界ソフトウェア品質会議(ドイツ開催)で発表したことがある。 

5) CPU違い 

8bit CPU, 16bit CPU, 32bit CPU, 64bit CPUはじめ、各種これら以外の論理回路群用のコンパイラでコンパイルしてみると、違いがまざまざとわかるかも。アセンブラがわかると乗り切れることがあるかもしれない。 

C言語のマクロ定義や、アセンブラのマクロ定義を使って、同じソースで違うCPUでコンパイルエラーがでなくする方法がいろいろある。 

アセンブラへの道

プリプロセッサをもう一つ作って、C言語ソースを出力する方法を取ったこともあるような気がする。 

6) コンパイラ提供元の違い

gcc, clang, visual C(C++)で、こんなにコンパイルエラーが違うなんて。せっせとエラーの記録を取っている。エラーが出たとに、ネット検索で自分の記録が出てくるように。

C++/C コンパイルエラーを記録するとよい理由7つ

Clang/Clang++(LLVM) gcc/g++(GNU) コンパイラ警告等比較

C言語規格は審議文書をネットに公開している。 

N3054 Working Draft, Standard for Programming Language C

このコード断片をコンパイル中です。

3.The C puzzle bookの写経

1週間しかかけられない時は、C Puzzle Bookの写経をお勧めします。 

これは、写経というよりパズルを解くだけで、数百行ですぐに終わります。 

The C Puzzle Bookがやってあれば、CPUの違い、コンパイラの違いなどによるコンパイルエラーは万全。っていうか、The C Puzzle Bookは、16bit コンパイラでもコンパイルしておくとわかりやすい。 

Watcom C, Intel Cは利用者の方に規格断片などをコンパイルして、エラー、警告などを教えていただきました。1990年代当時、見たことのあるコンパイラで一番規格に適合していたのがWatcom Cでした。現在ではオープンになっています。16ビットコンパイラの振る舞いを確認するのに利用しています。

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

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

Cパズルブック。文法書より先に動かそ。

C puzzleBookの著者も、Portable C Compilerの著者Stephen C. Johnson同様、Bell研究所での仕事です。

Bell研究所というと、Programming Language CというC言語規格ができる前の仕様書が有名です。この文法書を読まなくても、Cコンパイラのソースを入力してコンパイルし、The C Puzzle bookを入力してコンパイルし、最後に時間があれば、C言語規格のコード断片をコンパイルすれば、読まなくてもいいと断言してみたいです。

MISRA

MISRA C まとめ #include

misra Cのコード断片を最初にコンパイルした時は、The C puzzle bookのマクロを参考にしました。 

C言語の#define文マクロをC++のTemplateか何かにする方法

どなたか、ご指導いただけると幸いです。  

MISRA C 2012 -組み込みプログラミングの高信頼性ガイド

上記書籍の共著者です。中身について、ご意見、ご質問いただけると幸いです。

MISRA C++, AUTOSAR C++について

AUTOSAR 検索結果 C++ 関連文書, AUTOSAR(14)

Autosar Guidelines C++14 example code compile list

CERT

重要度が低いと考えられているか、参考文献がリンク切れになっていたことがある
2015年の時点のリンクの張りなおしは小川清が担当。

まとめに代えて 

C言語, C++は、毎日のようにどちらかはコンパイルするように努めています。主に、規格の断片を確認する作業を含めて。 

文法を学ばずに、写経とコンパイルエラーから学ぶ方式を母語方式とよんで学会発表などをしてきました。 

[C][C++]の国際規格案の例題をコンパイルするときの課題7つ。

自己関連記事

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

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

連立微分方程式のPade近似と、Cコンパイラとモデルに基づく設計

The C Puzzle Bookは、次の記事でも紹介させていただいています。

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

蛇足

老害よりたちが悪いか若害は皆で渡れば怖くないから

社会現象では、立場によって逆も真であることが大事。
一つの立場の主張は、一つの立場にとっては意味があっても、別の立場では意味がないかもしれないことがわかっていればよい。

老害、若害と年齢で発想することが無意味で、コンパイラを書くかどうかが大事という意味にたどり着いてもらうには、次の資料が役立つかも。やくだたないかも。
 
新人(学生)を指導するよりも新人(学生)に指導してもらった方が効率的。仮説(139)

若害を主張したいわけではないことが感じられれば大丈夫かも。

12日間の別のプログラミング言語教育では、課題を設定して12日でアプリを作ってもらうようにしました。一番機能が多いアプリを、一番最初に作成したのは60歳の技術者の方でした。他の参加者は、20代と30代で。 

いつもそうというわけではありません。verilog-HDLの場合には、大会社の技術者の方が、12日でアプリを作成されました。初めての言語で。 

目的、目標がしっかりしていれば、年齢は関係ないという例です。

IT業界でやめるとよいかもしれない3つの習慣(年齢・学歴(大学名)・理系文系)

プログラマにも読んでほしい「QC検定にも役立つ!QCべからず集」

データサイエンティストの気づき!「勉強して仕事に役立てない人。大嫌い!!」『それ自分かも?』ってなった!!!

技術を極める。近寄りたい人。近寄りたくない人。三分類、五集合。

経験と勘と度胸。裏打ち可能な分布と確率。証拠能力が高い。統計と確率(12)

立場が違えば、見え方が真逆という例を少し記録。
老害だと言った対象の方は、実は20歳頃からそんなんだったことをあなたが知らないだけかもしれません。50年前は、1チップCPUを使った計算で仕事をしている人は1%以下で、99%がメインフレームで計算していたかもしれません。今は、99%が1チップCPUを使った仕事をしており、1%の人がメインフレームで計算しているかもしれません。昔99%だった人がやってた振る舞いが、1%の人たちを貶すことがったとすれば、今、1%になったのに99%の人をけなしていても、同世代の人間から見れば、同じことをやっているだけで老害でもなんでもない。50年間、同じことを言い続けていただけだから。同世代で言われ続けた人間にとって、老害でもなんでもない。若い頃から権威主義なだけだったりするかもしれない。若い人から見ると、年寄りだからそういっているように見えるが、同い年でそういいつづけていない人間からすれば、見方が偏っているだけかもしれない。
私たち新人類と言われ始めた世代にとって、「今の若者は」といわれたことを、50年やりつづけているだけだし。今の若者はと言われる人と同じようなことをしているかもしれない。

例:
自分より少し若い人の発言「今の若者は仕事場で横になって仕事する。」
わい「ごめんなさい。50年前、仕事場で横になって仕事してました。私、昔、若者でしたから。昔の若者もしてました。あなたがしてなかっただけではないのですか。」
確率や分布の形が変わっているかもしれない。統計、分布を調べればわかることだろう。時間と空間をさまざまな評価関数を軸にとり11次元空間をはれば、01論理も社会現象には適用できるだろう。逆も真かもしれないという仮定をおいて。

参考資料(reference) 

育児していたからこそエンジニアのお仕事に役立ったこと10選 @e99h2121

新人の方によく展開している有益な情報 @kazuo_reve

1年以上かけて生産性倍増+成長し続けるチームになった施策を全部公開 @kojimadev

連携(link)

リンクC.png

リンクいただきありがとうございます。上の2つはすぐに消えるため、ここにURLを記録させてください。  

@kai_kou Qiita週間ストック数ランキング【自動更新】からリンク 9 hours ago

@koki_develop Qiita 週間いいね数ランキング【自動更新】からリンク 12 hours ago

@torifukukaiou 【毎日自動更新】AdventCalendar2022 タグ LGTMランキング!からリンク 1 day ago

twitter driven posting からリンク 1 day ago

いつもいいねをくださる小寺浩司さん頼みでないQiita記事の新しい市場誘導方法を試みています。Twitterで10個呟いて、いいねが多かった内容を記事にする。第二弾です。

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

文書履歴(document history)

ver. 0.01 初稿 20221023
ver. 0.02 電総研加筆 20221024
ver. 0.03 SmallC, 参考資料追記 20221025
ver. 0.04 Bell研究所、Portable C Compiler, Matlab追記 20221026 昼
ver. 0.05 コンパイルエラー、母語方式、MISRA C追記 20221026 夕
ver. 0.06 写経の意味を考える前に写経しよう。CPUの設計、OSの設計と言語の設計を同時に刷新できるかもしれない。 20221027
ver. 0.07 目次追加 20221028
ver. 0.08 実行時エラー、printfデバッグ追記 20221029
ver. 0.09 POSIX, hosted, freestanding, 割り込み処理(ISR), OSEK VDX 図追記 20221030
ver. 0.10 アセンブラ、計算機に勝てること 追記 20221102
ver. 0.11 未定義、未規定 追記 20221104
ver. 0.12 誤植訂正 20221107

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

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

Thank you very much for reading to the last sentence.

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

54
66
1

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
54
66