C言語/おわりに
C言語の次に学ぶべきこと編集
この節では、C言語及び標準ライブラリを学んだ後、次に学ぶべきことをまとめる。
といっても、「これら全てを学ばないとプログラムが作れない」というわけではなく、自分でプログラムを作りながら、必要なものを学んでいけばいいだろう。
標準ライブラリ以外のライブラリの使い方編集
C言語には標準ライブラリ以外にも、 様々なライブラリが存在する。 自分が使いたい機能を持ったライブラリの使い方を学習して、 何かプログラムを作ってみるといいかもしれない。
例えばゲームプログラミングをWindows上でしたいなら、後述するDirectXを使いやすくまとめた「DXライブラリ」というライブラリがある。
- DXライブラリ — 2001年に山田巧がC++用に開発した、コンピュータゲーム開発用ライブラリ。著作権は開発者の山田巧が保持している。
データ構造とアルゴリズム編集
データ構造とは、実際のデータをコンピュータのメモリ上でどのように表現するか定める形式である。 アルゴリズムとは、そのデータを用いて計算し問題を解くための手順や考え方である。 データ構造とアルゴリズムを学ぶことで、 より複雑な問題をプログラムで解けるようになる。
他の言語編集
ある一定以上複雑なプログラムを作ろうとすると、 C言語では難しくなる場合がある。 C言語以降に開発されたオブジェクト指向をサポートする言語を学ぶのも手だ。 例えば、C言語にクラスの機能を導入したC++という言語がある。 言語によって何ができるかにはあまり違いはないが、何を作りやすいかはかなり異なる。
インラインアセンブラ編集
インラインアセンブラとは、C言語のソースコードの一部に、アセンブリ言語で書かれたソースコードを含めることである。
もし、ハードウェアの制御などでC言語がサポートしていない動作をさせたい場合、アセンブラでプログラムする必要があり、このような時にインラインアセンブラを使うことで、C言語とアセンブラを併用できる。
また、プログラムの中で、最も頻度が高くかつ比較的実行時間のかかる部分(ホットスポットと呼びます)だけに、 インラインアセンブラを用いることで、プログラム全体の処理速度や応答時間を改善(最適化)することが出来る。
マイクロソフト Visual C++ の場合編集
Windowsの場合、Visual C++のソースコードにアセンブリ言語を含めるには、次のように記述する。
__asm アセンブリ文
または
__asm {アセンブリ複文}
asmの前にアンダーバー(_)が2つである。
gcc や clang の場合編集
gcc や clang の場合[1]、
- 構文
__asm__ (アセンブリテンプレート, 上書きリスト, 入力リスト )
- アセンブリテンプレート
- アセンブリ言語で書かれた雛形(必須)
- 上書きリスト
- アセンブリコードによって修飾されるレジスタ(任意)
- 入力リスト
- 引数となるC言語の変数(任意)
- 参考
-
- インラインアセンブラの使用したソースコードの例(amd64)
#include <stdio.h> int add(int a, int b) { int result = 0; __asm__(" \ movl %1, %0; \ addl %2, %0;" : "=&r"(result) : "r"(a), "r"(b)); return result; } int main() { int a = add(1, 2); printf("%d\n", a); }
- インラインアセンブラの使用したソースコードの例(arm64)
#include <stdio.h> int add(int a, int b) { int result = 0; __asm__("add %w0, %w1, %w2" : "=&r"(result) : "r"(a), "r"(b)); return result; } int main() { int a = add(1, 2); printf("%d\n", a); }
- 実行結果
3
Windows依存の技術編集
下記の技術はWindowsだけに依存して、macOSやUNIXやUNIX互換OSでは使えない技術である。
だが、2010年代の今のところ、Windowsでこれらの分野の学ぶのが最も入門しやすいので、紹介しておく。
Visual Studio のC++(いわゆる Visual C++)を使うことで、下記の技術を利用することができる。
Win32API編集
C言語と標準ライブラリを学ぶことで、ウィンドウに文字列を出力したり、変数にキーボードから入力したりできる。 このような文字のみを用いたユーザインターフェイスを、キャラクタユーザインターフェイス(Character-based User Interface, 略はCUI)と呼ぶ。
一方、今日のプログラムは、画面にウィンドウを表示し、
- ウィンドウ内にボタン、チェックボックス、コンボボックス、ラベル、リストボックス、
- ピクチャボックス、ラジオボタン、テキストボックスなど様々なコントロールを配置し、
キーボードやマウスを使って操作できる。
このようなグラフィカルなユーザインターフェイスを、グラフィカルユーザーインターフェイス(Graphical User Interface, 略はGUI)と呼ぶ。
Windows上でGUIをもったプログラムを作成するには、「Win32API」を学ぶ必要がある。
Win32APIを用いることで、画面にウィンドウを表示し、BitBlt関数を用いて矩形範囲のグラフィックをコピーしたり、 sndPlaySound関数を用いてWAVE音声を再生したりできる。
Visual C++ でなくとも、Visual Basic などでも Win32APIの提供するAPIの多くは利用できる。だが、wikibooksのC言語の入門的な単元を読破した読者なら、Visual C++ でWin32APIに入門するのが比較的にラクだろう。
DirectX又はOpenGL編集
DirectX編集
高速な2Dグラフィック処理や、3Dグラフィック処理を行うには、Windows上で行う場合なら、 DirectXを学ぶ必要があるだろう。
DirectXを用いることで、ハードウェアを用いたマルチメディア機能を使うことができる。
DirectXは基本、Visual C++ で利用しなければならない。(Visual Basic や Visual C#では利用が困難または不可能と思われる。)
なおDirectXの実行環境(ランタイム)はWindowsにあらかじめインストールされている。
DirectXをつかったアプリを開発したい場合には、DirectXのSDK(ソフトウェア開発キット)をマイクロソフトのwebサイトから追加でダウンロードしてきてインストールすればいい。
OpenGL編集
一方、DirectX以外で3Dなどの高度なグラフィックス処理を行うには、OpenGLを学ぶ必要がある。
OpenGLを用いることで、3次元グラフィックス機能を使うことができる。
OpenGLは、アプリ名ではなく規格名であり、多くのOSが準拠している。
いくつかの企業などが、OpenGLに準拠したライブラリを提供しているので、それをインクルードするなどして、3D描画をする仕組みである。
WinSock2編集
UnixでもWindowsでもネットワーク機能を使うには「Socket API」を学ぶ必要がある[2]。Windowsでソケット通信するためにはWinSockを学ぶ必要がある。
WinSockを用いることで、Windowsのインストールされたコンピュータが、他のコンピュータと通信できる。
WinSock2 は、BSDソケットを模倣しMicrosoftが、Windowsに移植したネットワークAPIだが、 模倣の過程で他の Windows API と戻値の仕様などを合わせるという選択をした。 これによって、BSDソケットの為に書かれたソースコードとの互換性はない。
また Linuxは、POSIXに準拠した実装とされるので、BSDソケットの為に書かれたソースコードとの間に基本的な互換性がある(poll などのシステムコールセットの違いからくる差異は存在するので、条件コンパイルなどで吸収する必要がある)。