エンジョイC015回目インクルードファイル(2020-07-05)

1
ほえほえ@スプシマン @hoehoe1234

エンジョイC 15回目(7/5) 2週連続の雨のなか15回目です。来ていただいたみなさんありがとうございます。 新しく参加された方のためにインクルードがなにをしているのかの説明です。こういうのは正しく理解するのが大切ですね。stdio.hを見ています。 pic.twitter.com/8tB6FiJ4iA

2020-07-07 12:52:15
拡大
ほえほえ@スプシマン @hoehoe1234

コンパイラオプションによりインクルードが展開された後の一時ファイルが残せます。以前にも説明しましたがインクルードは ①関数プロトタイプ宣言 ②マクロの展開 ③型定義 などを行っているファイルです。 pic.twitter.com/Kgx6iCmdxT

2020-07-07 12:54:29
拡大
ほえほえ@スプシマン @hoehoe1234

.cファイルからどういう手順で実行ファイルが作られるか?の解説です。このあたりはスクリプト言語とはだいぶ違いますね。分割コンパイルをするために「共通の情報」がインクルードファイルには含まれています。 pic.twitter.com/u5tRD7ccDg

2020-07-07 12:55:59
拡大
ほえほえ@スプシマン @hoehoe1234

レジスタって?というご質問がありましたので説明しました。コンピュータは ①外部デバイスとIF ②CPU ③メモリ などにより構成されていますが当面はCPUの構造とメモリイメージが大事になりますね。こういうのもある程度正しく理解したほうがよいと思います。 pic.twitter.com/LY3tUGLpqX

2020-07-07 12:57:42
拡大
ほえほえ@スプシマン @hoehoe1234

ただ、現代のCUPとかは複雑になっていますので過去の8ビットCPUである「Z80」の本とか「Z80アセンブラ入門」みたいな本を読んだほうが理解が深まるかもしれませんね。 塾においてありますのでお時間あれば読んでみてください。あと業務フローの書籍も先週入荷しました。

2020-07-07 12:59:25
ほえほえ@スプシマン @hoehoe1234

この業務フローの本は、昔あった「正式な業務フロー」の書き方を説明しています。ものすごく「精密」です。現代ではこのような書き方は(たぶん)しませんが正式な書き方を学んでおいてから「くずしていく」のがよいと思います。正式本のよいとことは書くための「概念」が全て含まれていることですね。

2020-07-07 13:01:21
ほえほえ@スプシマン @hoehoe1234

当塾におけるCSの大まかな定義です。この中でも当塾では ①OS ③アルゴリズムとデータ構造 に注力していきます。うまくいったら ②言語理論 なんかにも取り組みたいですね。②を習得すれば正規表現ルーチンを「自分で作れるように」なります。 pic.twitter.com/dSV2sB4o3E

2020-07-07 13:04:32
拡大
ほえほえ@スプシマン @hoehoe1234

ただ現実問題としてはやはりスキルアップにつながるのはOSのコードリーディングとアルゴリズム本の精読ですので当面はこちらを集中してやっていく予定です。特にアルゴリズム本の精読は「1つの関数をうまくかく」力に繋がります。最も下位層でのあらゆる制御構造とトリックが学べます。

2020-07-07 13:06:21
ほえほえ@スプシマン @hoehoe1234

たとえば白本のコードには「魂がこもっている」ことが読めばわかると思います。局所的なテクニックを習得することにより、単一関数がフルエントにエレガントに書けるようになることは取りも直さず「プログラミングを楽しめる」ことに直結します。数十行のコードを数時間かけて解析する価値があります。

2020-07-07 13:11:11
ほえほえ@スプシマン @hoehoe1234

どうして仮想記憶が必要か?の説明です。今では当たり前の仕組みですがちょっと前まではそうではありませんでした。仮想記憶を装備している「メジャーリーグのOS」のコードを読むことによりイメージではなく「実際にコードレベルで理解する」ことを目的としています。 pic.twitter.com/w8TPMMAx7X

2020-07-07 13:14:18
拡大
ほえほえ@スプシマン @hoehoe1234

文字、文字集合、文字コード、符号化文字列の説明です。ちょっとまちがえてるかもですがご容赦を。ユニコードの普及でだいぶらくになりましたがまだまだSJISとの混在は続きそうですね。エンジョイCコースでは「内部表現がどうなっているか」みたいなことをやります。 pic.twitter.com/BcrjrXw90M

2020-07-07 13:16:24
拡大
ほえほえ@スプシマン @hoehoe1234

VBAの文字列とC言語の文字列の違いの説明です。VBAはBSTRという構造、C言語ではnullターミネートの文字の連続です。どちらも構造がありますがVBAのほうが抽象度が高いですね。C言語ではゆるい構造なので途中を指せば、指したところから最後までが文字列として認識されます。 pic.twitter.com/OcCynL4rzv

2020-07-07 13:17:58
拡大
ほえほえ@スプシマン @hoehoe1234

構造と抽象化はそれらを扱う関数での約束事項ですので、C言語ではNULLで終了していればそれは「文字列」です。反対にVBAではBSTRを使っていますのでポインタで途中を指しても正しい文字列とはなりません。

2020-07-07 13:19:23
ほえほえ@スプシマン @hoehoe1234

図にあるようにBSTRは、文字列長4バイト、nullを含んだ文字可能、UNIコード(2バイトで1文字)、最後はNULL-NULLという構成ですね。ですからこれを操作するには関数が必要となります。 pic.twitter.com/xZLqtSzVQU

2020-07-07 13:22:33
拡大
ほえほえ@スプシマン @hoehoe1234

受講生の方にコードの説明をしていただきました。コードの解説をコードベースでだけしても理解には繋がりません。その後に「自分の言葉で」何をしているのかまとめ直すことが必要です。この図の場合は「入力した値を逆順に表示する」ということになります。 pic.twitter.com/538RyhEcva

2020-07-07 13:32:18
拡大
ほえほえ@スプシマン @hoehoe1234

再帰を理解するコツは、再帰としていちいち追わない。とういことなのですが最初は難しいです。特に「呼ぶときには明示的」に呼びますが「どこに戻ってくるのかわからない」ということになります。これを上の図で示しました。

2020-07-07 13:33:55
ほえほえ@スプシマン @hoehoe1234

また、パターンとして ①行きがけ順処理 ②再帰呼び出し1 ③真ん中順処理 ④再帰呼び出し2 ⑤帰りがけ順処理 となることが多いです。この順をトップダウン図と合わせて覚えるとよいでしょう。

2020-07-07 13:35:32
ほえほえ@スプシマン @hoehoe1234

ちょっと見にくいですが左がトップダウン解析、右が詳細に書いた関数呼び出しのパターンです。トップダウンかいせきにより自分のノード(関数)から左右に2つの線が生えます。これが自分自身の呼び出しです。この線(線1、線2とします)を基準として処理をかんがえていくとよいでしょう。 pic.twitter.com/KRHA9FRV96

2020-07-07 13:37:37
拡大
ほえほえ@スプシマン @hoehoe1234

線1は右側の再帰呼び出し1に、線2は再帰呼び出し2に相当しています。線1の左側は行きがけ順、線1と線2の間は真ん中順、線2の右は帰りがけ順となり、左のトップダウン図と右の呼び出しのパターンが一致していることがわかります。

2020-07-07 13:39:05
ほえほえ@スプシマン @hoehoe1234

その後には「どうやってコメンタリを読み進んでいくか?」について検討したり各自演習に取り組んでいただいたりしました。クイックソートは3つの要素をSmall, Large、中央値xに類別して考えると面白いですね。実際に並べてみるとどうしてxで止まらなければいけないのか?がよくわかります。

2020-07-07 13:41:23
ほえほえ@スプシマン @hoehoe1234

3つしか要素がないので要素の組合せは xxx xxS xxL xSS xLL xLS しかありません。これで実際に白本の通りに動かしてみると左からのポインタpと右からのポインタqがどのように入れ替わるかが視覚化され、理解が深まります。

2020-07-07 13:43:31
ほえほえ@スプシマン @hoehoe1234

仮にxを入れ替え対象としないとすぐにオーバーラン(入れ替え対象が見つからない)状況が発生するのがわかります。クイックソートは個別の値の比較ではなく基準値xより大きいか小さいか同じか?なので上記のように「モデル化」するとわかりやすくなります。これもコードを理解するテクニックですね。

2020-07-07 13:45:46
ほえほえ@スプシマン @hoehoe1234

ということで次週からエンジョイCはクイックソートに取り組みます。白本の構成で「まるでそこでロジックを開発しているように段階的に改良していく」という手法はいいですね。最初から最終的な回答または最適化されてない回答を提示されてなぞるよりも遥かに理解が深まります。 おわり。

2020-07-07 13:47:41