こんにちは､ お帰りなさい｡
この講義では､ さらに勉強できるトピックについてお話したいと思います｡
基本的に授業は巻いています｡
包んでいるところです｡
それで､ すべてを網羅することはできませんでした｡
明らかにビギナークラスです｡
C言語のプログラミングで本当にすごい人になるために､
さらに勉強できる高度なトピックがたくさんあるので､ そのうちのいくつかを紹介したいと思います｡
だからまず､ 型付けには手を出さなかった｡
その辺の話もしたかったのですが､ どちらかというと上級者向けの考え方ですね｡
enumの話をしました｡
そして､ enumは独自の型を作るための方法です｡
しかし､ 特にcではtypedefというキーワードがあり､ 自分でデータ型を作ることができる｡
これは非常に便利で､ より高度な概念です｡
ぜひ､ もっと勉強してください｡
プリプロセッサについては､ 具体的には文字列の連結など､ 他にもいろいろな情報を得ることができます｡
コンパイラの前に実行されるプリプロセッサーメモ｡
定義済みステートメントについて学びました｡
他にもあちこちで勉強しましたが､ プリプロセッサーはもっとたくさんの情報が載っていて､
まったく別のセクションになることもあります｡
基本的に多くのコードを最適化するために使うことができるので､ 事前に実行することができます｡
プリプロセッサーで実行するインライン関数など､ さまざまなコンセプトがあります｡
ボイドスターについては､ まだまだたくさんあります｡
ボイドスターは､ 自由度が高いことを覚えておいてください｡
特に､ malloc関数はvoid starを返します｡
voidポインターを取る関数を作り､ voidポインターを渡すことでより柔軟に対応できるようになります｡
それについては､ もっともっと研究できることがあるはずです｡
静的ライブラリと共有オブジェクト｡
この図書館という概念について､ 私たちは話しませんでした｡
リンクする際にライブラリを使用します｡
具体的には､ 多くのライブラリがc標準ライブラリで定義されています｡
しかし､ 自分でライブラリを作成することも可能です｡
私たちはプログラムを作りました｡
プログラムは､ メモリ上で動作するプロセスです｡
しかし､ ライブラリは､ 実は他のプログラムで再利用できる他のコードなのです｡
だから例えば､ cの標準ライブラリ｡
他の言語でプログラミングをしたことがある人なら､ 普通はその言語に付属しているAPIですよね｡
作成できるライブラリは2種類あります｡
スタティック・ライブラリを作成し､ リンク時にそのコードをすべてコンパイルすることができます｡
そして､ プログラムの実行中に､ 関数を探して呼び出すような共有オブジェクトを作ることもできます｡
静的ライブラリは通常ドットaで終わり､ 静的時にコンパイルされるか､
プログラムをコンパイルする時にコンパイルされます｡
共有オブジェクトはドット・ソ・ファイルであり､ ダイナミック・リンク・ライブラリやビジュアルCプラス・プラスをご存知の方は､
DLLと考えることもできます｡
しかし､ 共有オブジェクトはコンパイル時ではありません｡
繰り返しになりますが､ これはコードの再利用のためです｡
これらのコンセプトを勉強して､ 共有オブジェクトだけでなく､ 静的ライブラリの作り方も紹介できますね｡
マクロです｡
マクロの話をする機会がなかったんです｡
これは上級者向けのテーマです｡
これはプリプロセッサで実行され､ 主に置換､ 文字列置換を行う｡
今回勉強した関数の中には､ 実はアサートマクロのようにマクロとして書かれているものがあります｡
マクロはもっと詳しく調べることができます｡
ユニオン
ユニオンは通常､ 構造体に沿って進みます｡
これは､ 構造体の内部に､ 同じものを表す複数の異なるタイプのデータを返したり､
異なるタイプのメンバー要素を持たせたりする方法です｡
つまり､ 1つのメンバを持つ構造体があっても､ そのメンバはenterやfloatにすることができ､
そのためにはunionを使うことになります｡
その他のトピックス ファンクションポインタ
文字ポインタを中心に､ 整数ポインタやダブルポインタまでお話しました｡
しかし､ 実際には様々な関数を指すポインタを持つことができます｡
そのため､ プログラムの実行中に､ 1つの関数を実行することができます｡
そして､ 次に実行するときには､ ユーザーの入力に基づいて別の関数を実行するとか､
そういうことができる｡
関数ポインターは全く別の話題です｡
高度なポインタ｡
ポインターには､ これまで説明した以外にもいろいろなことがあります｡
ポインタの基本について説明しましたが､ ポインタについてはもっともっと詳しく説明することができます｡
実際にポインターのポインターがあるので､ ダブルポインターもありますし､ それはもっと高度なトップトピックです｡
関数への可変引数｡
これらは変分関数と呼ばれる｡
私たちは可変数の引数を持つprintf関数を使用していますが､
私たちは可変数の引数を持つ関数を定義していなかったので､ その概念を非常に有用に探ることができました｡
ダイナミックリンク｡
これは､ 時間ごとにライブラリを開く場合で､ シェアードオブジェクトとは少し違います｡
実行時にライブラリを開放することで､ パフォーマンスが向上し､
実行プログラムのサイズも小さくなります｡
そこで､ dlm openでは､ これを行うための実際のライブラリコールがあります｡
信号､ プロセス間通信をフォークする｡
プロセス間通信とは､ 2つのプログラムが通信を行うことです｡
コミュニケーションの方法はさまざまです｡
ファイルによるコミュニケーションも可能です｡
ソケットと呼ばれるものを介して通信することができます｡
パイプを使ったコミュニケーションも可能です｡
いろいろなテクニックがありますが､ 2つのプロセスがお互いに話をしたいときです｡
フォークとは､ 別のプロセスを作ることです｡
コードの中に他のプロセスを作るためのライブラリがあります｡
もし､ コードの中で別のプロセスを作るとしたら､
それは自分のアドレス・メモリ空間を持つことになり､ プログラムを少し効率化することができる｡
それからシグナルですが､ 今回はあまり触れませんでしたが､ シグナルはデバッグの際に､
異なるプログラムに対して異なるメッセージを生成するために使われます｡
スレッドと並行処理｡
もうひとつ､ 勉強したい高度なテーマがある｡
これにより､ プログラム内部に複数の実行ポイントを設けることができます｡
ほぼ同時にコードを実行することができます｡
つまり､ 効率化型ということですね｡
データの監視やデータ待ち､ あるいは巨大なファイルの読み込みなど､
プログラムの中で長時間実行しなければならないタスクがある場合､ そのために別のスレッドを作成し､
それでも同時にプログラムの他の部分を連動して実行することができます｡
ソケットです｡
ソケットはネットワークに使用されます｡
ソケットは､ 他のコンピュータに接続して､ その他のコンピュータからデータを取得する場合に使用されます｡
ネットワーキングは､ インターネットやその他のものがあるので､ とても大きな意味を持ちます｡
だから､ あなたはソケットのすべてを学び､ 同様に見ることができます｡
setjumpとlongjumpという2つの関数があるんだ｡
それは､ 状態を回復するためです｡
私たちは､ メモリ管理とフラグメンテーションについて､ より詳しくそれらを勉強することができました｡
これはmallocに限ったことではありませんが､ このようにメモリを管理し､ ヒープやスタックに置くことができます｡
プログラムを少し効率的にすることで､ 断片化が起きにくくなります｡
フラグメンテーションとは､ 異なる場所にメモリがあることで､ シーケンシャルではないので､
そのメモリを調べるのに時間がかかる方が大変かもしれません｡
フラグメンテーションを減らすことができます｡
プログラムをよりポータブルにするための努力はできる｡
一般に､ cプログラムはかなりポータブルです｡
しかし､ 一度書いたプログラムをさまざまなOSで動作させ､ 書き直す必要がないようにするために活用できるテクニックはもっとあります｡
cで利用可能なposix標準のいくつかを本質的に利用することができるのです｡
c規格のどのバージョンかによって､ 特定の規約を使用することで複数の規格で動作するようにすることができます｡
また､ カーネルと直接インターフェースするプログラムを書くこともできる｡
カーネルはOSの頭脳であることを忘れないでください｡
カーネルにはすべてのドライバが含まれています｡
下位のメモリ機能に対するあらゆる種類の呼び出しが含まれています｡
いろいろな情報をやってくれる｡
つまり､ カーネルには特定の機能があり､ それをcプログラムでインターフェースすることができるのです｡
これは低レベルの組み込み用でしょう｡
だから､ IOコントロールのようなコールを使うことができるのです｡
ハードウェアと直接対話するためのドライバを作ることができました｡
コンパイラやリンカに渡すフラグもいろいろあって､
これもまたプログラムを効率的にしてくれます｡
いろいろないろいろな国旗の話をたくさんする機会がなかったんです｡
ダッシュウォールなど基本的なものを中心に話をしましたが､ それ以上の高度なものはありませんでした｡
デバッガーについて､ アプリケーションのデバッグ方法についてお話しました｡
コードブロックでのデバッガーは､ グラフィカル・ユーザー・インターフェースを介していた｡
しかし､ デバッガの本当の利点は､ ボンネットの下にあるgdbを使うことです｡
Gdbはgnuのデバッガです｡
そして､ ブレークポイントの話とグラフィック・ユーザー・インターフェースによる使い方の話だけでしたが､
実はgdbではもっとたくさんのことができるんです｡
コンソールからgdbデバッガーを使っていろいろなコマンドを発行したり､
gdbを使ってコアファイルを読み込む方法を理解したり､ たくさんの素晴らしい高度なトピックがあります｡
プロファイリング､ トレースツール｡
静的解析ツール､ つまり､ プログラムを実行する前にコードを解析して､ デッドコードがないか､
悪いプログラミング手法がないかどうかを確認するツールについては､
ここでは触れませんでしたね｡
sトレース､ dトレース､ gプロファイル､ これらはすべて､
デバッグや効率性､ メモリ使用量､ プログラムのパフォーマンスを測定するために使用できる重要なツールです｡
他にもvalgrindのような追加のメモリデバッグツールがあります｡
これは､ レースコンディションやメモリ破壊の問題がある場合に役立ちます｡
メモリを管理していると､ バッファオーバーフローやメモリリークが発生したときに､ それを見つけるのが非常に難しいことがよくあります｡
そこで､ valgrindのようなツールを使って､ それらを見つけることができるのです｡
cの専門家になるために､ さまざまなテーマを探求することができるわけです｡
基本的なことに触れました｡
始めるにあたって､ 本当に本当に大切なことに触れました｡
しかし､ これらの追加トピックを使えば､ エキスパートになることができるのです｡
ありがとうございます｡